From 21a0d1f85c59db73680772f9b0d6b97e714c5cf4 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Fri, 25 Nov 2011 10:32:17 +0200 Subject: [PATCH] KT-613 verify error ++/-- in presence of this|receiver --- .../jet/codegen/intrinsics/Increment.java | 12 +++++++++--- compiler/testData/codegen/regressions/kt613.jet | 15 +++++++++++++++ .../jetbrains/jet/codegen/PropertyGenTest.java | 4 ++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt613.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java index 8c199a571a3..fc1292cf899 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java @@ -5,6 +5,7 @@ import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetParenthesizedExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; @@ -23,7 +24,10 @@ public class Increment implements IntrinsicMethod { @Override public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List arguments, StackValue receiver) { - final JetExpression operand = arguments.get(0); + JetExpression operand = arguments.get(0); + while(operand instanceof JetParenthesizedExpression) { + operand = ((JetParenthesizedExpression)operand).getExpression(); + } if (operand instanceof JetReferenceExpression) { final int index = codegen.indexOfLocal((JetReferenceExpression) operand); if (index >= 0 && JetTypeMapper.isIntPrimitive(expectedType)) { @@ -33,6 +37,7 @@ public class Increment implements IntrinsicMethod { } StackValue value = codegen.genQualified(receiver, operand); value. dupReceiver(v); + value. dupReceiver(v); value.put(expectedType, v); if (expectedType == Type.LONG_TYPE) { v.lconst(myDelta); @@ -44,10 +49,11 @@ public class Increment implements IntrinsicMethod { v.dconst(myDelta); } else { - v.aconst(myDelta); + v.iconst(myDelta); } v.add(expectedType); value.store(v); - return value; + value.put(expectedType, v); + return StackValue.onStack(expectedType); } } diff --git a/compiler/testData/codegen/regressions/kt613.jet b/compiler/testData/codegen/regressions/kt613.jet new file mode 100644 index 00000000000..463b77aa909 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt613.jet @@ -0,0 +1,15 @@ +namespace name + +class Test() { + var i = 5 + val ten = 10.lng + + fun Long.t() = this.int + i++ + ++i + + fun tt() = ten.t() +} + +fun box() : String { + var m = Test() + return if((m.i)++ == 5 && ++(m.i) == 7 && m.tt() == 26) "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index 096bd9e1c03..ccbd377fe0b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -136,6 +136,10 @@ public class PropertyGenTest extends CodegenTestCase { blackBoxFile("regressions/kt257.jet"); } + public void testKt613 () throws Exception { + blackBoxFile("regressions/kt613.jet"); + } + public void testKt160() throws Exception { loadText("internal val s = java.lang.Double.toString(1.0)"); final Method method = generateFunction("getS");