| //@ edition:2021 |
| //@ run-pass |
| |
| // Test that we can mutate a place through a mut-borrow |
| // that is captured by the closure |
| |
| // Check that we can mutate when one deref is required |
| fn mut_ref_1() { |
| let mut x = String::new(); |
| let rx = &mut x; |
| |
| let mut c = || { |
| *rx = String::new(); |
| }; |
| |
| c(); |
| } |
| |
| // Similar example as mut_ref_1, we don't deref the imm-borrow here, |
| // and so we are allowed to mutate. |
| fn mut_ref_2() { |
| let x = String::new(); |
| let y = String::new(); |
| let mut ref_x = &x; |
| let m_ref_x = &mut ref_x; |
| |
| let mut c = || { |
| *m_ref_x = &y; |
| }; |
| |
| c(); |
| } |
| |
| // Check that we can mutate when multiple derefs of mut-borrows are required to reach |
| // the target place. |
| // It works because all derefs are mutable, if either of them was an immutable |
| // borrow, then we would not be able to deref. |
| fn mut_mut_ref() { |
| let mut x = String::new(); |
| let mut mref_x = &mut x; |
| let m_mref_x = &mut mref_x; |
| |
| let mut c = || { |
| **m_mref_x = String::new(); |
| }; |
| |
| c(); |
| } |
| |
| fn main() { |
| mut_ref_1(); |
| mut_ref_2(); |
| mut_mut_ref(); |
| } |