2015-07-23 17:38:42 -05:00
|
|
|
// 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));
|
|
|
|
}
|
2017-12-13 19:27:23 -06:00
|
|
|
//~^^ ERROR `bomb` does not live long enough
|
2015-07-23 17:38:42 -05:00
|
|
|
|
|
|
|
fn closure() {
|
|
|
|
let (_w,v);
|
|
|
|
v = vec![""];
|
|
|
|
_w = {
|
|
|
|
let u = NoisyDrop(&v);
|
2017-12-13 19:27:23 -06:00
|
|
|
//~^ ERROR `v` does not live long enough
|
2015-07-23 17:38:42 -05:00
|
|
|
move || u.0.len()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() { closure(); projection() }
|