Update handling of varargs in unannotated / unmarked code
Opened this issue · 0 comments
msridhar commented
Follow-up to #1025. If the varargs argument is in unannotated code and restrictive annotations are disabled, callers from marked code should be able to pass @Nullable
either for individual varargs arguments or a @Nullable
varargs array.
With restrictive annotations enabled, hopefully this table should cover the behaviors when we see explicit @NonNull
annotations (legacy mode behavior to be confirmed):
Annotation Type | Annotation Position | Mode | @NonNull varargs array |
@NonNull individual args |
---|---|---|---|---|
declaration | - | standard | ❌ | ✅ |
declaration | - | legacy | ✅ | ✅ |
declaration | - | JSpecify | ❌ | ✅ |
type use | before ... |
standard | ✅ | ❌ |
type use | before ... |
legacy | ✅ | ✅ |
type use | before ... |
JSpecify | ✅ | ❌ |
type use | elements | standard | ❌ | ✅ |
type use | elements | legacy | ✅ | ✅ |
type use | elements | JSpecify | ❌ | ✅ |
type use | both | standard | ✅ | ✅ |
type use | both | legacy | ✅ | ✅ |
type use | both | JSpecify | ✅ | ✅ |
both | before ... |
standard | ✅ | ❌ |
both | before ... |
legacy | ✅ | ✅ |
both | before ... |
JSpecify | ✅ | ❌ |
both | elements | standard | ❌ | ✅ |
both | elements | legacy | ✅ | ✅ |
both | elements | JSpecify | ❌ | ✅ |
both | both | standard | ✅ | ✅ |
both | both | legacy | ✅ | ✅ |
both | both | JSpecify | ✅ | ✅ |
Note that restrictive annotations are read from @NullUnmarked
code by default, so calls into @NullUnmarked
code should behave as per the table even if the restrictive annotations flag is not passed.