| //@ 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 | |
| } |