#![allow(unreachable_code)] use std::marker::PhantomData; use std::ops::Deref; use std::sync::Arc; pub struct Guard { _phantom: PhantomData, } impl Deref for Guard { type Target = T; fn deref(&self) -> &T { unimplemented!() } } pub struct DirectDeref(T); impl Deref for DirectDeref> { type Target = T; fn deref(&self) -> &T { unimplemented!() } } pub trait Access { type Guard: Deref; fn load(&self) -> Self::Guard { unimplemented!() } } impl, P: Deref> Access for P { //~^ NOTE: required for `Arc>>` to implement `Access<_>` //~| NOTE unsatisfied trait bound introduced here type Guard = A::Guard; } impl Access for ArcSwapAny { //~^ NOTE: multiple `impl`s satisfying `ArcSwapAny>: Access<_>` found type Guard = Guard; } impl Access for ArcSwapAny> { type Guard = DirectDeref>; } pub struct ArcSwapAny { _phantom_arc: PhantomData, } pub fn foo() { let s: Arc>> = unimplemented!(); let guard: Guard> = s.load(); //~^ ERROR: type annotations needed //~| HELP: try using a fully qualified path to specify the expected types } fn main() {}