fn foo() {
    let foos = vec![String::new()];
    let bars = vec![""];
    let mut baz = vec![];
    let mut qux = vec![];
    for foo in foos { for bar in &bars { if foo == *bar {
    //~^ NOTE this reinitialization might get skipped
    //~| NOTE move occurs because `foo` has type `String`
    //~| NOTE inside of this loop
    //~| HELP consider moving the expression out of the loop
    //~| NOTE in this expansion of desugaring of `for` loop
        baz.push(foo);
        //~^ NOTE value moved here
        //~| HELP consider cloning the value
        continue;
        //~^ NOTE verify that your loop breaking logic is correct
        //~| NOTE this `continue` advances the loop at $DIR/nested-loop-moved-value-wrong-continue.rs:6:23
    } }
    qux.push(foo);
    //~^ ERROR use of moved value
    //~| NOTE value used here
    }
}

fn main() {
    let foos = vec![String::new()];
    let bars = vec![""];
    let mut baz = vec![];
    let mut qux = vec![];
    for foo in foos {
    //~^ NOTE this reinitialization might get skipped
    //~| NOTE move occurs because `foo` has type `String`
        for bar in &bars {
        //~^ NOTE inside of this loop
        //~| HELP consider moving the expression out of the loop
        //~| NOTE in this expansion of desugaring of `for` loop
            if foo == *bar {
                baz.push(foo);
                //~^ NOTE value moved here
                //~| HELP consider cloning the value
                continue;
                //~^ NOTE verify that your loop breaking logic is correct
                //~| NOTE this `continue` advances the loop at line 33
            }
        }
        qux.push(foo);
        //~^ ERROR use of moved value
        //~| NOTE value used here
    }
}
