use std::ops::Deref; use std::rc::Rc; struct Value(T); pub trait Wrap { fn wrap() -> Self; } impl Wrap R> for Value R> { fn wrap() -> Self { todo!() } } impl Wrap for Value R>> { fn wrap() -> Self { todo!() } } impl Deref for Value> { type Target = F; fn deref(&self) -> &Self::Target { &*self.0 } } fn main() { let var_fn = Value::wrap(); //~^ ERROR type annotations needed for `Value>` // The combination of `Value: Wrap` obligation plus the autoderef steps // (caused by the `Deref` impl above) actually means that the self type // of the method fn below is constrained to be `Value ?2>>`. // However, that's only known to us on the error path -- we still need // to emit an ambiguity error, though. let _ = var_fn.clone(); }