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 f5c4e2bdc88..221047a9193 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 @@ -151,12 +151,15 @@ class MemoizedInlineClassReplacements { val name = if (parameter == function.extensionReceiverParameter) Name.identifier("\$receiver") else parameter.name val newParameter: IrValueParameter if (parameter == function.dispatchReceiverParameter) { - newParameter = parameter.copyTo(this, index = -1, name = name) + newParameter = parameter.copyTo(this, index = -1, name = name, defaultValue = null) dispatchReceiverParameter = newParameter } else { - newParameter = parameter.copyTo(this, index = index - 1, name = name) + newParameter = parameter.copyTo(this, index = index - 1, name = name, defaultValue = null) valueParameters.add(newParameter) } + // Assuming that constructors and non-override functions are always replaced with the unboxed + // equivalent, deep-copying the value here is unnecessary. See `JvmInlineClassLowering`. + newParameter.defaultValue = parameter.defaultValue parameterMap[parameter.symbol] = newParameter } } @@ -176,8 +179,10 @@ class MemoizedInlineClassReplacements { else -> parameter.name } - val newParameter = parameter.copyTo(this, index = index, name = name) + val newParameter = parameter.copyTo(this, index = index, name = name, defaultValue = null) valueParameters.add(newParameter) + // See comment next to a similar line above. + newParameter.defaultValue = parameter.defaultValue parameterMap[parameter.symbol] = newParameter } } diff --git a/compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt b/compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt new file mode 100644 index 00000000000..8cfdc95d292 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND_FIR: JVM_IR +// FILE: a.kt +fun box() = A(0).f() + +// FILE: b.kt +inline class A(val i: Int) + +fun A.f(xs: Array = Array(1) { "OK" }) = xs[i] diff --git a/compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt b/compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt new file mode 100644 index 00000000000..17904c6a0e8 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt @@ -0,0 +1,11 @@ +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// WITH_REFLECT + +import kotlin.reflect.jvm.reflect + +inline class C(val x: Int) + +fun C.f(x: (String) -> Unit = { OK: String -> }) = x.reflect()?.parameters?.singleOrNull()?.name + +fun box(): String = C(0).f() ?: "null" diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index a48967fbf0b..4f5f8d76903 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12731,6 +12731,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/defaultFunctionsFromAnyForInlineClass.kt"); } + @TestMetadata("defaultWithInlineClassArgument.kt") + public void testDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt"); + } + @TestMetadata("elvisWithInlineClassAndNullConstant.kt") public void testElvisWithInlineClassAndNullConstant() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/elvisWithInlineClassAndNullConstant.kt"); @@ -23900,6 +23905,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/lambdaClasses/parameterNamesAndNullability.kt"); } + @TestMetadata("reflectOnDefaultWithInlineClassArgument.kt") + public void testReflectOnDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt"); + } + @TestMetadata("reflectOnLambdaInField.kt") public void testReflectOnLambdaInField() throws Exception { runTest("compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnLambdaInField.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index d82a114823b..e46d9e4bd8d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12746,6 +12746,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/defaultFunctionsFromAnyForInlineClass.kt"); } + @TestMetadata("defaultWithInlineClassArgument.kt") + public void testDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt"); + } + @TestMetadata("elvisWithInlineClassAndNullConstant.kt") public void testElvisWithInlineClassAndNullConstant() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/elvisWithInlineClassAndNullConstant.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 3569bc06828..8b8ef7931a0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -11581,6 +11581,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/defaultFunctionsFromAnyForInlineClass.kt"); } + @TestMetadata("defaultWithInlineClassArgument.kt") + public void testDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt"); + } + @TestMetadata("elvisWithInlineClassAndNullConstant.kt") public void testElvisWithInlineClassAndNullConstant() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/elvisWithInlineClassAndNullConstant.kt"); @@ -22384,6 +22389,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/reflection/lambdaClasses/parameterNamesAndNullability.kt"); } + @TestMetadata("reflectOnDefaultWithInlineClassArgument.kt") + public void testReflectOnDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt"); + } + @TestMetadata("reflectOnLambdaInField.kt") public void testReflectOnLambdaInField() throws Exception { runTest("compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnLambdaInField.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 7582b6585f8..39b4c4b2767 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11581,6 +11581,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/defaultFunctionsFromAnyForInlineClass.kt"); } + @TestMetadata("defaultWithInlineClassArgument.kt") + public void testDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt"); + } + @TestMetadata("elvisWithInlineClassAndNullConstant.kt") public void testElvisWithInlineClassAndNullConstant() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/elvisWithInlineClassAndNullConstant.kt"); @@ -22384,6 +22389,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/lambdaClasses/parameterNamesAndNullability.kt"); } + @TestMetadata("reflectOnDefaultWithInlineClassArgument.kt") + public void testReflectOnDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt"); + } + @TestMetadata("reflectOnLambdaInField.kt") public void testReflectOnLambdaInField() throws Exception { runTest("compiler/testData/codegen/box/reflection/lambdaClasses/reflectOnLambdaInField.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 221dfe0dee2..68679a3f046 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -10001,6 +10001,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/defaultFunctionsFromAnyForInlineClass.kt"); } + @TestMetadata("defaultWithInlineClassArgument.kt") + public void testDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt"); + } + @TestMetadata("elvisWithInlineClassAndNullConstant.kt") public void testElvisWithInlineClassAndNullConstant() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/elvisWithInlineClassAndNullConstant.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 665a6397c0d..45ba8d74b19 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11141,6 +11141,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/defaultFunctionsFromAnyForInlineClass.kt"); } + @TestMetadata("defaultWithInlineClassArgument.kt") + public void testDefaultWithInlineClassArgument() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/defaultWithInlineClassArgument.kt"); + } + @TestMetadata("elvisWithInlineClassAndNullConstant.kt") public void testElvisWithInlineClassAndNullConstant() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/elvisWithInlineClassAndNullConstant.kt");