From a56799aab328d4643150bfb43dff59eea4b4fa62 Mon Sep 17 00:00:00 2001 From: aefimov Date: Fri, 22 Jan 2016 10:49:45 +0300 Subject: [PATCH] 8068254: Method reference uses wrong qualifying type Summary: Generated code fails with IllegalAccessError due to compiler's mishandling of packageprivate classes in method reference expressions. Reviewed-by: rfield, mcimadamore --- .../sun/tools/javac/comp/LambdaToMethod.java | 8 ++-- ...ethodReferencePackagePrivateQualifier.java | 42 +++++++++++++++++++ .../methodReferenceExecution/pkg/B.java | 33 +++++++++++++++ 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 test/tools/javac/lambda/methodReferenceExecution/MethodReferencePackagePrivateQualifier.java create mode 100644 test/tools/javac/lambda/methodReferenceExecution/pkg/B.java diff --git a/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index 1253f872..87337114 100644 --- a/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -877,11 +877,9 @@ public class LambdaToMethod extends TreeTranslator { */ private JCExpression expressionInvoke(VarSymbol rcvr) { JCExpression qualifier = - tree.sym.isStatic() ? - make.Type(tree.sym.owner.type) : - (rcvr != null) ? - makeReceiver(rcvr) : - tree.getQualifierExpression(); + (rcvr != null) ? + makeReceiver(rcvr) : + tree.getQualifierExpression(); //create the qualifier expression JCFieldAccess select = make.Select(qualifier, tree.sym.name); diff --git a/test/tools/javac/lambda/methodReferenceExecution/MethodReferencePackagePrivateQualifier.java b/test/tools/javac/lambda/methodReferenceExecution/MethodReferencePackagePrivateQualifier.java new file mode 100644 index 00000000..ae657e70 --- /dev/null +++ b/test/tools/javac/lambda/methodReferenceExecution/MethodReferencePackagePrivateQualifier.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015, 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 8068254 + * @summary Method reference uses wrong qualifying type + * @author srikanth + * @run main MethodReferencePackagePrivateQualifier + */ +import pkg.B; +public class MethodReferencePackagePrivateQualifier { + public static void main(String... args) { + pkg.B.m(); + Runnable r = pkg.B::m; + r.run(); + r = B::m; + r.run(); + if (!pkg.B.result.equals("A.m()A.m()A.m()")) + throw new AssertionError("Incorrect result"); + } +} diff --git a/test/tools/javac/lambda/methodReferenceExecution/pkg/B.java b/test/tools/javac/lambda/methodReferenceExecution/pkg/B.java new file mode 100644 index 00000000..8b474e44 --- /dev/null +++ b/test/tools/javac/lambda/methodReferenceExecution/pkg/B.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2015, 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 pkg; +class A { + public static void m() { + B.result += "A.m()"; + } +} + +public class B extends A { + public static String result = ""; +} -- GitLab