//@ run-rustfix use std::ops::Deref; use std::ops::DerefMut; struct Bar(u8); struct Foo(Bar); struct Emm(Foo); impl Deref for Bar{ type Target = u8; fn deref(&self) -> &Self::Target { &self.0 } } impl Deref for Foo { type Target = Bar; fn deref(&self) -> &Self::Target { &self.0 } } impl Deref for Emm { type Target = Foo; fn deref(&self) -> &Self::Target { &self.0 } } impl DerefMut for Bar{ fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } impl DerefMut for Foo { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } impl DerefMut for Emm { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } fn main() { // Suggest dereference with arbitrary mutability let a = Emm(Foo(Bar(0))); let _: *const u8 = &***a; //~ ERROR mismatched types let mut a = Emm(Foo(Bar(0))); let _: *mut u8 = &mut ***a; //~ ERROR mismatched types let a = Emm(Foo(Bar(0))); let _: *const u8 = &***a; //~ ERROR mismatched types let mut a = Emm(Foo(Bar(0))); let _: *mut u8 = &mut ***a; //~ ERROR mismatched types }