From 4ac45eb38be60d6db7abd1c8149e424cd6531e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 18 Feb 2020 14:53:21 +0100 Subject: [PATCH] JVM IR: Fix inline class constructors taking default values of inline class type. --- .../kotlin/backend/jvm/lower/JvmInlineClassLowering.kt | 3 +++ ...nlineClassPrimaryConstructorWithInlineClassValue.kt | 10 ++++++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../kotlin/codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../test/ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 8 files changed, 43 insertions(+) create mode 100644 compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt index 22f3d3761cb..963a47b903d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt @@ -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( diff --git a/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt b/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt new file mode 100644 index 00000000000..fb6e55bfd0c --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/defaultParameterValues/inlineClassPrimaryConstructorWithInlineClassValue.kt @@ -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 +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 1d28ae42b63..3723e5f00d3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b6cd577779c..28a2dfb7707 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 53644beb475..010133dc643 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index f21d3b51d49..cc26c932748 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -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"); 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 33cda51f6b3..98d3793e980 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 @@ -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"); 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 a3ea6ff516b..2f3b5fc7f16 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 @@ -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");