From 8eabc2978e52eed6700fedd298801b2454e48ee2 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Tue, 22 Nov 2011 12:57:24 +0200 Subject: [PATCH] KT-581 wrong implicit receiver for intrinsic method call --- .../jet/codegen/ExpressionCodegen.java | 19 +++++++++++++++++ .../testData/codegen/regressions/kt581.jet | 21 +++++++++++++++++++ .../org/jetbrains/jet/codegen/VarArgTest.java | 5 +++++ 3 files changed, 45 insertions(+) create mode 100644 compiler/testData/codegen/regressions/kt581.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 87c4bb9bd30..1167da9c208 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -790,6 +790,25 @@ public class ExpressionCodegen extends JetVisitor { final IntrinsicMethod intrinsic = intrinsics.getIntrinsic(descriptor); if (intrinsic != null) { final Type expectedType = expressionType(expression); + if(receiver == StackValue.none()) { + if (resolvedCall.getThisObject().exists()) { + if(resolvedCall.getReceiverArgument().exists()) { + generateFromResolvedCall(resolvedCall.getThisObject()); + generateFromResolvedCall(resolvedCall.getReceiverArgument()); + receiver = StackValue.onStack(typeMapper.mapType(resolvedCall.getReceiverArgument().getType())); + } + else { + generateFromResolvedCall(resolvedCall.getThisObject()); + receiver = StackValue.onStack(typeMapper.mapType(resolvedCall.getThisObject().getType())); + } + } + else { + if (resolvedCall.getReceiverArgument().exists()) { + generateFromResolvedCall(resolvedCall.getReceiverArgument()); + receiver = StackValue.onStack(typeMapper.mapType(resolvedCall.getReceiverArgument().getType())); + } + } + } return intrinsic.generate(this, v, expectedType, expression, Collections.emptyList(), receiver); } diff --git a/compiler/testData/codegen/regressions/kt581.jet b/compiler/testData/codegen/regressions/kt581.jet new file mode 100644 index 00000000000..0f8d7162122 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt581.jet @@ -0,0 +1,21 @@ +namespace whats.the.difference + +import java.util.HashSet + +fun iarray(vararg a : Int) = a // BUG + +fun IntArray.lastIndex() = size - 1 + +fun box() : String { + // Problematic code does not compile +// val vals = iarray(789, 678, 567, 456, 345, 234, 123, 012) + + val vals = iarray(789, 678, 567, 456, 345, 234, 123, 12) + val diffs = HashSet + for (i in vals.indices) + for (j in i..vals.lastIndex()) + diffs.add(vals[i] - vals[j]) + System.out?.println(diffs.size()) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java b/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java index 78d1f519bfd..a71dacad1af 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/VarArgTest.java @@ -69,4 +69,9 @@ public class VarArgTest extends CodegenTestCase { assertTrue(((Integer[])res)[0].equals(2)); assertTrue(((Integer[])res)[1].equals(4)); } + + public void testKt581() { + createEnvironmentWithFullJdk(); + blackBoxFile("regressions/kt581.jet"); + } }