JVM_IR: do not copy defaults in functions with inline class parameters

This commit is contained in:
pyos
2019-12-20 12:41:21 +01:00
committed by Georgy Bronnikov
parent 9e17140daf
commit 982a088f00
9 changed files with 73 additions and 3 deletions
@@ -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]
@@ -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"
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");