From c74453d8d2ed6cf2c68b7f6e053209db8f88e0fb Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Mon, 29 Nov 2021 19:27:48 +0800 Subject: [PATCH] JVM_IR KT-48987 handle star projection arguments in smart casts --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../backend/jvm/lower/FunctionReferenceLowering.kt | 7 ++++++- compiler/testData/codegen/box/casts/kt48987.kt | 12 ++++++++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/casts/kt48987.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 2d43e3427f3..588286bd376 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 @@ -4589,6 +4589,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/casts/kt48927_privateMethodOnDerivedCastToBase.kt"); } + @Test + @TestMetadata("kt48987.kt") + public void testKt48987() throws Exception { + runTest("compiler/testData/codegen/box/casts/kt48987.kt"); + } + @Test @TestMetadata("lambdaToUnitCast.kt") public void testLambdaToUnitCast() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index b89e3a47a6e..4ebd9abb517 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -532,7 +532,12 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) else irFunctionReference.getArgumentsWithIr().singleOrNull() // The type of the reference is KFunction - private val parameterTypes = (irFunctionReference.type as IrSimpleType).arguments.map { (it as IrTypeProjection).type } + private val parameterTypes = (irFunctionReference.type as IrSimpleType).arguments.map { + when (it) { + is IrTypeProjection -> it.type + else -> context.irBuiltIns.anyNType + } + } private val argumentTypes = parameterTypes.dropLast(1) private val referenceReturnType = parameterTypes.last() diff --git a/compiler/testData/codegen/box/casts/kt48987.kt b/compiler/testData/codegen/box/casts/kt48987.kt new file mode 100644 index 00000000000..0efb3603418 --- /dev/null +++ b/compiler/testData/codegen/box/casts/kt48987.kt @@ -0,0 +1,12 @@ +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB + +fun box(): String { + return try { + val range1 = 0..1 + range1 as List + range1.joinToString { "" } + } catch (e: java.lang.ClassCastException) { + "OK" + } +} 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 e5c06e18b8b..f1d9ed1bc4b 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 @@ -4589,6 +4589,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/casts/kt48927_privateMethodOnDerivedCastToBase.kt"); } + @Test + @TestMetadata("kt48987.kt") + public void testKt48987() throws Exception { + runTest("compiler/testData/codegen/box/casts/kt48987.kt"); + } + @Test @TestMetadata("lambdaToUnitCast.kt") public void testLambdaToUnitCast() throws Exception {