Do not suggest dereferencing in macro
This commit is contained in:
parent
caed80ba4b
commit
26f38c0f34
3 changed files with 37 additions and 18 deletions
|
|
@ -351,11 +351,14 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
|||
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),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,20 +15,26 @@ macro_rules! borrow {
|
|||
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
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
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
|
||||
|
|
@ -11,9 +11,9 @@ LL | foo(s); //~ ERROR mismatched types
|
|||
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
|
||||
|
|
@ -23,9 +23,9 @@ LL | foo3(u); //~ ERROR mismatched types
|
|||
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
|
||||
|
|
@ -35,9 +35,9 @@ LL | foo(&"aaa".to_owned()); //~ ERROR mismatched types
|
|||
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
|
||||
|
|
@ -58,6 +58,16 @@ LL | foo3(borrow!(0));
|
|||
= 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`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue