From b03966e8d0ba40d6331ee36efc9414bd33744f89 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 May 2012 13:59:42 +0200 Subject: [PATCH] coerce condition value to Type.BOOLEAN (KT-2147) --- .../src/org/jetbrains/jet/codegen/StackValue.java | 14 +++++--------- compiler/testData/codegen/regressions/kt2147.kt | 9 +++++++++ .../jet/codegen/ControlStructuresTest.java | 5 +++++ 3 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2147.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index fee9715f644..854096100c4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -72,17 +72,13 @@ public abstract class StackValue { } public void condJump(Label label, boolean jumpIfFalse, InstructionAdapter v) { - if (this.type == Type.BOOLEAN_TYPE) { - put(Type.BOOLEAN_TYPE, v); - if (jumpIfFalse) { - v.ifeq(label); - } - else { - v.ifne(label); - } + put(this.type, v); + coerce(Type.BOOLEAN_TYPE, v); + if (jumpIfFalse) { + v.ifeq(label); } else { - throw new UnsupportedOperationException("can't generate a cond jump for a non-boolean value"); + v.ifne(label); } } diff --git a/compiler/testData/codegen/regressions/kt2147.kt b/compiler/testData/codegen/regressions/kt2147.kt new file mode 100644 index 00000000000..df664fb16ef --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2147.kt @@ -0,0 +1,9 @@ +class Foo { + fun isOk() = true +} + +fun box(): String { + val foo: Foo? = Foo() + if (foo?.isOk()!!) return "OK" + return "fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 3bf9fadee39..a73000c174f 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -331,4 +331,9 @@ public class ControlStructuresTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); blackBoxFile("regressions/kt1441.kt"); } + + public void testKt2147() throws Exception { + createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS); + blackBoxFile("regressions/kt2147.kt"); + } } -- GitLab