interface T { open fun baz(): String = "T.baz" } open class A { open val foo: String = "OK" open fun bar(): String = "OK" open fun boo(): String = "OK" } open class B : A(), T { override fun bar(): String = "B" override fun baz(): String = "B.baz" inner class E { val foo: String = super@B.foo fun bar() = super@B.bar() + super@B.bar() + super@B.baz() } } class C : B() { override fun bar(): String = "C" override fun boo(): String = "C" inner class D { val foo: String = super@C.foo fun bar() = super@C.bar() + super@C.boo() } } fun box(): String { var r = "" r = B().E().foo if (r != "OK") return "fail 1; r = $r" r = "" r = B().E().bar() if (r != "OKOKT.baz") return "fail 2; r = $r" r = "" r = C().D().foo if (r != "OK") return "fail 3; r = $r" r = "" r = C().D().bar() if (r != "BOK") return "fail 4; r = $r" return "OK" }