2015-02-20 00:33:11 -06:00
|
|
|
// 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;
|
2017-11-20 06:13:27 -06:00
|
|
|
*lock.lock().unwrap() = &z;
|
2017-12-13 19:27:23 -06:00
|
|
|
}
|
|
|
|
//~^^ ERROR `z` does not live long enough
|
2018-05-25 05:36:58 -05:00
|
|
|
lock.use_ref(); // (Mutex is #[may_dangle] so its dtor does not use `z` => needs explicit use)
|
2015-02-20 00:33:11 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2017-11-20 06:13:27 -06:00
|
|
|
*lock.write().unwrap() = &z;
|
2017-12-13 19:27:23 -06:00
|
|
|
}
|
|
|
|
//~^^ ERROR `z` does not live long enough
|
2018-05-25 05:36:58 -05:00
|
|
|
lock.use_ref(); // (RwLock is #[may_dangle] so its dtor does not use `z` => needs explicit use)
|
2015-02-20 00:33:11 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2017-11-20 06:13:27 -06:00
|
|
|
tx.send(&z).unwrap();
|
2017-12-13 19:27:23 -06:00
|
|
|
}
|
|
|
|
//~^^ ERROR `z` does not live long enough
|
2018-05-25 05:36:58 -05:00
|
|
|
// (channels lack #[may_dangle], thus their dtors are implicit uses of `z`)
|
2015-02-20 00:33:11 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|
2018-05-25 05:36:58 -05:00
|
|
|
|
|
|
|
trait Fake { fn use_mut(&mut self) { } fn use_ref(&self) { } }
|
|
|
|
impl<T> Fake for T { }
|