From cc7187e49be7b8b016e76d38abc438176f3bde78 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 12 Apr 2021 17:51:46 +0200 Subject: [PATCH] JVM_IR: cast argument of enumValueOf to String in bytecode Generic functions and implicit casts may return a supertype instead. #KT-45865 Fixed --- .../runners/codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/backend/jvm/intrinsics/EnumIntrinsics.kt | 5 +++-- compiler/testData/codegen/box/enum/enumValueOf.kt | 6 ++++++ .../test/runners/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../runners/codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ 10 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/enum/enumValueOf.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index d9344709fda..624a860639b 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -14104,6 +14104,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @Test + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @Test @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/EnumIntrinsics.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/EnumIntrinsics.kt index 262c8bb3a39..d02250af0dd 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/EnumIntrinsics.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/EnumIntrinsics.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo import org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen import org.jetbrains.kotlin.backend.jvm.codegen.MaterialValue -import org.jetbrains.kotlin.backend.jvm.codegen.materialized +import org.jetbrains.kotlin.backend.jvm.codegen.materializedAt import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression @@ -18,7 +18,8 @@ import org.jetbrains.org.objectweb.asm.Type object EnumValueOf : IntrinsicMethod() { override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo) = with(codegen) { val type = expression.getTypeArgument(0)!! - val result = expression.getValueArgument(0)!!.accept(this, data).materialized() + val result = expression.getValueArgument(0)!!.accept(this, data) + .materializedAt(AsmTypes.JAVA_STRING_TYPE, codegen.context.irBuiltIns.stringType) if (type.isReifiedTypeParameter) { // Note that the inliner expects exactly the following sequence of instructions. // diff --git a/compiler/testData/codegen/box/enum/enumValueOf.kt b/compiler/testData/codegen/box/enum/enumValueOf.kt new file mode 100644 index 00000000000..82beff54335 --- /dev/null +++ b/compiler/testData/codegen/box/enum/enumValueOf.kt @@ -0,0 +1,6 @@ +// IGNORE_BACKEND: WASM +enum class E { OK } + +fun id(x: T) = x + +fun box() = enumValueOf(id("OK")).name diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 6bcbd265260..a0b5a787709 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -14104,6 +14104,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @Test + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @Test @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7aa3ecb9679..2d1349f7217 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -14104,6 +14104,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @Test + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @Test @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index cbdc5b7e48e..05e2710ecc7 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11548,6 +11548,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/enum/enumWithLambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index a0ee0166ed3..e9275bb01a4 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -10347,6 +10347,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/enum/enumWithLambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index fa0ff31cec8..8d58f61dfba 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -9768,6 +9768,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/enum/enumWithLambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 413f34ce108..d02e90575a6 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -9768,6 +9768,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/enum/enumWithLambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 7b9e3b709ef..84cd9a6c130 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -4727,6 +4727,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/enum/enumShort.kt"); } + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumValueOf.kt"); + } + @TestMetadata("enumWithLambdaParameter.kt") public void testEnumWithLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/enum/enumWithLambdaParameter.kt");