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 01fe17d9d2f..511d835fe90 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 @@ -18420,6 +18420,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @Test + @TestMetadata("inlineInCompanion.kt") + public void testInlineInCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt"); + } + @Test @TestMetadata("iterateOverArrayOfInlineClassValues.kt") public void testIterateOverArrayOfInlineClassValues() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 098e88d11e2..a9ed5030899 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -185,6 +185,13 @@ class JvmBackendContext( functionSymbolMap[staticReplacement.symbol] = newStaticReplacement.symbol } + for ((methodReplacement, original) in inlineClassReplacements.originalFunctionForMethodReplacement) { + if (methodReplacement !is IrSimpleFunction) continue + val newOriginal = functionSymbolMap[original.symbol]?.owner ?: continue + val newMethodReplacement = inlineClassReplacements.getReplacementFunction(newOriginal) ?: continue + functionSymbolMap[methodReplacement.symbol] = newMethodReplacement.symbol + } + for ((original, suspendView) in suspendFunctionOriginalToView) { val newOriginal = functionSymbolMap[original.symbol]?.owner ?: continue val newSuspendView = suspendFunctionOriginalToView[newOriginal] ?: continue diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt index c515e4d2de5..4316830297d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt @@ -45,6 +45,7 @@ class MemoizedInlineClassReplacements( private val propertyMap = ConcurrentHashMap() internal val originalFunctionForStaticReplacement: MutableMap = ConcurrentHashMap() + internal val originalFunctionForMethodReplacement: MutableMap = ConcurrentHashMap() /** * Get a replacement for a function or a constructor. @@ -181,6 +182,7 @@ class MemoizedInlineClassReplacements( private fun createMethodReplacement(function: IrFunction): IrSimpleFunction = buildReplacement(function, function.origin) { + originalFunctionForMethodReplacement[this] = function require(function.dispatchReceiverParameter != null && function is IrSimpleFunction) dispatchReceiverParameter = function.dispatchReceiverParameter?.copyTo(this, index = -1) extensionReceiverParameter = function.extensionReceiverParameter?.copyTo(this, index = -1, name = Name.identifier("\$receiver")) diff --git a/compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt b/compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt new file mode 100644 index 00000000000..4f46b179474 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt @@ -0,0 +1,17 @@ +// TARGET_BACKEND: JVM_IR +// WITH_RUNTIME +// FILE: R.kt +import kotlin.jvm.JvmInline + +@JvmInline +value class R(val value: String) { + companion object { + inline fun ok() = R("OK") + } +} + +// FILE: test.kt + +fun box(): String = R.ok().value + + 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 04120a2d3ee..46ae4f3347f 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 @@ -18420,6 +18420,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); } + @Test + @TestMetadata("inlineInCompanion.kt") + public void testInlineInCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt"); + } + @Test @TestMetadata("iterateOverArrayOfInlineClassValues.kt") public void testIterateOverArrayOfInlineClassValues() throws Exception {