From a1477983ba427acf026f5db80224a65fdde70844 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 23 Nov 2022 12:39:25 +0100 Subject: [PATCH] Properly handle vararg interpretation for classic frontend #KT-55108 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../interpreter/checker/IrConstTransformer.kt | 12 +++----- .../codegen/box/annotations/kt55108.kt | 28 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/annotations/kt55108.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 82b1fe4da0a..d899808ea3f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -257,6 +257,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/annotations/kt25489.kt"); } + @Test + @TestMetadata("kt55108.kt") + public void testKt55108() throws Exception { + runTest("compiler/testData/codegen/box/annotations/kt55108.kt"); + } + @Test @TestMetadata("mustBeDocumented.kt") public void testMustBeDocumented() throws Exception { diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt index b31cf9aa438..25cef772342 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt @@ -119,14 +119,10 @@ class IrConstTransformer( if (elements.isEmpty()) return this val newIrVararg = IrVarargImpl(this.startOffset, this.endOffset, this.type, this.varargElementType) for (element in this.elements) { - when (element) { - is IrExpression -> newIrVararg.addElement(element.transformSingleArg(this.varargElementType)) - is IrSpreadElement -> { - when (val expression = element.expression) { - is IrVararg -> expression.transformVarArg().elements.forEach { newIrVararg.addElement(it) } - else -> newIrVararg.addElement(expression.transformSingleArg(this.varargElementType)) - } - } + when (val arg = (element as? IrSpreadElement)?.expression ?: element) { + is IrVararg -> arg.transformVarArg().elements.forEach { newIrVararg.addElement(it) } + is IrExpression -> newIrVararg.addElement(arg.transformSingleArg(this.varargElementType)) + else -> newIrVararg.addElement(arg) } } return newIrVararg diff --git a/compiler/testData/codegen/box/annotations/kt55108.kt b/compiler/testData/codegen/box/annotations/kt55108.kt new file mode 100644 index 00000000000..7581f8c058f --- /dev/null +++ b/compiler/testData/codegen/box/annotations/kt55108.kt @@ -0,0 +1,28 @@ +// TARGET_BACKEND: JVM_IR +// WITH_REFLECT + +annotation class A(vararg val strings: String) + +@A(*arrayOf("foo", "bar"), "baz") +class B + +@A("baz", *arrayOf("foo", "bar"), "xyz") +class C + +@A(*arrayOf("foo", "bar", "xyz")) +class D + +@A("foo", "baz", "bar") +class E + +@A(*arrayOf("foo", "bar"), *arrayOf("baz", "xyz")) +class F + +fun box(): String { + assert((B::class.annotations.single() as A).strings.contentEquals(arrayOf("foo", "bar", "baz"))) { "Fail1" } + assert((C::class.annotations.single() as A).strings.contentEquals(arrayOf("baz", "foo", "bar", "xyz"))) { "Fail 2" } + assert((D::class.annotations.single() as A).strings.contentEquals(arrayOf("foo", "bar", "xyz"))) { "Fail 3" } + assert((E::class.annotations.single() as A).strings.contentEquals(arrayOf("foo", "baz", "bar"))) { "Fail 4" } + assert((F::class.annotations.single() as A).strings.contentEquals(arrayOf("foo", "bar", "baz", "xyz"))) { "Fail 5" } + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 8ee1ccf299c..5b04fa7b9cd 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -257,6 +257,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/annotations/kt25489.kt"); } + @Test + @TestMetadata("kt55108.kt") + public void testKt55108() throws Exception { + runTest("compiler/testData/codegen/box/annotations/kt55108.kt"); + } + @Test @TestMetadata("mustBeDocumented.kt") public void testMustBeDocumented() throws Exception {