diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index d83fb85b7f2..9b3be5c5e00 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -3921,6 +3921,7 @@ public JCTree.JCCompilationUnit parseCompilationUnit() { boolean firstTypeDecl = true; // have we seen a class, enum, or interface declaration yet? boolean isImplicitClass = false; + boolean canBeImplicitClass = true; OUTER: while (token.kind != EOF) { if (token.pos <= endPosTable.errorEndPos) { // error recovery @@ -3989,7 +3990,7 @@ public JCTree.JCCompilationUnit parseCompilationUnit() { // it is parsed. Otherwise, parsing continues as though // implicitly declared classes did not exist and error reporting // is the same as in the past. - if (Feature.IMPLICIT_CLASSES.allowedInSource(source) && !isDeclaration()) { + if (canBeImplicitClass && Feature.IMPLICIT_CLASSES.allowedInSource(source) && !isDeclaration()) { final JCModifiers finalMods = mods; JavacParser speculative = new VirtualParser(this); List speculativeResult = @@ -4005,6 +4006,7 @@ public JCTree.JCCompilationUnit parseCompilationUnit() { defs.appendList(topLevelMethodOrFieldDeclaration(mods, docComment)); isImplicitClass = true; } else { + canBeImplicitClass = false; JCTree def = typeDeclaration(mods, docComment); if (def instanceof JCExpressionStatement statement) def = statement.expr;