fun t1() : Boolean {
    val s1 : String? = "sff"
    val s2 : String? = null
    return s1?.length() == 3 && s2?.length() == null
}

fun t2() : Boolean {
    val c1: C? = C(1)
    val c2: C? = null
    return c1?.x == 1 && c2?.x == null
}

fun t3() {
    val d: D = D("s")
    val x = d?.s
    if (!(d?.s == "s")) throw AssertionError()
}

fun t4() {
    val e: E? = E()
    if (!(e?.bar() == e)) throw AssertionError()
    val x = e?.foo()
}

fun box() : String {
    if(!t1 ()) return "fail"
    if(!t2 ()) return "fail"
    t3()
    t4()
    return "OK"
}

class C(val x: Int)
class D(val s: String)
class E() {
    fun foo() = 1
    fun bar() = this
}
