Handle case of incomplete local ty more gracefully
When encountering a local binding with a type that isn't completed, the parser will reach a `=` token. When this happen, consider the type "complete" as far as the parser is concerned to avoid further errors being emitted by parse recovery logic.
This commit is contained in:
parent
23744c84d9
commit
ce3bd29c68
3 changed files with 20 additions and 55 deletions
|
@ -162,13 +162,19 @@ impl<'a> Parser<'a> {
|
||||||
match self.parse_ty() {
|
match self.parse_ty() {
|
||||||
Ok(ty) => (None, Some(ty)),
|
Ok(ty) => (None, Some(ty)),
|
||||||
Err(mut err) => {
|
Err(mut err) => {
|
||||||
// Rewind to before attempting to parse the type and continue parsing.
|
|
||||||
let parser_snapshot_after_type =
|
|
||||||
mem::replace(self, parser_snapshot_before_type);
|
|
||||||
if let Ok(snip) = self.span_to_snippet(pat.span) {
|
if let Ok(snip) = self.span_to_snippet(pat.span) {
|
||||||
err.span_label(pat.span, format!("while parsing the type for `{}`", snip));
|
err.span_label(pat.span, format!("while parsing the type for `{}`", snip));
|
||||||
}
|
}
|
||||||
(Some((parser_snapshot_after_type, colon_sp, err)), None)
|
let err = if self.check(&token::Eq) {
|
||||||
|
err.emit();
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
// Rewind to before attempting to parse the type and continue parsing.
|
||||||
|
let parser_snapshot_after_type =
|
||||||
|
mem::replace(self, parser_snapshot_before_type);
|
||||||
|
Some((parser_snapshot_after_type, colon_sp, err))
|
||||||
|
};
|
||||||
|
(err, None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,11 +1,6 @@
|
||||||
fn main () {
|
fn main () {
|
||||||
let sr: Vec<(u32, _, _) = vec![];
|
let sr: Vec<(u32, _, _) = vec![];
|
||||||
//~^ ERROR expected one of `,` or `>`, found `=`
|
//~^ ERROR expected one of `,` or `>`, found `=`
|
||||||
//~| ERROR expected value, found struct `Vec`
|
|
||||||
//~| ERROR mismatched types
|
|
||||||
//~| ERROR invalid left-hand side of assignment
|
|
||||||
//~| ERROR expected expression, found reserved identifier `_`
|
|
||||||
//~| ERROR expected expression, found reserved identifier `_`
|
|
||||||
let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect();
|
let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect();
|
||||||
//~^ ERROR no method named `iter` found
|
//~^ ERROR a value of type `std::vec::Vec<(u32, _, _)>` cannot be built
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,55 +1,19 @@
|
||||||
error: expected expression, found reserved identifier `_`
|
|
||||||
--> $DIR/issue-34334.rs:2:23
|
|
||||||
|
|
|
||||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
|
||||||
| ^ expected expression
|
|
||||||
|
|
||||||
error: expected expression, found reserved identifier `_`
|
|
||||||
--> $DIR/issue-34334.rs:2:26
|
|
||||||
|
|
|
||||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
|
||||||
| ^ expected expression
|
|
||||||
|
|
||||||
error: expected one of `,` or `>`, found `=`
|
error: expected one of `,` or `>`, found `=`
|
||||||
--> $DIR/issue-34334.rs:2:29
|
--> $DIR/issue-34334.rs:2:29
|
||||||
|
|
|
|
||||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
LL | let sr: Vec<(u32, _, _) = vec![];
|
||||||
| --- ^ expected one of `,` or `>`
|
| -- ^ expected one of `,` or `>`
|
||||||
| | |
|
| |
|
||||||
| | help: use `=` if you meant to assign
|
|
||||||
| while parsing the type for `sr`
|
| while parsing the type for `sr`
|
||||||
|
|
||||||
error[E0423]: expected value, found struct `Vec`
|
error[E0277]: a value of type `std::vec::Vec<(u32, _, _)>` cannot be built from an iterator over elements of type `()`
|
||||||
--> $DIR/issue-34334.rs:2:13
|
--> $DIR/issue-34334.rs:4:87
|
||||||
|
|
|
||||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
|
||||||
| ^^^ help: use struct literal syntax instead: `Vec { buf: val, len: val }`
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
|
||||||
--> $DIR/issue-34334.rs:2:31
|
|
||||||
|
|
|
||||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
|
||||||
| ^^^^^^ expected `bool`, found struct `std::vec::Vec`
|
|
||||||
|
|
|
||||||
= note: expected type `bool`
|
|
||||||
found struct `std::vec::Vec<_>`
|
|
||||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
|
|
||||||
error[E0070]: invalid left-hand side of assignment
|
|
||||||
--> $DIR/issue-34334.rs:2:29
|
|
||||||
|
|
|
||||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
|
||||||
| --------------- ^
|
|
||||||
| |
|
|
||||||
| cannot assign to this expression
|
|
||||||
|
|
||||||
error[E0599]: no method named `iter` found for unit type `()` in the current scope
|
|
||||||
--> $DIR/issue-34334.rs:9:36
|
|
||||||
|
|
|
|
||||||
LL | let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect();
|
LL | let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect();
|
||||||
| ^^^^ method not found in `()`
|
| ^^^^^^^ value of type `std::vec::Vec<(u32, _, _)>` cannot be built from `std::iter::Iterator<Item=()>`
|
||||||
|
|
|
||||||
|
= help: the trait `std::iter::FromIterator<()>` is not implemented for `std::vec::Vec<(u32, _, _)>`
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0070, E0308, E0423, E0599.
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
For more information about an error, try `rustc --explain E0070`.
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue