Skip to content

Tweak non-char/numeric in range pattern diagnostic #66351

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 14, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 32 additions & 3 deletions src/librustc_typeck/check/pat.rs
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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