@@ -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