mirror of
https://github.com/rust-lang/rust
synced 2024-09-05 16:57:03 +00:00
36 lines
1 KiB
Rust
36 lines
1 KiB
Rust
// Tests correct kind-checking of the reason stack closures without the :Copy
|
|
// bound must be noncopyable. For details see
|
|
// https://smallcultfollowing.com/babysteps/blog/2013/04/30/the-case-of-the-recurring-closure/
|
|
|
|
struct R<'a> {
|
|
// This struct is needed to create the
|
|
// otherwise infinite type of a fn that
|
|
// accepts itself as argument:
|
|
c: Box<dyn FnMut(&mut R, bool) + 'a>
|
|
}
|
|
|
|
fn innocent_looking_victim() {
|
|
let mut x = Some("hello".to_string());
|
|
conspirator(|f, writer| {
|
|
if writer {
|
|
x = None;
|
|
} else {
|
|
match x {
|
|
Some(ref msg) => {
|
|
(f.c)(f, true);
|
|
//~^ ERROR: cannot borrow `*f` as mutable more than once at a time
|
|
println!("{}", msg);
|
|
},
|
|
None => panic!("oops"),
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
fn conspirator<F>(mut f: F) where F: FnMut(&mut R, bool) {
|
|
let mut r = R {c: Box::new(f)};
|
|
f(&mut r, false) //~ ERROR borrow of moved value
|
|
}
|
|
|
|
fn main() { innocent_looking_victim() }
|