From 85996572b61e789d7e45bd26b23d233a0a41e158 Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Wed, 10 Sep 2025 21:23:45 +0000 Subject: [PATCH] 8365676: javac incorrectly allows calling interface static method via type variable Co-authored-by: Maurizio Cimadamore Reviewed-by: vromero --- .../com/sun/tools/javac/comp/Attr.java | 16 ++++++++++++--- .../generics/typevars/8365676/T8365676.java | 20 +++++++++++++++++++ .../generics/typevars/8365676/T8365676.out | 4 ++++ 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 test/langtools/tools/javac/generics/typevars/8365676/T8365676.java create mode 100644 test/langtools/tools/javac/generics/typevars/8365676/T8365676.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 9f32e7f6186..f780df025bd 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -4569,9 +4569,19 @@ public class Attr extends JCTree.Visitor { log.error(pos, Errors.TypeVarCantBeDeref); return syms.errSymbol; } else { - Symbol sym2 = (sym.flags() & Flags.PRIVATE) != 0 ? - rs.new AccessError(env, site, sym) : - sym; + // JLS 4.9 specifies the members are derived by inheritance. + // We skip inducing a whole class by filtering members that + // can never be inherited: + Symbol sym2; + if (sym.isPrivate()) { + // Private members + sym2 = rs.new AccessError(env, site, sym); + } else if (sym.owner.isInterface() && sym.kind == MTH && (sym.flags() & STATIC) != 0) { + // Interface static methods + sym2 = rs.new SymbolNotFoundError(ABSENT_MTH); + } else { + sym2 = sym; + } rs.accessBase(sym2, pos, location, site, name, true); return sym; } diff --git a/test/langtools/tools/javac/generics/typevars/8365676/T8365676.java b/test/langtools/tools/javac/generics/typevars/8365676/T8365676.java new file mode 100644 index 00000000000..f6b992cb47b --- /dev/null +++ b/test/langtools/tools/javac/generics/typevars/8365676/T8365676.java @@ -0,0 +1,20 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8365676 + * @summary Interface static methods should not be inherited by type variables + * @compile/fail/ref=T8365676.out -XDrawDiagnostics T8365676.java + */ + +import java.text.Collator; +import java.util.Comparator; + +class T8365676 { + // T and P should have equivalent members + , P extends Object & Comparator> + void test() { + Comparator.reverseOrder(); + Collator.reverseOrder(); // Fails + P.reverseOrder(); // Fails + T.reverseOrder(); // Should fail + } +} diff --git a/test/langtools/tools/javac/generics/typevars/8365676/T8365676.out b/test/langtools/tools/javac/generics/typevars/8365676/T8365676.out new file mode 100644 index 00000000000..214b1640d4a --- /dev/null +++ b/test/langtools/tools/javac/generics/typevars/8365676/T8365676.out @@ -0,0 +1,4 @@ +T8365676.java:16:17: compiler.err.cant.resolve.location.args: kindname.method, reverseOrder, , , (compiler.misc.location: kindname.class, java.text.Collator, null) +T8365676.java:17:10: compiler.err.cant.resolve.location.args: kindname.method, reverseOrder, , , (compiler.misc.location: kindname.type.variable.bound, java.lang.Object&java.util.Comparator, null) +T8365676.java:18:10: compiler.err.cant.resolve.location.args: kindname.method, reverseOrder, , , (compiler.misc.location: kindname.type.variable.bound, T, null) +3 errors