From 7b7cf39388254aea895d9597cdc613478c26d743 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 27 Sep 2018 16:29:23 +0300 Subject: [PATCH] Fix inline classes coercion in 'if' expression #KT-27132 --- .../kotlin/codegen/ExpressionCodegen.java | 2 +- .../codegen/box/inlineClasses/kt27132.kt | 23 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ 7 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/kt27132.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 7a619714998..630bc69088a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -513,7 +513,7 @@ public class ExpressionCodegen extends KtVisitor impleme } } - return StackValue.operation(asmType, v -> { + return StackValue.operation(asmType, kotlinType, v -> { Label elseLabel = new Label(); BranchedValue.Companion.condJump(condition, elseLabel, true, v); diff --git a/compiler/testData/codegen/box/inlineClasses/kt27132.kt b/compiler/testData/codegen/box/inlineClasses/kt27132.kt new file mode 100644 index 00000000000..a6e4ef1658e --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt27132.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR, JS_IR +// WITH_RUNTIME + +inline class Ucn(private val i: UInt) + +interface Input { + fun foo(n: Int = 0): T +} + +fun Char.toUInt() = toInt().toUInt() + +class Kx(val x: UInt) : Input { + override fun foo(n: Int): Ucn = + if (n < 0) Ucn(0u) else Ucn(x) +} + +fun box(): String { + val p = Kx(42u).foo() + if (p.toString() != "Ucn(i=42)") throw AssertionError() + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 473b35c19ad..fcfd2bb0762 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11859,6 +11859,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27096_reference.kt"); } + @TestMetadata("kt27132.kt") + public void testKt27132() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt27132.kt"); + } + @TestMetadata("kt27140.kt") public void testKt27140() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt27140.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 3ff2cf774fc..1abe1f582ad 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11859,6 +11859,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt27096_reference.kt"); } + @TestMetadata("kt27132.kt") + public void testKt27132() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt27132.kt"); + } + @TestMetadata("kt27140.kt") public void testKt27140() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt27140.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index b606f59101e..c1515b54811 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11864,6 +11864,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt27096_reference.kt"); } + @TestMetadata("kt27132.kt") + public void testKt27132() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt27132.kt"); + } + @TestMetadata("kt27140.kt") public void testKt27140() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt27140.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index f2528550a8e..98aa1d8615f 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10399,6 +10399,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27096_reference.kt"); } + @TestMetadata("kt27132.kt") + public void testKt27132() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt27132.kt"); + } + @TestMetadata("kt27140.kt") public void testKt27140() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt27140.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 1727fb03fb1..1ea0a72e18f 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11444,6 +11444,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27096_reference.kt"); } + @TestMetadata("kt27132.kt") + public void testKt27132() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt27132.kt"); + } + @TestMetadata("kt27140.kt") public void testKt27140() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt27140.kt");