review request for 8010225 test in typeAnnotations/failures do not test TYPE_USE

Steve Sides steve.sides at oracle.com
Mon Sep 23 11:49:23 PDT 2013


This makes the noted changes: http://cr.openjdk.java.net/~ssides/8010225.3/

Also, I took out any changes to CantAnnotateStaticClass.java/out and 
this change leaves it as is. I saw Werner sent a much more comprehensive 
test for this as a mail attachement. It was CantAnnotateStaticClass2.java.
Werner, could you put that test back as 
CantAnnotateStaticClass.java/.out since your test was inclusive of the 
first and that first was never completed (no final .out file)?

-steve

On 9/17/2013 12:29 PM, Alex Buckley wrote:
> To all: there's a bug in case 4 below.
>
> On 9/17/2013 12:06 PM, Steve Sides wrote:
>> Got it. While whittling on this, I have another question about the
>> compiler's behavior.
>> 1. If I qualify the (not type) annotation,
>>
>>    @Scopes.UniqueInner
>>    class Scopes<T extends @Scopes.UniqueInner Object> {
>>       @interface UniqueInner { };
>>    }
>> I get 1 error, "Scopes.java:11:24:
>> compiler.err.annotation.type.not.applicable". This seems correct as I'm
>> using an annotation on a type usage, and the one on the class is okay.
>
> You are right. The annotation on the upper bound of T is illegal 
> because the Scopes.UniqueInner annotation type is applicable only in 
> locations which existed in Java SE 7 (such as type declarations) and 
> not in new locations in Java SE 8 (such as type uses).
>
>> 2. If I use the annotation unqualified, I get 3 errors, two for
>> "cant.resolve..." and the one above again. I can see that this can also
>> be correct.
>>
>> Scopes.java:10:2: compiler.err.cant.resolve: kindname.class,
>> UniqueInner, ,  // on the class
>> Scopes.java:11:25: compiler.err.cant.resolve: kindname.class,
>> UniqueInner, , // on the bound
>> Scopes.java:11:24:
>> compiler.err.annotation.type.not.applicable               // not a type
>> annotation(I assumed)?
>> 3 errors
>
> The scope of the @interface declaration is the body of class Scopes. 
> Therefore, the simple name "UniqueInner" is not in scope before the { 
> of the declaration of Scopes. All three errors are correct.
>
>> 3. If I use a qualified type annotation,
>> @Scopes.UniqueInner
>> class Scopes<T extends @Scopes.UniqueInner Object> {
>>      @Target(ElementType.TYPE_USE)
>>      @interface UniqueInner { };
>> }
>> it compiles without error.
>
> As it should.
>
>> 4. However, if I use an unqualified type annotation,
>> @UniqueInner
>> class Scopes<T extends @UniqueInner Object> {
>>      @Target(ElementType.TYPE_USE)
>>      @interface UniqueInner { };
>> }
>>   I get the same 3 errors as the unqualified annotation:
>>
>> Scopes.java:10:2: compiler.err.cant.resolve: kindname.class, 
>> UniqueInner, ,
>> Scopes.java:11:25: compiler.err.cant.resolve: kindname.class,
>> UniqueInner, ,
>> Scopes.java:11:24: compiler.err.annotation.type.not.applicable
>> 3 errors
>>
>> Why should I get "compiler.err.annotation.type.not.applicable" in this
>> last scenario?  For 1. I kind of assumed the third error meant it was
>> not applicable because it was not a type annotation.  Is it not
>> applicable for reasons other than not being TYPE_USE?
>
> You are right to ponder what's going on. The third error, about 
> applicability, is a bug.
>
>> I'm thinking of using it as below (and adding a postivie version with
>> qualified name),
>>
>> @UniqueInner
>> class Scopes<T extends @UniqueInner Object>  {
>>      // Unqualified @UniqueInner is not accessible to the class .
>>      // One has to use @Scopes.UniqueInner.
>>      @Target(ElementType.TYPE_USE)
>>      @interface UniqueInner { };
>> }
>>
>> but I'm unsure about that third error and would like to verify it is as
>> expected.
>
> Please add this test. The comment however should not mention 
> accessibility, which is a totally different concept. Say "The simple 
> name UniqueInner is not in scope on the header of class Scopes, so 
> @UniqueInner is not meaningful there. One must use the qualified name, 
> as in @Scopes.UniqueInner."
>
> In addition, the type parameter T is also out of UniqueInner's scope. 
> To ensure that annotations on the class declaration and annotations on 
> the type parameter declaration are handled consistently, @UniqueInner 
> should be written on T as well.
>
> Alex



More information about the type-annotations-dev mailing list