Integrated: 8191460: crash in Annotate with duplicate declaration and annotation processing enabled

Vicente Romero vromero at openjdk.org
Tue Nov 14 15:20:46 UTC 2023


On Wed, 1 Nov 2023 04:45:36 GMT, Vicente Romero <vromero at openjdk.org> wrote:

> This PR is removing an assertion in `com.sun.tools.javac.comp.Annotate`. The assertion is being thrown for a special, corner-ish, case. Basically having:
> 
> package p;
> @Deprecated class T {}  // see that class T is annotated
> 
> and:
> 
> package p;
> class Y {
>     @interface A {}
>     @interface A {} // error: class A is already defined
>     T t;
> }
> 
> class `Y` has a duplicate definition of annotation `A`. Now if class `T` is compiled first as in:
> 
> `javac -d out/ p/T.java`
> 
> and then we do:
> `javac -processor P -cp p:out/:. p/Y.java p/T.java`
> 
> where P is the simplest possible annotation processor, basically doing nothing. IMO what is happening here is that during the second compilation, once the compiler find type `T` in class `Y`, given that T.class is in the classpath, it is loaded and the `@Deprecated` annotation is attached to symbol for type `T`. Then when the source for `T.java` is being compiled and its annotations are being processed we get to the code where the assertion is. Here the symbol for `T` is not a package but its metadata is not empty and so the assertion is thrown. The fix here is just removing the assertion as as shown by this example it is not an invariant.
> 
> TIA

This pull request has now been integrated.

Changeset: a75b6e56
Author:    Vicente Romero <vromero at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/a75b6e569fe5f8e98326940f541423ac39b204a3
Stats:     184 lines in 2 files changed: 180 ins; 0 del; 4 mod

8191460: crash in Annotate with duplicate declaration and annotation processing enabled

Co-authored-by: Jan Lahoda <jlahoda at openjdk.org>
Reviewed-by: asotona

-------------

PR: https://git.openjdk.org/jdk/pull/16443


More information about the compiler-dev mailing list