06c6b3caaf
Part of #24407. Currently the diagnostics for range patterns are a bit wrong: ```rust fn main() { match 5u32 { 0 ... 10 => (), 'a' ... 10 => (), 10 ... 'z' => (), "what" ... 10 => (), "what" ... "well" => (), 10 ... "what" => () } } ``` ``` range.rs:4:9: 4:19 error: mismatched types in range: expected integral variable, found char [E0211] range.rs:4 'a' ... 10 => (), ^~~~~~~~~~ range.rs:4:9: 4:16 error: only char and numeric types are allowed in range [E0029] range.rs:4 'a' ... 10 => (), ^~~~~~~ range.rs:4:9: 4:19 error: mismatched types: expected `u32`, found `char` (expected u32, found char) [E0308] range.rs:4 'a' ... 10 => (), ^~~~~~~~~~ range.rs:5:9: 5:19 error: mismatched types in range: expected char, found integral variable [E0211] range.rs:5 10 ... 'z' => (), ^~~~~~~~~~ range.rs:5:9: 5:15 error: only char and numeric types are allowed in range [E0029] range.rs:5 10 ... 'z' => (), ^~~~~~ range.rs:6:9: 6:22 error: mismatched types in range: expected integral variable, found &-ptr [E0211] range.rs:6 "what" ... 10 => (), ^~~~~~~~~~~~~ range.rs:6:9: 6:19 error: only char and numeric types are allowed in range [E0029] range.rs:6 "what" ... 10 => (), ^~~~~~~~~~ range.rs:6:9: 6:22 error: mismatched types: expected `u32`, found `&'static str` (expected u32, found &-ptr) [E0308] range.rs:6 "what" ... 10 => (), ^~~~~~~~~~~~~ range.rs:7:9: 7:19 error: only char and numeric types are allowed in range [E0029] range.rs:7 "what" ... "well" => (), ^~~~~~~~~~ range.rs:7:9: 7:26 error: mismatched types: expected `u32`, found `&'static str` (expected u32, found &-ptr) [E0308] range.rs:7 "what" ... "well" => (), ^~~~~~~~~~~~~~~~~ range.rs:8:9: 8:22 error: mismatched types in range: expected &-ptr, found integral variable [E0211] range.rs:8 10 ... "what" => () ^~~~~~~~~~~~~ range.rs:8:9: 8:15 error: only char and numeric types are allowed in range [E0029] range.rs:8 10 ... "what" => () ^~~~~~ error: aborting due to 12 previous errors ``` The problems here are: 1. The type of the end of the range is used to predict the type of the start (only mildly counter intuitive). 2. E0029 is erroneously generated for `char ... num` and `num ... char`. 2. `u32` is mentioned. 3. Errors which are essentially the same are reported multiple times. I've attempted to fix this by checking the requirements in a different order. The output I've achieved for the above example is: ``` /home/michael/Temp/range.rs:4:17: 4:22 error: mismatched types in range: expected char, found integral variable [E0211] /home/michael/Temp/range.rs:4 'a' ... 10 => (), ^~~~~ /home/michael/Temp/range.rs:5:16: 5:22 error: mismatched types in range: expected integral variable, found char [E0211] /home/michael/Temp/range.rs:5 10 ... 'z' => (), ^~~~~~ /home/michael/Temp/range.rs:6:9: 6:19 error: only char and numeric types are allowed in range [E0029] /home/michael/Temp/range.rs:6 "what" ... 10 => (), ^~~~~~~~~~ /home/michael/Temp/range.rs:6:9: 6:19 help: run `rustc --explain E0029` to see a detailed explanation /home/michael/Temp/range.rs:6:9: 6:19 note: Start type: &'static str End type: _ /home/michael/Temp/range.rs:6 "what" ... 10 => (), ^~~~~~~~~~ /home/michael/Temp/range.rs:7:9: 7:26 error: only char and numeric types are allowed in range [E0029] /home/michael/Temp/range.rs:7 "what" ... "well" => (), ^~~~~~~~~~~~~~~~~ /home/michael/Temp/range.rs:7:9: 7:26 help: run `rustc --explain E0029` to see a detailed explanation /home/michael/Temp/range.rs:7:9: 7:26 note: Start type: &'static str End type: &'static str /home/michael/Temp/range.rs:7 "what" ... "well" => (), ^~~~~~~~~~~~~~~~~ /home/michael/Temp/range.rs:8:16: 8:25 error: only char and numeric types are allowed in range [E0029] /home/michael/Temp/range.rs:8 10 ... "what" => () ^~~~~~~~~ /home/michael/Temp/range.rs:8:16: 8:25 help: run `rustc --explain E0029` to see a detailed explanation /home/michael/Temp/range.rs:8:16: 8:25 note: Start type: _ End type: &'static str /home/michael/Temp/range.rs:8 10 ... "what" => () ^~~~~~~~~ error: aborting due to 5 previous errors ``` I think this is already tonnes better, but the `Start type/End type` stuff could be neater. I don't think there's really any need to start a `note:` block but I wanted to get some feedback on this. I'd also appreciate advice on how to print the integer types as something other than `_`. |
||
---|---|---|
.. | ||
check | ||
coherence | ||
astconv.rs | ||
collect.rs | ||
constrained_type_params.rs | ||
diagnostics.rs | ||
lib.rs | ||
rscope.rs | ||
variance.rs |