diff --git a/checker/tests/nullness/Issue3020.java b/checker/tests/nullness/Issue3020.java new file mode 100644 index 00000000000..b8d735d9eba --- /dev/null +++ b/checker/tests/nullness/Issue3020.java @@ -0,0 +1,17 @@ +enum Issue3020 { + INSTANCE; + + void retrieveConstant() { + Class theClass = Issue3020.class; + // :: error: (accessing.nullable) + Object unused = passThrough(theClass.getEnumConstants())[0]; + } + + void nonNullArray(String[] p) { + Object unused = passThrough(p)[0]; + } + + T passThrough(T t) { + return t; + } +} diff --git a/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java b/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java index ca2c9919352..681b15b7d4c 100644 --- a/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java +++ b/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java @@ -36,6 +36,7 @@ import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedWildcardType; import org.checkerframework.framework.type.visitor.AnnotatedTypeMerger; import org.checkerframework.framework.util.AnnotatedTypes; +import org.checkerframework.javacutil.BugInCF; import org.checkerframework.javacutil.Pair; import org.checkerframework.javacutil.TreeUtils; @@ -224,8 +225,17 @@ public AnnotatedTypeMirror visitArrayAccess(ArrayAccessTree node, AnnotatedTypeF f.visitorState.setAssignmentContext(null); AnnotatedTypeMirror type = f.getAnnotatedType(node.getExpression()); - assert type instanceof AnnotatedArrayType; - return ((AnnotatedArrayType) type).getComponentType(); + if (type.getKind() == TypeKind.ARRAY) { + return ((AnnotatedArrayType) type).getComponentType(); + } else if (type.getKind() == TypeKind.WILDCARD + && ((AnnotatedWildcardType) type).isUninferredTypeArgument()) { + // Clean-up after Issue #979. + AnnotatedTypeMirror wcbound = ((AnnotatedWildcardType) type).getExtendsBound(); + if (wcbound instanceof AnnotatedArrayType) { + return ((AnnotatedArrayType) wcbound).getComponentType(); + } + } + throw new BugInCF("Unexpected type: " + type); } finally { f.visitorState.setAssignmentContext(preAssCtxt); }