# HG changeset patch # User sadayapalam # Date 1473775323 -19800 # Node ID 5164e92730d9c2f78f851ab51d28f321d65a7ce5 # Parent 1b4b5d01aa11edf24b6fadbe3d2f3e411e3b02cd 8138667: java.lang.IllegalAccessError: tried to access method (for a protected method) Reviewed-by: mcimadamore diff -r 1b4b5d01aa11 -r 5164e92730d9 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Wed Jul 05 22:12:19 2017 +0200 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Sep 13 19:32:03 2016 +0530 @@ -2256,6 +2256,12 @@ types.erasure(owner.enclClass().asType())); } + boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage() { + return ((tree.sym.flags() & PROTECTED) != 0 && + tree.sym.packge() != owner.packge() && + !owner.enclClass().isSubClass(tree.sym.owner, types)); + } + /** * Signature polymorphic methods need special handling. * e.g. MethodHandle.invoke() MethodHandle.invokeExact() @@ -2293,6 +2299,7 @@ needsVarArgsConversion() || isArrayOp() || isPrivateInOtherClass() || + isProtectedInSuperClassOfEnclosingClassInOtherPackage() || !receiverAccessible() || (tree.getMode() == ReferenceMode.NEW && tree.kind != ReferenceKind.ARRAY_CTOR && diff -r 1b4b5d01aa11 -r 5164e92730d9 langtools/test/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest.java Tue Sep 13 19:32:03 2016 +0530 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8138667 + * @summary Verify that javac emits suitable accessors when a method reference mentions a protected method that would need an accessor + * @run main ProtectedInaccessibleMethodRefTest + */ + + +import pack.SuperClass; + +import java.util.concurrent.Callable; + +public final class ProtectedInaccessibleMethodRefTest extends SuperClass { + + static String message = "NOT OK"; + + public void doTest() throws Exception { + new Callable() { + @Override + public Void call() throws Exception { + final Runnable r = ProtectedInaccessibleMethodRefTest.this::myDo; + r.run(); + return null; + } + }.call(); + + new Callable() { + @Override + public Void call() throws Exception { + final Runnable r = ProtectedInaccessibleMethodRefTest::myStaticDo; + r.run(); + return null; + } + }.call(); + } + + public void message(String s) { + message = s; + } + + public static void main(String[] args) throws Exception { + new ProtectedInaccessibleMethodRefTest().doTest(); + if (!message.equals("OK!")) + throw new AssertionError("Unexpected output"); + if (!sMessage.equals("OK!")) + throw new AssertionError("Unexpected output"); + } +} diff -r 1b4b5d01aa11 -r 5164e92730d9 langtools/test/tools/javac/lambda/methodReference/pack/SuperClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/methodReference/pack/SuperClass.java Tue Sep 13 19:32:03 2016 +0530 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pack; + +public class SuperClass { + + public static String sMessage = "Not OK"; + + protected final void myDo() { + message("OK!"); + } + + protected static final void myStaticDo() { + sMessage = "OK!"; + } + + public void message(String s) { + } +}