#![allow(dead_code)] struct Events(R); struct Other; pub trait Trait { fn handle(value: T) -> Self; } // Blanket impl. (If you comment this out, compiler figures out that it // is passing an `&mut` to a method that must be expecting an `&mut`, // and injects an auto-reborrow.) impl Trait for T where T: From { fn handle(_: U) -> Self { unimplemented!() } } impl<'a, R> Trait<&'a mut Events> for Other { fn handle(_: &'a mut Events) -> Self { unimplemented!() } } fn this_compiles<'a, R>(value: &'a mut Events) { for _ in 0..3 { Other::handle(&mut *value); } } fn this_does_not<'a, R>(value: &'a mut Events) { for _ in 0..3 { Other::handle(value); //~ ERROR use of moved value: `value` } } fn main() {}