From dc3053779f3b83b21a401454418f1eeafbc27e71 Mon Sep 17 00:00:00 2001 From: Eric Milles Date: Tue, 10 Sep 2024 13:17:45 -0500 Subject: [PATCH] GROOVY-11474: STC: re-check types for vars assigned within `while` loops --- .../transform/stc/StaticTypeCheckingVisitor.java | 8 +++++++- .../groovy/transform/stc/STCAssignmentTest.groovy | 13 +++++++++++++ 2 files changed, 20 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 ce8dfec9ea1..b7c5675bc99 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -2192,9 +2192,15 @@ protected boolean isSecondPassNeededForControlStructure(final Map startTypes = new HashMap<>(); + loop.getLoopBlock().visit(new VariableExpressionTypeMemoizer(startTypes)); Map> oldTracker = pushAssignmentTracking(); + super.visitWhileLoop(loop); - popAssignmentTracking(oldTracker); + + if (isSecondPassNeededForControlStructure(startTypes, oldTracker)) { // GROOVY-11474 + visitWhileLoop(loop); + } } @Override diff --git a/src/test/groovy/transform/stc/STCAssignmentTest.groovy b/src/test/groovy/transform/stc/STCAssignmentTest.groovy index 04f2e0e039c..52d6594f08f 100644 --- a/src/test/groovy/transform/stc/STCAssignmentTest.groovy +++ b/src/test/groovy/transform/stc/STCAssignmentTest.groovy @@ -613,6 +613,19 @@ class STCAssignmentTest extends StaticTypeCheckingTestCase { 'Cannot find matching method java.io.Serializable#toInteger()' } + // GROOVY-11474 + void testWhileLoopWithAssignment2() { + shouldFailWithMessages ''' + def i = 0 + def x = 1 + while (i++ < 1) { + Integer y = x + x = " " + } + ''', + 'Cannot assign value of type (java.io.Serializable & java.lang.Comparable',') to variable of type java.lang.Integer' + } + void testTernaryWithNestedAssignment() { shouldFailWithMessages ''' def x = '123'