Thu, 06 Jun 2013 15:37:23 +0100
8015648: Duplicate variable in lambda causes javac crash
Summary: Missing flag in synthetic lambda blog is causing duplicates symbol to go undetected
Reviewed-by: jjg, vromero
1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jun 06 15:35:05 2013 +0100 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jun 06 15:37:23 2013 +0100 1.3 @@ -2609,7 +2609,7 @@ 1.4 //field initializer 1.5 lambdaEnv = env.dup(that, env.info.dup(env.info.scope.dupUnshared())); 1.6 lambdaEnv.info.scope.owner = 1.7 - new MethodSymbol(0, names.empty, null, 1.8 + new MethodSymbol((owner.flags() & STATIC) | BLOCK, names.empty, null, 1.9 env.info.scope.owner); 1.10 } else { 1.11 lambdaEnv = env.dup(that, env.info.dup(env.info.scope.dup()));
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/javac/lambda/LambdaScope05.java Thu Jun 06 15:37:23 2013 +0100 2.3 @@ -0,0 +1,31 @@ 2.4 +/* 2.5 + * @test /nodynamiccopyright/ 2.6 + * @bug 8015648 2.7 + * @summary Duplicate variable in lambda causes javac crash 2.8 + * @compile/fail/ref=LambdaScope05.out -XDrawDiagnostics LambdaScope05.java 2.9 + */ 2.10 + 2.11 +class LambdaScope05 { 2.12 + interface VoidFun1 { 2.13 + void m(int i); 2.14 + } 2.15 + 2.16 + static Runnable r1 = () -> { VoidFun1 p = p -> { }; }; 2.17 + Runnable r2 = () -> { VoidFun1 p = p -> { }; }; 2.18 + 2.19 + static { 2.20 + Runnable r = () -> { VoidFun1 p = p -> { }; }; 2.21 + } 2.22 + 2.23 + { 2.24 + Runnable r = () -> { VoidFun1 p = p -> { }; }; 2.25 + } 2.26 + 2.27 + static void m_static() { 2.28 + Runnable r = () -> { VoidFun1 p = p -> { }; }; 2.29 + } 2.30 + 2.31 + void m() { 2.32 + Runnable r = () -> { VoidFun1 p = p -> { }; }; 2.33 + } 2.34 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/javac/lambda/LambdaScope05.out Thu Jun 06 15:37:23 2013 +0100 3.3 @@ -0,0 +1,7 @@ 3.4 +LambdaScope05.java:13:47: compiler.err.already.defined.in.clinit: kindname.variable, p, kindname.static.init, kindname.class, LambdaScope05 3.5 +LambdaScope05.java:14:40: compiler.err.already.defined.in.clinit: kindname.variable, p, kindname.instance.init, kindname.class, LambdaScope05 3.6 +LambdaScope05.java:17:43: compiler.err.already.defined.in.clinit: kindname.variable, p, kindname.static.init, kindname.class, LambdaScope05 3.7 +LambdaScope05.java:21:43: compiler.err.already.defined.in.clinit: kindname.variable, p, kindname.instance.init, kindname.class, LambdaScope05 3.8 +LambdaScope05.java:25:43: compiler.err.already.defined: kindname.variable, p, kindname.method, m_static() 3.9 +LambdaScope05.java:29:43: compiler.err.already.defined: kindname.variable, p, kindname.method, m() 3.10 +6 errors