3 #![feature(trait_upcasting)]
5 trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
53 // Note: upcast lifetime means a shorter lifetime.
54 fn upcast_baz<'a: 'b, 'b, T>(v: Box<dyn Baz + 'a>, _l: &'b T) -> Box<dyn Baz + 'b> {
57 fn upcast_bar<'a: 'b, 'b, T>(v: Box<dyn Bar + 'a>, _l: &'b T) -> Box<dyn Bar + 'b> {
60 fn upcast_foo<'a: 'b, 'b, T>(v: Box<dyn Foo + 'a>, _l: &'b T) -> Box<dyn Foo + 'b> {
66 let l = &(); // dummy lifetime (shorter than `baz`)
68 let baz: Box<dyn Baz> = v.clone();
69 let u = upcast_baz(baz, &l);
71 assert_eq!(u.a(), 100);
72 assert_eq!(u.b(), 200);
73 assert_eq!(u.c(), 300);
75 let baz: Box<dyn Baz> = v.clone();
76 let bar: Box<dyn Bar> = baz;
77 let u = upcast_bar(bar, &l);
79 assert_eq!(u.a(), 100);
80 assert_eq!(u.b(), 200);
82 let baz: Box<dyn Baz> = v.clone();
83 let foo: Box<dyn Foo> = baz;
84 let u = upcast_foo(foo, &l);
86 assert_eq!(u.a(), 100);
88 let baz: Box<dyn Baz> = v.clone();
89 let bar: Box<dyn Bar> = baz;
90 let foo: Box<dyn Foo> = bar;
91 let u = upcast_foo(foo, &l);
93 assert_eq!(u.a(), 100);