From 259ac1dcaff0b244d88f957d40e7e7a4450325de Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Tue, 25 Feb 2020 09:25:35 -0500 Subject: [PATCH 1/2] Handle uninferred type parameter in array accesses. --- checker/tests/nullness/Issue3020.java | 17 +++++++++++++++++ .../type/TypeFromExpressionVisitor.java | 14 ++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 checker/tests/nullness/Issue3020.java 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..3dea8c5f330 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 instanceof AnnotatedArrayType) { + return ((AnnotatedArrayType) type).getComponentType(); + } else if (type instanceof AnnotatedWildcardType) { + // Clean-up after Issue #979. + AnnotatedWildcardType wc = (AnnotatedWildcardType) type; + AnnotatedTypeMirror wcbound = wc.getExtendsBound(); + if (wcbound instanceof AnnotatedArrayType) { + return ((AnnotatedArrayType) wcbound).getComponentType(); + } + } + throw new BugInCF("Unexpected type: " + type); } finally { f.visitorState.setAssignmentContext(preAssCtxt); } From 25cab2f0c85c19caa0e8032329e50639602eb432 Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Thu, 27 Feb 2020 14:37:38 -0500 Subject: [PATCH 2/2] Improvements. --- .../framework/type/TypeFromExpressionVisitor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 3dea8c5f330..681b15b7d4c 100644 --- a/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java +++ b/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java @@ -225,12 +225,12 @@ public AnnotatedTypeMirror visitArrayAccess(ArrayAccessTree node, AnnotatedTypeF f.visitorState.setAssignmentContext(null); AnnotatedTypeMirror type = f.getAnnotatedType(node.getExpression()); - if (type instanceof AnnotatedArrayType) { + if (type.getKind() == TypeKind.ARRAY) { return ((AnnotatedArrayType) type).getComponentType(); - } else if (type instanceof AnnotatedWildcardType) { + } else if (type.getKind() == TypeKind.WILDCARD + && ((AnnotatedWildcardType) type).isUninferredTypeArgument()) { // Clean-up after Issue #979. - AnnotatedWildcardType wc = (AnnotatedWildcardType) type; - AnnotatedTypeMirror wcbound = wc.getExtendsBound(); + AnnotatedTypeMirror wcbound = ((AnnotatedWildcardType) type).getExtendsBound(); if (wcbound instanceof AnnotatedArrayType) { return ((AnnotatedArrayType) wcbound).getComponentType(); }