| //@ edition:2015..2021 | |
| // check that dropck does the right thing with misc. Ty variants | |
| use std::fmt; | |
| struct NoisyDrop<T: fmt::Debug>(T); | |
| impl<T: fmt::Debug> Drop for NoisyDrop<T> { | |
| fn drop(&mut self) { | |
| let _ = vec!["0wned"]; | |
| println!("dropping {:?}", self.0) | |
| } | |
| } | |
| trait Associator { | |
| type As; | |
| } | |
| impl<T: fmt::Debug> Associator for T { | |
| type As = NoisyDrop<T>; | |
| } | |
| struct Wrap<A: Associator>(<A as Associator>::As); | |
| fn projection() { | |
| let (_w, bomb); | |
| bomb = vec![""]; | |
| _w = Wrap::<&[&str]>(NoisyDrop(&bomb)); | |
| } | |
| //~^^ ERROR `bomb` does not live long enough | |
| fn closure() { | |
| let (_w,v); | |
| v = vec![""]; | |
| _w = { | |
| let u = NoisyDrop(&v); | |
| //~^ ERROR `v` does not live long enough | |
| move || u.0.len() | |
| }; | |
| } | |
| fn main() { closure(); projection() } |