diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-04-01 16:28:28 +0200 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-05-21 17:27:45 +0200 |
commit | 93ec535db78b56aa1dda92f5754126caff1d6ef6 (patch) | |
tree | 4c7e8153414b239c2d4ee11da34104339bf038d3 | |
parent | 06c0531322a54e532eb3b9155bbf9f51adca0492 (diff) | |
download | sparse-93ec535db78b56aa1dda92f5754126caff1d6ef6.tar.gz |
scope: move scope opening/ending inside compound_statement()
A compound statement starts and ends a block scope, so
it's better to start & end this scope inside the function
parsing the statement: compound_statement.
The only exception is for the body of a function where
the scope also enclose the parameter declaration but that
is fine since the function is special anyway.
Move the calls to start & close the block scope inside
compound_statement() and directly call statement_list()
for the function body.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | expression.c | 2 | ||||
-rw-r--r-- | parse.c | 13 |
2 files changed, 6 insertions, 9 deletions
diff --git a/expression.c b/expression.c index 5b9bddfe..78e577cf 100644 --- a/expression.c +++ b/expression.c @@ -71,9 +71,7 @@ struct token *parens_expression(struct token *token, struct expression **expr, c struct statement *stmt = alloc_statement(token->pos, STMT_COMPOUND); *expr = e; e->statement = stmt; - start_symbol_scope(); token = compound_statement(token->next, stmt); - end_symbol_scope(); token = expect(token, '}', "at end of statement expression"); } else token = parse_expression(token, expr); @@ -2555,11 +2555,7 @@ static struct token *statement(struct token *token, struct statement **tree) } if (match_op(token, '{')) { - stmt->type = STMT_COMPOUND; - start_symbol_scope(); token = compound_statement(token->next, stmt); - end_symbol_scope(); - return expect(token, '}', "at end of compound statement"); } @@ -2666,7 +2662,10 @@ static struct token *parameter_type_list(struct token *token, struct symbol *fn) struct token *compound_statement(struct token *token, struct statement *stmt) { + stmt->type = STMT_COMPOUND; + start_symbol_scope(); token = statement_list(token, &stmt->stmts); + end_symbol_scope(); return token; } @@ -2818,15 +2817,15 @@ static struct token *parse_function_body(struct token *token, struct symbol *dec decl->ctype.modifiers |= MOD_EXTERN; stmt = start_function(decl); - *p = stmt; + FOR_EACH_PTR (base_type->arguments, arg) { declare_argument(arg, base_type); } END_FOR_EACH_PTR(arg); - token = compound_statement(token->next, stmt); - + token = statement_list(token->next, &stmt->stmts); end_function(decl); + if (!(decl->ctype.modifiers & MOD_INLINE)) add_symbol(list, decl); check_declaration(decl); |