diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a9827db12756..9eac46c04a7d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -42,6 +42,7 @@ Optional Checker. **Closed issues:** +eisop#792. Version 3.49.5-eisop1 (April 26, 2026) -------------------------------------- diff --git a/framework/src/main/java/org/checkerframework/framework/type/typeannotator/PropagationTypeAnnotator.java b/framework/src/main/java/org/checkerframework/framework/type/typeannotator/PropagationTypeAnnotator.java index 0e29bfcfd91a..b306cad2363f 100644 --- a/framework/src/main/java/org/checkerframework/framework/type/typeannotator/PropagationTypeAnnotator.java +++ b/framework/src/main/java/org/checkerframework/framework/type/typeannotator/PropagationTypeAnnotator.java @@ -127,6 +127,14 @@ public Void visitWildcard(AnnotatedWildcardType wildcard, Void aVoid) { } visitedNodes.put(wildcard, null); + // visitDeclared already copies annotations from the declaration to synthetic wildcard type + // arguments of raw types. If this visitor scans those wildcards' bounds, it may visit a + // nested wildcard that is not itself a type argument of the raw parent, so there is no + // corresponding type parameter from which to propagate annotations. + if (AnnotatedTypes.isTypeArgOfRawType(wildcard)) { + return null; + } + Element typeParamElement = TypesUtils.wildcardToTypeParam(wildcard.getUnderlyingType()); if (typeParamElement == null && !parents.isEmpty()) { typeParamElement = getTypeParameterElement(wildcard, parents.peekFirst()); diff --git a/framework/tests/all-systems/RawtypeCrash.java b/framework/tests/all-systems/RawtypeCrash.java new file mode 100644 index 000000000000..03f0412c7202 --- /dev/null +++ b/framework/tests/all-systems/RawtypeCrash.java @@ -0,0 +1,5 @@ +@SuppressWarnings("all") // Raw type use is intentional: this is a no-crash regression test. +public class RawtypeCrash { + RawtypeCrash nullObj = null; + Object obj = ((RawtypeCrash) null).nullObj; +} diff --git a/framework/tests/viewpointtest/RawtypeCrash.java b/framework/tests/viewpointtest/RawtypeCrash.java new file mode 100644 index 000000000000..e095fe0a69fb --- /dev/null +++ b/framework/tests/viewpointtest/RawtypeCrash.java @@ -0,0 +1,4 @@ +public class RawtypeCrash { + RawtypeCrash nullObj = null; + Object obj = ((RawtypeCrash) null).nullObj; +}