db.note("values in a scope are dropped in the opposite order \
they are created");
}
+ (Some(s1), Some(s2)) if !is_temporary && !is_closure => {
+ db.span = MultiSpan::from_span(s2);
+ db.span_label(error_span, &format!("borrow occurs here"));
+ let msg = match opt_loan_path(&err.cmt) {
+ None => "borrowed value".to_string(),
+ Some(lp) => {
+ format!("`{}`", self.loan_path_to_string(&lp))
+ }
+ };
+ db.span_label(s2,
+ &format!("{} dropped here while still borrowed", msg));
+ db.span_label(s1, &format!("{} needs to live until here", value_kind));
+ }
_ => {
match sub_span {
Some(s) => {
+++ /dev/null
-// Copyright 2012 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.
-
-fn main() {
- let msg;
- match Some("Hello".to_string()) {
- Some(ref m) => { //~ ERROR borrowed value does not live long enough
- msg = m;
- },
- None => { panic!() }
- }
- println!("{}", *msg);
-}
+++ /dev/null
-// Copyright 2014 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.
-
-// Tests the new destructor semantics.
-
-use std::cell::RefCell;
-
-fn main() {
- let b = {
- let a = Box::new(RefCell::new(4));
- *a.borrow() + 1 //~ ERROR `*a` does not live long enough
- };
- println!("{}", b);
-}
+++ /dev/null
-// Copyright 2013 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.
-
-use std::cell::RefCell;
-
-fn main() {
- let m = RefCell::new(0);
- let p;
- {
- let b = m.borrow();
- p = &*b; //~ ERROR `b` does not live long enough
- }
-}
+++ /dev/null
-// Copyright 2016 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.
-
-// Test range syntax - borrow errors.
-
-pub fn main() {
- let r = {
- let a = 42;
- let b = 42;
- &a..&b
- //~^ ERROR `a` does not live long enough
- //~^^ ERROR `b` does not live long enough
- };
-}
+++ /dev/null
-// Copyright 2014 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.
-
-use std::ops::FnMut;
-
-fn main() {
- let mut f;
- {
- let c = 1;
- let c_ref = &c; //~ ERROR `c` does not live long enough
- f = move |a: isize, b: isize| { a + b + *c_ref };
- }
-}
+++ /dev/null
-// Copyright 2014 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.
-
-#![feature(box_syntax)]
-
-// Test for what happens when a type parameter `A` is closed over into
-// an object. This should yield errors unless `A` (and the object)
-// both have suitable bounds.
-
-trait Foo { fn get(&self); }
-
-impl<A> Foo for A {
- fn get(&self) { }
-}
-
-fn repeater3<'a,A:'a>(v: A) -> Box<Foo+'a> {
- box v as Box<Foo+'a>
-}
-
-fn main() {
- // Error results because the type of is inferred to be
- // ~Repeat<&'blk isize> where blk is the lifetime of the block below.
-
- let _ = {
- let tmp0 = 3;
- let tmp1 = &tmp0; //~ ERROR `tmp0` does not live long enough
- repeater3(tmp1)
- };
-}
+++ /dev/null
-// Copyright 2012 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.
-
-fn main() {
- let x = 3;
-
- // Here, the variable `p` gets inferred to a type with a lifetime
- // of the loop body. The regionck then determines that this type
- // is invalid.
- let mut p = &x;
-
- loop {
- let x = 1 + *p;
- p = &x; //~ ERROR `x` does not live long enough
- }
-}
+++ /dev/null
-// Copyright 2012 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.
-
-// The type of `y` ends up getting inferred to the type of the block.
-fn broken() {
- let mut x = 3;
- let mut _y = vec![&mut x];
- //~^ NOTE borrow of `x` occurs here
- //~| NOTE borrow of `x` occurs here
- //~| NOTE borrow of `x` occurs here
- while x < 10 { //~ ERROR cannot use `x` because it was mutably borrowed
- //~^ NOTE use of borrowed `x`
- let mut z = x; //~ ERROR cannot use `x` because it was mutably borrowed
- //~^ NOTE use of borrowed `x`
- _y.push(&mut z); //~ ERROR `z` does not live long enough
- //~^ NOTE does not live long enough
- x += 1; //~ ERROR cannot assign
- //~^ NOTE assignment to borrowed `x` occurs here
- }
- //~^ NOTE borrowed value only lives until here
-}
-//~^ NOTE borrowed value needs to live until here
-
-fn main() { }
+++ /dev/null
-// Copyright 2012 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.
-
-
-fn borrow<T>(x: &T) -> &T {x}
-
-fn foo<C, M>(mut cond: C, mut make_box: M) where
- C: FnMut() -> bool,
- M: FnMut() -> Box<isize>,
-{
- let mut y: &isize;
- loop {
- let x = make_box();
-
- // Here we complain because the resulting region
- // of this borrow is the fn body as a whole.
- y = borrow(&*x); //~ ERROR `*x` does not live long enough
-
- assert_eq!(*x, *y);
- if cond() { break; }
- }
- assert!(*y != 0);
-}
-
-fn main() {}
+++ /dev/null
-// Copyright 2014 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.
-
-struct Guard<'a> {
- f: Box<Fn() + Send + 'a>,
-}
-
-fn scoped<'a, F: Fn() + Send + 'a>(f: F) -> Guard<'a> {
- Guard { f: Box::new(f) }
-}
-
-impl<'a> Guard<'a> {
- fn join(self) {}
-}
-
-fn main() {
- let bad = {
- let x = 1;
- let y = &x; //~ ERROR `x` does not live long enough
-
- scoped(|| {
- let _z = y;
- //~^ ERROR `y` does not live long enough
- })
- };
-
- bad.join();
-}
+++ /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.
-
-// basic tests to see that certain "obvious" errors are caught by
-// these types no longer requiring `'static` (RFC 458)
-
-#![allow(dead_code)]
-
-use std::sync::{Mutex, RwLock, mpsc};
-
-fn mutex() {
- let lock = {
- let x = 1;
- Mutex::new(&x) //~ ERROR does not live long enough
- };
-
- let _dangling = *lock.lock().unwrap();
-}
-
-fn rwlock() {
- let lock = {
- let x = 1;
- RwLock::new(&x) //~ ERROR does not live long enough
- };
- let _dangling = *lock.read().unwrap();
-}
-
-fn channel() {
- let (_tx, rx) = {
- let x = 1;
- let (tx, rx) = mpsc::channel();
- let _ = tx.send(&x); //~ ERROR does not live long enough
- (tx, rx)
- };
-
- let _dangling = rx.recv();
-}
-
-fn main() {}
+++ /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.
-
-// basic tests to see that certain "obvious" errors are caught by
-// these types no longer requiring `'static` (RFC 458)
-
-#![allow(dead_code)]
-
-use std::sync::{Mutex, RwLock, mpsc};
-
-fn mutex() {
- let x = 1;
- let y = Box::new(1);
- let lock = Mutex::new(&x);
- *lock.lock().unwrap() = &*y;
- drop(y); //~ ERROR cannot move out
- {
- let z = 2;
- *lock.lock().unwrap() = &z; //~ ERROR does not live long enough
- }
-}
-
-fn rwlock() {
- let x = 1;
- let y = Box::new(1);
- let lock = RwLock::new(&x);
- *lock.write().unwrap() = &*y;
- drop(y); //~ ERROR cannot move out
- {
- let z = 2;
- *lock.write().unwrap() = &z; //~ ERROR does not live long enough
- }
-}
-
-fn channel() {
- let x = 1;
- let y = Box::new(1);
- let (tx, rx) = mpsc::channel();
-
- tx.send(&x).unwrap();
- tx.send(&*y);
- drop(y); //~ ERROR cannot move out
- {
- let z = 2;
- tx.send(&z).unwrap(); //~ ERROR does not live long enough
- }
-}
-
-fn main() {}
+++ /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.
-
-// A method's receiver must be well-formed, even if it has late-bound regions.
-// Because of this, a method's substs being well-formed does not imply that
-// the method's implied bounds are met.
-
-struct Foo<'b>(Option<&'b ()>);
-
-trait Bar<'b> {
- fn xmute<'a>(&'a self, u: &'b u32) -> &'a u32;
-}
-
-impl<'b> Bar<'b> for Foo<'b> {
- fn xmute<'a>(&'a self, u: &'b u32) -> &'a u32 { u }
-}
-
-fn main() {
- let f = Foo(None);
- let f2 = f;
- let dangling = {
- let pointer = Box::new(42);
- f2.xmute(&pointer) //~ ERROR `pointer` does not live long enough
- };
- println!("{}", dangling);
-}
--- /dev/null
+// Copyright 2012 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.
+
+fn main() {
+ let msg;
+ match Some("Hello".to_string()) {
+ Some(ref m) => { //~ ERROR borrowed value does not live long enough
+ msg = m;
+ },
+ None => { panic!() }
+ }
+ println!("{}", *msg);
+}
--- /dev/null
+error: borrowed value does not live long enough
+ --> $DIR/borrowck-ref-into-rvalue.rs:18:5
+ |
+14 | Some(ref m) => { //~ ERROR borrowed value does not live long enough
+ | ----- borrow occurs here
+...
+18 | }
+ | ^ borrowed value dropped here while still borrowed
+19 | println!("{}", *msg);
+20 | }
+ | - borrowed value needs to live until here
+ |
+ = note: consider using a `let` binding to increase its lifetime
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2014 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.
+
+// Tests the new destructor semantics.
+
+use std::cell::RefCell;
+
+fn main() {
+ let b = {
+ let a = Box::new(RefCell::new(4));
+ *a.borrow() + 1 //~ ERROR `*a` does not live long enough
+ };
+ println!("{}", b);
+}
--- /dev/null
+error: `*a` does not live long enough
+ --> $DIR/destructor-restrictions.rs:19:5
+ |
+18 | *a.borrow() + 1 //~ ERROR `*a` does not live long enough
+ | - borrow occurs here
+19 | };
+ | ^- borrowed value needs to live until here
+ | |
+ | `*a` dropped here while still borrowed
+
+error: aborting due to previous error
+
18 | let f = to_fn_once(move|| &x);
| ^
| |
- | does not live long enough
- | borrowed value only lives until here
+ | borrow occurs here
+ | `x` dropped here while still borrowed
...
23 | }
| - borrowed value needs to live until here
= note: values in a scope are dropped in the opposite order they are created
error: `y` does not live long enough
- --> $DIR/issue-23338-locals-die-before-temps-of-body.rs:27:9
+ --> $DIR/issue-23338-locals-die-before-temps-of-body.rs:28:5
|
27 | y.borrow().clone() //~ ERROR `y` does not live long enough
- | ^ does not live long enough
+ | - borrow occurs here
28 | };
- | -- borrowed value needs to live until here
+ | ^- borrowed value needs to live until here
| |
- | borrowed value only lives until here
+ | `y` dropped here while still borrowed
error: aborting due to 2 previous errors
--- /dev/null
+// Copyright 2013 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.
+
+use std::cell::RefCell;
+
+fn main() {
+ let m = RefCell::new(0);
+ let p;
+ {
+ let b = m.borrow();
+ p = &*b; //~ ERROR `b` does not live long enough
+ }
+}
--- /dev/null
+error: `b` does not live long enough
+ --> $DIR/mut-ptr-cant-outlive-ref.rs:19:5
+ |
+18 | p = &*b; //~ ERROR `b` does not live long enough
+ | - borrow occurs here
+19 | }
+ | ^ `b` dropped here while still borrowed
+20 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2016 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.
+
+// Test range syntax - borrow errors.
+
+pub fn main() {
+ let r = {
+ let a = 42;
+ let b = 42;
+ &a..&b
+ //~^ ERROR `a` does not live long enough
+ //~^^ ERROR `b` does not live long enough
+ };
+}
--- /dev/null
+error: `a` does not live long enough
+ --> $DIR/range-2.rs:20:5
+ |
+17 | &a..&b
+ | - borrow occurs here
+...
+20 | };
+ | ^ `a` dropped here while still borrowed
+21 | }
+ | - borrowed value needs to live until here
+
+error: `b` does not live long enough
+ --> $DIR/range-2.rs:20:5
+ |
+17 | &a..&b
+ | - borrow occurs here
+...
+20 | };
+ | ^ `b` dropped here while still borrowed
+21 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to 2 previous errors
+
--- /dev/null
+// Copyright 2014 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.
+
+use std::ops::FnMut;
+
+fn main() {
+ let mut f;
+ {
+ let c = 1;
+ let c_ref = &c; //~ ERROR `c` does not live long enough
+ f = move |a: isize, b: isize| { a + b + *c_ref };
+ }
+}
--- /dev/null
+error: `c` does not live long enough
+ --> $DIR/regionck-unboxed-closure-lifetimes.rs:19:5
+ |
+17 | let c_ref = &c; //~ ERROR `c` does not live long enough
+ | - borrow occurs here
+18 | f = move |a: isize, b: isize| { a + b + *c_ref };
+19 | }
+ | ^ `c` dropped here while still borrowed
+20 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2014 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.
+
+#![feature(box_syntax)]
+
+// Test for what happens when a type parameter `A` is closed over into
+// an object. This should yield errors unless `A` (and the object)
+// both have suitable bounds.
+
+trait Foo { fn get(&self); }
+
+impl<A> Foo for A {
+ fn get(&self) { }
+}
+
+fn repeater3<'a,A:'a>(v: A) -> Box<Foo+'a> {
+ box v as Box<Foo+'a>
+}
+
+fn main() {
+ // Error results because the type of is inferred to be
+ // ~Repeat<&'blk isize> where blk is the lifetime of the block below.
+
+ let _ = {
+ let tmp0 = 3;
+ let tmp1 = &tmp0; //~ ERROR `tmp0` does not live long enough
+ repeater3(tmp1)
+ };
+}
--- /dev/null
+error: `tmp0` does not live long enough
+ --> $DIR/regions-close-over-type-parameter-2.rs:35:5
+ |
+33 | let tmp1 = &tmp0; //~ ERROR `tmp0` does not live long enough
+ | ---- borrow occurs here
+34 | repeater3(tmp1)
+35 | };
+ | ^- borrowed value needs to live until here
+ | |
+ | `tmp0` dropped here while still borrowed
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2012 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.
+
+fn main() {
+ let x = 3;
+
+ // Here, the variable `p` gets inferred to a type with a lifetime
+ // of the loop body. The regionck then determines that this type
+ // is invalid.
+ let mut p = &x;
+
+ loop {
+ let x = 1 + *p;
+ p = &x; //~ ERROR `x` does not live long enough
+ }
+}
--- /dev/null
+error: `x` does not live long enough
+ --> $DIR/regions-escape-loop-via-variable.rs:22:5
+ |
+21 | p = &x; //~ ERROR `x` does not live long enough
+ | - borrow occurs here
+22 | }
+ | ^ `x` dropped here while still borrowed
+23 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2012 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.
+
+// The type of `y` ends up getting inferred to the type of the block.
+fn broken() {
+ let mut x = 3;
+ let mut _y = vec![&mut x];
+ //~^ NOTE borrow of `x` occurs here
+ //~| NOTE borrow of `x` occurs here
+ //~| NOTE borrow of `x` occurs here
+ while x < 10 { //~ ERROR cannot use `x` because it was mutably borrowed
+ //~^ NOTE use of borrowed `x`
+ let mut z = x; //~ ERROR cannot use `x` because it was mutably borrowed
+ //~^ NOTE use of borrowed `x`
+ _y.push(&mut z); //~ ERROR `z` does not live long enough
+ //~^ NOTE does not live long enough
+ x += 1; //~ ERROR cannot assign
+ //~^ NOTE assignment to borrowed `x` occurs here
+ }
+ //~^ NOTE borrowed value only lives until here
+}
+//~^ NOTE borrowed value needs to live until here
+
+fn main() { }
--- /dev/null
+error: `z` does not live long enough
+ --> $DIR/regions-escape-loop-via-vec.rs:26:5
+ |
+22 | _y.push(&mut z); //~ ERROR `z` does not live long enough
+ | - borrow occurs here
+...
+26 | }
+ | ^ `z` dropped here while still borrowed
+27 | //~^ NOTE borrowed value only lives until here
+28 | }
+ | - borrowed value needs to live until here
+
+error[E0503]: cannot use `x` because it was mutably borrowed
+ --> $DIR/regions-escape-loop-via-vec.rs:18:11
+ |
+14 | let mut _y = vec![&mut x];
+ | - borrow of `x` occurs here
+...
+18 | while x < 10 { //~ ERROR cannot use `x` because it was mutably borrowed
+ | ^ use of borrowed `x`
+
+error[E0503]: cannot use `x` because it was mutably borrowed
+ --> $DIR/regions-escape-loop-via-vec.rs:20:13
+ |
+14 | let mut _y = vec![&mut x];
+ | - borrow of `x` occurs here
+...
+20 | let mut z = x; //~ ERROR cannot use `x` because it was mutably borrowed
+ | ^^^^^ use of borrowed `x`
+
+error[E0506]: cannot assign to `x` because it is borrowed
+ --> $DIR/regions-escape-loop-via-vec.rs:24:9
+ |
+14 | let mut _y = vec![&mut x];
+ | - borrow of `x` occurs here
+...
+24 | x += 1; //~ ERROR cannot assign
+ | ^^^^^^ assignment to borrowed `x` occurs here
+
+error: aborting due to 4 previous errors
+
--- /dev/null
+// Copyright 2012 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.
+
+
+fn borrow<T>(x: &T) -> &T {x}
+
+fn foo<C, M>(mut cond: C, mut make_box: M) where
+ C: FnMut() -> bool,
+ M: FnMut() -> Box<isize>,
+{
+ let mut y: &isize;
+ loop {
+ let x = make_box();
+
+ // Here we complain because the resulting region
+ // of this borrow is the fn body as a whole.
+ y = borrow(&*x); //~ ERROR `*x` does not live long enough
+
+ assert_eq!(*x, *y);
+ if cond() { break; }
+ }
+ assert!(*y != 0);
+}
+
+fn main() {}
--- /dev/null
+error: `*x` does not live long enough
+ --> $DIR/regions-infer-borrow-scope-within-loop.rs:28:5
+ |
+24 | y = borrow(&*x); //~ ERROR `*x` does not live long enough
+ | -- borrow occurs here
+...
+28 | }
+ | ^ `*x` dropped here while still borrowed
+29 | assert!(*y != 0);
+30 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2014 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.
+
+struct Guard<'a> {
+ f: Box<Fn() + Send + 'a>,
+}
+
+fn scoped<'a, F: Fn() + Send + 'a>(f: F) -> Guard<'a> {
+ Guard { f: Box::new(f) }
+}
+
+impl<'a> Guard<'a> {
+ fn join(self) {}
+}
+
+fn main() {
+ let bad = {
+ let x = 1;
+ let y = &x; //~ ERROR `x` does not live long enough
+
+ scoped(|| {
+ let _z = y;
+ //~^ ERROR `y` does not live long enough
+ })
+ };
+
+ bad.join();
+}
--- /dev/null
+error: `x` does not live long enough
+ --> $DIR/send-is-not-static-ensures-scoping.rs:32:5
+ |
+26 | let y = &x; //~ ERROR `x` does not live long enough
+ | - borrow occurs here
+...
+32 | };
+ | ^ `x` dropped here while still borrowed
+...
+35 | }
+ | - borrowed value needs to live until here
+
+error: `y` does not live long enough
+ --> $DIR/send-is-not-static-ensures-scoping.rs:29:22
+ |
+28 | scoped(|| {
+ | -- capture occurs here
+29 | let _z = y;
+ | ^ does not live long enough
+...
+32 | };
+ | - borrowed value only lives until here
+...
+35 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to 2 previous errors
+
--- /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.
+
+// basic tests to see that certain "obvious" errors are caught by
+// these types no longer requiring `'static` (RFC 458)
+
+#![allow(dead_code)]
+
+use std::sync::{Mutex, RwLock, mpsc};
+
+fn mutex() {
+ let lock = {
+ let x = 1;
+ Mutex::new(&x) //~ ERROR does not live long enough
+ };
+
+ let _dangling = *lock.lock().unwrap();
+}
+
+fn rwlock() {
+ let lock = {
+ let x = 1;
+ RwLock::new(&x) //~ ERROR does not live long enough
+ };
+ let _dangling = *lock.read().unwrap();
+}
+
+fn channel() {
+ let (_tx, rx) = {
+ let x = 1;
+ let (tx, rx) = mpsc::channel();
+ let _ = tx.send(&x); //~ ERROR does not live long enough
+ (tx, rx)
+ };
+
+ let _dangling = rx.recv();
+}
+
+fn main() {}
--- /dev/null
+error: `x` does not live long enough
+ --> $DIR/send-is-not-static-std-sync-2.rs:22:5
+ |
+21 | Mutex::new(&x) //~ ERROR does not live long enough
+ | - borrow occurs here
+22 | };
+ | ^ `x` dropped here while still borrowed
+...
+25 | }
+ | - borrowed value needs to live until here
+
+error: `x` does not live long enough
+ --> $DIR/send-is-not-static-std-sync-2.rs:31:5
+ |
+30 | RwLock::new(&x) //~ ERROR does not live long enough
+ | - borrow occurs here
+31 | };
+ | ^ `x` dropped here while still borrowed
+32 | let _dangling = *lock.read().unwrap();
+33 | }
+ | - borrowed value needs to live until here
+
+error: `x` does not live long enough
+ --> $DIR/send-is-not-static-std-sync-2.rs:41:5
+ |
+39 | let _ = tx.send(&x); //~ ERROR does not live long enough
+ | - borrow occurs here
+40 | (tx, rx)
+41 | };
+ | ^ `x` dropped here while still borrowed
+...
+44 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to 3 previous errors
+
--- /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.
+
+// basic tests to see that certain "obvious" errors are caught by
+// these types no longer requiring `'static` (RFC 458)
+
+#![allow(dead_code)]
+
+use std::sync::{Mutex, RwLock, mpsc};
+
+fn mutex() {
+ let x = 1;
+ let y = Box::new(1);
+ let lock = Mutex::new(&x);
+ *lock.lock().unwrap() = &*y;
+ drop(y); //~ ERROR cannot move out
+ {
+ let z = 2;
+ *lock.lock().unwrap() = &z; //~ ERROR does not live long enough
+ }
+}
+
+fn rwlock() {
+ let x = 1;
+ let y = Box::new(1);
+ let lock = RwLock::new(&x);
+ *lock.write().unwrap() = &*y;
+ drop(y); //~ ERROR cannot move out
+ {
+ let z = 2;
+ *lock.write().unwrap() = &z; //~ ERROR does not live long enough
+ }
+}
+
+fn channel() {
+ let x = 1;
+ let y = Box::new(1);
+ let (tx, rx) = mpsc::channel();
+
+ tx.send(&x).unwrap();
+ tx.send(&*y);
+ drop(y); //~ ERROR cannot move out
+ {
+ let z = 2;
+ tx.send(&z).unwrap(); //~ ERROR does not live long enough
+ }
+}
+
+fn main() {}
--- /dev/null
+error: `z` does not live long enough
+ --> $DIR/send-is-not-static-std-sync.rs:27:5
+ |
+26 | *lock.lock().unwrap() = &z; //~ ERROR does not live long enough
+ | - borrow occurs here
+27 | }
+ | ^ `z` dropped here while still borrowed
+28 | }
+ | - borrowed value needs to live until here
+
+error[E0505]: cannot move out of `y` because it is borrowed
+ --> $DIR/send-is-not-static-std-sync.rs:23:10
+ |
+22 | *lock.lock().unwrap() = &*y;
+ | -- borrow of `*y` occurs here
+23 | drop(y); //~ ERROR cannot move out
+ | ^ move out of `y` occurs here
+
+error: `z` does not live long enough
+ --> $DIR/send-is-not-static-std-sync.rs:39:5
+ |
+38 | *lock.write().unwrap() = &z; //~ ERROR does not live long enough
+ | - borrow occurs here
+39 | }
+ | ^ `z` dropped here while still borrowed
+40 | }
+ | - borrowed value needs to live until here
+
+error[E0505]: cannot move out of `y` because it is borrowed
+ --> $DIR/send-is-not-static-std-sync.rs:35:10
+ |
+34 | *lock.write().unwrap() = &*y;
+ | -- borrow of `*y` occurs here
+35 | drop(y); //~ ERROR cannot move out
+ | ^ move out of `y` occurs here
+
+error: `z` does not live long enough
+ --> $DIR/send-is-not-static-std-sync.rs:53:5
+ |
+52 | tx.send(&z).unwrap(); //~ ERROR does not live long enough
+ | - borrow occurs here
+53 | }
+ | ^ `z` dropped here while still borrowed
+54 | }
+ | - borrowed value needs to live until here
+
+error[E0505]: cannot move out of `y` because it is borrowed
+ --> $DIR/send-is-not-static-std-sync.rs:49:10
+ |
+48 | tx.send(&*y);
+ | -- borrow of `*y` occurs here
+49 | drop(y); //~ ERROR cannot move out
+ | ^ move out of `y` occurs here
+
+error: aborting due to 6 previous errors
+
--- /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.
+
+// A method's receiver must be well-formed, even if it has late-bound regions.
+// Because of this, a method's substs being well-formed does not imply that
+// the method's implied bounds are met.
+
+struct Foo<'b>(Option<&'b ()>);
+
+trait Bar<'b> {
+ fn xmute<'a>(&'a self, u: &'b u32) -> &'a u32;
+}
+
+impl<'b> Bar<'b> for Foo<'b> {
+ fn xmute<'a>(&'a self, u: &'b u32) -> &'a u32 { u }
+}
+
+fn main() {
+ let f = Foo(None);
+ let f2 = f;
+ let dangling = {
+ let pointer = Box::new(42);
+ f2.xmute(&pointer) //~ ERROR `pointer` does not live long enough
+ };
+ println!("{}", dangling);
+}
--- /dev/null
+error: `pointer` does not live long enough
+ --> $DIR/wf-method-late-bound-regions.rs:31:5
+ |
+30 | f2.xmute(&pointer) //~ ERROR `pointer` does not live long enough
+ | ------- borrow occurs here
+31 | };
+ | ^ `pointer` dropped here while still borrowed
+32 | println!("{}", dangling);
+33 | }
+ | - borrowed value needs to live until here
+
+error: aborting due to previous error
+