|  | //@ run-pass | 
|  |  | 
|  | //@ aux-build:specialization_cross_crate.rs | 
|  |  | 
|  | #![feature(specialization)] //~ WARN the feature `specialization` is incomplete | 
|  |  | 
|  | extern crate specialization_cross_crate; | 
|  |  | 
|  | use specialization_cross_crate::*; | 
|  |  | 
|  | struct NotClone; | 
|  |  | 
|  | #[derive(Clone)] | 
|  | struct MarkedAndClone; | 
|  | impl MyMarker for MarkedAndClone {} | 
|  |  | 
|  | struct MyType<T>(#[allow(dead_code)] T); | 
|  | impl<T> Foo for MyType<T> { | 
|  | default fn foo(&self) -> &'static str { | 
|  | "generic MyType" | 
|  | } | 
|  | } | 
|  |  | 
|  | impl Foo for MyType<u8> { | 
|  | fn foo(&self) -> &'static str { | 
|  | "MyType<u8>" | 
|  | } | 
|  | } | 
|  |  | 
|  | struct MyOtherType; | 
|  | impl Foo for MyOtherType {} | 
|  |  | 
|  | fn  main() { | 
|  | assert!(NotClone.foo() == "generic"); | 
|  | assert!(0u8.foo() == "generic Clone"); | 
|  | assert!(vec![NotClone].foo() == "generic"); | 
|  | assert!(vec![0u8].foo() == "generic Vec"); | 
|  | assert!(vec![0i32].foo() == "Vec<i32>"); | 
|  | assert!(0i32.foo() == "i32"); | 
|  | assert!(String::new().foo() == "String"); | 
|  | assert!(((), 0).foo() == "generic pair"); | 
|  | assert!(((), ()).foo() == "generic uniform pair"); | 
|  | assert!((0u8, 0u32).foo() == "(u8, u32)"); | 
|  | assert!((0u8, 0u8).foo() == "(u8, u8)"); | 
|  | assert!(MarkedAndClone.foo() == "generic Clone + MyMarker"); | 
|  |  | 
|  | assert!(MyType(()).foo() == "generic MyType"); | 
|  | assert!(MyType(0u8).foo() == "MyType<u8>"); | 
|  | assert!(MyOtherType.foo() == "generic"); | 
|  | } |