diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index 5142a30ae574f..8f7f9d09423f6 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -1354,6 +1354,12 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { !self.sess.opts.debugging_opts.disable_ast_check_for_mutation_in_guard } + /// If true, we should use the AST-based borrowck (we may *also* use + /// the MIR-based borrowck). + pub fn use_ast_borrowck(self) -> bool { + self.borrowck_mode().use_ast() + } + /// If true, we should use the MIR-based borrowck (we may *also* use /// the AST-based borrowck). pub fn use_mir_borrowck(self) -> bool { diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 4bd8e6afa76e3..df1b1138f3e88 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -89,6 +89,8 @@ pub struct AnalysisData<'a, 'tcx: 'a> { fn borrowck<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, owner_def_id: DefId) -> Lrc<BorrowCheckResult> { + assert!(tcx.use_ast_borrowck()); + debug!("borrowck(body_owner_def_id={:?})", owner_def_id); let owner_id = tcx.hir.as_local_node_id(owner_def_id).unwrap(); diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index feeac9d938b6a..96e9616699d37 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -1279,7 +1279,11 @@ where middle::liveness::check_crate(tcx) }); - time(sess, "borrow checking", || borrowck::check_crate(tcx)); + time(sess, "borrow checking", || { + if tcx.use_ast_borrowck() { + borrowck::check_crate(tcx); + } + }); time(sess, "MIR borrow checking", diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 3aaa3378bb005..ba649f8e7a909 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -80,7 +80,7 @@ fn mir_borrowck<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> BorrowC let mut return_early; // Return early if we are not supposed to use MIR borrow checker for this function. - return_early = !tcx.has_attr(def_id, "rustc_mir_borrowck") && !tcx.use_mir_borrowck(); + return_early = !tcx.has_attr(def_id, "rustc_mir") && !tcx.use_mir_borrowck(); if tcx.is_struct_constructor(def_id) { // We are not borrow checking the automatically generated struct constructors diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 06be2bb3734f4..90dfebeef1b0c 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -225,7 +225,10 @@ fn optimized_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx // (Mir-)Borrowck uses `mir_validated`, so we have to force it to // execute before we can steal. let _ = tcx.mir_borrowck(def_id); - let _ = tcx.borrowck(def_id); + + if tcx.use_ast_borrowck() { + let _ = tcx.borrowck(def_id); + } let mut mir = tcx.mir_validated(def_id).steal(); run_passes![tcx, mir, def_id, 2; diff --git a/src/librustc_mir/transform/rustc_peek.rs b/src/librustc_mir/transform/rustc_peek.rs index b23f056801210..da149f420644c 100644 --- a/src/librustc_mir/transform/rustc_peek.rs +++ b/src/librustc_mir/transform/rustc_peek.rs @@ -36,7 +36,7 @@ impl MirPass for SanityCheck { src: MirSource, mir: &mut Mir<'tcx>) { let def_id = src.def_id; let id = tcx.hir.as_local_node_id(def_id).unwrap(); - if !tcx.has_attr(def_id, "rustc_mir_borrowck") { + if !tcx.has_attr(def_id, "rustc_mir") { debug!("skipping rustc_peek::SanityCheck on {}", tcx.item_path_str(def_id)); return; } else { diff --git a/src/test/compile-fail/mir-dataflow/def-inits-1.rs b/src/test/compile-fail/mir-dataflow/def-inits-1.rs index f3c9f29821ebb..f5f0ede6864f4 100644 --- a/src/test/compile-fail/mir-dataflow/def-inits-1.rs +++ b/src/test/compile-fail/mir-dataflow/def-inits-1.rs @@ -10,6 +10,7 @@ // General test of maybe_uninits state computed by MIR dataflow. +#![feature(nll)] #![feature(core_intrinsics, rustc_attrs)] use std::intrinsics::rustc_peek; @@ -17,7 +18,6 @@ use std::mem::{drop, replace}; struct S(i32); -#[rustc_mir_borrowck] #[rustc_mir(rustc_peek_definite_init,stop_after_dataflow)] fn foo(test: bool, x: &mut S, y: S, mut z: S) -> S { let ret; diff --git a/src/test/compile-fail/mir-dataflow/inits-1.rs b/src/test/compile-fail/mir-dataflow/inits-1.rs index 8a5ab6e420ade..595f01f7c94b3 100644 --- a/src/test/compile-fail/mir-dataflow/inits-1.rs +++ b/src/test/compile-fail/mir-dataflow/inits-1.rs @@ -10,6 +10,7 @@ // General test of maybe_inits state computed by MIR dataflow. +#![feature(nll)] #![feature(core_intrinsics, rustc_attrs)] use std::intrinsics::rustc_peek; @@ -17,7 +18,6 @@ use std::mem::{drop, replace}; struct S(i32); -#[rustc_mir_borrowck] #[rustc_mir(rustc_peek_maybe_init,stop_after_dataflow)] fn foo(test: bool, x: &mut S, y: S, mut z: S) -> S { let ret; diff --git a/src/test/compile-fail/mir-dataflow/uninits-1.rs b/src/test/compile-fail/mir-dataflow/uninits-1.rs index 8df66ea815c68..bb10c03254e3c 100644 --- a/src/test/compile-fail/mir-dataflow/uninits-1.rs +++ b/src/test/compile-fail/mir-dataflow/uninits-1.rs @@ -10,6 +10,7 @@ // General test of maybe_uninits state computed by MIR dataflow. +#![feature(nll)] #![feature(core_intrinsics, rustc_attrs)] use std::intrinsics::rustc_peek; @@ -17,7 +18,6 @@ use std::mem::{drop, replace}; struct S(i32); -#[rustc_mir_borrowck] #[rustc_mir(rustc_peek_maybe_uninit,stop_after_dataflow)] fn foo(test: bool, x: &mut S, y: S, mut z: S) -> S { let ret; diff --git a/src/test/compile-fail/mir-dataflow/uninits-2.rs b/src/test/compile-fail/mir-dataflow/uninits-2.rs index 2edd275e78691..9854ea779b3ad 100644 --- a/src/test/compile-fail/mir-dataflow/uninits-2.rs +++ b/src/test/compile-fail/mir-dataflow/uninits-2.rs @@ -10,6 +10,7 @@ // General test of maybe_uninits state computed by MIR dataflow. +#![feature(nll)] #![feature(core_intrinsics, rustc_attrs)] use std::intrinsics::rustc_peek; @@ -17,7 +18,6 @@ use std::mem::{drop, replace}; struct S(i32); -#[rustc_mir_borrowck] #[rustc_mir(rustc_peek_maybe_uninit,stop_after_dataflow)] fn foo(x: &mut S) { // `x` is initialized here, so maybe-uninit bit is 0. diff --git a/src/test/ui/error-codes/E0017.nll.stderr b/src/test/ui/error-codes/E0017.nll.stderr index ec31f5d05d787..addbbf4434f4f 100644 --- a/src/test/ui/error-codes/E0017.nll.stderr +++ b/src/test/ui/error-codes/E0017.nll.stderr @@ -10,18 +10,18 @@ error[E0017]: references in statics may only refer to immutable values LL | static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0017 | ^^^^^^ statics require immutable values -error[E0017]: references in statics may only refer to immutable values - --> $DIR/E0017.rs:17:38 - | -LL | static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0017 - | ^^^^^^ statics require immutable values - error[E0596]: cannot borrow immutable item `X` as mutable --> $DIR/E0017.rs:15:39 | LL | static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0017 | ^^^^^^ cannot borrow as mutable +error[E0017]: references in statics may only refer to immutable values + --> $DIR/E0017.rs:17:38 + | +LL | static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0017 + | ^^^^^^ statics require immutable values + error: aborting due to 4 previous errors Some errors occurred: E0017, E0596. diff --git a/src/test/ui/error-codes/E0388.nll.stderr b/src/test/ui/error-codes/E0388.nll.stderr index 6a4bd6b31a116..0238ca6b623da 100644 --- a/src/test/ui/error-codes/E0388.nll.stderr +++ b/src/test/ui/error-codes/E0388.nll.stderr @@ -10,18 +10,18 @@ error[E0017]: references in statics may only refer to immutable values LL | static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0017 | ^^^^^^ statics require immutable values -error[E0017]: references in statics may only refer to immutable values - --> $DIR/E0388.rs:17:38 - | -LL | static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0017 - | ^^^^^^ statics require immutable values - error[E0596]: cannot borrow immutable item `X` as mutable --> $DIR/E0388.rs:15:39 | LL | static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0017 | ^^^^^^ cannot borrow as mutable +error[E0017]: references in statics may only refer to immutable values + --> $DIR/E0388.rs:17:38 + | +LL | static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0017 + | ^^^^^^ statics require immutable values + error: aborting due to 4 previous errors Some errors occurred: E0017, E0596.