abstract class A { abstract fun foo(): String } class B : A() { override fun foo() = "OK" } class C : A() { override fun foo() = "fail" } fun test(c: C, cond: Boolean): String { var x: A = c if (cond) { x = B() } return x.foo() } fun box(): String = test(C(), true)