// RUN_PIPELINE_TILL: BACKEND
// FIR_IDENTICAL
interface Base {
    fun baseFun()
}

abstract class A {
    protected val a: Base = null!!

    fun fest_1(other: A) {
        other.a.baseFun() // OK
        if (other is B) {
            other.a.baseFun()
        }
        if (other is C) {
            other.a.baseFun()
        }
        if (other is D) {
            other.a.baseFun()
        }
    }

    open class B : A() {
        class Nested {
            fun fest_3(other: A) {
                other.a.baseFun() // OK
                if (other is B) {
                    other.a.baseFun()
                }
                if (other is C) {
                    other.a.baseFun()
                }
                if (other is D) {
                    other.a.baseFun()
                }
            }
        }
    }

    class C : B() {
        fun fest_4(other: A) {
            other.a.baseFun() // OK
            if (other is B) {
                other.a.baseFun()
            }
            if (other is C) {
                other.a.baseFun()
            }
            if (other is D) {
                other.a.baseFun()
            }
        }
    }

    class D : A() {
        fun fest_5(other: A) {
            other.a.baseFun() // OK
            if (other is B) {
                other.a.baseFun()
            }
            if (other is C) {
                other.a.baseFun()
            }
            if (other is D) {
                other.a.baseFun()
            }
        }
    }
}

/* GENERATED_FIR_TAGS: checkNotNullCall, classDeclaration, functionDeclaration, ifExpression, interfaceDeclaration,
isExpression, nestedClass, propertyDeclaration */
