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 7298918b111..bd13b7860f2 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 @@ -14454,6 +14454,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/enum/javaClassWithNestedEnum.kt"); } + @Test + @TestMetadata("javaEnumValues.kt") + public void testJavaEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/javaEnumValues.kt"); + } + @Test @TestMetadata("kt1119.kt") public void testKt1119() throws Exception { @@ -14628,6 +14634,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @Test + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + + @Test + @TestMetadata("overloadedEnumValuesStatic.kt") + public void testOverloadedEnumValuesStatic() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt"); + } + @Test @TestMetadata("refToThis.kt") public void testRefToThis() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt index b8d7ded97b8..6b3be5319cd 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt @@ -21,8 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.IrEnumEntry import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrGetEnumValueImpl -import org.jetbrains.kotlin.ir.types.defaultType -import org.jetbrains.kotlin.ir.types.getClass +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.OperatorNameConventions @@ -113,7 +112,14 @@ private class MappedEnumWhenLowering(context: CommonBackendContext) : EnumWhenLo for ((enum, mappingAndField) in state!!.mappings) { val (mapping, field) = mappingAndField val builder = context.createIrBuilder(state!!.mappingsClass.symbol) - val enumValues = enum.functions.single { it.name.toString() == "values" } + val enumValues = enum.functions.single { + it.name.toString() == "values" + && it.dispatchReceiverParameter == null + && it.extensionReceiverParameter == null + && it.valueParameters.isEmpty() + && it.returnType.isBoxedArray + && it.returnType.getArrayElementType(context.irBuiltIns).classOrNull == enum.symbol + } field.initializer = builder.irExprBody(builder.irBlock { val enumSize = irCall(refArraySize).apply { dispatchReceiver = irCall(enumValues) } val result = irTemporary(irCall(intArrayConstructor).apply { putValueArgument(0, enumSize) }) diff --git a/compiler/testData/codegen/box/enum/javaEnumValues.kt b/compiler/testData/codegen/box/enum/javaEnumValues.kt new file mode 100644 index 00000000000..c2ed2096907 --- /dev/null +++ b/compiler/testData/codegen/box/enum/javaEnumValues.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR +// FILE: E.java +public enum E { + A(); + public static void values(boolean b) { + } +} + +// FILE: test.kt + +fun f(e: E) = when (e) { + E.A -> "OK" +} + +fun box(): String { + return f(E.A) +} diff --git a/compiler/testData/codegen/box/enum/overloadedEnumValues.kt b/compiler/testData/codegen/box/enum/overloadedEnumValues.kt new file mode 100644 index 00000000000..0f0a39b5905 --- /dev/null +++ b/compiler/testData/codegen/box/enum/overloadedEnumValues.kt @@ -0,0 +1,14 @@ +enum class E { + A; + + fun values(b: Boolean) {} + fun E.values(): Array = arrayOf(A) +} + +fun f(e: E) = when (e) { + E.A -> "OK" +} + +fun box(): String { + return f(E.A) +} diff --git a/compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt b/compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt new file mode 100644 index 00000000000..fd413a16cd2 --- /dev/null +++ b/compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt @@ -0,0 +1,25 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +enum class E { + A; + + companion object { + @JvmStatic + fun values(): Array = arrayOf("OK") + + @JvmStatic + fun E.values(): Array = arrayOf(A) + + @JvmStatic + fun values(x: Int): Array = arrayOf(A) + } +} + +fun f(e: E) = when (e) { + E.A -> "OK" +} + +fun box(): String { + return f(E.A) +} 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 a11ab7b8ab9..1495926d6fa 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 @@ -14454,6 +14454,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/enum/javaClassWithNestedEnum.kt"); } + @Test + @TestMetadata("javaEnumValues.kt") + public void testJavaEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/javaEnumValues.kt"); + } + @Test @TestMetadata("kt1119.kt") public void testKt1119() throws Exception { @@ -14628,6 +14634,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @Test + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + + @Test + @TestMetadata("overloadedEnumValuesStatic.kt") + public void testOverloadedEnumValuesStatic() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt"); + } + @Test @TestMetadata("refToThis.kt") public void testRefToThis() 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 ca0eead1316..0b51fa1ee60 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 @@ -14454,6 +14454,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/enum/javaClassWithNestedEnum.kt"); } + @Test + @TestMetadata("javaEnumValues.kt") + public void testJavaEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/javaEnumValues.kt"); + } + @Test @TestMetadata("kt1119.kt") public void testKt1119() throws Exception { @@ -14628,6 +14634,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @Test + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + + @Test + @TestMetadata("overloadedEnumValuesStatic.kt") + public void testOverloadedEnumValuesStatic() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt"); + } + @Test @TestMetadata("refToThis.kt") public void testRefToThis() 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 c38286ec237..ef1965d7806 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11839,6 +11839,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/enum/javaClassWithNestedEnum.kt"); } + @TestMetadata("javaEnumValues.kt") + public void testJavaEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/javaEnumValues.kt"); + } + @TestMetadata("kt1119.kt") public void testKt1119() throws Exception { runTest("compiler/testData/codegen/box/enum/kt1119.kt"); @@ -11984,6 +11989,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + + @TestMetadata("overloadedEnumValuesStatic.kt") + public void testOverloadedEnumValuesStatic() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValuesStatic.kt"); + } + @TestMetadata("refToThis.kt") public void testRefToThis() throws Exception { runTest("compiler/testData/codegen/box/enum/refToThis.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 31980105650..18c5d600f3d 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 @@ -10703,6 +10703,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + @TestMetadata("refToThis.kt") public void testRefToThis() throws Exception { runTest("compiler/testData/codegen/box/enum/refToThis.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 211f0e6f5b9..a188ab75ab7 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 @@ -10114,6 +10114,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + @TestMetadata("refToThis.kt") public void testRefToThis() throws Exception { runTest("compiler/testData/codegen/box/enum/refToThis.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 76aacddeb11..1bc79250435 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 @@ -10114,6 +10114,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + @TestMetadata("refToThis.kt") public void testRefToThis() throws Exception { runTest("compiler/testData/codegen/box/enum/refToThis.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 03b20b33eca..04ccdd6cbc1 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 @@ -4962,6 +4962,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/enum/ordinal.kt"); } + @TestMetadata("overloadedEnumValues.kt") + public void testOverloadedEnumValues() throws Exception { + runTest("compiler/testData/codegen/box/enum/overloadedEnumValues.kt"); + } + @TestMetadata("refToThis.kt") public void testRefToThis() throws Exception { runTest("compiler/testData/codegen/box/enum/refToThis.kt");