Suggest removal of & when borrowing macro and appropriate

Fix #58815.
This commit is contained in:
Esteban Küber 2019-03-02 11:25:00 -08:00
parent c1d2d83ca3
commit edbbfad88f
5 changed files with 54 additions and 3 deletions

View File

@ -367,6 +367,15 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
// Maybe remove `&`?
hir::ExprKind::AddrOf(_, ref expr) => {
if !cm.span_to_filename(expr.span).is_real() {
if let Ok(code) = cm.span_to_snippet(sp) {
if code.chars().next() == Some('&') {
return Some((
sp,
"consider removing the borrow",
code[1..].to_string()),
);
}
}
return None;
}
if let Ok(code) = cm.span_to_snippet(expr.span) {

View File

@ -4,7 +4,10 @@ error[E0308]: mismatched types
LL | fn main() {
| - expected `()` because of default return type
LL | &panic!()
| ^^^^^^^^^ expected (), found reference
| ^^^^^^^^^
| |
| expected (), found reference
| help: consider removing the borrow: `panic!()`
|
= note: expected type `()`
found type `&_`

View File

@ -1,13 +1,19 @@
error[E0308]: mismatched types
--> $DIR/diverging-tuple-parts-39485.rs:8:5
|
LL | fn g() {
| - help: try adding a return type: `-> &_`
LL | &panic!() //~ ERROR mismatched types
| ^^^^^^^^^ expected (), found reference
|
= note: expected type `()`
found type `&_`
help: try adding a return type
|
LL | fn g() -> &_ {
| ^^^^^
help: consider removing the borrow
|
LL | panic!() //~ ERROR mismatched types
| ^^^^^^^^
error[E0308]: mismatched types
--> $DIR/diverging-tuple-parts-39485.rs:12:5

View File

@ -0,0 +1,6 @@
fn main() {
let a: String = &String::from("a");
//~^ ERROR mismatched types
let b: String = &format!("b");
//~^ ERROR mismatched types
}

View File

@ -0,0 +1,27 @@
error[E0308]: mismatched types
--> $DIR/format-borrow.rs:2:21
|
LL | let a: String = &String::from("a");
| ^^^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: consider removing the borrow: `String::from("a")`
|
= note: expected type `std::string::String`
found type `&std::string::String`
error[E0308]: mismatched types
--> $DIR/format-borrow.rs:4:21
|
LL | let b: String = &format!("b");
| ^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: consider removing the borrow: `format!("b")`
|
= note: expected type `std::string::String`
found type `&std::string::String`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.