From 27081231d975d07a9fe7649fe465d5b07993d4d0 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Wed, 6 Oct 2021 01:59:43 +0200 Subject: [PATCH] Use original instead of lowered function to retrieve toString-impl in string concatenation lowering. Otherwise, inliner tries to get body of already lowered function, failing. #KT-48284 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../lower/JvmStringConcatenationLowering.kt | 5 ++--- .../box/inlineClasses/inlineToString.kt | 21 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/inlineToString.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 a8f95e18a42..316d16364d6 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 @@ -19164,6 +19164,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt"); } + @Test + @TestMetadata("inlineToString.kt") + public void testInlineToString() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineToString.kt"); + } + @Test @TestMetadata("iterateOverArrayOfInlineClassValues.kt") public void testIterateOverArrayOfInlineClassValues() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStringConcatenationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStringConcatenationLowering.kt index 312e08d0a62..fecf1a74124 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStringConcatenationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStringConcatenationLowering.kt @@ -16,9 +16,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.JvmIrBuilder import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrStringConcatenationImpl import org.jetbrains.kotlin.ir.types.* @@ -74,6 +72,7 @@ private fun JvmIrBuilder.lowerInlineClassArgument(expression: IrExpression): IrE if (InlineClassAbi.unboxType(expression.type) == null) return null val toStringFunction = expression.type.classOrNull?.owner?.toStringFunction + ?.let { (it as? IrAttributeContainer)?.attributeOwnerId as? IrFunction ?: it } ?: return null val toStringReplacement = backendContext.inlineClassReplacements.getReplacementFunction(toStringFunction) ?: return null diff --git a/compiler/testData/codegen/box/inlineClasses/inlineToString.kt b/compiler/testData/codegen/box/inlineClasses/inlineToString.kt new file mode 100644 index 00000000000..ceddf6ad283 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/inlineToString.kt @@ -0,0 +1,21 @@ +// TARGET_BACKEND: JVM_IR +// WITH_RUNTIME + +import kotlin.jvm.JvmInline + +open class Expando { + val expansion: Expansion = Expansion() +} + +@JvmInline +value class Expansion(val map: MutableMap = mutableMapOf()) { + override inline fun toString(): String = "OK" +} + +data class Foo(val i: Int): Expando() { + override fun toString(): String { + return "$expansion" + } +} + +fun box(): String = Foo(0).toString() 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 9eca13452f1..21bbb4f1f3a 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 @@ -19164,6 +19164,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt"); } + @Test + @TestMetadata("inlineToString.kt") + public void testInlineToString() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineToString.kt"); + } + @Test @TestMetadata("iterateOverArrayOfInlineClassValues.kt") public void testIterateOverArrayOfInlineClassValues() throws Exception {