diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index 67746dfa330..38bbddfd825 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -261,7 +261,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { errors: &Vec>) { debug!("report_region_errors(): {} errors to start", errors.len()); - if self.tcx.sess.opts.debugging_opts.nll { + if self.tcx.sess.nll() { for error in errors { match *error { RegionResolutionError::ConcreteFailure(ref origin, ..) | diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 8f41a2d6232..43ed9f02157 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -437,6 +437,9 @@ impl Session { pub fn print_llvm_passes(&self) -> bool { self.opts.debugging_opts.print_llvm_passes } + pub fn nll(&self) -> bool { + self.features.borrow().nll || self.opts.debugging_opts.nll + } pub fn nll_dump_cause(&self) -> bool { self.opts.debugging_opts.nll_dump_cause } diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 46e97d95f49..34c91b84f28 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -74,7 +74,7 @@ fn mir_borrowck<'a, 'tcx>( if { !tcx.has_attr(def_id, "rustc_mir_borrowck") && !tcx.sess.opts.borrowck_mode.use_mir() - && !tcx.sess.opts.debugging_opts.nll + && !tcx.sess.nll() } { return None; } @@ -104,7 +104,7 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>( // contain non-lexical lifetimes. It will have a lifetime tied // to the inference context. let mut mir: Mir<'tcx> = input_mir.clone(); - let free_regions = if !tcx.sess.opts.debugging_opts.nll { + let free_regions = if !tcx.sess.nll() { None } else { let mir = &mut mir; @@ -207,7 +207,7 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>( ); (Some(Rc::new(regioncx)), opt_closure_req) } else { - assert!(!tcx.sess.opts.debugging_opts.nll); + assert!(!tcx.sess.nll()); (None, None) }; let flow_inits = flow_inits; // remove mut diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index ba534676324..379881302ee 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -186,6 +186,9 @@ declare_features! ( // Allows the use of rustc_* attributes; RFC 572 (active, rustc_attrs, "1.0.0", Some(29642)), + // Allows the use of non lexical lifetimes; RFC 2094 + (active, nll, "1.0.0", Some(44928)), + // Allows the use of #[allow_internal_unstable]. This is an // attribute on macro_rules! and can't use the attribute handling // below (it has to be checked before expansion possibly makes @@ -798,6 +801,12 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG libcore functions that are inlined \ across crates and will never be stable", cfg_fn!(rustc_attrs))), + + // RFC #2094 + ("nll", Whitelisted, Gated(Stability::Unstable, + "nll", + "Non lexical lifetimes", + cfg_fn!(nll))), ("compiler_builtins", Whitelisted, Gated(Stability::Unstable, "compiler_builtins", "the `#[compiler_builtins]` attribute is used to \ diff --git a/src/test/ui/feature-gate-nll.rs b/src/test/ui/feature-gate-nll.rs new file mode 100644 index 00000000000..f34a9cddf98 --- /dev/null +++ b/src/test/ui/feature-gate-nll.rs @@ -0,0 +1,18 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![allow(dead_code)] + +fn main() { + let mut x = 33; + + let p = &x; + x = 22; //~ ERROR cannot assign to `x` because it is borrowed [E0506] +} diff --git a/src/test/ui/feature-gate-nll.stderr b/src/test/ui/feature-gate-nll.stderr new file mode 100644 index 00000000000..4135462305a --- /dev/null +++ b/src/test/ui/feature-gate-nll.stderr @@ -0,0 +1,10 @@ +error[E0506]: cannot assign to `x` because it is borrowed + --> $DIR/feature-gate-nll.rs:17:5 + | +16 | let p = &x; + | - borrow of `x` occurs here +17 | x = 22; //~ ERROR cannot assign to `x` because it is borrowed [E0506] + | ^^^^^^ assignment to borrowed `x` occurs here + +error: aborting due to previous error + diff --git a/src/test/ui/nll/capture-ref-in-struct.rs b/src/test/ui/nll/capture-ref-in-struct.rs index 6e234a966d1..2d208c88552 100644 --- a/src/test/ui/nll/capture-ref-in-struct.rs +++ b/src/test/ui/nll/capture-ref-in-struct.rs @@ -8,12 +8,13 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags:-Znll -Zborrowck=mir -Znll-dump-cause +// compile-flags:-Zborrowck=mir -Znll-dump-cause // Test that a structure which tries to store a pointer to `y` into // `p` (indirectly) fails to compile. #![feature(rustc_attrs)] +#![feature(nll)] struct SomeStruct<'a, 'b: 'a> { p: &'a mut &'b i32, diff --git a/src/test/ui/nll/capture-ref-in-struct.stderr b/src/test/ui/nll/capture-ref-in-struct.stderr index 7b3f7d25dd0..7e7487daa67 100644 --- a/src/test/ui/nll/capture-ref-in-struct.stderr +++ b/src/test/ui/nll/capture-ref-in-struct.stderr @@ -1,13 +1,13 @@ error[E0597]: `y` does not live long enough - --> $DIR/capture-ref-in-struct.rs:32:16 + --> $DIR/capture-ref-in-struct.rs:33:16 | -32 | y: &y, +33 | y: &y, | ^^ borrowed value does not live long enough ... -37 | } +38 | } | - borrowed value only lives until here -38 | -39 | deref(p); +39 | +40 | deref(p); | - borrow later used here | = note: borrowed value must be valid for lifetime '_#5r...