diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index 697df31c3ca..67cd365f407 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.org.objectweb.asm.Label; +import org.jetbrains.org.objectweb.asm.Opcodes; import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; @@ -381,14 +382,22 @@ public abstract class StackValue { unbox(unboxedType, v); coerce(unboxedType, toType, v); } - else { - Type numberType = getType(Number.class); - if (toType.getSort() == Type.BOOLEAN || (toType.getSort() == Type.CHAR && !numberType.equals(fromType))) { - coerce(fromType, boxType(toType), v); + else if (toType.getSort() == Type.BOOLEAN) { + coerce(fromType, boxType(Type.BOOLEAN_TYPE), v); + unbox(Type.BOOLEAN_TYPE, v); + } + else if (toType.getSort() == Type.CHAR) { + if (fromType.equals(NUMBER_TYPE)) { + unbox(Type.INT_TYPE, v); + v.visitInsn(Opcodes.I2C); } else { - coerce(fromType, numberType, v); + coerce(fromType, boxType(Type.CHAR_TYPE), v); + unbox(Type.CHAR_TYPE, v); } + } + else { + coerce(fromType, NUMBER_TYPE, v); unbox(toType, v); } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java index 979e7bc893a..db7bb2a7d45 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java @@ -30,6 +30,7 @@ public class AsmTypes { public static final Type JAVA_THROWABLE_TYPE = getType(Throwable.class); public static final Type JAVA_CLASS_TYPE = getType(Class.class); public static final Type ENUM_TYPE = getType(Enum.class); + public static final Type NUMBER_TYPE = getType(Number.class); public static final Type UNIT_TYPE = Type.getObjectType("kotlin/Unit"); diff --git a/compiler/testData/codegen/box/primitiveTypes/kt16732.kt b/compiler/testData/codegen/box/primitiveTypes/kt16732.kt new file mode 100644 index 00000000000..8b58c6f402b --- /dev/null +++ b/compiler/testData/codegen/box/primitiveTypes/kt16732.kt @@ -0,0 +1,15 @@ +//WITH_RUNTIME + +fun valueFromDB(value: Any): Any { + return when (value) { + is Char -> value + is Number-> value.toChar() + is String -> value.single() + else -> error("Unexpected value of type Char: $value") + } +} + +fun box(): String { + valueFromDB(1) + return "" + valueFromDB("O") + valueFromDB("K") +} \ No newline at end of file diff --git a/compiler/testData/codegen/light-analysis/primitiveTypes/kt16732.txt b/compiler/testData/codegen/light-analysis/primitiveTypes/kt16732.txt new file mode 100644 index 00000000000..2cda4b07de2 --- /dev/null +++ b/compiler/testData/codegen/light-analysis/primitiveTypes/kt16732.txt @@ -0,0 +1,5 @@ +@kotlin.Metadata +public final class Kt16732Kt { + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static @org.jetbrains.annotations.NotNull method valueFromDB(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index bdbd711a286..53ed1cc4e92 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11711,6 +11711,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("kt16732.kt") + public void testKt16732() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/primitiveTypes/kt16732.kt"); + doTest(fileName); + } + @TestMetadata("kt2251.kt") public void testKt2251() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/primitiveTypes/kt2251.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 256df83e345..a37bc916147 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11711,6 +11711,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt16732.kt") + public void testKt16732() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/primitiveTypes/kt16732.kt"); + doTest(fileName); + } + @TestMetadata("kt2251.kt") public void testKt2251() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/primitiveTypes/kt2251.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 eaab329b0f8..6e52997d961 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 @@ -13183,6 +13183,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("kt16732.kt") + public void testKt16732() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/primitiveTypes/kt16732.kt"); + doTest(fileName); + } + @TestMetadata("kt2251.kt") public void testKt2251() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/primitiveTypes/kt2251.kt");