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 69670cda45a..dde88a06cbf 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 @@ -24860,6 +24860,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/varargs/AmbiguousVararg.kt"); } + @TestMetadata("assignArrayToVararagInNamedFormWithInference.kt") + public void testAssignArrayToVararagInNamedFormWithInference() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.kt"); + } + @TestMetadata("assignArrayToVararagInNamedForm_1_3.kt") public void testAssignArrayToVararagInNamedForm_1_3() throws Exception { runTest("compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt index 49dca5fe9bd..af424bed0f6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt @@ -236,9 +236,12 @@ private fun arrayAssignmentToVarargInNamedFormInAnnotation( ): Boolean { if (!languageVersionSettings.supportsFeature(LanguageFeature.AssigningArraysToVarargsInNamedFormInAnnotations)) return false - if (!isParameterOfAnnotation(parameterDescriptor)) return false + val isAllowedAssigningSingleElementsToVarargsInNamedForm = + !languageVersionSettings.supportsFeature(LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm) - return argument.isNamed() && parameterDescriptor.isVararg && isArrayOrArrayLiteral(argument, trace) + if (isAllowedAssigningSingleElementsToVarargsInNamedForm && !isArrayOrArrayLiteral(argument, trace)) return false + + return isParameterOfAnnotation(parameterDescriptor) && argument.isNamed() && parameterDescriptor.isVararg } private fun arrayAssignmentToVarargInNamedFormInFunction( @@ -249,7 +252,12 @@ private fun arrayAssignmentToVarargInNamedFormInFunction( ): Boolean { if (!languageVersionSettings.supportsFeature(LanguageFeature.AllowAssigningArrayElementsToVarargsInNamedFormForFunctions)) return false - return argument.isNamed() && parameterDescriptor.isVararg && isArrayOrArrayLiteral(argument, trace) + val isAllowedAssigningSingleElementsToVarargsInNamedForm = + !languageVersionSettings.supportsFeature(LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm) + + if (isAllowedAssigningSingleElementsToVarargsInNamedForm && !isArrayOrArrayLiteral(argument, trace)) return false + + return argument.isNamed() && parameterDescriptor.isVararg } fun isArrayOrArrayLiteral(argument: ValueArgument, trace: BindingTrace): Boolean { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt index 6671208b147..4ea556029d7 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt @@ -151,9 +151,12 @@ private fun KotlinCallArgument.isArrayAssignedAsNamedArgumentInAnnotation( ): Boolean { if (!languageVersionSettings.supportsFeature(LanguageFeature.AssigningArraysToVarargsInNamedFormInAnnotations)) return false - if (this.argumentName == null || !parameter.isVararg) return false + val isAllowedAssigningSingleElementsToVarargsInNamedForm = + !languageVersionSettings.supportsFeature(LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm) - return isParameterOfAnnotation(parameter) && this.isArrayOrArrayLiteral() + if (isAllowedAssigningSingleElementsToVarargsInNamedForm && !isArrayOrArrayLiteral()) return false + + return this.argumentName != null && parameter.isVararg && isParameterOfAnnotation(parameter) } private fun KotlinCallArgument.isArrayAssignedAsNamedArgumentInFunction( @@ -162,9 +165,12 @@ private fun KotlinCallArgument.isArrayAssignedAsNamedArgumentInFunction( ): Boolean { if (!languageVersionSettings.supportsFeature(LanguageFeature.AllowAssigningArrayElementsToVarargsInNamedFormForFunctions)) return false - if (this.argumentName == null || !parameter.isVararg) return false + val isAllowedAssigningSingleElementsToVarargsInNamedForm = + !languageVersionSettings.supportsFeature(LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm) - return this.isArrayOrArrayLiteral() + if (isAllowedAssigningSingleElementsToVarargsInNamedForm && !isArrayOrArrayLiteral()) return false + + return this.argumentName != null && parameter.isVararg } fun KotlinCallArgument.isArrayOrArrayLiteral(): Boolean { diff --git a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt index 6e7dcd89023..aae553ed551 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt @@ -12,7 +12,7 @@ fun main() { join(1, "2", "3") join(*1, "2") join(1, *"2") - join(x = 1, a = "2") + join(x = 1, a = "2") join(x = *1, a = *"2") join(x = 1, a = a) join(x = 1, a = b) @@ -33,7 +33,7 @@ fun main() { joinG(*1, "2") joinG(1, *"2") joinG(x = 1, a = a) - joinG(x = 1, a = "2") + joinG(x = 1, a = "2") joinG(x = *1, a = *"2") joinG(1, *a) joinG(1, *a, "3") @@ -46,7 +46,7 @@ fun main() { joinG(*1, "2") joinG(1, *"2") joinG(x = 1, a = a) - joinG(x = 1, a = "2") + joinG(x = 1, a = "2") joinG(x = *1, a = *"2") joinG(1, *a) joinG(1, *a, "3") diff --git a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsInDifferentPositions.kt b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsInDifferentPositions.kt index 0abd0d74549..674111bbb09 100644 --- a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsInDifferentPositions.kt +++ b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsInDifferentPositions.kt @@ -8,6 +8,6 @@ fun overloadedFun(arg: String, vararg args: String) = X1 fun overloadedFun(arg: String, vararg args: String, flag: Boolean = true) = X2 val test1a: X1 = overloadedFun("", "") -val test1b: X1 = overloadedFun("", args = "") +val test1b: X1 = overloadedFun("", args = "") val test1c: X2 = overloadedFun("", "", "", flag = true) diff --git a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.kt b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.kt index 4470eab6469..39b6f98be7b 100644 --- a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.kt +++ b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.kt @@ -9,5 +9,5 @@ fun overloadedFun5(s: String, vararg ss: String) = X2 val test1 = overloadedFun5("") val test2 = overloadedFun5("", "") -val test3: X2 = overloadedFun5(s = "", ss = "") -val test4: X1 = overloadedFun5(ss = "") \ No newline at end of file +val test3: X2 = overloadedFun5(s = "", ss = "") +val test4: X1 = overloadedFun5(ss = "") \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.kt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.kt new file mode 100644 index 00000000000..4ec25a93ded --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun id(x: K) = x + +fun main() { + foo(x = id(arrayOf(1))) +} + +fun foo(vararg x: T) {} diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.txt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.txt new file mode 100644 index 00000000000..ad7323e8fb9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.txt @@ -0,0 +1,5 @@ +package + +public fun foo(/*0*/ vararg x: T /*kotlin.Array*/): kotlin.Unit +public fun id(/*0*/ x: K): K +public fun main(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt index 482d6abbb36..af94f1b47ce 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt @@ -31,6 +31,6 @@ fun test_ann(s: String, arr: Array) { @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 919f0f8805b..d74bf038a54 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.kt @@ -16,7 +16,7 @@ fun test_fun(s: String, arr: Array) { withVararg(s = *arr) // Warning withVararg(s) // OK - withVararg(s = s) // Error + withVararg(s = s) // Error } fun test_ann(s: String, arr: Array) { @@ -31,6 +31,6 @@ fun test_ann(s: String, arr: Array) { @Ann("", x = 1) foo() - @Ann(s = "", x = 1) + @Ann(s = "", x = 1) foo() } diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.kt index 7bd7fbeff16..6f3a0c756fd 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.kt @@ -11,7 +11,7 @@ annotation class Ann(vararg val s: String) -@Ann(s = "value") +@Ann(s = "value") fun test1() {} @Ann(s = *arrayOf("value")) @@ -20,7 +20,7 @@ fun test2() {} @Ann(s = *["value"]) fun test3() {} -@JavaAnn(value = "value") +@JavaAnn(value = "value") fun test4() {} @JavaAnn("value", path = arrayOf("path")) diff --git a/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt b/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt index cb272bb8344..4eb8af851f5 100644 --- a/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt +++ b/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt @@ -4,7 +4,7 @@ annotation class Anno1(vararg val s: String) annotation class Anno2(vararg val i: Int) -@Anno1(s = "foo") +@Anno1(s = "foo") @Anno2(i = *intArrayOf(1)) fun f1() {} @@ -15,6 +15,6 @@ fun f2() {} fun foo(vararg ints: Int) {} fun test() { - foo(ints = 1) + foo(ints = 1) foo(ints = *intArrayOf(1)) } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 244595fe1c9..c92cea38c31 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -24942,6 +24942,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/varargs/AmbiguousVararg.kt"); } + @TestMetadata("assignArrayToVararagInNamedFormWithInference.kt") + public void testAssignArrayToVararagInNamedFormWithInference() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.kt"); + } + @TestMetadata("assignArrayToVararagInNamedForm_1_3.kt") public void testAssignArrayToVararagInNamedForm_1_3() throws Exception { runTest("compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index a5fa5b1090e..66b886766bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -24862,6 +24862,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/varargs/AmbiguousVararg.kt"); } + @TestMetadata("assignArrayToVararagInNamedFormWithInference.kt") + public void testAssignArrayToVararagInNamedFormWithInference() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedFormWithInference.kt"); + } + @TestMetadata("assignArrayToVararagInNamedForm_1_3.kt") public void testAssignArrayToVararagInNamedForm_1_3() throws Exception { runTest("compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.kt");