diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java index 7f6fb066e72..428a662807f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java @@ -41,8 +41,18 @@ public class CompareTo implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { + JetExpression argument; assert arguments != null; - JetExpression argument = arguments.get(0); + if (arguments.size() == 1) { + argument = arguments.get(0); + } + else if (arguments.size() == 2) { + receiver = codegen.gen(arguments.get(0)); + argument = arguments.get(1); + } + else { + throw new IllegalStateException("Invalid arguments to compareTo: " + arguments); + } Type type = comparisonOperandType(receiver.type, codegen.expressionType(argument)); receiver.put(type, v); diff --git a/compiler/testData/codegen/intrinsics/compareTo.kt b/compiler/testData/codegen/intrinsics/compareTo.kt new file mode 100644 index 00000000000..c2eae39fc2c --- /dev/null +++ b/compiler/testData/codegen/intrinsics/compareTo.kt @@ -0,0 +1,16 @@ +fun box(): String { + val sb = StringBuilder() + + for (i in -1..1) { + for (j in -1..1) { + val a = i compareTo j + val b = i.compareTo(j) + if (a != b) { + sb.append("$i compareTo $j: $a != $b\n") + } + } + } + + if (sb.length() == 0) return "OK" + return "Fail:\n$sb" +} diff --git a/compiler/testData/codegen/regressions/ea33909.kt b/compiler/testData/codegen/regressions/ea33909.kt new file mode 100644 index 00000000000..91701ce012f --- /dev/null +++ b/compiler/testData/codegen/regressions/ea33909.kt @@ -0,0 +1,7 @@ +fun box(): String { + return justPrint(9 compareTo 4) +} + +fun justPrint(value: Int): String { + return if (value > 0) "OK" else "Fail $value" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java index d0c2425d90b..84eea7c8fe5 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java @@ -199,4 +199,8 @@ public class FunctionGenTest extends CodegenTestCase { assertFalse(text.contains("INVOKEVIRTUAL")); assertTrue(text.contains("INVOKESPECIAL")); } + + public void testEa33909() { + blackBoxFile("regressions/ea33909.kt"); + } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/IntrinsicsTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/IntrinsicsTestGenerated.java index 7fc6172d806..9000a690998 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/IntrinsicsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/IntrinsicsTestGenerated.java @@ -33,6 +33,11 @@ public class IntrinsicsTestGenerated extends AbstractCodegenTest { public void testAllFilesPresentInIntrinsics() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/intrinsics"), "kt", true); } + + @TestMetadata("compareTo.kt") + public void testCompareTo() throws Exception { + blackBoxFileByFullPath("compiler/testData/codegen/intrinsics/compareTo.kt"); + } @TestMetadata("longRangeWithExplicitDot.kt") public void testLongRangeWithExplicitDot() throws Exception {