Don't check an argument type during passing it to vararg in the named form to avoid false positives if the argument type is type variable yet
^KT-41144 Fixed
This commit is contained in:
+5
@@ -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");
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+10
-4
@@ -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 {
|
||||
|
||||
@@ -12,7 +12,7 @@ fun main() {
|
||||
join(1, "2", "3")
|
||||
join(<!NON_VARARG_SPREAD!>*<!>1, "2")
|
||||
join(1, *<!TYPE_MISMATCH!>"2"<!>)
|
||||
join(x = 1, a = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>"2"<!>)
|
||||
join(x = 1, a = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, NI;TYPE_MISMATCH!>"2"<!>)
|
||||
join(x = <!NON_VARARG_SPREAD!>*<!>1, a = *<!TYPE_MISMATCH!>"2"<!>)
|
||||
join(x = 1, a = a)
|
||||
join(x = 1, a = <!TYPE_MISMATCH!>b<!>)
|
||||
@@ -33,7 +33,7 @@ fun main() {
|
||||
joinG<String>(<!NON_VARARG_SPREAD!>*<!>1, "2")
|
||||
joinG<String>(1, *<!TYPE_MISMATCH!>"2"<!>)
|
||||
joinG<String>(x = 1, a = a)
|
||||
joinG<String>(x = 1, a = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>"2"<!>)
|
||||
joinG<String>(x = 1, a = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, NI;TYPE_MISMATCH!>"2"<!>)
|
||||
joinG<String>(x = <!NON_VARARG_SPREAD!>*<!>1, a = *<!TYPE_MISMATCH!>"2"<!>)
|
||||
joinG<String>(1, *a)
|
||||
joinG<String>(1, *a, "3")
|
||||
@@ -46,7 +46,7 @@ fun main() {
|
||||
joinG(<!NON_VARARG_SPREAD!>*<!>1, "2")
|
||||
<!OI;TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR!>joinG<!>(1, *<!TYPE_MISMATCH!>"2"<!>)
|
||||
joinG(x = 1, a = a)
|
||||
joinG(x = 1, a = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>"2"<!>)
|
||||
joinG(x = 1, a = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, NI;TYPE_MISMATCH!>"2"<!>)
|
||||
<!OI;TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR!>joinG<!>(x = <!NON_VARARG_SPREAD!>*<!>1, a = *<!TYPE_MISMATCH!>"2"<!>)
|
||||
joinG(1, *a)
|
||||
joinG(1, *a, "3")
|
||||
|
||||
Vendored
+1
-1
@@ -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 = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>""<!>)
|
||||
val test1b: X1 = overloadedFun("", args = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, TYPE_MISMATCH!>""<!>)
|
||||
val test1c: X2 = overloadedFun("", "", "", flag = true)
|
||||
|
||||
|
||||
+2
-2
@@ -9,5 +9,5 @@ fun overloadedFun5(s: String, vararg ss: String) = X2
|
||||
|
||||
val test1 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>overloadedFun5<!>("")
|
||||
val test2 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>overloadedFun5<!>("", "")
|
||||
val test3: X2 = overloadedFun5(s = "", ss = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>""<!>)
|
||||
val test4: X1 = overloadedFun5(ss = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>""<!>)
|
||||
val test3: X2 = <!NONE_APPLICABLE!>overloadedFun5<!>(<!DEBUG_INFO_MISSING_UNRESOLVED!>s<!> = "", <!DEBUG_INFO_MISSING_UNRESOLVED!>ss<!> = "")
|
||||
val test4: X1 = overloadedFun5(ss = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, TYPE_MISMATCH!>""<!>)
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun <K> id(x: K) = x
|
||||
|
||||
fun main() {
|
||||
foo(x = id(arrayOf(1)))
|
||||
}
|
||||
|
||||
fun <T> foo(vararg x: T) {}
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T> foo(/*0*/ vararg x: T /*kotlin.Array<out T>*/): kotlin.Unit
|
||||
public fun </*0*/ K> id(/*0*/ x: K): K
|
||||
public fun main(): kotlin.Unit
|
||||
+1
-1
@@ -31,6 +31,6 @@ fun test_ann(s: String, arr: Array<String>) {
|
||||
|
||||
@Ann("", x = 1)
|
||||
foo()
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>""<!>, x = 1)
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, NI;TYPE_MISMATCH!>""<!>, x = 1)
|
||||
foo()
|
||||
}
|
||||
+2
-2
@@ -16,7 +16,7 @@ fun test_fun(s: String, arr: Array<String>) {
|
||||
withVararg(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_FUNCTION!>arr<!>) // Warning
|
||||
|
||||
withVararg(s) // OK
|
||||
withVararg(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>s<!>) // Error
|
||||
withVararg(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, NI;TYPE_MISMATCH!>s<!>) // Error
|
||||
}
|
||||
|
||||
fun test_ann(s: String, arr: Array<String>) {
|
||||
@@ -31,6 +31,6 @@ fun test_ann(s: String, arr: Array<String>) {
|
||||
|
||||
@Ann("", x = 1)
|
||||
foo()
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>""<!>, x = 1)
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, NI;TYPE_MISMATCH!>""<!>, x = 1)
|
||||
foo()
|
||||
}
|
||||
|
||||
+2
-2
@@ -11,7 +11,7 @@
|
||||
|
||||
annotation class Ann(vararg val s: String)
|
||||
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>"value"<!>)
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, TYPE_MISMATCH!>"value"<!>)
|
||||
fun test1() {}
|
||||
|
||||
@Ann(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>arrayOf("value")<!>)
|
||||
@@ -20,7 +20,7 @@ fun test2() {}
|
||||
@Ann(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>["value"]<!>)
|
||||
fun test3() {}
|
||||
|
||||
@JavaAnn(value = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>"value"<!>)
|
||||
@JavaAnn(value = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, TYPE_MISMATCH!>"value"<!>)
|
||||
fun test4() {}
|
||||
|
||||
@JavaAnn("value", path = arrayOf("path"))
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
annotation class Anno1(vararg val s: String)
|
||||
annotation class Anno2(vararg val i: Int)
|
||||
|
||||
@Anno1(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>"foo"<!>)
|
||||
@Anno1(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, TYPE_MISMATCH!>"foo"<!>)
|
||||
@Anno2(i = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>intArrayOf(1)<!>)
|
||||
fun f1() {}
|
||||
|
||||
@@ -15,6 +15,6 @@ fun f2() {}
|
||||
fun foo(vararg ints: Int) {}
|
||||
|
||||
fun test() {
|
||||
foo(ints = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR!>1<!>)
|
||||
foo(ints = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>)
|
||||
foo(ints = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_FUNCTION!>intArrayOf(1)<!>)
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user