|
1 | 1 | use super::ty::{AllowPlus, RecoverQPath};
|
2 |
| -use super::{Parser, TokenType}; |
| 2 | +use super::{Parser, Restrictions, TokenType}; |
3 | 3 | use crate::maybe_whole;
|
4 | 4 | use rustc_ast::ast::{self, AngleBracketedArg, AngleBracketedArgs, GenericArg, ParenthesizedArgs};
|
5 | 5 | use rustc_ast::ast::{AnonConst, AssocTyConstraint, AssocTyConstraintKind, BlockCheckMode};
|
@@ -479,36 +479,34 @@ impl<'a> Parser<'a> {
|
479 | 479 | GenericArg::Lifetime(self.expect_lifetime())
|
480 | 480 | } else if self.check_const_arg() {
|
481 | 481 | // Parse const argument.
|
482 |
| - let expr = if let token::OpenDelim(token::Brace) = self.token.kind { |
| 482 | + let value = if let token::OpenDelim(token::Brace) = self.token.kind { |
483 | 483 | self.parse_block_expr(
|
484 | 484 | None,
|
485 | 485 | self.token.span,
|
486 | 486 | BlockCheckMode::Default,
|
487 | 487 | ast::AttrVec::new(),
|
488 | 488 | )?
|
489 |
| - } else if self.token.is_ident() { |
| 489 | + } else { |
490 | 490 | // FIXME(const_generics): to distinguish between idents for types and consts,
|
491 | 491 | // we should introduce a GenericArg::Ident in the AST and distinguish when
|
492 | 492 | // lowering to the HIR. For now, idents for const args are not permitted.
|
493 |
| - if self.token.is_bool_lit() { |
494 |
| - self.parse_literal_maybe_minus()? |
495 |
| - } else { |
496 |
| - let span = self.token.span; |
497 |
| - let msg = "identifiers may currently not be used for const generics"; |
498 |
| - self.struct_span_err(span, msg).emit(); |
499 |
| - let block = self.mk_block_err(span); |
500 |
| - self.mk_expr(span, ast::ExprKind::Block(block, None), ast::AttrVec::new()) |
501 |
| - } |
502 |
| - } else { |
503 |
| - self.parse_literal_maybe_minus()? |
| 493 | + let start = self.token.span; |
| 494 | + self.parse_expr_res(Restrictions::CONST_EXPR, None).map_err(|mut err| { |
| 495 | + err.span_label( |
| 496 | + start.shrink_to_lo(), |
| 497 | + "while parsing a `const` argument starting here", |
| 498 | + ); |
| 499 | + err |
| 500 | + })? |
504 | 501 | };
|
505 |
| - GenericArg::Const(AnonConst { id: ast::DUMMY_NODE_ID, value: expr }) |
| 502 | + GenericArg::Const(AnonConst { id: ast::DUMMY_NODE_ID, value }) |
506 | 503 | } else if self.check_type() {
|
507 | 504 | // Parse type argument.
|
508 | 505 | GenericArg::Type(self.parse_ty()?)
|
509 | 506 | } else {
|
510 | 507 | return Ok(None);
|
511 | 508 | };
|
| 509 | + // FIXME: recover from const expressions without braces that require them. |
512 | 510 | Ok(Some(arg))
|
513 | 511 | }
|
514 | 512 | }
|
0 commit comments