Skip call to the underlying value of inline class

This commit is contained in:
Mikhail Zarechenskiy
2018-02-08 12:18:52 +03:00
parent 2c279978c8
commit c86d3e354b
10 changed files with 134 additions and 6 deletions
@@ -0,0 +1,16 @@
// !LANGUAGE: +InlineClasses
inline class UInt(val value: Int) {
operator fun plus(other: UInt) = UInt(value + other.value)
fun otherValue(other: UInt) = other.value
}
fun box(): String {
val a = UInt(10)
val b = UInt(20)
if (a.otherValue(b) != 20) return "fail 1"
if ((a + b).value != 30) return "fail 2"
return "OK"
}
@@ -0,0 +1,16 @@
// !LANGUAGE: +InlineClasses
inline class UInt(val value: Int)
fun box(): String {
val a = UInt(123)
if(a.value != 123) return "fail"
val c = a.value.hashCode()
if (c.hashCode() != 123.hashCode()) return "fail"
val b = UInt(100).value + a.value
if (b != 223) return "faile"
return "OK"
}
@@ -0,0 +1,17 @@
// !LANGUAGE: +InlineClasses
inline class UInt(val value: Int)
fun test(u1: UInt, u2: UInt) {
val a = u1.value
val b = u1.value.hashCode() // box int to call hashCode
val c = u1.value + u2.value
}
// 0 INVOKESTATIC UInt\$Erased.getValue
// 0 INVOKESTATIC UInt\$Erased.box
// 0 INVOKEVIRTUAL UInt.unbox
// 1 valueOf
// 0 intValue