diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 7bd813cddb73a..ae489536ec4fc 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -50,9 +50,11 @@ import com.sun.tools.javac.comp.DeferredAttr.AttrMode; import com.sun.tools.javac.comp.MatchBindingsComputer.MatchBindings; import com.sun.tools.javac.jvm.*; + import static com.sun.tools.javac.resources.CompilerProperties.Fragments.Diamond; import static com.sun.tools.javac.resources.CompilerProperties.Fragments.DiamondInvalidArg; import static com.sun.tools.javac.resources.CompilerProperties.Fragments.DiamondInvalidArgs; + import com.sun.tools.javac.resources.CompilerProperties.Errors; import com.sun.tools.javac.resources.CompilerProperties.Fragments; import com.sun.tools.javac.resources.CompilerProperties.Warnings; @@ -2909,6 +2911,12 @@ private void visitAnonymousClassDefinition(JCNewClass tree, JCExpression clazz, // ... // } InferenceContext inferenceContext = resultInfo.checkContext.inferenceContext(); + Type enclType = clazztype.getEnclosingType(); + if (enclType != null && + enclType.hasTag(CLASS) && + !chk.checkDenotable((ClassType)enclType)) { + log.error(tree.encl, Errors.EnclosingClassTypeNonDenotable(enclType)); + } final boolean isDiamond = TreeInfo.isDiamond(tree); if (isDiamond && ((tree.constructorType != null && inferenceContext.free(tree.constructorType)) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 3fd713fabfcb1..ae2f1f8c6fc75 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -3912,3 +3912,8 @@ compiler.warn.declared.using.preview=\ compiler.warn.attempt.to.synchronize.on.instance.of.value.based.class=\ attempt to synchronize on an instance of a value-based class + +# 0: type +compiler.err.enclosing.class.type.non.denotable=\ + enclosing class type: {0}\n\ + is non-denotable, try casting to a denotable type diff --git a/test/langtools/tools/javac/8203436/T8203436a.java b/test/langtools/tools/javac/8203436/T8203436a.java index eba0f827c8626..db47a62e67270 100644 --- a/test/langtools/tools/javac/8203436/T8203436a.java +++ b/test/langtools/tools/javac/8203436/T8203436a.java @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8203436 + * @bug 8203436 8211004 * @summary javac should fail early when emitting illegal signature attributes * @compile/fail/ref=T8203436a.out -XDrawDiagnostics T8203436a.java */ diff --git a/test/langtools/tools/javac/8203436/T8203436a.out b/test/langtools/tools/javac/8203436/T8203436a.out index 71b7e6871664f..e076a20a2a845 100644 --- a/test/langtools/tools/javac/8203436/T8203436a.out +++ b/test/langtools/tools/javac/8203436/T8203436a.out @@ -1,2 +1,2 @@ -- compiler.err.cannot.generate.class: compiler.misc.anonymous.class: T8203436a$1, (compiler.misc.illegal.signature: compiler.misc.anonymous.class: T8203436a$1, compiler.misc.type.captureof: 1, ?) +T8203436a.java:12:7: compiler.err.enclosing.class.type.non.denotable: T8203436a 1 error diff --git a/test/langtools/tools/javac/8203436/T8203436b.out b/test/langtools/tools/javac/8203436/T8203436b.out index 979e550fff6c8..48eb947cecf1e 100644 --- a/test/langtools/tools/javac/8203436/T8203436b.out +++ b/test/langtools/tools/javac/8203436/T8203436b.out @@ -1,2 +1,2 @@ -- compiler.err.cannot.generate.class: compiler.misc.anonymous.class: T8203436b$1, (compiler.misc.illegal.signature: compiler.misc.anonymous.class: T8203436b$1, java.lang.Object&T8203436b.A&T8203436b.B) +T8203436b.java:17:10: compiler.err.enclosing.class.type.non.denotable: T8203436b 1 error diff --git a/test/langtools/tools/javac/diags/examples.not-yet.txt b/test/langtools/tools/javac/diags/examples.not-yet.txt index f257b7df8e09d..9f9f8f7801447 100644 --- a/test/langtools/tools/javac/diags/examples.not-yet.txt +++ b/test/langtools/tools/javac/diags/examples.not-yet.txt @@ -206,3 +206,4 @@ compiler.warn.source.target.conflict compiler.warn.target.default.source.conflict compiler.err.preview.not.latest compiler.err.preview.without.source.or.release +compiler.misc.illegal.signature # the compiler can now detect more non-denotable types before class writing diff --git a/test/langtools/tools/javac/diags/examples/IllegalSignature.java b/test/langtools/tools/javac/diags/examples/IllegalSignature.java index a9b64b41afa68..96b93b6bdabbd 100644 --- a/test/langtools/tools/javac/diags/examples/IllegalSignature.java +++ b/test/langtools/tools/javac/diags/examples/IllegalSignature.java @@ -21,8 +21,7 @@ * questions. */ -// key: compiler.err.cannot.generate.class -// key: compiler.misc.illegal.signature +// key: compiler.err.enclosing.class.type.non.denotable class IllegalSignature { class Inner { } diff --git a/test/langtools/tools/javac/generics/diamond/neg/Neg21.out b/test/langtools/tools/javac/generics/diamond/neg/Neg21.out index 35e1a94cc156e..d273f7ae71300 100644 --- a/test/langtools/tools/javac/generics/diamond/neg/Neg21.out +++ b/test/langtools/tools/javac/generics/diamond/neg/Neg21.out @@ -1,2 +1,3 @@ +Neg21.java:13:9: compiler.err.enclosing.class.type.non.denotable: Neg21 Neg21.java:13:28: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg21.A), (compiler.misc.diamond.invalid.arg: java.lang.Object&java.io.Serializable&java.lang.Cloneable, (compiler.misc.diamond: Neg21.A)) -1 error +2 errors