// RUN_PIPELINE_TILL: BACKEND
// LANGUAGE: -ProhibitSimplificationOfNonTrivialConstBooleanExpressions
fun unreachable() {}

fun a() {
    do {
    } while (true)
    unreachable()
}

fun b() {
    while (true) {
    }
    unreachable()
}

fun c() {
    do {} while (1 == 1)
}

fun d() {
    while (2 == 2) {}
}

fun use(arg: Any) = arg

fun f(cond: Boolean) {
    val bar: Any
    do {
        if (cond) {
            bar = "value"
            break
        }
    } while (true)
    use(bar) // should work

    val foo: Any
    while (true) {
        if (cond) {
            foo = "value"
            break
        }
    }
    use(foo) // should work
}

fun g(): Int {
    do {
        if (true) return 12
    } while (true)
} // should work

fun h(): Int {
    while (true) {
        if (true) return 12
    }
} // should work

/* GENERATED_FIR_TAGS: assignment, break, doWhileLoop, equalityExpression, functionDeclaration, ifExpression,
integerLiteral, localProperty, propertyDeclaration, smartcast, stringLiteral, whileLoop */
