Skip to content

Commit f5d304c

Browse files
committed
Allow interleaved designated initializers in C mode
1 parent fa64e83 commit f5d304c

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

src/parser/cxx/parser.cc

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,8 @@ auto Parser::parse_nested_name_specifier(NestedNameSpecifierAST*& yyast,
10981098
}
10991099

11001100
auto Parser::parse_lambda_expression(ExpressionAST*& yyast) -> bool {
1101+
if (!is_parsing_cxx()) return false;
1102+
11011103
if (lookat(TokenKind::T_LBRACKET, TokenKind::T_LBRACKET)) return false;
11021104
if (lookat(TokenKind::T_LBRACKET, TokenKind::T_COLON)) return false;
11031105
if (!lookat(TokenKind::T_LBRACKET)) return false;
@@ -5984,7 +5986,7 @@ auto Parser::parse_braced_init_list(BracedInitListAST*& ast,
59845986

59855987
ast->lbraceLoc = lbraceLoc;
59865988

5987-
if (lookat_designator()) {
5989+
if (is_parsing_cxx() && lookat_designator()) {
59885990
auto it = &ast->expressionList;
59895991

59905992
DesignatedInitializerClauseAST* designatedInitializerClause = nullptr;
@@ -6039,7 +6041,17 @@ auto Parser::parse_initializer_list(List<ExpressionAST*>*& yyast,
60396041

60406042
ExpressionAST* expression = nullptr;
60416043

6042-
if (!parse_initializer_clause(expression, ctx)) return false;
6044+
if (is_parsing_c() && lookat_designator()) {
6045+
DesignatedInitializerClauseAST* designatedInitializerClause = nullptr;
6046+
6047+
if (!parse_designated_initializer_clause(designatedInitializerClause)) {
6048+
parse_error("expected designated initializer clause");
6049+
}
6050+
6051+
expression = designatedInitializerClause;
6052+
} else if (!parse_initializer_clause(expression, ctx)) {
6053+
return false;
6054+
}
60436055

60446056
SourceLocation ellipsisLoc;
60456057

@@ -6060,8 +6072,16 @@ auto Parser::parse_initializer_list(List<ExpressionAST*>*& yyast,
60606072

60616073
ExpressionAST* expression = nullptr;
60626074

6063-
if (!parse_initializer_clause(expression, ctx)) {
6064-
parse_error("expected initializer clause");
6075+
if (is_parsing_c() && lookat_designator()) {
6076+
DesignatedInitializerClauseAST* designatedInitializerClause = nullptr;
6077+
6078+
if (!parse_designated_initializer_clause(designatedInitializerClause)) {
6079+
parse_error("expected designated initializer clause");
6080+
}
6081+
6082+
expression = designatedInitializerClause;
6083+
} else if (!parse_initializer_clause(expression, ctx)) {
6084+
return false;
60656085
}
60666086

60676087
SourceLocation ellipsisLoc;

src/parser/cxx/type_checker.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,8 @@ auto TypeChecker::Visitor::check_cast_to_derived(const Type* targetType,
557557
void TypeChecker::Visitor::operator()(BuiltinBitCastExpressionAST* ast) {}
558558

559559
void TypeChecker::Visitor::operator()(BuiltinOffsetofExpressionAST* ast) {
560-
auto classType = type_cast<ClassType>(ast->typeId->type);
560+
auto classType =
561+
ast->typeId ? type_cast<ClassType>(ast->typeId->type) : nullptr;
561562
auto id = ast_cast<IdExpressionAST>(ast->expression);
562563

563564
if (classType && id && !id->nestedNameSpecifier) {

0 commit comments

Comments
 (0)