RFR: 8027682: javac wrongly accepts semicolons in package and import decls [v2]
Jonathan Gibbons
jjg at openjdk.org
Tue Feb 7 00:08:25 UTC 2023
On Tue, 7 Feb 2023 00:01:47 GMT, Archie L. Cobbs <duke at openjdk.org> wrote:
>> JLS [§7.3](https://docs.oracle.com/javase/specs/jls/se19/html/jls-7.html#jls-7.3) specifies that while a lone semi-colon is a valid _TopLevelClassOrInterfaceDeclaration_, it is not a valid _ImportDeclaration_. Therefore, if we see a lone semi-colon while looking for the next import statement we have to advance and accept a class declaration, and we can therefore no longer accept any further `import` statements.
>>
>> However, the compiler was allowing this, for example:
>>
>> package p; import X; ;;; import Y; class Foo {}
>>
>> The bug is that the parser was switching out of "look for imports" mode after parsing a valid class declaration, but it was not switching out of "look for imports" mode after parsing a lone semi-colon.
>>
>> The fix to `JavacParser.java` is easy, however it also requires these adjustments to unit tests:
>>
>> * Test `tree/T6963934.java` must go away, because it is verifying a bug that only happens when the above bogus input is successfully parsed, and this can no longer happen.
>> * A bug in `lib/types/TypeHarness.java` was uncovered and fixed; it was inserting an extra semi-colon.
>> * The following bugs, which check invalid syntax within import statements, now generate different parse errors and therefor needed their "golden output" updated:
>> * annotations/typeAnnotations/failures/AnnotatedImport.java
>> * annotations/typeAnnotations/failures/AnnotatedPackage1.java
>> * annotations/typeAnnotations/failures/AnnotatedPackage2.java
>
> Archie L. Cobbs has updated the pull request incrementally with two additional commits since the last revision:
>
> - Fix some extraneous semi-colons that are now disallowed.
> - Give a more helpful error for spurious semi-colons before import statements.
src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java line 3830:
> 3828: // but here we try to provide a more helpful error message if we encounter any.
> 3829: // Do that by slurping in as many semi-colons as possible, and then seeing what
> 3830: // comes after before deciding how best to handle them.
Maybe it's my fault for misleading you in the discussion, but the dictionary says that "semicolon" is not a hyphenated word.
-------------
PR: https://git.openjdk.org/jdk/pull/12448
More information about the compiler-dev
mailing list