Introduce warning for the changing arguments execution order for named varargs (KT-17691)

This commit is contained in:
Victor Petukhov
2020-09-29 15:34:49 +03:00
parent d62c665e99
commit d02432cf93
43 changed files with 1187 additions and 75 deletions
@@ -25,9 +25,9 @@ fun main() {
join(1, "4", *a)
join(1, "4", *a, *a, "3")
join(1, "4", *a, *<!TYPE_MISMATCH!>b<!>, "3")
join(a = a, x = 1)
join(a = <!TYPE_MISMATCH!>b<!>, x = 1)
join(a = a, x = 1)
join(<!NI;CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>a = a<!>, x = 1)
join(<!NI;CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>a = <!TYPE_MISMATCH!>b<!><!>, x = 1)
join(<!NI;CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>a = a<!>, x = 1)
joinG<String>(1, "2")
joinG<String>(<!NON_VARARG_SPREAD!>*<!>1, "2")
@@ -40,7 +40,7 @@ fun main() {
joinG<String>(1, "4", *a, "3")
joinG<String>(1, "4", *a)
joinG<String>(1, "4", *a, *a, "3")
joinG<String>(a = a, x = 1)
joinG<String>(<!NI;CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>a = a<!>, x = 1)
joinG(1, "2")
joinG(<!NON_VARARG_SPREAD!>*<!>1, "2")
@@ -53,7 +53,7 @@ fun main() {
joinG(1, "4", *a, "3")
joinG(1, "4", *a)
joinG(1, "4", *a, *a, "3")
joinG(a = a, x = 1)
joinG(<!NI;CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>a = a<!>, x = 1)
val x1 = joinT(1, "2")
checkSubtype<String?>(x1)
@@ -69,7 +69,7 @@ fun main() {
checkSubtype<String?>(x9)
val x10 = joinT(1, "4", *a, *a, "3")
checkSubtype<String?>(x10)
val x11 = joinT(a = a, x = 1)
val x11 = joinT(<!NI;CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>a = a<!>, x = 1)
checkSubtype<String?>(x11)
val x12 = joinT(x = 1, a = a)
checkSubtype<String?>(x12)
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !LANGUAGE: -UseCorrectExecutionOrderForVarargArguments
// WITH_RUNTIME
fun foo(vararg x: Unit, y: Any) {}
fun main() {
foo({ }(), y = { }())
foo(x = *arrayOf({ }()), y = { }())
foo(x = arrayOf({ }()), y = { }())
foo(*arrayOf({ }()), y = { }())
}
fun foo2(vararg x: Unit, y: Any, z: Any) {}
fun main2() {
foo2(y = { }(), x = arrayOf({ }()), z = { }())
}
fun foo3(vararg x: Unit, y: Any, z: Any = { }()) {}
fun main3() {
// no warning, execution order is already right
foo3(y = { }(), x = arrayOf({ }()))
}
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !LANGUAGE: -UseCorrectExecutionOrderForVarargArguments
// WITH_RUNTIME
fun foo(vararg x: Unit, y: Any) {}
fun main() {
foo({ }(), y = { }())
foo(<!CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>x = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_FUNCTION!>arrayOf({ }())<!><!>, y = { }())
foo(<!CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>x = arrayOf({ }())<!>, y = { }())
foo(*arrayOf({ }()), y = { }())
}
fun foo2(vararg x: Unit, y: Any, z: Any) {}
fun main2() {
foo2(y = { }(), <!CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS!>x = arrayOf({ }())<!>, z = { }())
}
fun foo3(vararg x: Unit, y: Any, z: Any = { }()) {}
fun main3() {
// no warning, execution order is already right
foo3(y = { }(), x = arrayOf({ }()))
}
@@ -0,0 +1,8 @@
package
public fun foo(/*0*/ vararg x: kotlin.Unit /*kotlin.Array<out kotlin.Unit>*/, /*1*/ y: kotlin.Any): kotlin.Unit
public fun foo2(/*0*/ vararg x: kotlin.Unit /*kotlin.Array<out kotlin.Unit>*/, /*1*/ y: kotlin.Any, /*2*/ z: kotlin.Any): kotlin.Unit
public fun foo3(/*0*/ vararg x: kotlin.Unit /*kotlin.Array<out kotlin.Unit>*/, /*1*/ y: kotlin.Any, /*2*/ z: kotlin.Any = ...): kotlin.Unit
public fun main(): kotlin.Unit
public fun main2(): kotlin.Unit
public fun main3(): kotlin.Unit
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !LANGUAGE: +UseCorrectExecutionOrderForVarargArguments
// WITH_RUNTIME
fun foo(vararg x: Unit, y: Any) {}
fun main() {
foo({ }(), y = { }())
foo(x = *arrayOf({ }()), y = { }())
foo(x = arrayOf({ }()), y = { }())
foo(*arrayOf({ }()), y = { }())
}
fun foo2(vararg x: Unit, y: Any, z: Any) {}
fun main2() {
foo2(y = { }(), x = arrayOf({ }()), z = { }())
}
fun foo3(vararg x: Unit, y: Any, z: Any = { }()) {}
fun main3() {
// no warning, execution order is already right
foo3(y = { }(), x = arrayOf({ }()))
}
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !LANGUAGE: +UseCorrectExecutionOrderForVarargArguments
// WITH_RUNTIME
fun foo(vararg x: Unit, y: Any) {}
fun main() {
foo({ }(), y = { }())
foo(x = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_FUNCTION!>arrayOf({ }())<!>, y = { }())
foo(x = arrayOf({ }()), y = { }())
foo(*arrayOf({ }()), y = { }())
}
fun foo2(vararg x: Unit, y: Any, z: Any) {}
fun main2() {
foo2(y = { }(), x = arrayOf({ }()), z = { }())
}
fun foo3(vararg x: Unit, y: Any, z: Any = { }()) {}
fun main3() {
// no warning, execution order is already right
foo3(y = { }(), x = arrayOf({ }()))
}
@@ -0,0 +1,8 @@
package
public fun foo(/*0*/ vararg x: kotlin.Unit /*kotlin.Array<out kotlin.Unit>*/, /*1*/ y: kotlin.Any): kotlin.Unit
public fun foo2(/*0*/ vararg x: kotlin.Unit /*kotlin.Array<out kotlin.Unit>*/, /*1*/ y: kotlin.Any, /*2*/ z: kotlin.Any): kotlin.Unit
public fun foo3(/*0*/ vararg x: kotlin.Unit /*kotlin.Array<out kotlin.Unit>*/, /*1*/ y: kotlin.Any, /*2*/ z: kotlin.Any = ...): kotlin.Unit
public fun main(): kotlin.Unit
public fun main2(): kotlin.Unit
public fun main3(): kotlin.Unit