use std::ops::{Deref, DerefMut}; trait Happy {} struct LDM; impl Happy for &mut LDM {} struct Foo(LDM); struct Bar(Foo); struct Baz(Bar); impl Deref for Foo { type Target = LDM; fn deref(&self) -> &Self::Target { &self.0 } } impl Deref for Bar { type Target = Foo; fn deref(&self) -> &Self::Target { &self.0 } } impl Deref for Baz { type Target = Bar; fn deref(&self) -> &Self::Target { &self.0 } } impl DerefMut for Foo { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } impl DerefMut for Bar { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } impl DerefMut for Baz { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } fn foo(_: T) where T: Happy {} fn main() { // Currently the compiler doesn't try to suggest dereferences for situations // where DerefMut involves. So this test is meant to ensure compiler doesn't // generate incorrect help message. let mut baz = Baz(Bar(Foo(LDM))); foo(&mut baz); //~^ ERROR the trait bound `&mut Baz: Happy` is not satisfied }