This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new ab34974345 GROOVY-11621: STC: fix for `list[idx] = null` and 
`map['key'] = null`
ab34974345 is described below

commit ab34974345bd8d381441d82713e2447ac89343e7
Author: Eric Milles <[email protected]>
AuthorDate: Thu Apr 17 09:19:58 2025 -0500

    GROOVY-11621: STC: fix for `list[idx] = null` and `map['key'] = null`
    
    3_0_X backport
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  3 +-
 .../stc/ArraysAndCollectionsSTCTest.groovy         | 39 ++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 309bf3ff84..831adc48e5 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -823,7 +823,8 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
                 if (!(enclosingBE_rightExpr instanceof ClosureExpression)) {
                     enclosingBE_rightExpr.visit(this);
                 }
-                ClassNode[] arguments = {rType, 
getType(enclosingBE_rightExpr)};
+                ClassNode[] arguments = {rType, 
isNullConstant(enclosingBE_rightExpr) // GROOVY-11621
+                            ? UNKNOWN_PARAMETER_TYPE : 
getType(enclosingBE_rightExpr) };
                 List<MethodNode> nodes = findMethod(lType.redirect(), "putAt", 
arguments);
                 if (nodes.size() == 1) {
                     typeCheckMethodsWithGenericsOrFail(lType, arguments, 
nodes.get(0), enclosingBE_rightExpr);
diff --git a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy 
b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
index c72b3e246c..76a340eaef 100644
--- a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
@@ -800,6 +800,45 @@ class ArraysAndCollectionsSTCTest extends 
StaticTypeCheckingTestCase {
         'Cannot find matching method java.util.Collection#putAt(int, 
java.lang.Object)'
     }
 
+    // GROOVY-11621
+    void testListPutAt() {
+        assertScript '''
+            def list = ['a', 'b', 'c']
+            list[0] = 'aa'
+            assert list[0] == 'aa'
+
+            list.set(2, null)
+            assert list[2] == null
+
+            list.putAt(0, null)
+            assert list[0] == null
+
+            list[1] = null
+            assert list[1] == null
+        '''
+    }
+
+    // GROOVY-11621
+    void testMapPutAt() {
+        assertScript '''
+            def map = [a: 'foo', b: 'bar', c: 'baz']
+            map['a'] = 'aa'
+            assert map['a'] == 'aa'
+
+            map.put('c', null)
+            assert map['c'] == null
+
+            map.putAt('a', null)
+            assert map['a'] == null
+
+            map.d = null
+            assert map['d'] == null
+
+            map['b'] = null
+            assert map['b'] == null
+        '''
+    }
+
     // GROOVY-6266
     void testMapKeyGenerics() {
         assertScript """

Reply via email to