Skip to content

Commit

Permalink
Tweak non-char/numeric in range pattern diagnostic
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnTitor committed Nov 12, 2019
1 parent 5dda3ee commit 302cf6d
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 80 deletions.
35 changes: 32 additions & 3 deletions src/librustc_typeck/check/pat.rs
Expand Up @@ -380,9 +380,38 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
E0029,
"only char and numeric types are allowed in range patterns"
);
err.span_label(span, "ranges require char or numeric types");
err.note(&format!("start type: {}", self.ty_to_string(lhs_ty)));
err.note(&format!("end type: {}", self.ty_to_string(rhs_ty)));
if !lhs_compat && !rhs_compat {
err.span_label(
begin.span,
&format!("this is of type `{}` but it should be `char` or numeric", lhs_ty)
);
err.span_label(
end.span,
&format!("this is of type `{}` but it should be `char` or numeric", rhs_ty)
);
} else if !lhs_compat {
err.span_label(
begin.span,
&format!("this is of type `{}` but it should be `char` or numeric", lhs_ty)
);
if !rhs_ty.references_error() {
err.span_label(
end.span,
&format!("this is of type `{}`", rhs_ty)
);
}
} else {
err.span_label(
end.span,
&format!("this is of type `{}` but it should be `char` or numeric", rhs_ty)
);
if !lhs_ty.references_error() {
err.span_label(
begin.span,
&format!("this is of type `{}`", lhs_ty)
);
}
}
if self.tcx.sess.teach(&err.get_code().unwrap()) {
err.note(
"In a match expression, only numbers and characters can be matched \
Expand Down
7 changes: 4 additions & 3 deletions src/test/ui/error-codes/E0029-teach.stderr
Expand Up @@ -2,10 +2,11 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/E0029-teach.rs:7:9
|
LL | "hello" ..= "world" => {}
| ^^^^^^^^^^^^^^^^^^^ ranges require char or numeric types
| -------^^^^^-------
| | |
| | this is of type `&'static str` but it should be `char` or numeric
| this is of type `&'static str` but it should be `char` or numeric
|
= note: start type: &'static str
= note: end type: &'static str
= note: In a match expression, only numbers and characters can be matched against a range. This is because the compiler checks that the range is non-empty at compile-time, and is unable to evaluate arbitrary comparison functions. If you want to capture values of an orderable type between two end-points, you can use a guard.

error: aborting due to previous error
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/error-codes/E0029.stderr
Expand Up @@ -2,10 +2,10 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/E0029.rs:5:9
|
LL | "hello" ..= "world" => {}
| ^^^^^^^^^^^^^^^^^^^ ranges require char or numeric types
|
= note: start type: &'static str
= note: end type: &'static str
| -------^^^^^-------
| | |
| | this is of type `&'static str` but it should be `char` or numeric
| this is of type `&'static str` but it should be `char` or numeric

error: aborting due to previous error

Expand Down
9 changes: 5 additions & 4 deletions src/test/ui/match/match-range-fail.rs
Expand Up @@ -3,15 +3,16 @@ fn main() {
"bar" ..= "foo" => { }
};
//~^^ ERROR only char and numeric types are allowed in range
//~| start type: &'static str
//~| end type: &'static str

match "wow" {
10 ..= "what" => ()
};
//~^^ ERROR only char and numeric types are allowed in range
//~| start type: {integer}
//~| end type: &'static str

match "wow" {
true ..= "what" => {}
};
//~^^ ERROR only char and numeric types are allowed in range

match 5 {
'c' ..= 100 => { }
Expand Down
28 changes: 18 additions & 10 deletions src/test/ui/match/match-range-fail.stderr
Expand Up @@ -2,30 +2,38 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/match-range-fail.rs:3:9
|
LL | "bar" ..= "foo" => { }
| ^^^^^^^^^^^^^^^ ranges require char or numeric types
|
= note: start type: &'static str
= note: end type: &'static str
| -----^^^^^-----
| | |
| | this is of type `&'static str` but it should be `char` or numeric
| this is of type `&'static str` but it should be `char` or numeric

error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/match-range-fail.rs:10:16
--> $DIR/match-range-fail.rs:8:16
|
LL | 10 ..= "what" => ()
| ^^^^^^ ranges require char or numeric types
| -- ^^^^^^ this is of type `&'static str` but it should be `char` or numeric
| |
| this is of type `{integer}`

error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/match-range-fail.rs:13:9
|
= note: start type: {integer}
= note: end type: &'static str
LL | true ..= "what" => {}
| ----^^^^^------
| | |
| | this is of type `&'static str` but it should be `char` or numeric
| this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/match-range-fail.rs:17:9
--> $DIR/match-range-fail.rs:18:9
|
LL | 'c' ..= 100 => { }
| ^^^^^^^^^^^ expected integer, found char
|
= note: expected type `{integer}`
found type `char`

error: aborting due to 3 previous errors
error: aborting due to 4 previous errors

Some errors have detailed explanations: E0029, E0308.
For more information about an error, try `rustc --explain E0029`.
72 changes: 24 additions & 48 deletions src/test/ui/parser/recover-range-pats.stderr
Expand Up @@ -401,19 +401,17 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:19:12
|
LL | if let true..Y = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: bool
= note: end type: u8
| ^^^^ - this is of type `u8`
| |
| this is of type `bool` but it should be `char` or numeric

error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:20:15
|
LL | if let X..true = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: u8
= note: end type: bool
| - ^^^^ this is of type `bool` but it should be `char` or numeric
| |
| this is of type `u8`

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:21:12
Expand All @@ -437,19 +435,17 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:32:12
|
LL | if let true..=Y = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: bool
= note: end type: u8
| ^^^^ - this is of type `u8`
| |
| this is of type `bool` but it should be `char` or numeric

error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:33:16
|
LL | if let X..=true = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: u8
= note: end type: bool
| - ^^^^ this is of type `bool` but it should be `char` or numeric
| |
| this is of type `u8`

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:34:12
Expand All @@ -473,19 +469,17 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:45:12
|
LL | if let true...Y = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: bool
= note: end type: u8
| ^^^^ - this is of type `u8`
| |
| this is of type `bool` but it should be `char` or numeric

error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:47:16
|
LL | if let X...true = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: u8
= note: end type: bool
| - ^^^^ this is of type `bool` but it should be `char` or numeric
| |
| this is of type `u8`

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:49:12
Expand All @@ -509,10 +503,7 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:60:12
|
LL | if let true.. = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: bool
= note: end type: [type error]
| ^^^^ this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:62:12
Expand All @@ -527,10 +518,7 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:70:12
|
LL | if let true..= = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: bool
= note: end type: [type error]
| ^^^^ this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:72:12
Expand All @@ -545,10 +533,7 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:82:12
|
LL | if let true... = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: bool
= note: end type: [type error]
| ^^^^ this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:85:12
Expand All @@ -563,10 +548,7 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:94:14
|
LL | if let ..true = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: [type error]
= note: end type: bool
| ^^^^ this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:96:12
Expand All @@ -581,10 +563,7 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:104:15
|
LL | if let ..=true = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: [type error]
= note: end type: bool
| ^^^^ this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:106:12
Expand All @@ -599,10 +578,7 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/recover-range-pats.rs:116:15
|
LL | if let ...true = 0 {}
| ^^^^ ranges require char or numeric types
|
= note: start type: [type error]
= note: end type: bool
| ^^^^ this is of type `bool` but it should be `char` or numeric

error[E0308]: mismatched types
--> $DIR/recover-range-pats.rs:119:12
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/pattern/patkind-litrange-no-expr.stderr
Expand Up @@ -7,11 +7,11 @@ LL | Arith = 1 + 1,
error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/patkind-litrange-no-expr.rs:20:13
|
LL | $( $value ..= 42 => Some($name::$variant), )* // PatKind::Range
| -- this is of type `{integer}`
...
LL | Arith = 1 + 1,
| ^^^^^ ranges require char or numeric types
|
= note: start type: {integer}
= note: end type: {integer}
| ^^^^^ this is of type `_` but it should be `char` or numeric

error: aborting due to 2 previous errors

Expand Down
7 changes: 3 additions & 4 deletions src/test/ui/qualified/qualified-path-params.stderr
Expand Up @@ -8,10 +8,9 @@ error[E0029]: only char and numeric types are allowed in range patterns
--> $DIR/qualified-path-params.rs:22:15
|
LL | 0 ..= <S as Tr>::A::f::<u8> => {}
| ^^^^^^^^^^^^^^^^^^^^^ ranges require char or numeric types
|
= note: start type: {integer}
= note: end type: fn() {S::f::<u8>}
| - ^^^^^^^^^^^^^^^^^^^^^ this is of type `fn() {S::f::<u8>}` but it should be `char` or numeric
| |
| this is of type `{integer}`

error: aborting due to 2 previous errors

Expand Down

0 comments on commit 302cf6d

Please sign in to comment.