8013222: Javac issues spurious raw type warnings when lambda has implicit parameter types

Wed, 15 May 2013 14:03:09 +0100

author
mcimadamore
date
Wed, 15 May 2013 14:03:09 +0100
changeset 1761
78717f2d00e8
parent 1760
33d1937af1a3
child 1762
31ef33db5e0e

8013222: Javac issues spurious raw type warnings when lambda has implicit parameter types
Summary: Bad warnings and position for lambda inferred parameter types
Reviewed-by: jjg, vromero

src/share/classes/com/sun/tools/javac/comp/Attr.java file | annotate | diff | comparison | revisions
test/tools/javac/lambda/NoWarnOnImplicitParams.java file | annotate | diff | comparison | revisions
test/tools/javac/lambda/NoWarnOnImplicitParams.out file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed May 15 14:02:37 2013 +0100
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed May 15 14:03:09 2013 +0100
     1.3 @@ -1056,7 +1056,10 @@
     1.4          Lint prevLint = chk.setLint(lint);
     1.5  
     1.6          // Check that the variable's declared type is well-formed.
     1.7 -        chk.validate(tree.vartype, env);
     1.8 +        boolean isImplicitLambdaParameter = env.tree.hasTag(LAMBDA) &&
     1.9 +                ((JCLambda)env.tree).paramKind == JCLambda.ParameterKind.IMPLICIT &&
    1.10 +                (tree.sym.flags() & PARAMETER) != 0;
    1.11 +        chk.validate(tree.vartype, env, !isImplicitLambdaParameter);
    1.12          deferredLintHandler.flush(tree.pos());
    1.13  
    1.14          try {
    1.15 @@ -2344,7 +2347,7 @@
    1.16                      Type argType = arityMismatch ?
    1.17                              syms.errType :
    1.18                              actuals.head;
    1.19 -                    params.head.vartype = make.Type(argType);
    1.20 +                    params.head.vartype = make.at(params.head).Type(argType);
    1.21                      params.head.sym = null;
    1.22                      actuals = actuals.isEmpty() ?
    1.23                              actuals :
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/tools/javac/lambda/NoWarnOnImplicitParams.java	Wed May 15 14:03:09 2013 +0100
     2.3 @@ -0,0 +1,26 @@
     2.4 +/*
     2.5 + * @test /nodynamiccopyright/
     2.6 + * @bug 8013222
     2.7 + * @summary Javac issues spurious raw type warnings when lambda has implicit parameter types
     2.8 + * @compile/fail/ref=NoWarnOnImplicitParams.out -Xlint:rawtypes -Werror -XDrawDiagnostics NoWarnOnImplicitParams.java
     2.9 + */
    2.10 +import java.util.List;
    2.11 +
    2.12 +class NoWarnOnImplicitParams {
    2.13 +
    2.14 +    public void testRawMerge(List<String> ls) {
    2.15 +        R12 r12_1 = l->"Foo";
    2.16 +        R12 r12_2 = (List l)->"Foo";
    2.17 +    }
    2.18 +
    2.19 +    interface R1 {
    2.20 +        Object m(List<String> ls);
    2.21 +    }
    2.22 +
    2.23 +    @SuppressWarnings("rawtypes")
    2.24 +    interface R2 {
    2.25 +        String m(List l);
    2.26 +    }
    2.27 +
    2.28 +    interface R12 extends R1, R2 {}
    2.29 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/tools/javac/lambda/NoWarnOnImplicitParams.out	Wed May 15 14:03:09 2013 +0100
     3.3 @@ -0,0 +1,4 @@
     3.4 +NoWarnOnImplicitParams.java:13:22: compiler.warn.raw.class.use: java.util.List, java.util.List<E>
     3.5 +- compiler.err.warnings.and.werror
     3.6 +1 error
     3.7 +1 warning

mercurial