diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs index e4cae5fe6c826..e3b67b0a003ef 100644 --- a/src/librustc_mir/dataflow/mod.rs +++ b/src/librustc_mir/dataflow/mod.rs @@ -17,6 +17,7 @@ use rustc_data_structures::work_queue::WorkQueue; use rustc::ty::{self, TyCtxt}; use rustc::mir::{self, Mir, BasicBlock, BasicBlockData, Location, Statement, Terminator}; +use rustc::mir::traversal; use rustc::session::Session; use std::borrow::Borrow; @@ -332,7 +333,7 @@ pub(crate) trait DataflowResultsConsumer<'a, 'tcx: 'a> { fn analyze_results(&mut self, flow_uninit: &mut Self::FlowState) { let flow = flow_uninit; - for bb in self.mir().basic_blocks().indices() { + for (bb, _) in traversal::reverse_postorder(self.mir()) { flow.reset_to_entry_of(bb); self.process_basic_block(bb, flow); } diff --git a/src/test/ui/issue-47184.stderr b/src/test/ui/issue-47184.stderr index a9eb33f01e3e0..32a9783e9c213 100644 --- a/src/test/ui/issue-47184.stderr +++ b/src/test/ui/issue-47184.stderr @@ -2,10 +2,9 @@ error[E0597]: borrowed value does not live long enough --> $DIR/issue-47184.rs:14:44 | LL | let _vec: Vec<&'static String> = vec![&String::new()]; - | ^^^^^^^^^^^^^ temporary value does not live long enough -LL | //~^ ERROR borrowed value does not live long enough [E0597] -LL | } - | - temporary value only lives until here + | ^^^^^^^^^^^^^ - temporary value only lives until here + | | + | temporary value does not live long enough | = note: borrowed value must be valid for the static lifetime... diff --git a/src/test/ui/nll/get_default.stderr b/src/test/ui/nll/get_default.stderr index dd69e18652c9a..75194bf55bc9f 100644 --- a/src/test/ui/nll/get_default.stderr +++ b/src/test/ui/nll/get_default.stderr @@ -55,6 +55,18 @@ LL | | } LL | | } | |_^ +error[E0502]: cannot borrow `*map` as mutable because it is also borrowed as immutable (Mir) + --> $DIR/get_default.rs:45:17 + | +LL | match map.get() { + | --- immutable borrow occurs here +LL | Some(v) => { +LL | map.set(String::new()); // Both AST and MIR error here + | ^^^ mutable borrow occurs here +... +LL | return v; + | - borrow later used here + error[E0502]: cannot borrow `*map` as mutable because it is also borrowed as immutable (Mir) --> $DIR/get_default.rs:51:17 | @@ -76,18 +88,6 @@ LL | | } LL | | } | |_^ -error[E0502]: cannot borrow `*map` as mutable because it is also borrowed as immutable (Mir) - --> $DIR/get_default.rs:45:17 - | -LL | match map.get() { - | --- immutable borrow occurs here -LL | Some(v) => { -LL | map.set(String::new()); // Both AST and MIR error here - | ^^^ mutable borrow occurs here -... -LL | return v; - | - borrow later used here - error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0502`. diff --git a/src/test/ui/span/dropck_arr_cycle_checked.nll.stderr b/src/test/ui/span/dropck_arr_cycle_checked.nll.stderr index fee0d7feb6d36..cbb9d0429c616 100644 --- a/src/test/ui/span/dropck_arr_cycle_checked.nll.stderr +++ b/src/test/ui/span/dropck_arr_cycle_checked.nll.stderr @@ -1,7 +1,7 @@ -error[E0597]: `b1` does not live long enough - --> $DIR/dropck_arr_cycle_checked.rs:111:24 +error[E0597]: `b3` does not live long enough + --> $DIR/dropck_arr_cycle_checked.rs:105:24 | -LL | b3.a[0].v.set(Some(&b1)); +LL | b1.a[1].v.set(Some(&b3)); | ^^^ borrowed value does not live long enough ... LL | } @@ -22,10 +22,10 @@ LL | } | borrowed value only lives until here | borrow later used here, when `b1` is dropped -error[E0597]: `b3` does not live long enough - --> $DIR/dropck_arr_cycle_checked.rs:105:24 +error[E0597]: `b1` does not live long enough + --> $DIR/dropck_arr_cycle_checked.rs:111:24 | -LL | b1.a[1].v.set(Some(&b3)); +LL | b3.a[0].v.set(Some(&b1)); | ^^^ borrowed value does not live long enough ... LL | } diff --git a/src/test/ui/span/dropck_direct_cycle_with_drop.nll.stderr b/src/test/ui/span/dropck_direct_cycle_with_drop.nll.stderr index 86a4f0e13b512..37fffe886e309 100644 --- a/src/test/ui/span/dropck_direct_cycle_with_drop.nll.stderr +++ b/src/test/ui/span/dropck_direct_cycle_with_drop.nll.stderr @@ -1,9 +1,9 @@ -error[E0597]: `d1` does not live long enough - --> $DIR/dropck_direct_cycle_with_drop.rs:48:19 +error[E0597]: `d2` does not live long enough + --> $DIR/dropck_direct_cycle_with_drop.rs:46:19 | -LL | d2.p.set(Some(&d1)); +LL | d1.p.set(Some(&d2)); | ^^^ borrowed value does not live long enough -LL | //~^ ERROR `d1` does not live long enough +... LL | } | - | | @@ -12,12 +12,12 @@ LL | } | = note: values in a scope are dropped in the opposite order they are defined -error[E0597]: `d2` does not live long enough - --> $DIR/dropck_direct_cycle_with_drop.rs:46:19 +error[E0597]: `d1` does not live long enough + --> $DIR/dropck_direct_cycle_with_drop.rs:48:19 | -LL | d1.p.set(Some(&d2)); +LL | d2.p.set(Some(&d1)); | ^^^ borrowed value does not live long enough -... +LL | //~^ ERROR `d1` does not live long enough LL | } | - | | diff --git a/src/test/ui/span/dropck_vec_cycle_checked.nll.stderr b/src/test/ui/span/dropck_vec_cycle_checked.nll.stderr index b7f8b85f46cee..13bd1f5419821 100644 --- a/src/test/ui/span/dropck_vec_cycle_checked.nll.stderr +++ b/src/test/ui/span/dropck_vec_cycle_checked.nll.stderr @@ -1,7 +1,7 @@ -error[E0597]: `c1` does not live long enough - --> $DIR/dropck_vec_cycle_checked.rs:121:24 +error[E0597]: `c3` does not live long enough + --> $DIR/dropck_vec_cycle_checked.rs:115:24 | -LL | c3.v[0].v.set(Some(&c1)); +LL | c1.v[1].v.set(Some(&c3)); | ^^^ borrowed value does not live long enough ... LL | } @@ -22,10 +22,10 @@ LL | } | borrowed value only lives until here | borrow later used here, when `c1` is dropped -error[E0597]: `c3` does not live long enough - --> $DIR/dropck_vec_cycle_checked.rs:115:24 +error[E0597]: `c1` does not live long enough + --> $DIR/dropck_vec_cycle_checked.rs:121:24 | -LL | c1.v[1].v.set(Some(&c3)); +LL | c3.v[0].v.set(Some(&c1)); | ^^^ borrowed value does not live long enough ... LL | } diff --git a/src/test/ui/span/vec-must-not-hide-type-from-dropck.nll.stderr b/src/test/ui/span/vec-must-not-hide-type-from-dropck.nll.stderr index 389adb231c422..100b4c1292f44 100644 --- a/src/test/ui/span/vec-must-not-hide-type-from-dropck.nll.stderr +++ b/src/test/ui/span/vec-must-not-hide-type-from-dropck.nll.stderr @@ -1,21 +1,21 @@ -error[E0597]: `c1` does not live long enough - --> $DIR/vec-must-not-hide-type-from-dropck.rs:129:24 +error[E0597]: `c2` does not live long enough + --> $DIR/vec-must-not-hide-type-from-dropck.rs:127:24 | -LL | c2.v[0].v.set(Some(&c1)); +LL | c1.v[0].v.set(Some(&c2)); | ^^^ borrowed value does not live long enough -LL | //~^ ERROR `c1` does not live long enough +... LL | } | - | | | borrowed value only lives until here | borrow later used here, when `c1` is dropped -error[E0597]: `c2` does not live long enough - --> $DIR/vec-must-not-hide-type-from-dropck.rs:127:24 +error[E0597]: `c1` does not live long enough + --> $DIR/vec-must-not-hide-type-from-dropck.rs:129:24 | -LL | c1.v[0].v.set(Some(&c2)); +LL | c2.v[0].v.set(Some(&c1)); | ^^^ borrowed value does not live long enough -... +LL | //~^ ERROR `c1` does not live long enough LL | } | - | |