1 #![feature(generic_associated_types)] 2 3 // check-pass 4 5 use std::rc::Rc; 6 use std::sync::Arc; 7 use std::ops::Deref; 8 9 trait PointerFamily { 10 type Pointer<T>: Deref<Target = T>; new<T>(value: T) -> Self::Pointer<T>11 fn new<T>(value: T) -> Self::Pointer<T>; 12 } 13 14 struct ArcFamily; 15 16 impl PointerFamily for ArcFamily { 17 type Pointer<T> = Arc<T>; new<T>(value: T) -> Self::Pointer<T>18 fn new<T>(value: T) -> Self::Pointer<T> { 19 Arc::new(value) 20 } 21 } 22 23 struct RcFamily; 24 25 impl PointerFamily for RcFamily { 26 type Pointer<T> = Rc<T>; new<T>(value: T) -> Self::Pointer<T>27 fn new<T>(value: T) -> Self::Pointer<T> { 28 Rc::new(value) 29 } 30 } 31 32 struct Foo<P: PointerFamily> { 33 bar: P::Pointer<String>, 34 } 35 main()36fn main() {} 37