]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/yield-while-ref-reborrowed.rs
Rollup merge of #44287 - Eh2406:master, r=aturon
[rust.git] / src / test / ui / generator / yield-while-ref-reborrowed.rs
1 // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 #![feature(generators, generator_trait)]
12
13 use std::ops::{GeneratorState, Generator};
14 use std::cell::Cell;
15
16 fn reborrow_shared_ref(x: &i32) {
17     // This is OK -- we have a borrow live over the yield, but it's of
18     // data that outlives the generator.
19     let mut b = move || {
20         let a = &*x;
21         yield();
22         println!("{}", a);
23     };
24     b.resume();
25 }
26
27 fn reborrow_mutable_ref(x: &mut i32) {
28     // This is OK -- we have a borrow live over the yield, but it's of
29     // data that outlives the generator.
30     let mut b = move || {
31         let a = &mut *x;
32         yield();
33         println!("{}", a);
34     };
35     b.resume();
36 }
37
38 fn reborrow_mutable_ref_2(x: &mut i32) {
39     // ...but not OK to go on using `x`.
40     let mut b = || {
41         let a = &mut *x;
42         yield();
43         println!("{}", a);
44     };
45     println!("{}", x); //~ ERROR
46     b.resume();
47 }
48
49 fn main() { }