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

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


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 737ba5054e GROOVY-11488: STC: null check
737ba5054e is described below

commit 737ba5054efc899270fba12cc9d6b184c582fb3e
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Tue Oct 1 15:09:37 2024 -0500

    GROOVY-11488: STC: null check
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 24 ++++++++++++----------
 .../transform/stc/TypeInferenceSTCTest.groovy      | 17 ++++++++++++++-
 2 files changed, 29 insertions(+), 12 deletions(-)

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 a98c50f7d5..14462f47b9 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -4094,7 +4094,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
         } else {
             // saving type of variables to restoring them after returning from 
block
             Map<VariableExpression, List<ClassNode>> oldTracker = 
pushAssignmentTracking();
-            getTypeCheckingContext().pushTemporaryTypeInfo();
+            typeCheckingContext.pushTemporaryTypeInfo();
             typeCheckingContext.blockStatements2Types.put(currentBlock, 
oldTracker);
         }
         pushInstanceOfTypeInfo(be.getLeftExpression(), 
be.getRightExpression());
@@ -4114,11 +4114,11 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 
     @Deprecated
     public void visitClosingBlock(final BlockStatement block) {
-        BlockStatement peekBlock = 
typeCheckingContext.enclosingBlocks.removeFirst();
-        boolean found = 
typeCheckingContext.blockStatements2Types.containsKey(peekBlock);
+        BlockStatement theBlock = typeCheckingContext.enclosingBlocks.pop();
+        boolean found = 
typeCheckingContext.blockStatements2Types.containsKey(theBlock);
         if (found) {
-            Map<VariableExpression, List<ClassNode>> oldTracker = 
typeCheckingContext.blockStatements2Types.remove(peekBlock);
-            getTypeCheckingContext().popTemporaryTypeInfo();
+            Map<VariableExpression, List<ClassNode>> oldTracker = 
typeCheckingContext.blockStatements2Types.remove(theBlock);
+            typeCheckingContext.popTemporaryTypeInfo();
             popAssignmentTracking(oldTracker);
         }
     }
@@ -4262,13 +4262,15 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 
     protected Map<VariableExpression, ClassNode> popAssignmentTracking(final 
Map<VariableExpression, List<ClassNode>> oldTracker) {
         Map<VariableExpression, ClassNode> assignments = new HashMap<>();
-        typeCheckingContext.ifElseForWhileAssignmentTracker.forEach((var, 
types) -> {
-            types.stream().filter(t -> t != null && t != 
UNKNOWN_PARAMETER_TYPE) // GROOVY-6099, GROOVY-10294
-                    
.reduce(WideningCategories::lowestUpperBound).ifPresent(type -> {
-                assignments.put(var, type);
-                storeType(var, type);
+        if (typeCheckingContext.ifElseForWhileAssignmentTracker != null){ // 
GROOVY-11488
+            typeCheckingContext.ifElseForWhileAssignmentTracker.forEach((var, 
types) -> {
+                types.stream().filter(t -> t != null && t != 
UNKNOWN_PARAMETER_TYPE) // GROOVY-6099, GROOVY-10294
+                        
.reduce(WideningCategories::lowestUpperBound).ifPresent(type -> {
+                    assignments.put(var, type);
+                    storeType(var, type);
+                });
             });
-        });
+        }
         typeCheckingContext.ifElseForWhileAssignmentTracker = oldTracker;
         // GROOVY-9786, GROOVY-11450: nested conditional assignments
         if (oldTracker != null) {
diff --git a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy 
b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
index dd5a9cbc74..4f9069804c 100644
--- a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
@@ -614,6 +614,21 @@ class TypeInferenceSTCTest extends 
StaticTypeCheckingTestCase {
         ''', 'Cannot find matching method java.lang.Object#toUpperCase()'
     }
 
+    // GROOVY-11488
+    void testNotInstanceOf7() {
+        assertScript '''
+            def test(object) {
+                if (false) {
+                    return 'not possible'
+                } else if (object !instanceof Object[]) {
+                    return 'not array'
+                }
+            }
+            assert test(null) == 'not array'
+            assert test(new Object[0]) == null
+        '''
+    }
+
     // GROOVY-10217
     void testInstanceOfThenSubscriptOperator() {
         assertScript '''
@@ -1401,7 +1416,7 @@ class TypeInferenceSTCTest extends 
StaticTypeCheckingTestCase {
         '''
     }
 
-    // GROOVY-
+    // GROOVY-6207
     void testGetAnnotationFails() {
         assertScript '''
             import groovy.transform.*

Reply via email to