]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/many_shr_bor.rs
Auto merge of #104915 - weihanglo:update-cargo, r=ehuss
[rust.git] / src / tools / miri / tests / pass / many_shr_bor.rs
1 // Make sure validation can handle many overlapping shared borrows for different parts of a data structure
2 use std::cell::RefCell;
3
4 #[allow(unused)]
5 struct Test {
6     a: u32,
7     b: u32,
8 }
9
10 fn test1() {
11     let t = &mut Test { a: 0, b: 0 };
12     {
13         let x;
14         {
15             let y = &t.a;
16             x = &t;
17             let _y = *y;
18         }
19         let _x = x.a;
20     }
21     t.b = 42;
22 }
23
24 fn test2(r: &mut RefCell<i32>) {
25     let x = &*r; // releasing write lock, first suspension recorded
26     let mut x_ref = x.borrow_mut();
27     let x_inner: &mut i32 = &mut *x_ref; // new inner write lock, with same lifetime as outer lock
28     let _x_inner_shr = &*x_inner; // releasing inner write lock, recording suspension
29     let _y = &*r; // second suspension for the outer write lock
30     let _x_inner_shr2 = &*x_inner; // 2nd suspension for inner write lock
31 }
32
33 fn main() {
34     test1();
35     test2(&mut RefCell::new(0));
36 }