From 5633f71edcccffae001cc581e06e3f9784e921f1 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Tue, 10 Jan 2012 15:36:33 +0200 Subject: [PATCH] KT-950 wrong call to array-like setter with non-void return type --- .../src/org/jetbrains/jet/codegen/StackValue.java | 13 +++++++++++-- compiler/testData/codegen/regressions/kt950.jet | 9 +++++++++ .../org/jetbrains/jet/codegen/ArrayGenTest.java | 4 ++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt950.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index e797dadb554..b29522718c2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -531,8 +531,17 @@ public abstract class StackValue { if (setter == null) { throw new UnsupportedOperationException("no setter specified"); } - if(setter instanceof CallableMethod) - ((CallableMethod)setter).invoke(v); + if(setter instanceof CallableMethod) { + CallableMethod method = (CallableMethod) setter; + method.invoke(v); + Type returnType = method.getSignature().getAsmMethod().getReturnType(); + if(returnType != Type.VOID_TYPE) { + if(returnType.getSize() == 2) + v.pop2(); + else + v.pop(); + } + } else ((IntrinsicMethod)setter).generate(codegen, v, null, null, null, null); } diff --git a/compiler/testData/codegen/regressions/kt950.jet b/compiler/testData/codegen/regressions/kt950.jet new file mode 100644 index 00000000000..40e572f79b2 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt950.jet @@ -0,0 +1,9 @@ +import java.util.* + +fun Map.set(k : K, v : V) = put(k, v) + +fun box() : String { + val map = HashMap() + map["239"] = "932" + return if(map["239"] == "932") "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index f14c34e279d..69f20e56346 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -286,6 +286,10 @@ public class ArrayGenTest extends CodegenTestCase { // System.out.println(generateToText()); } + public void testKt950() { + blackBoxFile("regressions/kt950.jet"); + } + public void testKt594() throws Exception { loadFile("regressions/kt594.jet"); // System.out.println(generateToText());