// !LANGUAGE: +InlineClasses fun underlying(a: IC): T = bar(a, object : IFace { override fun call(ic: IC): T = (ic.value as FooHolder).value as T }) //fun extension(a: IC): T = bar(a, object : IFace { // override fun call(ic: IC): T = ic.extensionValue() //}) // //fun dispatch(a: IC): T = bar(a, object : IFace { // override fun call(ic: IC): T = ic.dispatchValue() //}) // //fun normal(a: IC): T = bar(a, object : IFace { // override fun call(ic: IC): T = normalValue(ic) //}) // //fun IC.extensionValue(): T = (value as FooHolder).value as T // //fun normalValue(ic: IC): T = (ic.value as FooHolder).value as T interface IFace { fun call(ic: T): R } fun bar(value: T, f: IFace): R { return f.call(value) } interface Foo class FooHolder(val value: Any): Foo inline class IC(val value: Foo): Foo { // fun dispatchValue(): T = (value as FooHolder).value as T } fun box(): String { var res = underlying(IC(FooHolder(40))) + 2 if (res != 42) return "FAIL 1: $res" // res = extension(IC(FooHolder(40))) + 3 // if (res != 43) return "FAIL 2: $res" // // res = dispatch(IC(FooHolder(40))) + 4 // if (res != 44) return "FAIL 3: $res" // // res = normal(IC(FooHolder(40))) + 5 // if (res != 45) return "FAIL 4: $res" return "OK" }