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 0518adc134e..567a0303fd5 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 @@ -3925,29 +3925,23 @@ public class JavacParser implements Parser { } else { int pos = token.pos; List errs; - if (token.kind == IDENTIFIER && token.name() == names.record) { - checkSourceLevel(Feature.RECORDS); - JCErroneous erroneousTree = syntaxError(token.pos, List.of(mods), Errors.RecordHeaderExpected); - return toP(F.Exec(erroneousTree)); + if (LAX_IDENTIFIER.test(token.kind)) { + errs = List.of(mods, toP(F.at(pos).Ident(ident()))); + setErrorEndPos(token.pos); } else { - if (LAX_IDENTIFIER.test(token.kind)) { - errs = List.of(mods, toP(F.at(pos).Ident(ident()))); - setErrorEndPos(token.pos); - } else { - errs = List.of(mods); - } - final JCErroneous erroneousTree; - if (parseModuleInfo) { - erroneousTree = syntaxError(pos, errs, Errors.ExpectedModuleOrOpen); - } else { - if (allowRecords) { - erroneousTree = syntaxError(pos, errs, Errors.Expected4(CLASS, INTERFACE, ENUM, "record")); - } else { - erroneousTree = syntaxError(pos, errs, Errors.Expected3(CLASS, INTERFACE, ENUM)); - } - } - return toP(F.Exec(erroneousTree)); + errs = List.of(mods); } + final JCErroneous erroneousTree; + if (parseModuleInfo) { + erroneousTree = syntaxError(pos, errs, Errors.ExpectedModuleOrOpen); + } else { + if (allowRecords) { + erroneousTree = syntaxError(pos, errs, Errors.Expected4(CLASS, INTERFACE, ENUM, "record")); + } else { + erroneousTree = syntaxError(pos, errs, Errors.Expected3(CLASS, INTERFACE, ENUM)); + } + } + return toP(F.Exec(erroneousTree)); } } @@ -4426,10 +4420,7 @@ public class JavacParser implements Parser { } protected boolean isRecordStart() { - if (token.kind == IDENTIFIER && token.name() == names.record && - (peekToken(TokenKind.IDENTIFIER, TokenKind.LPAREN) || - peekToken(TokenKind.IDENTIFIER, TokenKind.EOF) || - peekToken(TokenKind.IDENTIFIER, TokenKind.LT))) { + if (token.kind == IDENTIFIER && token.name() == names.record && peekToken(TokenKind.IDENTIFIER)) { checkSourceLevel(Feature.RECORDS); return true; } else { 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 db5d3a0e76a..1c6cdd5429a 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 @@ -3774,9 +3774,6 @@ compiler.err.instance.initializer.not.allowed.in.records=\ compiler.err.static.declaration.not.allowed.in.inner.classes=\ static declarations not allowed in inner classes -compiler.err.record.header.expected=\ - record header expected - ############################################ # messages previously at javac.properties diff --git a/test/langtools/tools/javac/diags/examples/IncorrectRecordDeclaration.java b/test/langtools/tools/javac/diags/examples/IncorrectRecordDeclaration.java index dc1dd8af632..2b0d0c9673c 100644 --- a/test/langtools/tools/javac/diags/examples/IncorrectRecordDeclaration.java +++ b/test/langtools/tools/javac/diags/examples/IncorrectRecordDeclaration.java @@ -21,6 +21,7 @@ * questions. */ -// key: compiler.err.record.header.expected +// key: compiler.err.expected +// key: compiler.err.illegal.start.of.type record R {} diff --git a/test/langtools/tools/javac/records/RecordCompilationTests.java b/test/langtools/tools/javac/records/RecordCompilationTests.java index baa58ef8d83..656246620a1 100644 --- a/test/langtools/tools/javac/records/RecordCompilationTests.java +++ b/test/langtools/tools/javac/records/RecordCompilationTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2022, 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 @@ -25,7 +25,7 @@ * RecordCompilationTests * * @test - * @bug 8250629 8252307 8247352 8241151 8246774 8259025 8288130 8282714 8289647 + * @bug 8250629 8252307 8247352 8241151 8246774 8259025 8288130 8282714 8289647 8294020 * @summary Negative compilation tests, and positive compilation (smoke) tests for records * @library /lib/combo /tools/lib /tools/javac/lib * @modules @@ -149,7 +149,7 @@ public class RecordCompilationTests extends CompilationTestCase { assertFail("compiler.err.expected", "record R();"); assertFail("compiler.err.illegal.start.of.type", "record R(,) { }"); assertFail("compiler.err.illegal.start.of.type", "record R((int x)) { }"); - assertFail("compiler.err.record.header.expected", "record R { }"); + assertFail("compiler.err.expected", "record R { }"); assertFail("compiler.err.expected", "record R(foo) { }"); assertFail("compiler.err.expected", "record R(int int) { }"); assertFail("compiler.err.mod.not.allowed.here", "abstract record R(String foo) { }"); diff --git a/test/langtools/tools/javac/records/RecordDeclarationSyntaxTest.java b/test/langtools/tools/javac/records/RecordDeclarationSyntaxTest.java new file mode 100644 index 00000000000..a00d72fdd09 --- /dev/null +++ b/test/langtools/tools/javac/records/RecordDeclarationSyntaxTest.java @@ -0,0 +1,10 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8294020 + * @summary improve error position for records without header + * @compile/fail/ref=RecordDeclarationSyntaxTest.out -XDrawDiagnostics RecordDeclarationSyntaxTest.java + */ + +class RecordDeclarationSyntaxTest { + record R {} // no header +} diff --git a/test/langtools/tools/javac/records/RecordDeclarationSyntaxTest.out b/test/langtools/tools/javac/records/RecordDeclarationSyntaxTest.out new file mode 100644 index 00000000000..32f526ebbc8 --- /dev/null +++ b/test/langtools/tools/javac/records/RecordDeclarationSyntaxTest.out @@ -0,0 +1,3 @@ +RecordDeclarationSyntaxTest.java:9:13: compiler.err.expected: '(' +RecordDeclarationSyntaxTest.java:9:14: compiler.err.illegal.start.of.type +2 errors