From d6475cb2ad1eed6d824af3b0ae5cd668f7002698 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Mon, 1 Oct 2018 14:15:52 +0300 Subject: [PATCH] Handle inline class operations in inline class secondary constructors #KT-27225 Fixed --- .../kotlin/backend/konan/lower/Autoboxing.kt | 4 +++- backend.native/tests/build.gradle | 4 ++++ .../tests/codegen/inlineClass/inlineClass0.kt | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 backend.native/tests/codegen/inlineClass/inlineClass0.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt index 1d713a933b2..7cff5804126 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt @@ -271,6 +271,8 @@ private class InlineClassTransformer(private val context: Context) : IrBuildingT } override fun visitConstructor(declaration: IrConstructor): IrStatement { + super.visitConstructor(declaration) + val classIsInlined = declaration.constructedClass.isInlined() if (classIsInlined && !declaration.isPrimary) { @@ -282,7 +284,7 @@ private class InlineClassTransformer(private val context: Context) : IrBuildingT (declaration.body as IrBlockBody).statements.clear() } - return super.visitConstructor(declaration) + return declaration } private fun IrBuilderWithScope.irIsNull(expression: IrExpression): IrExpression { diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 1f1aed97fff..e34a17348fb 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2580,6 +2580,10 @@ task classDeclarationInsideInline(type: RunKonanTest) { goldValue = "test1: 1.0\n1\ntest2\n" } +task inlineClass0(type: RunKonanTest) { + source = "codegen/inlineClass/inlineClass0.kt" +} + task deserialized_inline0(type: RunKonanTest) { source = "serialization/deserialized_inline0.kt" } diff --git a/backend.native/tests/codegen/inlineClass/inlineClass0.kt b/backend.native/tests/codegen/inlineClass/inlineClass0.kt new file mode 100644 index 00000000000..d4204320bc2 --- /dev/null +++ b/backend.native/tests/codegen/inlineClass/inlineClass0.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package codegen.inlineClass.inlineClass0 + +import kotlin.test.* + +// Based on KT-27225. + +inline class First(val value: Int) + +inline class Second(val value: First) { + constructor(c: Int) : this(First(c)) +} + +@Test fun runTest() { + assertEquals(Second(42).value.value, 42) +}