// run-pass #![allow(unused_mut)] // Check that a trait is still object-safe (and usable) if it has // methods with by-value self so long as they require `Self : Sized`. trait Counter { fn tick(&mut self) -> u32; fn get(self) -> u32 where Self : Sized; } struct CCounter { c: u32 } impl Counter for CCounter { fn tick(&mut self) -> u32 { self.c += 1; self.c } fn get(self) -> u32 where Self : Sized { self.c } } fn tick1(mut c: C) -> u32 { tick2(&mut c); c.get() } fn tick2(c: &mut dyn Counter) { tick3(c); } fn tick3(c: &mut C) { c.tick(); c.tick(); } fn main() { let mut c = CCounter { c: 0 }; let value = tick1(c); assert_eq!(value, 2); }