// WITH_STDLIB // WORKS_WHEN_VALUE_CLASS // LANGUAGE: +ValueClasses, +GenericInlineClassParameter fun underlying(a: IC): T = bar(a) { it.value.value as T } fun extension(a: IC): T = bar(a) { it.extensionValue() } fun dispatch(a: IC): T = bar(a) { it.dispatchValue() } fun normal(a: IC): T = bar(a) { normalValue(it) } fun IC.extensionValue(): T = value.value as T fun normalValue(ic: IC): T = ic.value.value as T fun bar(value: T, f: (T) -> R): R { return f(value) } interface Foo class FooHolder(val value: Any): Foo OPTIONAL_JVM_INLINE_ANNOTATION value class IC(val value: T): 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" }