X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc_typeck%2Fcheck%2Fdemand.rs;h=7110a1ba81d8f4888891ca60ef464136e54e662c;hb=21d4ba2ea66ee297e556af9b1e4e96130e2e1bcf;hp=65900dc3f36e7d8242903846e0995187ac6858ee;hpb=4cdb36262b93390c8733a1ce44665619d9348981;p=rust.git diff --git a/src/librustc_typeck/check/demand.rs b/src/librustc_typeck/check/demand.rs index 65900dc3f36..7110a1ba81d 100644 --- a/src/librustc_typeck/check/demand.rs +++ b/src/librustc_typeck/check/demand.rs @@ -261,6 +261,39 @@ fn check_ref(&self, } None } + (_, &ty::TyRef(_, checked)) => { + // We have `&T`, check if what was expected was `T`. If so, + // we may want to suggest adding a `*`, or removing + // a `&`. + // + // (But, also check check the `expn_info()` to see if this is + // a macro; if so, it's hard to extract the text and make a good + // suggestion, so don't bother.) + if self.infcx.can_sub(self.param_env, checked.ty, &expected).is_ok() && + expr.span.ctxt().outer().expn_info().is_none() { + match expr.node { + // Maybe remove `&`? + hir::ExprAddrOf(_, ref expr) => { + if let Ok(code) = self.tcx.sess.codemap().span_to_snippet(expr.span) { + return Some(format!("try with `{}`", code)); + } + } + + // Maybe add `*`? Only if `T: Copy`. + _ => { + if !self.infcx.type_moves_by_default(self.param_env, + checked.ty, + expr.span) { + let sp = self.sess().codemap().call_span_if_macro(expr.span); + if let Ok(code) = self.tcx.sess.codemap().span_to_snippet(sp) { + return Some(format!("try with `*{}`", code)); + } + } + }, + } + } + None + } _ => None, } }