diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 07ae23e4ca8..e29daf48860 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -920,6 +920,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/annotations/deprecatedRepeatable.kt"); } + @TestMetadata("dontReportWarningAboutChangingExecutionOrderForVararg.kt") + public void testDontReportWarningAboutChangingExecutionOrderForVararg() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.kt"); + } + @TestMetadata("extensionFunctionType.kt") public void testExtensionFunctionType() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/VarargWrongExecutionOrderChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/VarargWrongExecutionOrderChecker.kt index c18deff6c4b..56634e1ccd9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/VarargWrongExecutionOrderChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/VarargWrongExecutionOrderChecker.kt @@ -12,12 +12,15 @@ import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.resolve.calls.callUtil.getParameterForArgument import org.jetbrains.kotlin.resolve.calls.components.isVararg import org.jetbrains.kotlin.resolve.calls.model.* +import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor object VarargWrongExecutionOrderChecker : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { val isCorrectExecutionOrderForVarargArgumentsAlreadyUsed = context.languageVersionSettings.getFeatureSupport(LanguageFeature.UseCorrectExecutionOrderForVarargArguments) == LanguageFeature.State.ENABLED + if (resolvedCall.candidateDescriptor.isAnnotationConstructor()) return + if (isCorrectExecutionOrderForVarargArgumentsAlreadyUsed) return val valueArguments = resolvedCall.call.valueArguments diff --git a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt new file mode 100644 index 00000000000..8ca3f58b4ca --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt @@ -0,0 +1,23 @@ +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno(vararg val x: String, val y: String) + +@Anno(x = [["a", "b"], ["a", "b"]], y = "a") +fun foo1() {} + +@Anno(x = ["a", "b"], y = "a") +fun foo2() {} + +@Anno(x = arrayOf(arrayOf("a"), arrayOf("b")), y = "a") +fun foo3() {} + +@Anno(x = arrayOf("a", "b"), y = "a") +fun foo4() {} + +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno1(val x: Array, val y: String) + +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno2(vararg val x: String, val y: String) + +@Anno1(x = ["", Anno2(x = [""], y = "")], y = "") +fun foo5() {} diff --git a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.kt b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.kt new file mode 100644 index 00000000000..94956926244 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.kt @@ -0,0 +1,23 @@ +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno(vararg val x: String, val y: String) + +@Anno(x = [["a", "b"], ["a", "b"]], y = "a") +fun foo1() {} + +@Anno(x = ["a", "b"], y = "a") +fun foo2() {} + +@Anno(x = arrayOf(arrayOf("a"), arrayOf("b")), y = "a") +fun foo3() {} + +@Anno(x = arrayOf("a", "b"), y = "a") +fun foo4() {} + +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno1(val x: Array, val y: String) + +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno2(vararg val x: String, val y: String) + +@Anno1(x = ["", Anno2(x = [""], y = "")], y = "") +fun foo5() {} diff --git a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.txt b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.txt new file mode 100644 index 00000000000..fb9586c3c83 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.txt @@ -0,0 +1,34 @@ +package + +@Anno(x = {{"a", "b"}, {"a", "b"}}, y = "a") public fun foo1(): kotlin.Unit +@Anno(x = {"a", "b"}, y = "a") public fun foo2(): kotlin.Unit +@Anno(x = {{"a"}, {"b"}}, y = "a") public fun foo3(): kotlin.Unit +@Anno(x = {"a", "b"}, y = "a") public fun foo4(): kotlin.Unit +@Anno1(x = {"", Anno2(x = {""}, y = "")}, y = "") public fun foo5(): kotlin.Unit + +@kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class Anno : kotlin.Annotation { + public constructor Anno(/*0*/ vararg x: kotlin.String /*kotlin.Array*/, /*1*/ y: kotlin.String) + public final val x: kotlin.Array + public final val y: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class Anno1 : kotlin.Annotation { + public constructor Anno1(/*0*/ x: kotlin.Array, /*1*/ y: kotlin.String) + public final val x: kotlin.Array + public final val y: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class Anno2 : kotlin.Annotation { + public constructor Anno2(/*0*/ vararg x: kotlin.String /*kotlin.Array*/, /*1*/ y: kotlin.String) + public final val x: kotlin.Array + public final val y: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt index 1b1b29427a3..af94f1b47ce 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt @@ -24,13 +24,13 @@ fun test_ann(s: String, arr: Array) { foo() @Ann(*[""], x = 1) foo() - @Ann(s = [""], x = 1) + @Ann(s = [""], x = 1) foo() - @Ann(s = *[""], x = 1) + @Ann(s = *[""], x = 1) foo() @Ann("", x = 1) foo() - @Ann(s = "", x = 1) + @Ann(s = "", x = 1) foo() } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.kt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.kt index 092998e528c..d74bf038a54 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.kt @@ -24,13 +24,13 @@ fun test_ann(s: String, arr: Array) { foo() @Ann(*[""], x = 1) foo() - @Ann(s = [""], x = 1) + @Ann(s = [""], x = 1) foo() - @Ann(s = *[""], x = 1) + @Ann(s = *[""], x = 1) foo() @Ann("", x = 1) foo() - @Ann(s = "", x = 1) + @Ann(s = "", x = 1) foo() } diff --git a/compiler/testData/diagnostics/tests/varargs/assigningArraysToVarargsInAnnotations.kt b/compiler/testData/diagnostics/tests/varargs/assigningArraysToVarargsInAnnotations.kt index 4c3911d35c7..e830c54b743 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningArraysToVarargsInAnnotations.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningArraysToVarargsInAnnotations.kt @@ -33,7 +33,7 @@ fun jTest1() {} @JavaAnn(value = ["value"]) fun jTest2() {} -@JavaAnn(value = ["value"], path = ["path"]) +@JavaAnn(value = ["value"], path = ["path"]) fun jTest3() {} diff --git a/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.kt b/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.kt index 6496325002f..203747e07d8 100644 --- a/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.kt +++ b/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.kt @@ -30,7 +30,7 @@ fun jTest1() {} @JavaAnn(value = ["value"]) fun jTest2() {} -@JavaAnn(value = ["value"], path = ["path"]) +@JavaAnn(value = ["value"], path = ["path"]) fun jTest3() {} annotation class IntAnn(vararg val i: Int) diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.kt index 0ffb8a37a9f..ee2422d2d7e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.kt @@ -26,5 +26,5 @@ public @interface A { @A fun test8() {} @A(x = Any::class, *arrayOf("5", "6"), "7", y = 3) fun test9() {} -@A(x = Any::class, value = ["5", "6"], "7", y = 3) fun test10() {} -@A(x = Any::class, value = ["5", "6", "7"], y = 3) fun test11() {} +@A(x = Any::class, value = ["5", "6"], "7", y = 3) fun test10() {} +@A(x = Any::class, value = ["5", "6", "7"], y = 3) fun test11() {} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index eb9b16060f9..65c2b18fc0a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -927,6 +927,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/annotations/deprecatedRepeatable.kt"); } + @TestMetadata("dontReportWarningAboutChangingExecutionOrderForVararg.kt") + public void testDontReportWarningAboutChangingExecutionOrderForVararg() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.kt"); + } + @TestMetadata("extensionFunctionType.kt") public void testExtensionFunctionType() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 6be9c99bccb..39d7c9033e0 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -922,6 +922,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/annotations/deprecatedRepeatable.kt"); } + @TestMetadata("dontReportWarningAboutChangingExecutionOrderForVararg.kt") + public void testDontReportWarningAboutChangingExecutionOrderForVararg() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.kt"); + } + @TestMetadata("extensionFunctionType.kt") public void testExtensionFunctionType() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt");