// run-pass #![allow(unused_variables)] // Check that a trait is still object-safe (and usable) if it has // generic methods so long as they require `Self : Sized`. trait Counter { fn tick(&mut self) -> u32; fn with(&self, f: F) where Self : Sized; } struct CCounter { c: u32 } impl Counter for CCounter { fn tick(&mut self) -> u32 { self.c += 1; self.c } fn with(&self, f: F) { f(self.c); } } fn tick1(c: &mut C) { tick2(c); c.with(|i| ()); } 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 }; tick1(&mut c); assert_eq!(c.tick(), 3); }