diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index b23fdc5307f..103ee23fd0a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -605,6 +605,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 106bbc1fdce..e6f485fc591 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -605,6 +605,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AnnotationImplementationTransformer.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AnnotationImplementationTransformer.kt index 89815924151..7364ca95515 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AnnotationImplementationTransformer.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AnnotationImplementationTransformer.kt @@ -17,12 +17,12 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.classOrNull -import org.jetbrains.kotlin.ir.types.isArray +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name @@ -105,11 +105,36 @@ abstract class AnnotationImplementationTransformer(val context: BackendContext, destination.symbol.owner.valueParameters.forEachIndexed { index, parameter -> val valueArg = argumentsByName[parameter.name] - if (parameter.defaultValue == null && valueArg == null) - error( - "Usage of default value argument for this annotation is not yet possible.\n" + - "Please specify value for '${source.type.classOrNull?.owner?.name}.${parameter.name}' explicitly" - ) + + if (parameter.defaultValue == null && valueArg == null) { + // if parameter is vararg, put an empty array as argument + // The vararg is already lowered to array, so `isVararg` is false. + if (parameter.type.isBoxedArray || parameter.type.isPrimitiveArray() || parameter.type.isUnsignedArray()) { + val arrayType = parameter.type + + val arrayConstructorCall = + if (arrayType.isBoxedArray) { + val arrayFunction = context.ir.symbols.arrayOfNulls + IrCallImpl.fromSymbolOwner(source.startOffset, source.endOffset, arrayType, arrayFunction) + } else { + val arrayConstructor = arrayType.classOrNull!!.constructors.single { + it.owner.valueParameters.size == 1 && it.owner.valueParameters.single().type == context.irBuiltIns.intType + } + IrConstructorCallImpl.fromSymbolOwner(source.startOffset, source.endOffset, arrayType, arrayConstructor) + } + arrayConstructorCall.putValueArgument( + 0, + IrConstImpl.int(source.startOffset, source.endOffset, context.irBuiltIns.intType, 0) + ) + destination.putValueArgument(index, arrayConstructorCall) + return + } else { + error( + "Usage of default value argument for this annotation is not yet possible.\n" + + "Please specify value for '${source.type.classOrNull?.owner?.name}.${parameter.name}' explicitly" + ) + } + } destination.putValueArgument(index, valueArg) } } diff --git a/compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt b/compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt new file mode 100644 index 00000000000..2eb4bf0de80 --- /dev/null +++ b/compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt @@ -0,0 +1,18 @@ +// WITH_STDLIB +// IGNORE_BACKEND: JVM +// UIntArray parameters do not work on WASM +// See also: KT-59032. +// IGNORE_BACKEND: WASM + +annotation class KotlinAnn(vararg val foo: String) + +annotation class KotlinIntAnn(vararg val foo: Int) + +annotation class KotlinUIntAnn(vararg val foo: UInt) + +fun box(): String { + KotlinAnn() + KotlinIntAnn() + KotlinUIntAnn() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 54ab14e6bd6..15a2d641f61 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -491,6 +491,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested 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 af42ffcd874..acbfaa6d7ba 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 @@ -605,6 +605,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index ac183c4f4f3..10155be2f1f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -605,6 +605,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 8bda4fda64c..89ac3488177 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -425,6 +425,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void ignoreVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } + private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 5802cbbfb38..2655ea62d46 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -107,6 +107,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { public void testMultiplatformInstantiation() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/multiplatformInstantiation.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index c750a74ae61..4edfa94617b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -161,6 +161,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index d1ae7af3470..5f0f8de9fae 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -161,6 +161,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 6f68d49b9aa..d5f37c2673c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -161,6 +161,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java index bcc8c9b67a0..f90e393a302 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java @@ -178,6 +178,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java index a2ce02295de..cf9b988ca35 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java @@ -188,6 +188,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 6130806ae16..11c9d3bf146 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -174,6 +174,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java index c81e9510278..c8cd92e54a5 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java @@ -179,6 +179,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @Test + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @Nested diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java index b77fed61961..fc4d66d737c 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java @@ -157,6 +157,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest public void testNestedAnnotationInstances() throws Exception { runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt"); } + + @TestMetadata("varargInAnnotationParameterInstantiation.kt") + public void testVarargInAnnotationParameterInstantiation() throws Exception { + runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt"); + } } @TestMetadata("compiler/testData/codegen/box/annotations/kClassMapping")