[FIR] Keep vararg argument order in resolved calls (KT-17691).
This commit is contained in:
committed by
teamcityserver
parent
f6ce2d893c
commit
eb631bc429
@@ -19,6 +19,7 @@ fun foo3(
|
||||
) = "$p1 $p2 ${p3[0].toInt()} ${p3[1].toInt()}"
|
||||
|
||||
fun box(): String {
|
||||
if (foo1(1, 2, p2 = "3", p3 = 4.0) != "1 2 3 4") return "fail 1"
|
||||
if (foo1(p1 = *intArrayOf(1, 2), "3", p3 = 4.0) != "1 2 3 4") return "fail 2"
|
||||
|
||||
if (foo2(p1 = 1, "2", "3", p3 = 4.0) != "1 2 3 4") return "fail 3"
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
// !LANGUAGE: +NewInference +MixedNamedArgumentsInTheirOwnPosition
|
||||
// IGNORE_BACKEND: JVM
|
||||
// See KT-17691: Wrong argument order in resolved call with varargs. (fixed in JVM_IR)
|
||||
|
||||
var log = ""
|
||||
|
||||
fun <T> logged(value: T): T =
|
||||
value.also { log += " " + value }
|
||||
|
||||
fun doTest(id: String, expected: String, expectedLog: String, test: () -> String) {
|
||||
log = ""
|
||||
val actual = test()
|
||||
if (actual != expected) throw AssertionError("$id expected: $expected, actual: $actual")
|
||||
if (log != expectedLog) throw AssertionError("$id expectedLog: $expectedLog, actual: $log")
|
||||
}
|
||||
|
||||
fun foo1(
|
||||
vararg p1: Int,
|
||||
p2: String,
|
||||
p3: Double
|
||||
) = "${p1[0]} ${p1[1]} $p2 ${p3.toInt()}"
|
||||
|
||||
fun foo2(
|
||||
p1: Int,
|
||||
vararg p2: String,
|
||||
p3: Double
|
||||
) = "$p1 ${p2[0]} ${p2[1]} ${p3.toInt()}"
|
||||
|
||||
fun foo3(
|
||||
p1: Int,
|
||||
p2: String,
|
||||
vararg p3: Double
|
||||
) = "$p1 $p2 ${p3[0].toInt()} ${p3[1].toInt()}"
|
||||
|
||||
fun box(): String {
|
||||
doTest("test1", "1 2 3 4", " 1 2 3 4.5") { foo1(logged(1), logged(2), p2 = logged("3"), p3 = logged(4.5)) }
|
||||
doTest("test2", "1 2 3 4", " 1 2 3 4.5") { foo1(p1 = *intArrayOf(logged(1), logged(2)), logged("3"), p3 = logged(4.5)) }
|
||||
|
||||
doTest("test3", "1 2 3 4", " 1 2 3 4.5") { foo2(p1 = logged(1), logged("2"), logged("3"), p3 = logged(4.5)) }
|
||||
doTest("test4", "1 2 3 4", " 1 2 3 4.5") { foo2(logged(1), p2 = *arrayOf(logged("2"), logged("3")), logged(4.5)) }
|
||||
|
||||
doTest("test5", "1 2 3 4", " 1 2 3.5 4.5") { foo3(p1 = logged(1), logged("2"), logged(3.5), logged(4.5)) }
|
||||
doTest("test6", "1 2 3 4", " 1 2 3.5 4.5") { foo3(p1 = logged(1), logged("2"), p3 = *doubleArrayOf(logged(3.5), logged(4.5))) }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user