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 934728e49ed48..5f18bfd8c17a9 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 @@ -5018,10 +5018,11 @@ protected JCTree methodDeclaratorRest(int pos, if (token.kind == DEFAULT) { accept(DEFAULT); defaultValue = annotationValue(); + accept(SEMI); } else { defaultValue = null; + accept(SEMI, tk -> Errors.Expected2(LBRACE, SEMI)); } - accept(SEMI, tk -> Errors.Expected2(LBRACE, SEMI)); if (token.pos <= endPosTable.errorEndPos) { // error recovery // look if there is a probable missing opening brace, diff --git a/test/langtools/tools/javac/parser/JavacParserTest.java b/test/langtools/tools/javac/parser/JavacParserTest.java index 94cf7cf8e8c50..fdc4d32293891 100644 --- a/test/langtools/tools/javac/parser/JavacParserTest.java +++ b/test/langtools/tools/javac/parser/JavacParserTest.java @@ -2661,6 +2661,45 @@ public class TestB { }"""); } + @Test //JDK-8324859 + void testImplicitlyDeclaredClassesConfusion7() throws IOException { + //after 'default' attribute value, only semicolon (';') is expected, + //not left brace ('{'): + String code = """ + package tests; + public @interface A { + public String value() default "" + } + """; + DiagnosticCollector coll = + new DiagnosticCollector<>(); + JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, fm, coll, + List.of("--enable-preview", "--source", SOURCE_VERSION), + null, Arrays.asList(new MyFileObject(code))); + CompilationUnitTree cut = ct.parse().iterator().next(); + + List codes = new LinkedList<>(); + + for (Diagnostic d : coll.getDiagnostics()) { + codes.add(d.getLineNumber() + ":" + d.getColumnNumber() + ":" + d.getCode()); + } + + assertEquals("testImplicitlyDeclaredClassesConfusion5: " + codes, + List.of("3:37:compiler.err.expected"), + codes); + String result = toStringWithErrors(cut).replaceAll("\\R", "\n"); + System.out.println("RESULT\n" + result); + assertEquals("incorrect AST", + result, + """ + package tests; + \n\ + public @interface A { + \n\ + public String value() default ""; + }"""); + } + void run(String[] args) throws Exception { int passed = 0, failed = 0; final Pattern p = (args != null && args.length > 0)