From 4c5fe708042e924f409790d83023f9a4eb49a1d9 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 30 Oct 2012 22:54:20 +0400 Subject: [PATCH] Do not compare boxed values with 0 via IFEQ/IFNE --- .../src/org/jetbrains/jet/codegen/ExpressionCodegen.java | 4 ++-- .../controlStructures/compareBoxedIntegerToZero.kt | 8 ++++++++ .../org/jetbrains/jet/codegen/ControlStructuresTest.java | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/controlStructures/compareBoxedIntegerToZero.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index b90bf818022..8c8e04a8538 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2362,11 +2362,11 @@ public class ExpressionCodegen extends JetVisitor implem return genCmpWithNull(left, leftType, opToken); } - if (isIntZero(left, leftType)) { + if (isIntZero(left, leftType) && isIntPrimitive(rightType)) { return genCmpWithZero(right, rightType, opToken); } - if (isIntZero(right, rightType)) { + if (isIntZero(right, rightType) && isIntPrimitive(leftType)) { return genCmpWithZero(left, leftType, opToken); } diff --git a/compiler/testData/codegen/controlStructures/compareBoxedIntegerToZero.kt b/compiler/testData/codegen/controlStructures/compareBoxedIntegerToZero.kt new file mode 100644 index 00000000000..6b2091be148 --- /dev/null +++ b/compiler/testData/codegen/controlStructures/compareBoxedIntegerToZero.kt @@ -0,0 +1,8 @@ +fun box(): String { + val x: Int? = 0 + if (x != 0) return "Fail $x" + if (0 != x) return "Fail $x" + if (!(x == 0)) return "Fail $x" + if (!(0 == x)) return "Fail $x" + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 378ea834324..c8e0221c453 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -250,6 +250,11 @@ public class ControlStructuresTest extends CodegenTestCase { assertEquals(false, main.invoke(null, 1, 0)); } + public void testCompareBoxedIntegerToZero() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("controlStructures/compareBoxedIntegerToZero.kt"); + } + public void testCompareToNull() throws Exception { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); loadText("fun foo(a: String?, b: String?): Boolean = a == null && b !== null && null == a && null !== b");