Box values of inline class types when passing to function as varargs

This commit is contained in:
Mikhail Zarechenskiy
2018-02-12 05:33:12 +03:00
parent 6687751cf5
commit 3919dc94e1
11 changed files with 87 additions and 10 deletions
@@ -0,0 +1,24 @@
// !LANGUAGE: +InlineClasses
inline class UInt(val value: Int)
fun <T> takeVarargs(vararg e: T): T {
return e[e.size - 1]
}
fun test(u1: UInt, u2: UInt, u3: UInt?): Int {
val a = takeVarargs(u1, u2)
val b = takeVarargs(u3) ?: UInt(-1)
val c = takeVarargs(u1, u3) ?: UInt(-1)
return a.value + b.value + c.value
}
fun box(): String {
val u1 = UInt(0)
val u2 = UInt(1)
val u3 = UInt(2)
if (test(u1, u2, u3) != 1 + 2 + 2) return "fail"
return "OK"
}
@@ -0,0 +1,17 @@
// !LANGUAGE: +InlineClasses
inline class UInt(val u: Int)
fun <T> takeVarargs(vararg e: T) {}
fun test(u1: UInt, u2: UInt, u3: UInt?) {
takeVarargs(u1, u2) // 2 box
takeVarargs(u3)
takeVarargs(u1, u3) // box
}
// 3 INVOKESTATIC UInt\$Erased.box
// 0 INVOKEVIRTUAL UInt.unbox
// 0 valueOf
// 0 intValue