| //@ 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 = &a; //~ ERROR mismatched types |
| |
| let a = Emm(Foo(Bar(0))); |
| let _: *const u8 = &mut a; //~ ERROR mismatched types |
| |
| let mut a = Emm(Foo(Bar(0))); |
| let _: *mut u8 = &mut a; //~ ERROR mismatched types |
| } |