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 '''