diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index ce132a04870..1205d688b85 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -980,7 +980,8 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session, passes.push_pass(box mir::transform::simplify_cfg::SimplifyCfg::new("initial")); passes.push_pass(box mir::transform::qualify_consts::QualifyAndPromoteConstants); passes.push_pass(box mir::transform::type_check::TypeckMir); - passes.push_pass(box mir::transform::simplify_branches::SimplifyBranches::new("initial")); + passes.push_pass( + box mir::transform::simplify_branches::SimplifyBranches::new("initial")); passes.push_pass(box mir::transform::simplify_cfg::SimplifyCfg::new("qualify-consts")); // And run everything. passes.run_passes(tcx, &mut mir_map); diff --git a/src/librustc_mir/build/cfg.rs b/src/librustc_mir/build/cfg.rs index 3bd6a7e1dd1..83f8c3b42c8 100644 --- a/src/librustc_mir/build/cfg.rs +++ b/src/librustc_mir/build/cfg.rs @@ -78,8 +78,11 @@ impl<'tcx> CFG<'tcx> { block: BasicBlock, source_info: SourceInfo, kind: TerminatorKind<'tcx>) { + debug!("terminating block {:?} <- {:?}", block, kind); debug_assert!(self.block_data(block).terminator.is_none(), - "terminate: block {:?} already has a terminator set", block); + "terminate: block {:?}={:?} already has a terminator set", + block, + self.block_data(block)); self.block_data_mut(block).terminator = Some(Terminator { source_info: source_info, kind: kind, diff --git a/src/librustc_mir/build/matches/mod.rs b/src/librustc_mir/build/matches/mod.rs index c57913c8e60..b3315ab7d29 100644 --- a/src/librustc_mir/build/matches/mod.rs +++ b/src/librustc_mir/build/matches/mod.rs @@ -87,6 +87,9 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { // can't be reached - terminate them with an `unreachable`. let source_info = self.source_info(span); + let mut otherwise = otherwise; + otherwise.sort(); + otherwise.dedup(); // variant switches can introduce duplicate target blocks for block in otherwise { self.cfg.terminate(block, source_info, TerminatorKind::Unreachable); } diff --git a/src/rustc/Cargo.lock b/src/rustc/Cargo.lock index 50d9f61e2c1..3e8277e28ba 100644 --- a/src/rustc/Cargo.lock +++ b/src/rustc/Cargo.lock @@ -87,6 +87,7 @@ dependencies = [ "graphviz 0.0.0", "log 0.0.0", "rustc 0.0.0", + "rustc_data_structures 0.0.0", "rustc_mir 0.0.0", "syntax 0.0.0", ]