diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index f897ba4df1d..903bfc44c1d 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -18,7 +18,7 @@ use lint; use middle::allocator::AllocatorKind; use middle::dependency_format; use session::search_paths::PathKind; -use session::config::DebugInfoLevel; +use session::config::{BorrowckMode, DebugInfoLevel}; use ty::tls; use util::nodemap::{FxHashMap, FxHashSet}; use util::common::{duration_to_secs_str, ErrorReported}; @@ -440,16 +440,34 @@ impl Session { pub fn nll(&self) -> bool { self.features.borrow().nll || self.opts.debugging_opts.nll } + pub fn use_mir(&self) -> bool { + self.features.borrow().nll || self.opts.borrowck_mode.use_mir() + } pub fn nll_dump_cause(&self) -> bool { self.opts.debugging_opts.nll_dump_cause } pub fn two_phase_borrows(&self) -> bool { self.features.borrow().nll || self.opts.debugging_opts.two_phase_borrows } + pub fn borrowck_mode(&self) -> BorrowckMode { + match self.opts.borrowck_mode { + mode @ BorrowckMode::Mir | + mode @ BorrowckMode::Compare => mode, + + mode @ BorrowckMode::Ast => { + if self.features.borrow().nll { + BorrowckMode::Mir + } else { + mode + } + } + + } + } pub fn emit_end_regions(&self) -> bool { self.opts.debugging_opts.emit_end_regions || (self.opts.debugging_opts.mir_emit_validate > 0) || - self.opts.borrowck_mode.use_mir() + self.use_mir() } pub fn lto(&self) -> bool { self.opts.cg.lto || self.target.target.options.requires_lto diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 62736db9260..b124872ba12 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -275,7 +275,7 @@ impl<'b, 'tcx: 'b> BorrowckErrors for BorrowckCtxt<'b, 'tcx> { o: Origin) -> DiagnosticBuilder<'a> { - if !o.should_emit_errors(self.tcx.sess.opts.borrowck_mode) { + if !o.should_emit_errors(self.tcx.sess.borrowck_mode()) { self.tcx.sess.diagnostic().cancel(&mut diag); } diag diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index b53e3e4c17a..7a6c2c25bf1 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -73,7 +73,7 @@ fn mir_borrowck<'a, 'tcx>( debug!("run query mir_borrowck: {}", tcx.item_path_str(def_id)); if { - !tcx.has_attr(def_id, "rustc_mir_borrowck") && !tcx.sess.opts.borrowck_mode.use_mir() + !tcx.has_attr(def_id, "rustc_mir_borrowck") && !tcx.sess.use_mir() && !tcx.sess.nll() } { return None; diff --git a/src/librustc_mir/util/borrowck_errors.rs b/src/librustc_mir/util/borrowck_errors.rs index 7cd92de88ee..38227bd7133 100644 --- a/src/librustc_mir/util/borrowck_errors.rs +++ b/src/librustc_mir/util/borrowck_errors.rs @@ -509,7 +509,7 @@ impl<'b, 'gcx, 'tcx> BorrowckErrors for TyCtxt<'b, 'gcx, 'tcx> { o: Origin) -> DiagnosticBuilder<'a> { - if !o.should_emit_errors(self.sess.opts.borrowck_mode) { + if !o.should_emit_errors(self.sess.borrowck_mode()) { self.sess.diagnostic().cancel(&mut diag); } diag diff --git a/src/test/run-pass/borrowck/two-phase-control-flow-split-before-activation.rs b/src/test/run-pass/borrowck/two-phase-control-flow-split-before-activation.rs index 162314a8b79..35a5422040a 100644 --- a/src/test/run-pass/borrowck/two-phase-control-flow-split-before-activation.rs +++ b/src/test/run-pass/borrowck/two-phase-control-flow-split-before-activation.rs @@ -10,7 +10,6 @@ // revisions: lxl nll //[lxl]compile-flags: -Z borrowck=mir -Z two-phase-borrows -//[nll]compile-flags: -Z borrowck=mir #![cfg_attr(nll, feature(nll))]