@@ -5922,7 +5922,7 @@ auto Parser::parse_braced_init_list(BracedInitListAST*& ast,
59225922
59235923 ast->lbraceLoc = lbraceLoc;
59245924
5925- if (lookat (TokenKind::T_DOT )) {
5925+ if (lookat_designator ( )) {
59265926 auto it = &ast->expressionList ;
59275927
59285928 DesignatedInitializerClauseAST* designatedInitializerClause = nullptr ;
@@ -6018,43 +6018,67 @@ auto Parser::parse_initializer_list(List<ExpressionAST*>*& yyast,
60186018 return true ;
60196019}
60206020
6021+ auto Parser::lookat_designator () -> bool {
6022+ if (lookat (TokenKind::T_DOT)) return true ;
6023+
6024+ if (unit->language () == LanguageKind::kCXX ) return false ;
6025+
6026+ if (lookat (TokenKind::T_LBRACKET)) return true ;
6027+
6028+ return false ;
6029+ }
6030+
6031+ void Parser::parse_designator (DesignatorAST*& yyast) {
6032+ if (lookat (TokenKind::T_DOT)) {
6033+ parse_dot_designator (yyast);
6034+ } else if (lookat (TokenKind::T_LBRACKET)) {
6035+ parse_subscript_designator (yyast);
6036+ }
6037+ }
6038+
6039+ void Parser::parse_dot_designator (DesignatorAST*& yyast) {
6040+ auto ast = make_node<DotDesignatorAST>(pool_);
6041+ yyast = ast;
6042+
6043+ expect (TokenKind::T_DOT, ast->dotLoc );
6044+ expect (TokenKind::T_IDENTIFIER, ast->identifierLoc );
6045+ ast->identifier = unit->identifier (ast->identifierLoc );
6046+ }
6047+
6048+ void Parser::parse_subscript_designator (DesignatorAST*& yyast) {
6049+ auto ast = make_node<SubscriptDesignatorAST>(pool_);
6050+ yyast = ast;
6051+
6052+ expect (TokenKind::T_LBRACKET, ast->lbracketLoc );
6053+
6054+ std::optional<ConstValue> index;
6055+ if (!parse_constant_expression (ast->expression , index)) {
6056+ parse_error (" expected expression after '['" );
6057+ }
6058+
6059+ expect (TokenKind::T_RBRACKET, ast->rbracketLoc );
6060+ }
6061+
60216062auto Parser::parse_designated_initializer_clause (
60226063 DesignatedInitializerClauseAST*& yyast) -> bool {
60236064 auto ast = make_node<DesignatedInitializerClauseAST>(pool_);
60246065 yyast = ast;
60256066
60266067 auto it = &ast->designatorList ;
60276068
6028- while (true ) {
6029- if (SourceLocation dotLoc; match (TokenKind::T_DOT, dotLoc)) {
6030- auto designator = make_node<DotDesignatorAST>(pool_);
6031- designator->dotLoc = dotLoc;
6069+ DesignatorAST* designator = nullptr ;
6070+ parse_designator (designator);
60326071
6033- if (lookat (TokenKind::T_IDENTIFIER)) {
6034- expect (TokenKind::T_IDENTIFIER, designator->identifierLoc );
6035- designator->identifier = unit->identifier (designator->identifierLoc );
6036- } else {
6037- parse_error (" expected identifier after '.'" );
6038- }
6039-
6040- *it = make_list_node<DesignatorAST>(pool_, designator);
6041- it = &(*it)->next ;
6042- } else if (SourceLocation lbracketLoc;
6043- match (TokenKind::T_LBRACKET, lbracketLoc)) {
6044- auto designator = make_node<SubscriptDesignatorAST>(pool_);
6045- designator->lbracketLoc = lbracketLoc;
6046-
6047- std::optional<ConstValue> index;
6048- if (!parse_constant_expression (designator->expression , index)) {
6049- parse_error (" expected expression after '['" );
6050- }
6072+ *it = make_list_node (pool_, designator);
6073+ it = &(*it)->next ;
60516074
6052- expect (TokenKind::T_RBRACKET, designator->rbracketLoc );
6075+ if (unit->language () == LanguageKind::kC ) {
6076+ while (lookat_designator ()) {
6077+ DesignatorAST* designator = nullptr ;
6078+ parse_designator (designator);
60536079
6054- *it = make_list_node<DesignatorAST> (pool_, designator);
6080+ *it = make_list_node (pool_, designator);
60556081 it = &(*it)->next ;
6056- } else {
6057- break ;
60586082 }
60596083 }
60606084
0 commit comments