| // LANGUAGE: +FullValueClasses |
| // WITH_STDLIB |
| |
| val list = mutableListOf<Any>() |
| |
| sealed value class Sealed(a: Int) { |
| init { |
| list.add(a - 100) |
| } |
| } |
| |
| abstract value class A(a: Int): Sealed(a - 100) { |
| init { |
| list.add(a) |
| } |
| } |
| |
| value class B(val x: Int): A(-x) { |
| init { |
| list.add(x) |
| } |
| } |
| |
| fun id(b: B) = b |
| |
| fun B.cast(): A = this |
| fun A.cast(): B = this as B |
| fun B.asNullable(): B? = this |
| |
| fun box(): String { |
| list.clear() |
| val b = B(42) |
| val b1 = id(b) |
| val a = b1.cast() |
| require(a as Any is B) |
| require(a as Any is A) |
| val b2 = a.cast() |
| val b3 = id(b2) |
| val b4 = b3.asNullable() |
| val b5 = b4!! |
| |
| require(list == listOf(-242, -42, 42)) { "Single-field: $list" } |
| |
| return "OK" |
| } |