errors: &Vec<RegionResolutionError<'tcx>>) {
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, ..) |
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
}
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;
}
// 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;
);
(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
// 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
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 \
--- /dev/null
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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]
+}
--- /dev/null
+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
+
// 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,
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...