Skip to content

Commit

Permalink
Rollup merge of rust-lang#53727 - estebank:incorrect-deref-suggestion…
Browse files Browse the repository at this point in the history
…, r=nikomatsakis

Do not suggest dereferencing in macro

Fix rust-lang#52783.
  • Loading branch information
pietroalbini authored Aug 29, 2018
2 parents 7d60f7c + a2722f3 commit aa93a6a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 17 deletions.
13 changes: 8 additions & 5 deletions src/librustc_typeck/check/demand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
));
}
}
}
Expand Down
14 changes: 10 additions & 4 deletions src/test/ui/deref-suggestion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
26 changes: 18 additions & 8 deletions src/test/ui/deref-suggestion.stderr
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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`.

0 comments on commit aa93a6a

Please sign in to comment.