// RUN_PIPELINE_TILL: FRONTEND
// CHECK_TYPE

sealed class A {
    class A1 : A()
    class A2 : A()
}

sealed class B {
    class B1 : B()
    class B2 : B()
}

fun foo(a: A) {
    if (<!USELESS_IS_CHECK!>a !is B<!>) return

    <!NO_ELSE_IN_WHEN!>when<!> (<!DEBUG_INFO_SMARTCAST!>a<!>) {
        is A.A1 -> ""
        is A.A2 -> "v"
    }.length

    <!NO_ELSE_IN_WHEN!>when<!> (<!DEBUG_INFO_SMARTCAST!>a<!>) {
        is A.A1 -> ""
        is A.A2 -> "v"
    }.length // OK

    <!NO_ELSE_IN_WHEN!>when<!> (<!DEBUG_INFO_SMARTCAST!>a<!>) {
        is A.A1 -> ""
        is A.A2 -> "v"
        is <!INCOMPATIBLE_TYPES!>B.B1<!> -> "..." // should be warning: unreachable code
    }.length // OK

    <!NO_ELSE_IN_WHEN!>when<!> (<!DEBUG_INFO_SMARTCAST!>a<!>) {
        is A.A1 -> ""
        is <!INCOMPATIBLE_TYPES!>B.B1<!> -> "..."
        is A.A2 -> "v"
    }.length // OK

    <!NO_ELSE_IN_WHEN!>when<!> (<!DEBUG_INFO_SMARTCAST!>a<!>) {
        is A.A1 -> ""
        is <!INCOMPATIBLE_TYPES!>B.B1<!> -> "..."
    }.length
}

/* GENERATED_FIR_TAGS: classDeclaration, funWithExtensionReceiver, functionDeclaration, functionalType, ifExpression,
infix, intersectionType, isExpression, nestedClass, nullableType, sealed, smartcast, stringLiteral, typeParameter,
typeWithExtension, whenExpression, whenWithSubject */
