# HG changeset patch # User sadayapalam # Date 1574747033 -19800 # Node ID d9a3bddcffccd5597301c6d8f0e466962e3071d6 # Parent 981a55672786650dfcb403f4c75b112750613512 8234729: Javac should eagerly change code generation for method references to avert IllegalAccessError in future. Reviewed-by: mcimadamore diff -r 981a55672786 -r d9a3bddcffcc src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Nov 26 02:32:32 2019 +0000 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Nov 26 11:13:53 2019 +0530 @@ -2266,8 +2266,7 @@ boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage() { return ((tree.sym.flags() & PROTECTED) != 0 && - tree.sym.packge() != owner.packge() && - !owner.enclClass().isSubClass(tree.sym.owner, types)); + tree.sym.packge() != owner.packge()); } /** diff -r 981a55672786 -r d9a3bddcffcc test/langtools/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest2.java Tue Nov 26 11:13:53 2019 +0530 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2019, 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 8234729 + * @summary Javac should eagerly change code generation for method references to avert IllegalAccessError in future. + * @run main ProtectedInaccessibleMethodRefTest2 + */ + +import pack.I; +import pack.J; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.function.Function; +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +public final class ProtectedInaccessibleMethodRefTest2 extends I { + + public static void main(String... args) { + ProtectedInaccessibleMethodRefTest2 m = new ProtectedInaccessibleMethodRefTest2(); + m.test(Paths.get("test")); + // Verify that the method reference has been folded into a lambda. + boolean lambdaFound = false; + for (Method meth : ProtectedInaccessibleMethodRefTest2.class.getDeclaredMethods()) { + if (meth.getName().equals("lambda$test$0")) { + lambdaFound = true; + break; + } + } + if (!lambdaFound) { + throw new AssertionError("Did not find evidence of new code generation"); + } + } + + void test(Path outputDir) { + Sub c = new Sub(this::readFile); + c.check(outputDir); + } + public class Sub extends J { + Sub(Function fileReader) { + super(fileReader); + } + } +} diff -r 981a55672786 -r d9a3bddcffcc test/langtools/tools/javac/lambda/methodReference/pack/I.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/lambda/methodReference/pack/I.java Tue Nov 26 11:13:53 2019 +0530 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019, 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; + +import java.nio.file.Path; + +public class I { + protected String readFile(Path file) { + return file.toString(); + } +} diff -r 981a55672786 -r d9a3bddcffcc test/langtools/tools/javac/lambda/methodReference/pack/J.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/lambda/methodReference/pack/J.java Tue Nov 26 11:13:53 2019 +0530 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019, 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; + +import java.nio.file.Path; +import java.util.function.Function; + +public class J { + protected final Function fileReader; + + public J(Function fileReader) { + this.fileReader = fileReader; + } + + protected void checkFile(Path file) { + fileReader.apply(file); + } + + public void check(Path file) { + checkFile(file); + } +}