# HG changeset patch # User jlahoda # Date 1415962708 -3600 # Node ID eb2cbcdc86bb5d71dd9e87ea15241f8a68476cbd # Parent 82f4cb44b2d7af2352f48568a64b7b6a5ae960cd 8062747: Compiler error when anonymous class uses method with parametrized exception Summary: When inferring lambda's thrown types, avoid tracking variables that are not under the lambda to avoid crashes. Reviewed-by: vromero diff -r 82f4cb44b2d7 -r eb2cbcdc86bb langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java Wed Jul 05 20:07:55 2017 +0200 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java Fri Nov 14 11:58:28 2014 +0100 @@ -242,9 +242,15 @@ Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log); try { new AssignAnalyzer() { + WriteableScope enclosedSymbols = WriteableScope.create(env.enclClass.sym); + @Override + public void visitVarDef(JCVariableDecl tree) { + enclosedSymbols.enter(tree.sym); + super.visitVarDef(tree); + } @Override protected boolean trackable(VarSymbol sym) { - return !env.info.scope.includes(sym) && + return enclosedSymbols.includes(sym) && sym.owner.kind == MTH; } }.analyzeTree(env, that); diff -r 82f4cb44b2d7 -r eb2cbcdc86bb langtools/test/tools/javac/flow/T8062747.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/flow/T8062747.java Fri Nov 14 11:58:28 2014 +0100 @@ -0,0 +1,24 @@ +/** + * @test + * @bug 8062747 + * @summary Avoiding an error for lambdas with thrown types inference inside an anonymous class. + * @compile T8062747.java + */ +public class T8062747 { + + public interface Throwing { + void canThrow() throws Y; + } + + public static void wrap(Throwing action) { + } + + public static void invoke(String a) { + Runnable r = new Runnable() { + @Override + public void run() { + wrap(() -> System.out.println(a)); + } + }; + } +}