f80a71517f
Vararg parameter in reflection type is interpreted as covariant
array type against array in expected functional type and as
vararg element type otherwise. For instance having function
fun foo(vararg args: Int): Unit { /*...*/ }
reference ::foo can be passed against expected
(Int) -> Unit,
(Int, Int) -> Unit, etc.
In none of such cases type for parameter in foo's reflection type
should be changed to array.
However, against expected type (IntArray) -> Unit args' type
must become IntArray.
^KT-25514 Fixed
30 lines
1.7 KiB
Kotlin
Vendored
30 lines
1.7 KiB
Kotlin
Vendored
// !LANGUAGE: +NewInference
|
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
|
|
fun stringVararg(vararg args: String) {}
|
|
fun intVararg(vararg args: Int) {}
|
|
fun numberVararg(vararg args: Number) {}
|
|
|
|
fun useStrings(fn: (String, String, String) -> Unit) = fn("foo", "bar", "boo")
|
|
fun useStringArray(fn: (Array<String>) -> Unit) = fn(arrayOf("foo", "bar", "boo"))
|
|
|
|
fun useIntArray(fn: (Array<Int>) -> Unit) = fn(arrayOf(1, 2, 3))
|
|
fun usePrimitiveIntArray(fn: (IntArray) -> Unit) = fn(intArrayOf(4, 5, 6))
|
|
|
|
fun useMixedStringArgs1(fn: (String, Array<String>) -> Unit) = fn("foo", arrayOf("bar", "baz"))
|
|
fun useMixedStringArgs2(fn: (Array<String>, String) -> Unit) = fn(arrayOf("foo", "bar"), "baz")
|
|
fun useMixedStringArgs3(fn: (String, Array<String>, String) -> Unit) = fn("foo", arrayOf("bar", "baz"), "boo")
|
|
fun useTwoStringArrays(fn: (Array<String>, Array<String>) -> Unit) = fn(arrayOf("foo", "bar"), arrayOf("baz", "boo"))
|
|
|
|
fun test() {
|
|
useStrings(::stringVararg)
|
|
useStringArray(::stringVararg)
|
|
useIntArray(::numberVararg)
|
|
usePrimitiveIntArray(::intVararg)
|
|
useIntArray(<!TYPE_MISMATCH("(Array<Int>) -> Unit", "KFunction1<IntArray, Unit>")!>::intVararg<!>)
|
|
useMixedStringArgs1(<!TYPE_MISMATCH("(String, Array<String>) -> Unit", "KFunction1<Array<out String>, Unit>")!>::stringVararg<!>)
|
|
useMixedStringArgs2(<!TYPE_MISMATCH("(Array<String>, String) -> Unit", "KFunction1<Array<out String>, Unit>")!>::stringVararg<!>)
|
|
useMixedStringArgs3(<!TYPE_MISMATCH("(String, Array<String>, String) -> Unit", "KFunction1<Array<out String>, Unit>")!>::stringVararg<!>)
|
|
useTwoStringArrays(<!TYPE_MISMATCH("(Array<String>, Array<String>) -> Unit", "KFunction1<Array<out String>, Unit>")!>::stringVararg<!>)
|
|
}
|