[JVM_IR] Determine correct type of empty varargs array.
When calling vararg methods with a generic vararg type without passing explicit parameters, we have to allocate an empty array of the right type. We failed to do so previously, as we did not take the type arguments for the dispatch receiver into account.
This commit is contained in:
committed by
Alexander Udalov
parent
ffc003c051
commit
1ecf5943ab
@@ -0,0 +1,18 @@
|
||||
// FILE: A.java
|
||||
|
||||
public abstract class A<T> {
|
||||
protected abstract String doIt(T... args);
|
||||
|
||||
public String test(T... args) {
|
||||
return doIt(args);
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: 1.kt
|
||||
|
||||
val a: A<Void> =
|
||||
object : A<Void>() {
|
||||
override fun doIt(vararg parameters: Void): String = "OK"
|
||||
}
|
||||
|
||||
fun box(): String = a.test()
|
||||
@@ -0,0 +1,21 @@
|
||||
// FILE: A.java
|
||||
|
||||
public abstract class A<T> {
|
||||
protected abstract String doIt(T... args);
|
||||
|
||||
public <S extends T> String test(S... args) {
|
||||
return doIt(args);
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: 1.kt
|
||||
|
||||
open class Super
|
||||
class Sub: Super()
|
||||
|
||||
val a: A<Super> =
|
||||
object : A<Super>() {
|
||||
override fun doIt(vararg parameters: Super): String = "OK"
|
||||
}
|
||||
|
||||
fun box(): String = a.test<Sub>()
|
||||
@@ -0,0 +1,37 @@
|
||||
// FILE: A.java
|
||||
|
||||
public abstract class A<T> {
|
||||
protected abstract String doIt(T... args);
|
||||
|
||||
class B<S extends T, U extends S> {
|
||||
public String test(T... args) {
|
||||
return doIt(args);
|
||||
}
|
||||
|
||||
public String test2(S... args) {
|
||||
return doIt(args);
|
||||
}
|
||||
|
||||
public String test3(U... args) {
|
||||
return doIt(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: 1.kt
|
||||
|
||||
open class Super
|
||||
open class Sub: Super()
|
||||
class Sub2: Sub()
|
||||
|
||||
val a: A<Super> =
|
||||
object : A<Super>() {
|
||||
override fun doIt(vararg parameters: Super): String = "OK"
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val b = a.B<Sub, Sub2>()
|
||||
if (b.test() != "OK") return "FAIL1"
|
||||
if (b.test2() != "OK") return "FAIL2"
|
||||
return b.test3()
|
||||
}
|
||||
Reference in New Issue
Block a user