// WITH_STDLIB // WORKS_WHEN_VALUE_CLASS // LANGUAGE: +ValueClasses, +GenericInlineClassParameter OPTIONAL_JVM_INLINE_ANNOTATION value class AsAny(val x: T) OPTIONAL_JVM_INLINE_ANNOTATION value class AsAny2(val x: T?) OPTIONAL_JVM_INLINE_ANNOTATION value class AsInt(val x: T) inline fun Any?.checkcast(): T = this as T object Reference { fun transform(a: AsAny): AsAny = a as AsAny fun transformNullable(a: AsAny?): AsAny = a as AsAny fun transformToNullable(a: AsAny): AsAny? = a as AsAny fun transformToNullableTarget(a: AsAny): AsAny? = a as AsAny? fun transformNullableToNullableTarget(a: AsAny?): AsAny? = a as AsAny? } object Reference2 { fun transform(a: AsAny2): AsAny2 = a as AsAny2 fun transformNullable(a: AsAny2?): AsAny2 = a as AsAny2 fun transformToNullable(a: AsAny2): AsAny2? = a as AsAny2 fun transformToNullableTarget(a: AsAny2): AsAny2? = a as AsAny2? fun transformNullableToNullableTarget(a: AsAny2?): AsAny2? = a as AsAny2? } object Primitive { fun transform(a: AsInt): AsInt = a as AsInt fun transformNullable(a: AsInt?): AsInt = a as AsInt fun transformToNullable(a: AsInt): AsInt? = a as AsInt fun transformToNullableTarget(a: AsInt): AsInt? = a as AsInt? fun transformNullableToNullableTarget(a: AsInt?): AsInt? = a as AsInt? } fun box(): String { val a = AsAny(42) val b1 = Reference.transform(a) val b2 = Reference.transformNullable(a) val b3 = Reference.transformToNullable(a) val b4 = Reference.transformToNullableTarget(a) val b5 = Reference.transformNullableToNullableTarget(a) val b6 = Reference.transformNullableToNullableTarget(null) val b7 = a.checkcast>() if (b7.x != a.x) return "Fail 1" val a2 = AsAny2(42) val b21 = Reference2.transform(a2) val b22 = Reference2.transformNullable(a2) val b23 = Reference2.transformToNullable(a2) val b24 = Reference2.transformToNullableTarget(a2) val b25 = Reference2.transformNullableToNullableTarget(a2) val b26 = Reference2.transformNullableToNullableTarget(null) val b72 = a2.checkcast>() if (b72.x != a2.x) return "Fail 12" val c = AsInt(42) val d1 = Primitive.transform(c) val d2 = Primitive.transformNullable(c) val d3 = Primitive.transformToNullable(c) val d4 = Primitive.transformToNullableTarget(c) val d5 = Primitive.transformNullableToNullableTarget(c) val d6 = Primitive.transformNullableToNullableTarget(null) val d7 = c.checkcast>() if (d7.x != c.x) return "Fail 2" return "OK" }