// !WITH_NEW_INFERENCE open class A() { fun foo() {} } class B() : A() { fun bar() {} } fun f9(init : A?) { val a : A? = init a?.foo() a?.bar() if (a is B) { a.bar() a.foo() } a?.foo() a?.bar() if (!(a is B)) { a?.bar() a?.foo() } if (!(a is B) || a.bar() == Unit) { a?.bar() } if (!(a is B)) { return; } a.bar() a.foo() } fun f10(init : A?) { val a : A? = init if (!(a is B)) { return; } if (!(a is B)) { return; } } class C() : A() { fun bar() { } } fun f101(a : A?) { if (a is C) { a.bar(); } } fun f11(a : A?) { when (a) { is B -> a.bar() is A -> a.foo() is Any -> a.foo() is Any? -> a.bar() else -> a?.foo() } } fun f12(a : A?) { when (a) { is B -> a.bar() is A -> a.foo() is Any -> a.foo(); is Any? -> a.bar() is C -> a.bar() else -> a?.foo() } if (a is Any?) { a?.bar() } if (a is B) { a.foo() a.bar() } } fun f13(a : A?) { if (a is B) { a.foo() a.bar() } else { a?.foo() c.bar() } a?.foo() if (!(a is B)) { a?.foo() c.bar() } else { a.foo() c.bar() } a?.foo() if (a is B && a.foo() == Unit) { a.foo() a.bar() } else { a?.foo() c.bar() } if (!(a is B) || !(a is C)) { } else { } if (!(a is B) || !(a is C)) { } if (!(a is B)) return a.bar() } fun f14(a : A?) { while (!(a is B)) { } a.bar() } fun f15(a : A?) { do { } while (!(a is B)) a.bar() } fun getStringLength(obj : Any) : Char? { if (obj !is String) return null return obj.get(0) // no cast to String is needed } fun toInt(i: Int?): Int = if (i != null) i else 0 fun illegalWhenBody(a: Any): Int = when(a) { is Int -> a is String -> a } fun illegalWhenBlock(a: Any): Int { when(a) { is Int -> return a is String -> return a } } fun declarations(a: Any?) { if (a is String) { val p4: String = a } if (a is String?) { if (a != null) { val s: String = a } } if (a != null) { if (a is String?) { val s: String = a } } } fun vars(a: Any?) { var b: Int = 0 if (a is Int) { b = a } } fun returnFunctionLiteralBlock(a: Any?): Function0 { if (a is Int) return { a } else return { 1 } } fun returnFunctionLiteral(a: Any?): Function0 { if (a is Int) return { -> a } else return { -> 1 } } fun returnFunctionLiteralExpressionBody(a: Any?): Function0 = if (a is Int) { -> a } else { -> 1 } fun mergeSmartCasts(a: Any?) { if (a is String || a is Int) { a.compareTo("") a.toString() } if (a is Int || a is String) { a.compareTo("") } when (a) { is String, is Any -> a.compareTo("") } if (a is String && a is Any) { val i: Int = a.compareTo("") } if (a is String && a.compareTo("") == 0) {} if (a is String || a.compareTo("") == 0) {} } //mutability fun f(): String { var a: Any = 11 if (a is String) { // a is a string, despite of being a variable val i: String = a a.compareTo("f") // Beginning from here a is captured in a closure but nobody modifies it val f: Function0 = { a } return a } return "" } fun foo(aa: Any?): Int { var a = aa if (a is Int?) { return a } return 1 }