pub struct Foo { x: u32 } pub struct Bar(u32); pub enum Baz { X(u32) } union U { a: u8, b: u64, } impl Foo { fn x(&mut self) -> &mut u32 { &mut self.x } } impl Bar { fn x(&mut self) -> &mut u32 { &mut self.0 } } impl Baz { fn x(&mut self) -> &mut u32 { match *self { Baz::X(ref mut value) => value } } } fn main() { // Local and field from struct { let mut f = Foo { x: 22 }; let x = f.x(); f.x; //~ ERROR cannot use `f.x` because it was mutably borrowed drop(x); } // Local and field from tuple-struct { let mut g = Bar(22); let x = g.x(); g.0; //~ ERROR cannot use `g.0` because it was mutably borrowed drop(x); } // Local and field from tuple { let mut h = (22, 23); let x = &mut h.0; h.0; //~ ERROR cannot use `h.0` because it was mutably borrowed drop(x); } // Local and field from enum { let mut e = Baz::X(2); let x = e.x(); match e { Baz::X(value) => value //~ ERROR cannot use `e.0` because it was mutably borrowed }; drop(x); } // Local and field from union unsafe { let mut u = U { b: 0 }; let x = &mut u.a; u.a; //~ ERROR cannot use `u.a` because it was mutably borrowed drop(x); } // Deref and field from struct { let mut f = Box::new(Foo { x: 22 }); let x = f.x(); f.x; //~ ERROR cannot use `f.x` because it was mutably borrowed drop(x); } // Deref and field from tuple-struct { let mut g = Box::new(Bar(22)); let x = g.x(); g.0; //~ ERROR cannot use `g.0` because it was mutably borrowed drop(x); } // Deref and field from tuple { let mut h = Box::new((22, 23)); let x = &mut h.0; h.0; //~ ERROR cannot use `h.0` because it was mutably borrowed drop(x); } // Deref and field from enum { let mut e = Box::new(Baz::X(3)); let x = e.x(); match *e { Baz::X(value) => value //~^ ERROR cannot use `e.0` because it was mutably borrowed }; drop(x); } // Deref and field from union unsafe { let mut u = Box::new(U { b: 0 }); let x = &mut u.a; u.a; //~ ERROR cannot use `u.a` because it was mutably borrowed drop(x); } // Constant index { let mut v = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let x = &mut v; match v { &[x, _, .., _, _] => println!("{}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } match v { &[_, x, .., _, _] => println!("{}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } match v { &[_, _, .., x, _] => println!("{}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } match v { &[_, _, .., _, x] => println!("{}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } drop(x); } // Subslices { let mut v = &[1, 2, 3, 4, 5]; let x = &mut v; match v { &[x @ ..] => println!("{:?}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } match v { &[_, x @ ..] => println!("{:?}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } match v { &[x @ .., _] => println!("{:?}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } match v { &[_, x @ .., _] => println!("{:?}", x), //~^ ERROR cannot use `v[..]` because it was mutably borrowed _ => panic!("other case"), } drop(x); } // Downcasted field { enum E { A(X), B { x: X } } let mut e = E::A(3); let x = &mut e; match e { //~^ ERROR cannot use `e` because it was mutably borrowed E::A(ref ax) => //~^ ERROR cannot borrow `e.0` as immutable because it is also borrowed as mutable println!("e.ax: {:?}", ax), E::B { x: ref bx } => //~^ ERROR cannot borrow `e.x` as immutable because it is also borrowed as mutable println!("e.bx: {:?}", bx), } drop(x); } // Field in field { struct F { x: u32, y: u32 }; struct S { x: F, y: (u32, u32), }; let mut s = S { x: F { x: 1, y: 2}, y: (999, 998) }; let x = &mut s; match s { S { y: (ref y0, _), .. } => //~^ ERROR cannot borrow `s.y.0` as immutable because it is also borrowed as mutable println!("y0: {:?}", y0), _ => panic!("other case"), } match s { S { x: F { y: ref x0, .. }, .. } => //~^ ERROR cannot borrow `s.x.y` as immutable because it is also borrowed as mutable println!("x0: {:?}", x0), _ => panic!("other case"), } drop(x); } // Field of ref { struct Block<'a> { current: &'a u8, unrelated: &'a u8, }; fn bump<'a>(mut block: &mut Block<'a>) { let x = &mut block; let p: &'a u8 = &*block.current; //~^ ERROR cannot borrow `*block.current` as immutable because it is also borrowed as mutable // See issue rust#38899 drop(x); } } // Field of ptr { struct Block2 { current: *const u8, unrelated: *const u8, } unsafe fn bump2(mut block: *mut Block2) { let x = &mut block; let p : *const u8 = &*(*block).current; //~^ ERROR cannot borrow `*block.current` as immutable because it is also borrowed as mutable // See issue rust#38899 drop(x); } } // Field of index { struct F {x: u32, y: u32}; let mut v = &[F{x: 1, y: 2}, F{x: 3, y: 4}]; let x = &mut v; v[0].y; //~^ ERROR cannot use `v[_].y` because it was mutably borrowed //~| ERROR cannot use `*v` because it was mutably borrowed drop(x); } // Field of constant index { struct F {x: u32, y: u32}; let mut v = &[F{x: 1, y: 2}, F{x: 3, y: 4}]; let x = &mut v; match v { &[_, F {x: ref xf, ..}] => println!("{}", xf), //~^ ERROR cannot borrow `v[..].x` as immutable because it is also borrowed as mutable _ => panic!("other case") } drop(x); } // Field from upvar { let mut x = 0; || { let y = &mut x; &mut x; //~ ERROR cannot borrow `x` as mutable more than once at a time *y = 1; }; } // Field from upvar nested { let mut x = 0; || { || { //~ ERROR captured variable cannot escape `FnMut` closure body let y = &mut x; &mut x; //~ ERROR cannot borrow `x` as mutable more than once at a time *y = 1; drop(y); } }; } { fn foo(x: Vec) { let c = || { drop(x); drop(x); //~ ERROR use of moved value: `x` }; c(); } } }