static void parse_declaration_rest(entity_t *ndeclaration,
const declaration_specifiers_t *specifiers,
- parsed_declaration_func finished_declaration)
+ parsed_declaration_func finished_declaration,
+ declarator_flags_t flags)
{
add_anchor_token(';');
add_anchor_token(',');
eat(',');
add_anchor_token('=');
- ndeclaration = parse_declarator(specifiers, DECL_FLAGS_NONE);
+ ndeclaration = parse_declarator(specifiers, flags);
rem_anchor_token('=');
}
expect(';');
return record_entity(entity, false);
}
-static void parse_declaration(parsed_declaration_func finished_declaration)
+static void parse_declaration(parsed_declaration_func finished_declaration,
+ declarator_flags_t flags)
{
declaration_specifiers_t specifiers;
memset(&specifiers, 0, sizeof(specifiers));
if (token.type == ';') {
parse_anonymous_declaration_rest(&specifiers);
} else {
- entity_t *entity = parse_declarator(&specifiers, DECL_FLAGS_NONE);
- parse_declaration_rest(entity, &specifiers, finished_declaration);
+ entity_t *entity = parse_declarator(&specifiers, flags);
+ parse_declaration_rest(entity, &specifiers, finished_declaration, flags);
}
}
/* parse declaration list */
while (is_declaration_specifier(&token, false)) {
- parse_declaration(finished_kr_declaration);
+ parse_declaration(finished_kr_declaration, DECL_IS_PARAMETER);
}
/* pop function parameters */
case ',':
case ';':
case '=':
- parse_declaration_rest(ndeclaration, &specifiers, record_entity);
+ parse_declaration_rest(ndeclaration, &specifiers, record_entity,
+ DECL_FLAGS_NONE);
return;
}
if (token.type == ';') {
next_token();
} else if (is_declaration_specifier(&token, false)) {
- parse_declaration(record_entity);
+ parse_declaration(record_entity, DECL_FLAGS_NONE);
} else {
add_anchor_token(';');
expression_t *const init = parse_expression();
statement_t *statement = allocate_statement_zero(STATEMENT_DECLARATION);
entity_t *before = current_scope->last_entity;
- if (GNU_MODE)
+ if (GNU_MODE) {
parse_external_declaration();
- else
- parse_declaration(record_entity);
+ } else {
+ parse_declaration(record_entity, DECL_FLAGS_NONE);
+ }
if (before == NULL) {
statement->declaration.declarations_begin = current_scope->entities;