if !self.infcx.type_moves_by_default(self.param_env,
checked,
sp) {
- let sp = cm.call_span_if_macro(sp);
- if let Ok(code) = cm.span_to_snippet(sp) {
- return Some((sp,
- "consider dereferencing the borrow",
- format!("*{}", code)));
+ // do not suggest if the span comes from a macro (#52783)
+ if let (Ok(code),
+ true) = (cm.span_to_snippet(sp), sp == expr.span) {
+ return Some((
+ sp,
+ "consider dereferencing the borrow",
+ format!("*{}", code),
+ ));
}
}
}
fn foo(_: String) {}
fn foo2(s: &String) {
- foo(s); //~ ERROR mismatched types
+ foo(s);
+ //~^ ERROR mismatched types
}
fn foo3(_: u32) {}
fn foo4(u: &u32) {
- foo3(u); //~ ERROR mismatched types
+ foo3(u);
+ //~^ ERROR mismatched types
}
fn main() {
let s = String::new();
let r_s = &s;
foo2(r_s);
- foo(&"aaa".to_owned()); //~ ERROR mismatched types
- foo(&mut "aaa".to_owned()); //~ ERROR mismatched types
+ foo(&"aaa".to_owned());
+ //~^ ERROR mismatched types
+ foo(&mut "aaa".to_owned());
+ //~^ ERROR mismatched types
foo3(borrow!(0));
foo4(&0);
-}
+ assert_eq!(3i32, &3i32);
+ //~^ ERROR mismatched types
+}
\ No newline at end of file
error[E0308]: mismatched types
--> $DIR/deref-suggestion.rs:18:9
|
-LL | foo(s); //~ ERROR mismatched types
+LL | foo(s);
| ^
| |
| expected struct `std::string::String`, found reference
found type `&std::string::String`
error[E0308]: mismatched types
- --> $DIR/deref-suggestion.rs:23:10
+ --> $DIR/deref-suggestion.rs:24:10
|
-LL | foo3(u); //~ ERROR mismatched types
+LL | foo3(u);
| ^
| |
| expected u32, found &u32
found type `&u32`
error[E0308]: mismatched types
- --> $DIR/deref-suggestion.rs:30:9
+ --> $DIR/deref-suggestion.rs:32:9
|
-LL | foo(&"aaa".to_owned()); //~ ERROR mismatched types
+LL | foo(&"aaa".to_owned());
| ^^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
found type `&std::string::String`
error[E0308]: mismatched types
- --> $DIR/deref-suggestion.rs:31:9
+ --> $DIR/deref-suggestion.rs:34:9
|
-LL | foo(&mut "aaa".to_owned()); //~ ERROR mismatched types
+LL | foo(&mut "aaa".to_owned());
| ^^^^^^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found mutable reference
= note: expected type `u32`
found type `&{integer}`
-error: aborting due to 5 previous errors
+error[E0308]: mismatched types
+ --> $DIR/deref-suggestion.rs:38:5
+ |
+LL | assert_eq!(3i32, &3i32);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^ expected i32, found &i32
+ |
+ = note: expected type `i32`
+ found type `&i32`
+ = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: aborting due to 6 previous errors
For more information about this error, try `rustc --explain E0308`.