Files
kotlin/compiler/testData/codegen/box/inlineClasses/boundCallableReferencePassedToInlineFunction.kt
Mikhail Zarechenskiy 35fb3ba096 Fix CCE when unboxed inline class receiver is passed to inline function
Initial problem is started in `capturedBoundReferenceReceiver` method
 where we assume that bound receiver is captured for usual call.

 Note that if method is inline then we don't pass actual name reference
 receiver, but pass special CAPTURED_RECEIVER_FIELD, which is then
 is used to find special instructions during inline and fold several
 instructions in `foldFieldAccessChainIfNeeded`.

 As a result, we got unboxed reference receiver for inline call, which
 caused CCE and to fix it we should box receiver one more time during
 inline

 #KT-28188 Fixed
2018-11-14 11:21:04 +03:00

66 lines
1.8 KiB
Kotlin
Vendored

// WITH_RUNTIME
// IGNORE_BACKEND: JVM_IR
inline class IcInt(val i: Int) {
fun simple(): String = i.toString()
}
inline class IcLong(val l: Long) {
fun simple(): String = l.toString()
}
inline class IcAny(val a: Any?) {
fun simple(): String = a?.toString() ?: "null"
}
inline class IcOverIc(val o: IcLong) {
fun simple(): String = o.toString()
}
fun testUnboxed(i: IcInt, l: IcLong, a: IcAny, o: IcOverIc): String =
foo(i::simple) + foo(l::simple) + foo(a::simple) + foo(o::simple)
fun testBoxed(i: IcInt?, l: IcLong?, a: IcAny?, o: IcOverIc?): String =
foo(i!!::simple) + foo(l!!::simple) + foo(a!!::simple) + foo(o!!::simple)
fun testLocalVars(): String {
val i = IcInt(0)
val l = IcLong(1L)
val a = IcAny(2)
val o = IcOverIc(IcLong(3))
return foo(i::simple) + foo(l::simple) + foo(a::simple) + foo(o::simple)
}
val ip = IcInt(1)
val lp = IcLong(2L)
val ap = IcAny(3)
val op = IcOverIc(IcLong(4))
fun testGlobalProperties(): String =
foo(ip::simple) + foo(lp::simple) + foo(ap::simple) + foo(op::simple)
fun testCapturedVars(): String {
return IcInt(2).let { foo(it::simple) } +
IcLong(3).let { foo(it::simple) } +
IcAny(4).let { foo(it::simple) } +
IcOverIc(IcLong(5)).let { foo(it::simple) }
}
inline fun foo(init: () -> String): String = init()
fun box(): String {
val i = IcInt(3)
val l = IcLong(4)
val a = IcAny(5)
val o = IcOverIc(IcLong(6))
if (testUnboxed(i, l, a, o) != "345IcLong(l=6)") return "Fail 1"
if (testBoxed(i, l, a, o) != "345IcLong(l=6)") return "Fail 2"
if (testLocalVars() != "012IcLong(l=3)") return "Fail 3"
if (testGlobalProperties() != "123IcLong(l=4)") return "Fail 4"
if (testCapturedVars() != "234IcLong(l=5)") return "Fail 5"
return "OK"
}