1
Fork 0

"incompatible arm" diagnostic span tweak

Use span label instead of span note for single line spans in
"incompatible arm" diagnostic.
This commit is contained in:
Esteban Küber 2017-12-22 15:55:44 -08:00
parent 4a7c072fa6
commit fed4fcb318
6 changed files with 23 additions and 22 deletions

View file

@ -437,10 +437,20 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
match cause.code { match cause.code {
ObligationCauseCode::MatchExpressionArm { arm_span, source } => match source { ObligationCauseCode::MatchExpressionArm { arm_span, source } => match source {
hir::MatchSource::IfLetDesugar {..} => { hir::MatchSource::IfLetDesugar {..} => {
err.span_note(arm_span, "`if let` arm with an incompatible type"); let msg = "`if let` arm with an incompatible type";
if self.tcx.sess.codemap().is_multiline(arm_span) {
err.span_note(arm_span, msg);
} else {
err.span_label(arm_span, msg);
}
} }
_ => { _ => {
err.span_note(arm_span, "match arm with an incompatible type"); let msg = "match arm with an incompatible type";
if self.tcx.sess.codemap().is_multiline(arm_span) {
err.span_note(arm_span, msg);
} else {
err.span_label(arm_span, msg);
}
} }
}, },
_ => () _ => ()

View file

@ -446,6 +446,12 @@ impl CodeMap {
.expect("CodeMap::span_to_unmapped_path called for imported FileMap?") .expect("CodeMap::span_to_unmapped_path called for imported FileMap?")
} }
pub fn is_multiline(&self, sp: Span) -> bool {
let lo = self.lookup_char_pos(sp.lo());
let hi = self.lookup_char_pos(sp.hi());
lo.line != hi.line
}
pub fn span_to_lines(&self, sp: Span) -> FileLinesResult { pub fn span_to_lines(&self, sp: Span) -> FileLinesResult {
debug!("span_to_lines(sp={:?})", sp); debug!("span_to_lines(sp={:?})", sp);

View file

@ -6,17 +6,14 @@ error[E0308]: match arms have incompatible types
14 | | //~| expected type `bool` 14 | | //~| expected type `bool`
15 | | //~| found type `()` 15 | | //~| found type `()`
... | ... |
19 | | None => (),
| | -- match arm with an incompatible type
20 | | _ => true 20 | | _ => true
21 | | } 21 | | }
| |_____^ expected bool, found () | |_____^ expected bool, found ()
| |
= note: expected type `bool` = note: expected type `bool`
found type `()` found type `()`
note: match arm with an incompatible type
--> $DIR/issue-11319.rs:19:20
|
19 | None => (),
| ^^
error: aborting due to previous error error: aborting due to previous error

View file

@ -17,6 +17,7 @@ error[E0308]: match arms have incompatible types
19 | | //~^ ERROR match arms have incompatible types 19 | | //~^ ERROR match arms have incompatible types
20 | | 1 => |c| c + 1, 20 | | 1 => |c| c + 1,
21 | | 2 => |c| c - 1, 21 | | 2 => |c| c - 1,
| | --------- match arm with an incompatible type
22 | | _ => |c| c - 1 22 | | _ => |c| c - 1
23 | | }; 23 | | };
| |_____^ expected closure, found a different closure | |_____^ expected closure, found a different closure
@ -25,11 +26,6 @@ error[E0308]: match arms have incompatible types
found type `[closure@$DIR/issue-24036.rs:21:14: 21:23]` found type `[closure@$DIR/issue-24036.rs:21:14: 21:23]`
= note: no two closures, even if identical, have the same type = note: no two closures, even if identical, have the same type
= help: consider boxing your closure and/or using it as a trait object = help: consider boxing your closure and/or using it as a trait object
note: match arm with an incompatible type
--> $DIR/issue-24036.rs:21:14
|
21 | 2 => |c| c - 1,
| ^^^^^^^^^
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -5,6 +5,7 @@ error[E0308]: match arms have incompatible types
| _____________^ | _____________^
19 | | 0 => x, 19 | | 0 => x,
20 | | _ => y, 20 | | _ => y,
| | - match arm with an incompatible type
21 | | }; 21 | | };
| |_____^ expected bound lifetime parameter, found concrete lifetime | |_____^ expected bound lifetime parameter, found concrete lifetime
| |
@ -12,11 +13,6 @@ error[E0308]: match arms have incompatible types
found type `for<'a> fn(&'a u8, &'a u8)` found type `for<'a> fn(&'a u8, &'a u8)`
= note: this was previously accepted by the compiler but has been phased out = note: this was previously accepted by the compiler but has been phased out
= note: for more information, see https://github.com/rust-lang/rust/issues/45852 = note: for more information, see https://github.com/rust-lang/rust/issues/45852
note: match arm with an incompatible type
--> $DIR/old-lub-glb-hr.rs:20:14
|
20 | _ => y,
| ^
error: aborting due to previous error error: aborting due to previous error

View file

@ -5,6 +5,7 @@ error[E0308]: match arms have incompatible types
| _____________^ | _____________^
21 | | 0 => x, 21 | | 0 => x,
22 | | _ => y, 22 | | _ => y,
| | - match arm with an incompatible type
23 | | }; 23 | | };
| |_____^ expected bound lifetime parameter 'a, found concrete lifetime | |_____^ expected bound lifetime parameter 'a, found concrete lifetime
| |
@ -12,11 +13,6 @@ error[E0308]: match arms have incompatible types
found type `&for<'a> Foo<&'a u8, &'a u8>` found type `&for<'a> Foo<&'a u8, &'a u8>`
= note: this was previously accepted by the compiler but has been phased out = note: this was previously accepted by the compiler but has been phased out
= note: for more information, see https://github.com/rust-lang/rust/issues/45852 = note: for more information, see https://github.com/rust-lang/rust/issues/45852
note: match arm with an incompatible type
--> $DIR/old-lub-glb-object.rs:22:14
|
22 | _ => y,
| ^
error: aborting due to previous error error: aborting due to previous error