# HG changeset patch # User lana # Date 1414006225 25200 # Node ID e7560bceb36a933f5eb6ce8c33dce030ba0288f2 # Parent 8c4a9603598fdea6fede86e191db346ece5ddf4d# Parent c058b97ecb879faabe62f04c97939466775324b9 Merge diff -r 8c4a9603598f -r e7560bceb36a src/share/classes/com/sun/tools/javac/comp/Flow.java --- a/src/share/classes/com/sun/tools/javac/comp/Flow.java Wed Oct 22 11:18:28 2014 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Flow.java Wed Oct 22 12:30:25 2014 -0700 @@ -247,7 +247,7 @@ return !env.info.scope.includes(sym) && sym.owner.kind == MTH; } - }.analyzeTree(env); + }.analyzeTree(env, that); LambdaFlowAnalyzer flowAnalyzer = new LambdaFlowAnalyzer(); flowAnalyzer.analyzeTree(env, that, make); return flowAnalyzer.inferredThrownTypes; diff -r 8c4a9603598f -r e7560bceb36a src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Wed Oct 22 11:18:28 2014 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Wed Oct 22 12:30:25 2014 -0700 @@ -846,6 +846,10 @@ if (rcvr == null) return null; JCExpression rcvrExpr = make.Ident(rcvr); Type rcvrType = tree.sym.enclClass().type; + if (rcvrType == syms.arrayClass.type) { + // Map the receiver type to the actually type, not just "array" + rcvrType = tree.getQualifierExpression().type; + } if (!rcvr.type.tsym.isSubClass(rcvrType.tsym, types)) { rcvrExpr = make.TypeCast(make.Type(rcvrType), rcvrExpr).setType(rcvrType); } diff -r 8c4a9603598f -r e7560bceb36a test/tools/javac/flow/T8042741/LambdaArgumentsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/flow/T8042741/LambdaArgumentsTest.java Wed Oct 22 12:30:25 2014 -0700 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2014, 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 8054210 + * @summary NullPointerException when compiling specific code + * @compile LambdaArgumentsTest.java + */ + +public class LambdaArgumentsTest { + interface Thrower { void apply() throws E; } + interface Consumer { void take(E arg); } + + + void m1(Thrower a1, Consumer a2) {} + + + void m2(Thrower a1, Consumer a2) {} + + void test() { + m1(() -> {}, e -> {}); + m2(() -> {}, (RuntimeException e) -> {}); + } +} diff -r 8c4a9603598f -r e7560bceb36a test/tools/javac/lambda/MethodReferenceArrayClone.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/lambda/MethodReferenceArrayClone.java Wed Oct 22 12:30:25 2014 -0700 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2014, 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 8056051 + * @summary int[]::clone causes "java.lang.NoClassDefFoundError: Array" + * @run main MethodReferenceArrayClone + */ + +import java.util.Arrays; +import java.util.function.Function; +import java.util.function.Supplier; + +public class MethodReferenceArrayClone { + public static void main(String[] args) { + int[] intArgs = new int[] {1, 2, 3, 4, 5}; + checkInt("int[]::clone", int[]::clone, intArgs); + checkInt("a -> a.clone()", a -> a.clone(), intArgs); + checkInt("intArgs::clone", intArgs::clone, intArgs); + + String[] stringArgs = new String[] {"hi", "de", "ho"}; + checkString("String[]::clone", String[]::clone, stringArgs); + checkString("a -> a.clone()", a -> a.clone(), stringArgs); + checkString("args::clone", stringArgs::clone, stringArgs); + } + + private static void checkInt(String label, Supplier s, int[] expected) { + if (!Arrays.equals(s.get(), expected)) { + throw new RuntimeException("Unexpected value " + label + ": " + Arrays.toString(s.get())); + } + } + + private static void checkInt(String label, Function f, int[] a) { + checkInt(label, () -> f.apply(a), a); + } + + private static void checkString(String label, Supplier s, String[] expected) { + if (!Arrays.equals(s.get(), expected)) { + throw new RuntimeException("Unexpected value " + label + ": " + Arrays.toString(s.get())); + } + } + + private static void checkString(String label, Function f, String[] a) { + checkString(label, () -> f.apply(a), a); + } +}