a775fa195b
The inline class is boxed when we pass it as lambda argument, now we unbox it. If the underlying type is not Any or Any?, bridge method does the unboxing. #KT-32450 Fixed #KT-39923 Fixed #KT-32228 Fixed #KT-40282 Fixed
49 lines
1.1 KiB
Kotlin
Vendored
49 lines
1.1 KiB
Kotlin
Vendored
// !LANGUAGE: +InlineClasses
|
|
|
|
fun <T> underlying(a: IC): T = bar(a, object : IFace<IC, T> {
|
|
override fun call(ic: IC): T = ic.value as T
|
|
})
|
|
|
|
fun <T> extension(a: IC): T = bar(a, object : IFace<IC, T> {
|
|
override fun call(ic: IC): T = ic.extensionValue()
|
|
})
|
|
|
|
fun <T> dispatch(a: IC): T = bar(a, object : IFace<IC, T> {
|
|
override fun call(ic: IC): T = ic.dispatchValue()
|
|
})
|
|
|
|
fun <T> normal(a: IC): T = bar(a, object : IFace<IC, T> {
|
|
override fun call(ic: IC): T = normalValue(ic)
|
|
})
|
|
|
|
interface IFace<T, R> {
|
|
fun call(ic: T): R
|
|
}
|
|
|
|
fun <T, R> bar(value: T, f: IFace<T, R>): R {
|
|
return f.call(value)
|
|
}
|
|
|
|
fun <T> IC.extensionValue(): T = value as T
|
|
|
|
fun <T> normalValue(ic: IC): T = ic.value as T
|
|
|
|
inline class IC(val value: Int) {
|
|
fun <T> dispatchValue(): T = value as T
|
|
}
|
|
|
|
fun box(): String {
|
|
var res = underlying<Int>(IC(40)) + 2
|
|
if (res != 42) "FAIL 1: $res"
|
|
|
|
res = extension<Int>(IC(40)) + 3
|
|
if (res != 43) "FAIL 2: $res"
|
|
|
|
res = dispatch<Int>(IC(40)) + 4
|
|
if (res != 44) "FAIL 3: $res"
|
|
|
|
res = normal<Int>(IC(40)) + 5
|
|
if (res != 45) return "FAIL 4: $res"
|
|
|
|
return "OK"
|
|
} |