Fix ICE when parsing token trees after an error.

This commit is contained in:
Jeffrey Seyfried 2017-02-08 23:38:41 +00:00
parent 031c1168b9
commit 66bd8eede5
3 changed files with 42 additions and 3 deletions

View file

@ -802,6 +802,10 @@ impl<'a> Parser<'a> {
let mut first: bool = true;
let mut v = vec![];
while !kets.contains(&&self.token) {
match self.token {
token::CloseDelim(..) | token::Eof => break,
_ => {}
};
match sep.sep {
Some(ref t) => {
if first {
@ -2608,9 +2612,12 @@ impl<'a> Parser<'a> {
return Ok((None, kleene_op));
}
let separator = self.bump_and_get();
let separator = match self.token {
token::CloseDelim(..) => None,
_ => Some(self.bump_and_get()),
};
match parse_kleene_op(self)? {
Some(zerok) => Ok((Some(separator), zerok)),
Some(zerok) => Ok((separator, zerok)),
None => return Err(self.fatal("expected `*` or `+`"))
}
}
@ -2647,7 +2654,7 @@ impl<'a> Parser<'a> {
tts: tts,
})))
},
token::CloseDelim(_) | token::Eof => unreachable!(),
token::CloseDelim(..) | token::Eof => Ok(TokenTree::Token(self.span, token::Eof)),
token::Dollar | token::SubstNt(..) if self.quote_depth > 0 => self.parse_unquoted(),
_ => Ok(TokenTree::Token(self.span, self.bump_and_get())),
}