diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index 295bb192a42..ab84d372bd7 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -3605,6 +3605,18 @@ public class Resolve { ReferenceKind.BOUND; } } + + @Override + Symbol access(Env env, DiagnosticPosition pos, Symbol location, Symbol sym) { + if (originalSite.hasTag(TYPEVAR) && sym.kind == MTH) { + sym = (sym.flags() & Flags.PRIVATE) != 0 ? + new AccessError(env, site, sym) : + sym; + return accessBase(sym, pos, location, originalSite, name, true); + } else { + return super.access(env, pos, location, sym); + } + } } /** diff --git a/test/langtools/tools/javac/lambda/methodReference/PrivateMethodReferenceWithTypeVarTest.java b/test/langtools/tools/javac/lambda/methodReference/PrivateMethodReferenceWithTypeVarTest.java new file mode 100644 index 00000000000..b87783416a3 --- /dev/null +++ b/test/langtools/tools/javac/lambda/methodReference/PrivateMethodReferenceWithTypeVarTest.java @@ -0,0 +1,34 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8318160 + * @summary javac does not reject private method reference with type-variable receiver + * @compile/fail/ref=PrivateMethodReferenceWithTypeVarTest.out -XDrawDiagnostics PrivateMethodReferenceWithTypeVarTest.java + */ + +import java.util.function.*; + +class PrivateMethodReferenceWithTypeVarTest { + class Foo { + X get() { return null; } + } + + private String asString() { + return "bar"; + } + + private String asString2(Object o) { + return "bar"; + } + + static Function m1() { + return T::asString; + } + + static Function m2(T t) { + return t::asString2; + } + + static Function m2(Foo foo) { + return foo.get()::asString2; + } +} diff --git a/test/langtools/tools/javac/lambda/methodReference/PrivateMethodReferenceWithTypeVarTest.out b/test/langtools/tools/javac/lambda/methodReference/PrivateMethodReferenceWithTypeVarTest.out new file mode 100644 index 00000000000..b4dac12a9ae --- /dev/null +++ b/test/langtools/tools/javac/lambda/methodReference/PrivateMethodReferenceWithTypeVarTest.out @@ -0,0 +1,4 @@ +PrivateMethodReferenceWithTypeVarTest.java:24:16: compiler.err.report.access: asString(), private, PrivateMethodReferenceWithTypeVarTest +PrivateMethodReferenceWithTypeVarTest.java:28:16: compiler.err.report.access: asString2(java.lang.Object), private, PrivateMethodReferenceWithTypeVarTest +PrivateMethodReferenceWithTypeVarTest.java:32:16: compiler.err.report.access: asString2(java.lang.Object), private, PrivateMethodReferenceWithTypeVarTest +3 errors