Wed, 11 Dec 2013 11:56:55 -0800
8029558: java.lang.VerifyError: Bad return type when lambda's body is in parentheses
Summary: properly type convert the body of a lambda expression
Reviewed-by: vromero
1.1 --- a/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Mon Dec 09 19:29:33 2013 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Wed Dec 11 11:56:55 2013 -0800 1.3 @@ -586,7 +586,7 @@ 1.4 try { 1.5 currentMethod = null; 1.6 tree.params = translate(tree.params); 1.7 - tree.body = translate(tree.body, null); 1.8 + tree.body = translate(tree.body, tree.body.type==null? null : erasure(tree.body.type)); 1.9 tree.type = erasure(tree.type); 1.10 result = tree; 1.11 }
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/javac/lambda/LambdaParenGeneric.java Wed Dec 11 11:56:55 2013 -0800 2.3 @@ -0,0 +1,48 @@ 2.4 +/* 2.5 + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 2.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.7 + * 2.8 + * This code is free software; you can redistribute it and/or modify it 2.9 + * under the terms of the GNU General Public License version 2 only, as 2.10 + * published by the Free Software Foundation. 2.11 + * 2.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 2.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 2.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2.15 + * version 2 for more details (a copy is included in the LICENSE file that 2.16 + * accompanied this code). 2.17 + * 2.18 + * You should have received a copy of the GNU General Public License version 2.19 + * 2 along with this work; if not, write to the Free Software Foundation, 2.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2.21 + * 2.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2.23 + * or visit www.oracle.com if you need additional information or have any 2.24 + * questions. 2.25 + */ 2.26 + 2.27 +/* 2.28 + * @test 2.29 + * @bug 8029558 2.30 + * @summary VerifyError lambda body is parenthesized generic value 2.31 + * @author Robert Field 2.32 + * @run main LambdaParenGeneric 2.33 + */ 2.34 + 2.35 +public class LambdaParenGeneric { 2.36 + 2.37 + @FunctionalInterface 2.38 + public interface FI { 2.39 + Integer apply(); 2.40 + } 2.41 + 2.42 + public static class Val<A> { 2.43 + A value; 2.44 + Val(A v) { value = v; } 2.45 + } 2.46 + 2.47 + public static void main(String[] args) { 2.48 + FI inc = () -> (new Val<Integer>(77).value); 2.49 + System.out.println(inc.apply()); 2.50 + } 2.51 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/javac/lambda/LambdaParenGenericOrig.java Wed Dec 11 11:56:55 2013 -0800 3.3 @@ -0,0 +1,49 @@ 3.4 +/* 3.5 + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3.7 + * 3.8 + * This code is free software; you can redistribute it and/or modify it 3.9 + * under the terms of the GNU General Public License version 2 only, as 3.10 + * published by the Free Software Foundation. 3.11 + * 3.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 3.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 3.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 3.15 + * version 2 for more details (a copy is included in the LICENSE file that 3.16 + * accompanied this code). 3.17 + * 3.18 + * You should have received a copy of the GNU General Public License version 3.19 + * 2 along with this work; if not, write to the Free Software Foundation, 3.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 3.21 + * 3.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 3.23 + * or visit www.oracle.com if you need additional information or have any 3.24 + * questions. 3.25 + */ 3.26 + 3.27 +/* 3.28 + * @test 3.29 + * @bug 8029558 3.30 + * @summary VerifyError lambda body is parenthesized generic value (originally submitted test) 3.31 + * @author Dmitrii Afanasyev 3.32 + * @run main LambdaParenGenericOrig 3.33 + */ 3.34 + 3.35 +public class LambdaParenGenericOrig { 3.36 + 3.37 + @FunctionalInterface 3.38 + public static interface Function1<R, A> { 3.39 + R apply(A input); 3.40 + } 3.41 + 3.42 + @FunctionalInterface 3.43 + public static interface Function2<R, A1, A2> { 3.44 + R apply(A1 input1, A2 input2); 3.45 + } 3.46 + 3.47 + public static void main(String[] args) { 3.48 + final Function2<Integer, Integer, Integer> add = (x, y) -> x + y; 3.49 + final Function1<Integer, Integer> inc = x -> (add.apply(x, 1)); 3.50 + System.out.println(inc.apply(0)); 3.51 + } 3.52 +}