// RUN_PIPELINE_TILL: FRONTEND
fun foo(x: String?, y: String?, z: String?) {
    if ((x!!.hashCode() == 0 || y!!.hashCode() == 1) && z!!.hashCode() == 2) {
        <!DEBUG_INFO_SMARTCAST!>x<!>.length
        y<!UNSAFE_CALL!>.<!>length
        // condition is true => z!! after and is called
        <!DEBUG_INFO_SMARTCAST!>z<!>.length
    }
    else {
        <!DEBUG_INFO_SMARTCAST!>x<!>.length
        y<!UNSAFE_CALL!>.<!>length
        z<!UNSAFE_CALL!>.<!>length
    }
    // First element is always analyzed
    <!DEBUG_INFO_SMARTCAST!>x<!>.length
    var xx = y ?: z
    if ((xx!!.hashCode() == 0 && y!!.hashCode() == 1) || z!!.hashCode() == 2) {
        <!DEBUG_INFO_SMARTCAST!>xx<!>.length
        y<!UNSAFE_CALL!>.<!>length
        z<!UNSAFE_CALL!>.<!>length
    }
    else {
        <!DEBUG_INFO_SMARTCAST!>xx<!>.length
        y<!UNSAFE_CALL!>.<!>length
        // condition is false => z!! after or is called
        <!DEBUG_INFO_SMARTCAST!>z<!>.length
    }
    // First element is always analyzed
    <!DEBUG_INFO_SMARTCAST!>x<!>.length
    xx = y ?: z
    if (xx!!.hashCode() == 0 && y!!.hashCode() == 1 && z!!.hashCode() == 2) {
        // all three are called
        <!DEBUG_INFO_SMARTCAST!>xx<!>.length
        <!DEBUG_INFO_SMARTCAST!>y<!>.length
        <!DEBUG_INFO_SMARTCAST!>z<!>.length
    }
    else {
        <!DEBUG_INFO_SMARTCAST!>xx<!>.length
        y<!UNSAFE_CALL!>.<!>length
        z<!UNSAFE_CALL!>.<!>length
    }
    // First element is always analyzed
    <!DEBUG_INFO_SMARTCAST!>x<!>.length
    xx = y ?: z
    if (xx!!.hashCode() == 0 || y!!.hashCode() == 1 || z!!.hashCode() == 2) {
        <!DEBUG_INFO_SMARTCAST!>xx<!>.length
        y<!UNSAFE_CALL!>.<!>length
        z<!UNSAFE_CALL!>.<!>length
    }
    else {
        // all three are called
        <!DEBUG_INFO_SMARTCAST!>xx<!>.length
        <!DEBUG_INFO_SMARTCAST!>y<!>.length
        <!DEBUG_INFO_SMARTCAST!>z<!>.length
    }
}

/* GENERATED_FIR_TAGS: andExpression, assignment, checkNotNullCall, disjunctionExpression, elvisExpression,
equalityExpression, functionDeclaration, ifExpression, integerLiteral, localProperty, nullableType, propertyDeclaration,
smartcast */
