JVM_IR: do not copy defaults in functions with inline class parameters
This commit is contained in:
+8
-3
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<String> = Array<String>(1) { "OK" }) = xs[i]
|
||||
Vendored
+11
@@ -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"
|
||||
+10
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+10
@@ -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");
|
||||
|
||||
+10
@@ -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");
|
||||
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user