// run-pass #![feature(trait_upcasting)] #![allow(incomplete_features)] use std::rc::Rc; use std::sync::Arc; trait Foo: PartialEq + std::fmt::Debug + Send + Sync { fn a(&self) -> i32 { 10 } fn z(&self) -> i32 { 11 } fn y(&self) -> i32 { 12 } } trait Bar: Foo { fn b(&self) -> i32 { 20 } fn w(&self) -> i32 { 21 } } trait Baz: Bar { fn c(&self) -> i32 { 30 } } impl Foo for i32 { fn a(&self) -> i32 { 100 } } impl Bar for i32 { fn b(&self) -> i32 { 200 } } impl Baz for i32 { fn c(&self) -> i32 { 300 } } fn test_box() { let v = Box::new(1); let baz: Box = v.clone(); assert_eq!(*baz, 1); assert_eq!(baz.a(), 100); assert_eq!(baz.b(), 200); assert_eq!(baz.c(), 300); assert_eq!(baz.z(), 11); assert_eq!(baz.y(), 12); assert_eq!(baz.w(), 21); let baz: Box = v.clone(); let bar: Box = baz; assert_eq!(*bar, 1); assert_eq!(bar.a(), 100); assert_eq!(bar.b(), 200); assert_eq!(bar.z(), 11); assert_eq!(bar.y(), 12); assert_eq!(bar.w(), 21); let baz: Box = v.clone(); let foo: Box = baz; assert_eq!(*foo, 1); assert_eq!(foo.a(), 100); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); let baz: Box = v.clone(); let bar: Box = baz; let foo: Box = bar; assert_eq!(*foo, 1); assert_eq!(foo.a(), 100); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); } fn test_rc() { let v = Rc::new(1); let baz: Rc = v.clone(); assert_eq!(*baz, 1); assert_eq!(baz.a(), 100); assert_eq!(baz.b(), 200); assert_eq!(baz.c(), 300); assert_eq!(baz.z(), 11); assert_eq!(baz.y(), 12); assert_eq!(baz.w(), 21); let baz: Rc = v.clone(); let bar: Rc = baz; assert_eq!(*bar, 1); assert_eq!(bar.a(), 100); assert_eq!(bar.b(), 200); assert_eq!(bar.z(), 11); assert_eq!(bar.y(), 12); assert_eq!(bar.w(), 21); let baz: Rc = v.clone(); let foo: Rc = baz; assert_eq!(*foo, 1); assert_eq!(foo.a(), 100); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); let baz: Rc = v.clone(); let bar: Rc = baz; let foo: Rc = bar; assert_eq!(*foo, 1); assert_eq!(foo.a(), 100); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); } fn test_arc() { let v = Arc::new(1); let baz: Arc = v.clone(); assert_eq!(*baz, 1); assert_eq!(baz.a(), 100); assert_eq!(baz.b(), 200); assert_eq!(baz.c(), 300); assert_eq!(baz.z(), 11); assert_eq!(baz.y(), 12); assert_eq!(baz.w(), 21); let baz: Arc = v.clone(); let bar: Arc = baz; assert_eq!(*bar, 1); assert_eq!(bar.a(), 100); assert_eq!(bar.b(), 200); assert_eq!(bar.z(), 11); assert_eq!(bar.y(), 12); assert_eq!(bar.w(), 21); let baz: Arc = v.clone(); let foo: Arc = baz; assert_eq!(*foo, 1); assert_eq!(foo.a(), 100); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); let baz: Arc = v.clone(); let bar: Arc = baz; let foo: Arc = bar; assert_eq!(*foo, 1); assert_eq!(foo.a(), 100); assert_eq!(foo.z(), 11); assert_eq!(foo.y(), 12); } fn main() { test_box(); test_rc(); test_arc(); }