// run-pass // Check that a trait is still object-safe (and usable) if it has // methods that return `Self` so long as they require `Self : Sized`. trait Counter { fn new() -> Self where Self : Sized; fn tick(&mut self) -> u32; } struct CCounter { c: u32 } impl Counter for CCounter { fn new() -> CCounter { CCounter { c: 0 } } fn tick(&mut self) -> u32 { self.c += 1; self.c } } fn preticked() -> C { let mut c: C = Counter::new(); tick(&mut c); c } fn tick(c: &mut dyn Counter) { tick_generic(c); } fn tick_generic(c: &mut C) { c.tick(); c.tick(); } fn main() { let mut c = preticked::(); tick(&mut c); assert_eq!(c.tick(), 5); }