JVM IR: Fix inline class constructors taking default values of inline class type.

This commit is contained in:
Steven Schäfer
2020-02-18 14:53:21 +01:00
committed by Alexander Udalov
parent 846e50a0c0
commit 4ac45eb38b
8 changed files with 43 additions and 0 deletions
@@ -430,6 +430,8 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER
returnType = irConstructor.returnType
}.apply {
// Don't create a default argument stub for the primary constructor
irConstructor.valueParameters.forEach { it.defaultValue = null }
copyParameterDeclarationsFrom(irConstructor)
body = context.createIrBuilder(this.symbol).irBlockBody(this) {
+irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
@@ -444,6 +446,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
// Add a static bridge method to the primary constructor.
// This is a placeholder for null-checks and default arguments.
val function = context.inlineClassReplacements.getReplacementFunction(irConstructor)!!
function.valueParameters.forEach { it.transformChildrenVoid() }
with(context.createIrBuilder(function.symbol)) {
val argument = function.valueParameters[0]
function.body = irExprBody(
@@ -0,0 +1,10 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND_FIR: JVM_IR
inline class Inner(val result: String)
inline class A(val inner: Inner = Inner("OK"))
fun box(): String {
return A().inner.result
}
@@ -13851,6 +13851,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructor.kt");
}
@TestMetadata("inlineClassPrimaryConstructorWithInlineClassValue.kt")
public void testInlineClassPrimaryConstructorWithInlineClassValue() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt");
}
@TestMetadata("inlineClassSecondaryConstructor.kt")
public void testInlineClassSecondaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassSecondaryConstructor.kt");
@@ -13851,6 +13851,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructor.kt");
}
@TestMetadata("inlineClassPrimaryConstructorWithInlineClassValue.kt")
public void testInlineClassPrimaryConstructorWithInlineClassValue() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt");
}
@TestMetadata("inlineClassSecondaryConstructor.kt")
public void testInlineClassSecondaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassSecondaryConstructor.kt");
@@ -12721,6 +12721,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructor.kt");
}
@TestMetadata("inlineClassPrimaryConstructorWithInlineClassValue.kt")
public void testInlineClassPrimaryConstructorWithInlineClassValue() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt");
}
@TestMetadata("inlineClassSecondaryConstructor.kt")
public void testInlineClassSecondaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassSecondaryConstructor.kt");
@@ -12721,6 +12721,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructor.kt");
}
@TestMetadata("inlineClassPrimaryConstructorWithInlineClassValue.kt")
public void testInlineClassPrimaryConstructorWithInlineClassValue() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt");
}
@TestMetadata("inlineClassSecondaryConstructor.kt")
public void testInlineClassSecondaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassSecondaryConstructor.kt");
@@ -10981,6 +10981,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructor.kt");
}
@TestMetadata("inlineClassPrimaryConstructorWithInlineClassValue.kt")
public void testInlineClassPrimaryConstructorWithInlineClassValue() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt");
}
@TestMetadata("inlineClassSecondaryConstructor.kt")
public void testInlineClassSecondaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassSecondaryConstructor.kt");
@@ -11046,6 +11046,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructor.kt");
}
@TestMetadata("inlineClassPrimaryConstructorWithInlineClassValue.kt")
public void testInlineClassPrimaryConstructorWithInlineClassValue() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt");
}
@TestMetadata("inlineClassSecondaryConstructor.kt")
public void testInlineClassSecondaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassSecondaryConstructor.kt");