提交 36faafee 编写于 作者: E Esteban Küber

Use suggestions instead of notes ref mismatches

On type mismatch errors, use a suggestion when encountering minimal
differences in type differences due to refs, instead of a note.
上级 e3ed2127
......@@ -134,10 +134,8 @@ pub fn demand_coerce_diag(&self,
}
}
if let Some(suggestion) = self.check_ref(expr,
checked_ty,
expected) {
err.help(&suggestion);
if let Some((msg, suggestion)) = self.check_ref(expr, checked_ty, expected) {
err.span_suggestion(expr.span, msg, suggestion);
} else {
let mode = probe::Mode::MethodCall;
let suggestions = self.probe_for_return_type(syntax_pos::DUMMY_SP,
......@@ -214,7 +212,7 @@ fn check_ref(&self,
expr: &hir::Expr,
checked_ty: Ty<'tcx>,
expected: Ty<'tcx>)
-> Option<String> {
-> Option<(&'static str, String)> {
match (&expected.sty, &checked_ty.sty) {
(&ty::TyRef(_, exp), &ty::TyRef(_, check)) => match (&exp.ty.sty, &check.ty.sty) {
(&ty::TyStr, &ty::TyArray(arr, _)) |
......@@ -222,7 +220,8 @@ fn check_ref(&self,
if let hir::ExprLit(_) = expr.node {
let sp = self.sess().codemap().call_span_if_macro(expr.span);
if let Ok(src) = self.tcx.sess.codemap().span_to_snippet(sp) {
return Some(format!("try `{}`", &src[1..]));
return Some(("consider removing the leading `b`",
src[1..].to_string()));
}
}
None
......@@ -232,7 +231,8 @@ fn check_ref(&self,
if let hir::ExprLit(_) = expr.node {
let sp = self.sess().codemap().call_span_if_macro(expr.span);
if let Ok(src) = self.tcx.sess.codemap().span_to_snippet(sp) {
return Some(format!("try `b{}`", src));
return Some(("consider adding a leading `b`",
format!("b{}", src)));
}
}
None
......@@ -260,12 +260,14 @@ fn check_ref(&self,
// Use the callsite's span if this is a macro call. #41858
let sp = self.sess().codemap().call_span_if_macro(expr.span);
if let Ok(src) = self.tcx.sess.codemap().span_to_snippet(sp) {
return Some(format!("try with `{}{}`",
match mutability.mutbl {
hir::Mutability::MutMutable => "&mut ",
hir::Mutability::MutImmutable => "&",
},
&src));
return Some(match mutability.mutbl {
hir::Mutability::MutMutable => {
("consider mutably borrowing here", format!("&mut {}", src))
}
hir::Mutability::MutImmutable => {
("consider borrowing here", format!("&{}", src))
}
});
}
}
None
......@@ -284,7 +286,8 @@ fn check_ref(&self,
// 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));
return Some(("consider removing the borrow",
code));
}
}
......@@ -295,7 +298,8 @@ fn check_ref(&self,
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));
return Some(("consider dereferencing the borrow",
format!("*{}", code)));
}
}
},
......
......@@ -35,5 +35,5 @@ fn check<'r, I: Iterator<Item=usize>, T: Itble<'r, usize, I>>(cont: &T) -> bool
fn main() {
check((3, 5));
//~^ ERROR mismatched types
//~| HELP try with `&(3, 5)`
//~| HELP consider borrowing here
}
......@@ -17,31 +17,37 @@ error[E0308]: mismatched types
--> $DIR/deref-suggestion.rs:23:10
|
23 | foo3(u); //~ ERROR mismatched types
| ^ expected u32, found &u32
| ^
| |
| expected u32, found &u32
| help: consider dereferencing the borrow: `*u`
|
= note: expected type `u32`
found type `&u32`
= help: try with `*u`
error[E0308]: mismatched types
--> $DIR/deref-suggestion.rs:30:9
|
30 | foo(&"aaa".to_owned()); //~ ERROR mismatched types
| ^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found reference
| ^^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: consider removing the borrow: `"aaa".to_owned()`
|
= note: expected type `std::string::String`
found type `&std::string::String`
= help: try with `"aaa".to_owned()`
error[E0308]: mismatched types
--> $DIR/deref-suggestion.rs:31:9
|
31 | foo(&mut "aaa".to_owned()); //~ ERROR mismatched types
| ^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found mutable reference
| ^^^^^^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found mutable reference
| help: consider removing the borrow: `"aaa".to_owned()`
|
= note: expected type `std::string::String`
found type `&mut std::string::String`
= help: try with `"aaa".to_owned()`
error[E0308]: mismatched types
--> $DIR/deref-suggestion.rs:12:20
......
......@@ -23,7 +23,7 @@ fn main() {
//~^ ERROR E0308
//~| NOTE expected &str, found struct `std::string::String`
//~| NOTE expected type `&str`
//~| HELP try with `&String::new()`
//~| HELP consider borrowing here
let y = String::new();
test(&y);
//~^ ERROR E0308
......
......@@ -14,11 +14,13 @@ error[E0308]: mismatched types
--> $DIR/coerce-suggestions.rs:22:19
|
22 | let x: &str = String::new();
| ^^^^^^^^^^^^^ expected &str, found struct `std::string::String`
| ^^^^^^^^^^^^^
| |
| expected &str, found struct `std::string::String`
| help: consider borrowing here: `&String::new()`
|
= note: expected type `&str`
found type `std::string::String`
= help: try with `&String::new()`
error[E0308]: mismatched types
--> $DIR/coerce-suggestions.rs:28:10
......@@ -48,11 +50,13 @@ error[E0308]: mismatched types
--> $DIR/coerce-suggestions.rs:42:9
|
42 | s = format!("foo");
| ^^^^^^^^^^^^^^ expected mutable reference, found struct `std::string::String`
| ^^^^^^^^^^^^^^
| |
| expected mutable reference, found struct `std::string::String`
| help: consider mutably borrowing here: `&mut format!("foo")`
|
= note: expected type `&mut std::string::String`
found type `std::string::String`
= help: try with `&mut format!("foo")`
= 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
......
......@@ -2,31 +2,37 @@ error[E0308]: mismatched types
--> $DIR/str-lit-type-mismatch.rs:13:20
|
13 | let x: &[u8] = "foo"; //~ ERROR mismatched types
| ^^^^^ expected slice, found str
| ^^^^^
| |
| expected slice, found str
| help: consider adding a leading `b`: `b"foo"`
|
= note: expected type `&[u8]`
found type `&'static str`
= help: try `b"foo"`
error[E0308]: mismatched types
--> $DIR/str-lit-type-mismatch.rs:14:23
|
14 | let y: &[u8; 4] = "baaa"; //~ ERROR mismatched types
| ^^^^^^ expected array of 4 elements, found str
| ^^^^^^
| |
| expected array of 4 elements, found str
| help: consider adding a leading `b`: `b"baaa"`
|
= note: expected type `&[u8; 4]`
found type `&'static str`
= help: try `b"baaa"`
error[E0308]: mismatched types
--> $DIR/str-lit-type-mismatch.rs:15:19
|
15 | let z: &str = b"foo"; //~ ERROR mismatched types
| ^^^^^^ expected str, found array of 3 elements
| ^^^^^^
| |
| expected str, found array of 3 elements
| help: consider removing the leading `b`: `"foo"`
|
= note: expected type `&str`
found type `&'static [u8; 3]`
= help: try `"foo"`
error: aborting due to 3 previous errors
......@@ -28,5 +28,5 @@ fn main() { //~ NOTE expected `()` because of default return type
//~^ ERROR mismatched types
//~| NOTE expected &str, found str
//~| NOTE expected type
//~| HELP try with `&s[..2]`
//~| HELP consider borrowing here
}
......@@ -34,11 +34,13 @@ error[E0308]: mismatched types
--> $DIR/str-array-assignment.rs:27:17
|
27 | let w: &str = s[..2];
| ^^^^^^ expected &str, found str
| ^^^^^^
| |
| expected &str, found str
| help: consider borrowing here: `&s[..2]`
|
= note: expected type `&str`
found type `str`
= help: try with `&s[..2]`
error: aborting due to 4 previous errors
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册