|  | //@ run-pass | 
|  |  | 
|  | #![feature(specialization)] //~ WARN the feature `specialization` is incomplete | 
|  |  | 
|  | // Test that default methods are cascaded correctly | 
|  |  | 
|  | // First, test only use of explicit `default` items: | 
|  |  | 
|  | trait Foo { | 
|  | fn foo(&self) -> bool; | 
|  | } | 
|  |  | 
|  | // Specialization tree for Foo: | 
|  | // | 
|  | //        T | 
|  | //       / \ | 
|  | //    i32   i64 | 
|  |  | 
|  | impl<T> Foo for T { | 
|  | default fn foo(&self) -> bool { false } | 
|  | } | 
|  |  | 
|  | impl Foo for i32 {} | 
|  |  | 
|  | impl Foo for i64 { | 
|  | fn foo(&self) -> bool { true } | 
|  | } | 
|  |  | 
|  | fn test_foo() { | 
|  | assert!(!0i8.foo()); | 
|  | assert!(!0i32.foo()); | 
|  | assert!(0i64.foo()); | 
|  | } | 
|  |  | 
|  | // Next, test mixture of explicit `default` and provided methods: | 
|  |  | 
|  | trait Bar { | 
|  | fn bar(&self) -> i32 { 0 } | 
|  | } | 
|  |  | 
|  | // Specialization tree for Bar. | 
|  | // Uses of $ designate that method is provided | 
|  | // | 
|  | //           $Bar   (the trait) | 
|  | //             | | 
|  | //             T | 
|  | //            /|\ | 
|  | //           / | \ | 
|  | //          /  |  \ | 
|  | //         /   |   \ | 
|  | //        /    |    \ | 
|  | //       /     |     \ | 
|  | //     $i32   &str  $Vec<T> | 
|  | //                    /\ | 
|  | //                   /  \ | 
|  | //            Vec<i32>  $Vec<i64> | 
|  |  | 
|  | impl<T> Bar for T { | 
|  | default fn bar(&self) -> i32 { 0 } | 
|  | } | 
|  |  | 
|  | impl Bar for i32 { | 
|  | fn bar(&self) -> i32 { 1 } | 
|  | } | 
|  | impl<'a> Bar for &'a str {} | 
|  |  | 
|  | impl<T> Bar for Vec<T> { | 
|  | default fn bar(&self) -> i32 { 2 } | 
|  | } | 
|  | impl Bar for Vec<i32> {} | 
|  | impl Bar for Vec<i64> { | 
|  | fn bar(&self) -> i32 { 3 } | 
|  | } | 
|  |  | 
|  | fn test_bar() { | 
|  | assert!(0u8.bar() == 0); | 
|  | assert!(0i32.bar() == 1); | 
|  | assert!("hello".bar() == 0); | 
|  | assert!(vec![()].bar() == 2); | 
|  | assert!(vec![0i32].bar() == 2); | 
|  | assert!(vec![0i64].bar() == 3); | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | test_foo(); | 
|  | test_bar(); | 
|  | } |