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 04318a3ab49..b49d9652e1a 100644 --- a/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java +++ b/framework/src/main/java/org/checkerframework/framework/type/TypeFromExpressionVisitor.java @@ -22,9 +22,11 @@ import com.sun.source.tree.ParenthesizedTree; import com.sun.source.tree.PrimitiveTypeTree; import com.sun.source.tree.Tree; +import com.sun.source.tree.Tree.Kind; import com.sun.source.tree.TypeCastTree; import com.sun.source.tree.UnaryTree; import com.sun.source.tree.WildcardTree; +import com.sun.source.util.TreePath; import java.util.List; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -271,11 +273,24 @@ public AnnotatedTypeMirror visitMemberSelect(MemberSelectTree tree, AnnotatedTyp return AnnotatedTypes.asSuper( f, thisType, AnnotatedTypeMirror.createType(superTypeMirror, f, false)); } else { - // tree must be a field access, so get the type of the (receiver) expression, and then call - // asMemberOf. + // tree must be a field access or an enum constant, so get the type of the (receiver) + // expression, and then call asMemberOf. AnnotatedTypeMirror typeOfReceiver = f.getAnnotatedType(tree.getExpression()); typeOfReceiver = f.applyCaptureConversion(typeOfReceiver); - return f.applyCaptureConversion(AnnotatedTypes.asMemberOf(f.types, f, typeOfReceiver, elt)); + AnnotatedTypeMirror typeOfFieldAccess = + AnnotatedTypes.asMemberOf(f.types, f, typeOfReceiver, elt); + TreePath path = f.getPath(tree); + + // Only capture the type if this is not the left hand side of an assignment. + if (path != null && path.getParentPath().getLeaf().getKind() == Kind.ASSIGNMENT) { + AssignmentTree assignmentTree = (AssignmentTree) path.getParentPath().getLeaf(); + @SuppressWarnings("interning:not.interned") // Looking for exact object. + boolean leftHandSide = assignmentTree.getExpression() != tree; + if (leftHandSide) { + return typeOfFieldAccess; + } + } + return f.applyCaptureConversion(typeOfFieldAccess); } } diff --git a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceType.java b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceType.java index 08d9405c53f..15e7879da87 100644 --- a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceType.java +++ b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceType.java @@ -234,7 +234,7 @@ public int hashCode() { @Override public TypeMirror getJavaType() { - return typeMirror; + return type.getUnderlyingType(); } @Override diff --git a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/ProperType.java b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/ProperType.java index 2f9455c944d..1fd6cf8077d 100644 --- a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/ProperType.java +++ b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/ProperType.java @@ -240,7 +240,7 @@ public int hashCode() { @Override public TypeMirror getJavaType() { - return properType; + return type.getUnderlyingType(); } @Override diff --git a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/UseOfVariable.java b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/UseOfVariable.java index 5cb7e136f01..0a3b2394995 100644 --- a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/UseOfVariable.java +++ b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/UseOfVariable.java @@ -95,7 +95,7 @@ public UseOfVariable getErased() { @Override public TypeVariable getJavaType() { - return variable.typeVariableJava; + return variable.typeVariable.getUnderlyingType(); } @Override diff --git a/framework/tests/all-systems/Issue6825.java b/framework/tests/all-systems/Issue6825.java index d158645fe1f..8a2e332258e 100644 --- a/framework/tests/all-systems/Issue6825.java +++ b/framework/tests/all-systems/Issue6825.java @@ -1,3 +1,6 @@ +import java.util.ArrayList; +import java.util.List; + @SuppressWarnings("all") // Just check for crashes. public class Issue6825 { static class ClassA {} @@ -9,4 +12,13 @@ void method(Number n) { var y = flag ? f : new ClassA(); var x = flag ? this.f : new ClassA(); } + + static class SomeClass {} + + private List typeParameters = null; + + public Issue6825(Issue6825 other) { + this.typeParameters = + other.typeParameters == null ? null : new ArrayList<>(other.typeParameters); + } }