struct Bar; impl std::ops::Mul for &mut Bar { type Output = Bar; fn mul(self, _rhs: Self) -> Self::Output { unimplemented!() } } fn main() { let ref_mut_bar: &mut Bar = &mut Bar; let ref_bar: &Bar = &Bar; let owned_bar: Bar = Bar; let _ = ref_mut_bar * ref_mut_bar; // FIXME: we should be able to suggest borrowing both side let _ = owned_bar * owned_bar; //~^ ERROR cannot multiply let _ = ref_bar * ref_bar; //~^ ERROR cannot multiply let _ = ref_bar * ref_mut_bar; //~^ ERROR cannot multiply let _ = ref_mut_bar * ref_bar; //~^ ERROR mismatched types }