[Checkers] <@ReadOnly Object> generic type (fwd)

Matt Papi mpapi at csail.mit.edu
Tue Mar 25 23:23:24 EDT 2008


> The compiler API sees the type
> List<@ReadOnly Object>
> as
> List<@ReadOnly Object extends Object>
> , causing the framework to emit an error, since @ReadOnly Object is not a 
> subtype of Object.

This is actually the intended behavior. It's because List is declared as 
"List<T>", which is really "List<T extends Object>", which is (in the 
current implementation) really "List<T extends @Mutable Object>".

I should have realized that this would be an issue for 
@ReadOnly/@Mutable, though it didn't break any tests when I committed it 
last week (and still doesn't seem to, despite 
tests/javari/ForEnhanced.java using "List<@ReadOnly Object>").

> I have two possible ideas to fix this bug:
> 1. Check on BaseTypeVisitor if the upper bound is Object, and if so, do not 
> call commonAssignmentCheck

This one will certainly break the NonNull checker. See the GenericArgs 
test case: if there's a class Cell<T extends @NonNull Object> and it's 
instantiated via "new Cell<@Nullable Object>()", that should (and 
currently does) cause an error.

> 2. Modify the local (javari) version of commonAssignmentCheck, to add the 
> @ReadOnly annotation to the upperbound if it is object and if the error key is 
> "generic.argument.invalid".

The code to do this probably doesn't belong in commonAssignmentCheck, so 
I don't think this is ideal (as you mentioned). Two fixes that I think 
are a bit cleaner are:

- in the Javari-annotated JDK, change List<T> to List<T extends 
@ReadOnly Object>, etc. (probably much more work than is worthwhile!)

- in the framework, make it possible for a checker to override the 
default upper bound (so Javari can specify the default to be @ReadOnly 
Object), or somehow determine what it should be using the checker's 
annotation relation graph (eventually)

> The nonnull tests do not all pass either before or after the fix

Are you sure they don't pass before the fix? This might be part of the 
confusion -- as of r2018, and at least since r2008, the test suites of 
all the checkers (including NonNull and its GenericArgs test) are 
completely passing.

- Matt

More information about the checkers mailing list