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 a1461f120ef..b452df8cff3 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 void evaluateEqual(final BinaryExpression expression, final boolean defin 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 483030fbd1b..8f8af583bab 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 '''