From 76ed09482f9ee12145f125ef5ff8da98faa15da2 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Tue, 22 Sep 2020 17:57:55 +0300 Subject: [PATCH] [IR BE] Fix inline class lowering - provide additional type parameters from context when transforming constructor into static function. - fix KT-41771 - add test --- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../lower/InlineClassDeclarationLowering.kt | 18 +++++++++++++++++- .../genericVararg2ndConstructor.kt | 11 +++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 9 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 5e830a98c8e..57df44f5be3 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -13532,6 +13532,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt index 1693bf5bd8d..160b90b4f12 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt @@ -255,8 +255,24 @@ class InlineClassLowering(val context: CommonBackendContext) { else -> Name.identifier(asString() + INLINE_CLASS_IMPL_SUFFIX) } + private fun collectTypeParameters(declaration: IrTypeParametersContainer): List { + val result = mutableListOf() + + fun collectImpl(declaration: IrDeclaration) { + if (declaration is IrTypeParametersContainer) result.addAll(declaration.typeParameters) + if (declaration is IrClass && declaration.isInner) collectImpl(declaration.parent as IrDeclaration) + } + + collectImpl(declaration) + + return result + } + private fun createStaticBodilessMethod(function: IrFunction): IrSimpleFunction = context.irFactory.createStaticFunctionWithReceivers( - function.parent, function.name.toInlineClassImplementationName(), function + function.parent, + function.name.toInlineClassImplementationName(), + function, + typeParametersFromContext = collectTypeParameters(function.parentAsClass) ) } diff --git a/compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt b/compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt new file mode 100644 index 00000000000..7394adb23b6 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt @@ -0,0 +1,11 @@ +// KJS_WITH_FULL_RUNTIME +// WITH_RUNTIME +// KT-41771 + +inline class Polynomial(val coefficients: List) { + constructor(vararg coefficients: T) : this(coefficients.toList()) +} +fun box(): String { + val p = Polynomial("FAIL1", "OK", "FAIL2") + return p.coefficients[1] +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 19e85f7974b..409caa8b8ee 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -14927,6 +14927,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 09583f04fab..f979302cbcc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -14937,6 +14937,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index cc5e5335747..9d999c4a6eb 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -13532,6 +13532,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index ea5b66d7264..a2655e463c5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -11642,6 +11642,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.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 6f75281184d..ba3099a7465 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 @@ -11642,6 +11642,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.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 dc253cb5a9e..5aa92914c10 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 @@ -11707,6 +11707,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt"); } + @TestMetadata("genericVararg2ndConstructor.kt") + public void testGenericVararg2ndConstructor() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/genericVararg2ndConstructor.kt"); + } + @TestMetadata("inlineClassAsLastExpressionInInLambda.kt") public void testInlineClassAsLastExpressionInInLambda() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt");