8019480: Javac crashes when method is called on a type-variable receiver from lambda expression

Fri, 05 Jul 2013 11:02:17 +0100

author
mcimadamore
date
Fri, 05 Jul 2013 11:02:17 +0100
changeset 1888
70b37cdb19d5
parent 1887
7b756b307e12
child 1889
b0386f0dc28e

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

src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java file | annotate | diff | comparison | revisions
test/tools/javac/lambda/8019480/T8019480.java file | annotate | diff | comparison | revisions
test/tools/javac/lambda/8019480/T8019480.out file | annotate | diff | comparison | revisions
     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

mercurial