Fri, 05 Jul 2013 11:02:17 +0100
8019480: Javac crashes when method is called on a type-variable receiver from lambda expression
Summary: Logic for shortcircuiting speculative attribution doesn't handle type-variable receivers
Reviewed-by: jjg, vromero
1.1 --- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Jul 05 11:00:19 2013 +0100 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri Jul 05 11:02:17 2013 +0100 1.3 @@ -941,6 +941,10 @@ 1.4 attribSpeculative(rec, env, attr.unknownTypeExprInfo).type : 1.5 env.enclClass.sym.type; 1.6 1.7 + while (site.hasTag(TYPEVAR)) { 1.8 + site = site.getUpperBound(); 1.9 + } 1.10 + 1.11 ListBuffer<Type> args = ListBuffer.lb(); 1.12 for (int i = 0; i < tree.args.length(); i ++) { 1.13 args.append(Type.noType);
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/javac/lambda/8019480/T8019480.java Fri Jul 05 11:02:17 2013 +0100 2.3 @@ -0,0 +1,23 @@ 2.4 +/* 2.5 + * @test /nodynamiccopyright/ 2.6 + * @bug 8019480 2.7 + * @summary Javac crashes when method is called on a type-variable receiver from lambda expression 2.8 + * @author Maurizio Cimadamore 2.9 + * @compile/fail/ref=T8019480.out -XDrawDiagnostics T8019480.java 2.10 + */ 2.11 +import java.util.*; 2.12 + 2.13 +class T8019480<U> { 2.14 + interface Predicate<T> { 2.15 + void m(T t); 2.16 + } 2.17 + 2.18 + interface Stream<T> { 2.19 + void forEach(Predicate<T> pt); 2.20 + } 2.21 + 2.22 + void test(U current, Stream<U> stream) { 2.23 + List<U> list3 = new ArrayList<>(); 2.24 + stream.forEach(i -> list3.add(current.clone())); 2.25 + } 2.26 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/javac/lambda/8019480/T8019480.out Fri Jul 05 11:02:17 2013 +0100 3.3 @@ -0,0 +1,3 @@ 3.4 +T8019480.java:21:46: compiler.err.report.access: clone(), protected, java.lang.Object 3.5 +T8019480.java:21:34: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.Object,{(compiler.misc.inapplicable.method: kindname.method, java.util.Collection, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(int,U), (compiler.misc.arg.length.mismatch))} 3.6 +2 errors