]> git.lizzy.rs Git - rust.git/blob - tests/run-pass/stacked-borrows/refcell.rs
dddc7089d02d0d8958660fef693fa5976382828d
[rust.git] / tests / run-pass / stacked-borrows / refcell.rs
1 use std::cell::RefCell;
2
3 fn main() {
4     aliasing_mut_and_shr();
5     aliasing_frz_and_shr();
6 }
7
8 fn aliasing_mut_and_shr() {
9     fn inner(rc: &RefCell<i32>, aliasing: &mut i32) {
10         *aliasing += 4;
11         let _escape_to_raw = rc as *const _;
12         *aliasing += 4;
13         let _shr = &*rc;
14         *aliasing += 4;
15         // also turning this into a frozen ref now must work
16         let aliasing = &*aliasing;
17         let _val = *aliasing;
18         let _escape_to_raw = rc as *const _; // this must NOT unfreeze
19         let _val = *aliasing;
20         let _shr = &*rc; // this must NOT unfreeze
21         let _val = *aliasing;
22     }
23
24     let rc = RefCell::new(23);
25     let mut bmut = rc.borrow_mut();
26     inner(&rc, &mut *bmut);
27     drop(bmut);
28     assert_eq!(*rc.borrow(), 23+12);
29 }
30
31 fn aliasing_frz_and_shr() {
32     fn inner(rc: &RefCell<i32>, aliasing: &i32) {
33         let _val = *aliasing;
34         let _escape_to_raw = rc as *const _; // this must NOT unfreeze
35         let _val = *aliasing;
36         let _shr = &*rc; // this must NOT unfreeze
37         let _val = *aliasing;
38     }
39
40     let rc = RefCell::new(23);
41     let bshr = rc.borrow();
42     inner(&rc, &*bshr);
43     assert_eq!(*rc.borrow(), 23);
44 }