// Check that we properly record borrows when we are doing an // overloaded, autoderef of a value obtained via an overloaded index // operator. The accounting of the all the implicit things going on // here is rather subtle. Issue #20232. use std::ops::{Deref, Index}; struct MyVec { x: T } impl Index for MyVec { type Output = T; fn index(&self, _: usize) -> &T { &self.x } } struct MyPtr { x: T } impl Deref for MyPtr { type Target = T; fn deref(&self) -> &T { &self.x } } struct Foo { f: usize } fn main() { let mut v = MyVec { x: MyPtr { x: Foo { f: 22 } } }; let i = &v[0].f; v = MyVec { x: MyPtr { x: Foo { f: 23 } } }; //~^ ERROR cannot assign to `v` because it is borrowed read(*i); } fn read(_: usize) { }