about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <arielb1@mail.tau.ac.il>2016-06-09 17:23:23 +0300
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2016-06-09 21:47:58 +0300
commitce4fdefbd824271c342ab253b5e475ab9dc91be9 (patch)
tree31e99478e98d82661933ac549ca3b1fe143add27
parentf5b1ba6e90afe1cd5bc46bae4ee97d989c71adbf (diff)
downloadrust-ce4fdefbd824271c342ab253b5e475ab9dc91be9.tar.gz
rust-ce4fdefbd824271c342ab253b5e475ab9dc91be9.zip
fix issues
-rw-r--r--src/librustc_driver/driver.rs3
-rw-r--r--src/librustc_mir/build/cfg.rs5
-rw-r--r--src/librustc_mir/build/matches/mod.rs3
-rw-r--r--src/rustc/Cargo.lock1
4 files changed, 10 insertions, 2 deletions
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",
 ]