You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2026/05/01 03:51:13 UTC

(groovy) branch master updated: GROOVY-11959: multi-assignment failure for singleton primitives

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

paulk-asert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new ab1b6f3da0 GROOVY-11959: multi-assignment failure for singleton primitives
ab1b6f3da0 is described below

commit ab1b6f3da03944e9bfa93f09993d71fd75f590df
Author: Paul King <pa...@asert.com.au>
AuthorDate: Sat Apr 25 11:53:59 2026 +1000

    GROOVY-11959: multi-assignment failure for singleton primitives
---
 .../classgen/asm/BinaryExpressionHelper.java       |  7 +++++
 .../MultipleAssignmentDeclarationTest.groovy       | 32 ++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
index a1461f120e..b452df8cff 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
@@ -477,6 +477,13 @@ public class BinaryExpressionHelper {
             return;
         }
 
+        // GROOVY-11959: box primitive RHS so the temp slot holds an object reference
+        // (the multi-assignment path ALOADs it for IF_ACMPEQ and dispatches iterator/getAt on it)
+        if (!singleAssignment && ClassHelper.isPrimitiveType(rhsType)) {
+            operandStack.box();
+            rhsType = operandStack.getTopOperand();
+        }
+
         int rhsValueId = compileStack.defineTemporaryVariable("$rhs", rhsType, true);
         // TODO: if RHS is already a VariableSlotLoader, then skip creating a new one
         Expression rhsValueLoader = new VariableSlotLoader(rhsType, rhsValueId, operandStack);
diff --git a/src/test/groovy/gls/statements/MultipleAssignmentDeclarationTest.groovy b/src/test/groovy/gls/statements/MultipleAssignmentDeclarationTest.groovy
index 483030fbd1..8f8af583ba 100644
--- a/src/test/groovy/gls/statements/MultipleAssignmentDeclarationTest.groovy
+++ b/src/test/groovy/gls/statements/MultipleAssignmentDeclarationTest.groovy
@@ -151,6 +151,38 @@ final class MultipleAssignmentDeclarationTest {
         '''
     }
 
+    @Test // GROOVY-11959
+    void testMultiAssignFromInteger() {
+        shouldFail MissingMethodException, '''
+            Integer z = 42
+            def (x, y) = z
+        '''
+    }
+
+    @Test // GROOVY-11959
+    void testMultiAssignFromPrimitiveInt() {
+        shouldFail MissingMethodException, '''
+            int z = 42
+            def (x, y) = z
+        '''
+    }
+
+    @Test // GROOVY-11959
+    void testMultiAssignFromPrimitiveLong() {
+        shouldFail MissingMethodException, '''
+            long z = 42L
+            def (x, y) = z
+        '''
+    }
+
+    @Test // GROOVY-11959
+    void testMultiAssignFromPrimitiveDouble() {
+        shouldFail MissingMethodException, '''
+            double z = 4.2d
+            def (x, y) = z
+        '''
+    }
+
     @Test
     void testMultiAssignFromCalendar() {
         assertScript '''