// Changed when traits were introduced. May not make sense any more

open class X(val x : Int) {}
interface Y {
    abstract val y : Int
}

class YImpl(override val y : Int) : Y {}

class Point(x : Int, yy : Int) : X(x) , Y {
    override val y : Int = yy
}

interface Abstract {}

class P1(x : Int, yy : Y) : Abstract, X(x), Y by yy {}
class P2(x : Int, yy : Y) : X(x), Abstract, Y by yy {}
class P3(x : Int, yy : Y) : X(x), Y by yy, Abstract {}
class P4(x : Int, yy : Y) : Y by yy, Abstract, X(x) {}

fun box() : String {
    if (X(239).x != 239) return "FAIL #1"
    if (YImpl(239).y != 239) return "FAIL #2"

    val p = Point(240, -1)
    if (p.x + p.y != 239) return "FAIL #3"

    val y = YImpl(-1)
    val p1 = P1(240, y)
    if (p1.x + p1.y != 239) return "FAIL #4"
    val p2 = P2(240, y)
    if (p2.x + p2.y != 239) return "FAIL #5"

    val p3 = P3(240, y)
    if (p3.x + p3.y != 239) return "FAIL #6"

    val p4 = P4(240, y)
    if (p4.x + p4.y != 239) return "FAIL #7"

    return "OK"
}
