diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index c416d188337..f0a27f7b8d5 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -1454,11 +1454,11 @@ public class LambdaToMethod extends TreeTranslator { localContext = localContext.prev; } } + super.visitNewClass(tree); if (context() != null && !inReferencedClass && isLocal) { LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context(); captureLocalClassDefs(def, lambdaContext); } - super.visitNewClass(tree); } //where void captureLocalClassDefs(Symbol csym, final LambdaTranslationContext lambdaContext) { diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java index 095e5f68d28..9eaa36bc498 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java @@ -2827,7 +2827,14 @@ public class Lower extends TreeTranslator { // If we have an anonymous class, create its flat version, rather // than the class or interface following new. if (tree.def != null) { - translate(tree.def); + Map prevLambdaTranslationMap = lambdaTranslationMap; + try { + lambdaTranslationMap = null; + translate(tree.def); + } finally { + lambdaTranslationMap = prevLambdaTranslationMap; + } + tree.clazz = access(make_at(tree.clazz.pos()).Ident(tree.def.sym)); tree.def = null; } else { diff --git a/test/langtools/tools/javac/lambda/LambdaConv30.java b/test/langtools/tools/javac/lambda/LambdaConv30.java new file mode 100644 index 00000000000..52e26fa2b49 --- /dev/null +++ b/test/langtools/tools/javac/lambda/LambdaConv30.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8229862 + * @summary Verifying lambdas anonymous classes whose supertype captures works. + * @compile LambdaConv30.java + * @run main LambdaConv30 + */ +public class LambdaConv30 { + + public static void main(String[] args) { + Integer a = 1; + class Inner { + int i; + Inner(int i) { + this.i = i; + } + + public int result() { + return a * 1000 + i; + } + } + SAM s = v -> new Inner(v) { }.result(); + if (s.m(2) != 1002) { + throw new AssertionError("Unexpected value!"); + } + } + + interface SAM { + int m(int v); + } +}