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