diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 43e7c9330e4..9b9954859be 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2002,8 +2002,29 @@ fn parse_bottom_expr(&mut self) -> PResult<'a, P> { let ex: ExprKind; + macro_rules! parse_lit { + () => { + match self.parse_lit() { + Ok(literal) => { + hi = self.prev_span; + ex = ExprKind::Lit(literal); + } + Err(mut err) => { + self.cancel(&mut err); + return Err(self.expected_expression_found()); + } + } + } + } + // Note: when adding new syntax here, don't forget to adjust TokenKind::can_begin_expr(). match self.token.kind { + // This match arm is a special-case of the `_` match arm below and + // could be removed without changing functionality, but it's faster + // to have it here, especially for programs with large constants. + token::Literal(_) => { + parse_lit!() + } token::OpenDelim(token::Paren) => { self.bump(); @@ -2249,16 +2270,7 @@ fn parse_bottom_expr(&mut self) -> PResult<'a, P> { self.bump(); return Ok(self.mk_expr(self.span, ExprKind::Err, ThinVec::new())); } - match self.parse_literal_maybe_minus() { - Ok(expr) => { - hi = expr.span; - ex = expr.node.clone(); - } - Err(mut err) => { - self.cancel(&mut err); - return Err(self.expected_expression_found()); - } - } + parse_lit!() } } }