// RUN_PIPELINE_TILL: FRONTEND
// WITH_EXTRA_CHECKERS
// KT-13612 related tests (reassignment in try-catch-finally)

fun f1() {
    val n: Int
    try {
        <!UNUSED_VALUE!>n =<!> 1
        throw Exception()
    }
    catch (e: Exception) {
        // KT-13612: reassignment
        <!VAL_REASSIGNMENT!>n<!> = 2
    }
    n.hashCode()
}

fun f2() {
    val <!ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE!>n<!>: Int
    try {
        <!UNUSED_VALUE!>n =<!> 1
        throw Exception()
    }
    finally {
        <!UNUSED_VALUE!><!VAL_REASSIGNMENT!>n<!> =<!> 2
    }
    <!UNREACHABLE_CODE!>n.hashCode()<!>
}

fun g1(flag: Boolean) {
    val n: Int
    try {
        if (flag) throw Exception()
        n = 1
    }
    catch (e: Exception) {
        // KT-13612: ? reassignment or definite assignment ?
        <!VAL_REASSIGNMENT!>n<!> = 2
    }
    n.hashCode()
}

fun g2(flag: Boolean) {
    val n: Int
    try {
        if (flag) throw Exception()
        <!UNUSED_VALUE!>n =<!> 1
    }
    finally {
        <!VAL_REASSIGNMENT!>n<!> = 2
    }
    n.hashCode()
}

fun h1(flag: Boolean) {
    val n = try {
        if (flag) throw Exception()
        1
    }
    catch (e: Exception) {
        2
    }
    n.hashCode()
}

fun h2(flag: Boolean) {
    val n = try {
        if (flag) throw Exception()
        1
    }
    finally {
        <!UNUSED_EXPRESSION!>2<!>
    }
    n.hashCode()
}

fun j(flag: Boolean) {
    if (flag) throw Exception()
}

fun k1(flag: Boolean) {
    val n: Int
    try {
        n = 1
        j(flag)
    }
    catch (e: Exception) {
        // KT-13612: reassignment
        <!VAL_REASSIGNMENT!>n<!> = 2
    }
    n.hashCode()
}

fun k2(flag: Boolean) {
    val n: Int
    try {
        <!UNUSED_VALUE!>n =<!> 1
        j(flag)
    }
    finally {
        <!VAL_REASSIGNMENT!>n<!> = 2
    }
    n.hashCode()
}

/* GENERATED_FIR_TAGS: assignment, functionDeclaration, ifExpression, integerLiteral, localProperty, propertyDeclaration,
tryExpression */
