// This is a non-regression test about differences in scopes computed by NLLs and `-Zpolonius=next`
// found during the crater run for PR #117593.
//
// Live loans were computed too early compared to some of the liveness data coming from later passes
// than `liveness::trace`, on some specific CFGs shapes: a variable was dead during tracing but its
// regions were marked live later, and live loans were not recomputed at this point.

//@ check-pass
//@ revisions: nll polonius
//@ [polonius] compile-flags: -Zpolonius=next

// minimized from wavefc-cli-3.0.0
fn repro1() {
    let a = 0;
    let closure = || {
        let _b = a;
    };

    let callback = if true { Some(closure) } else { None };
    do_it(callback);
}
fn do_it<F>(_: Option<F>)
where
    F: Fn(),
{
}

// minimized from simple-server-0.4.0
fn repro2() {
    let mut a = &();
    let s = S(&mut a);
    let _ = if true { Some(s) } else { None };
}
struct S<'a>(&'a mut &'a ());

// minimized from https://github.com/SHaaD94/AICup2022
fn repro3() {
    let runner = ();
    let writer = debug_interface(&runner);
    let _ = if true { Some(writer) } else { None };
}
fn debug_interface(_: &()) -> &mut dyn std::io::Write {
    unimplemented!()
}

fn main() {}
