diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-07-18 18:09:35 +0200 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-07-18 18:09:35 +0200 |
commit | a30da6a51cc240ca1c6966db1b77cf24e0701758 (patch) | |
tree | 56f0c51205da1dcb0c46afb2d21bf28935cd7542 | |
parent | 92d7f58c411120eb5bc4f90a0dad6aa228249c6c (diff) | |
parent | 14b55d27ee7d577be66c60a457f0e80a28ef274d (diff) | |
download | sparse-a30da6a51cc240ca1c6966db1b77cf24e0701758.tar.gz |
Merge branch 'empty-expr'
* warn on empty assignments & initializations
-rw-r--r-- | expression.c | 6 | ||||
-rw-r--r-- | parse.c | 5 | ||||
-rw-r--r-- | validation/bad-assignment.c | 1 | ||||
-rw-r--r-- | validation/empty-assign.c | 13 | ||||
-rw-r--r-- | validation/empty-initializer.c | 9 |
5 files changed, 32 insertions, 2 deletions
diff --git a/expression.c b/expression.c index 1160cd9c..ecbdd18e 100644 --- a/expression.c +++ b/expression.c @@ -937,10 +937,14 @@ struct token *assignment_expression(struct token *token, struct expression **tre for (i = 0; i < ARRAY_SIZE(assignments); i++) if (assignments[i] == op) { struct expression * expr = alloc_expression(token->pos, EXPR_ASSIGNMENT); + struct token *next = token->next; expr->left = *tree; expr->op = op; *tree = expr; - return assignment_expression(token->next, &expr->right); + token = assignment_expression(next, &expr->right); + if (token == next) + expression_error(expr, "expression expected before '%s'", show_token(token)); + return token; } } return token; @@ -3103,7 +3103,10 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis for (;;) { if (!is_typedef && match_op(token, '=')) { - token = initializer(&decl->initializer, token->next); + struct token *next = token->next; + token = initializer(&decl->initializer, next); + if (token == next) + sparse_error(token->pos, "expression expected before '%s'", show_token(token)); } if (!is_typedef) { if (validate_decl) diff --git a/validation/bad-assignment.c b/validation/bad-assignment.c index 71938db7..959712be 100644 --- a/validation/bad-assignment.c +++ b/validation/bad-assignment.c @@ -8,6 +8,7 @@ static int foo(int a) * check-name: bad assignment * * check-error-start +bad-assignment.c:3:11: error: expression expected before '\' bad-assignment.c:3:13: error: Expected ; at end of statement bad-assignment.c:3:13: error: got \ * check-error-end diff --git a/validation/empty-assign.c b/validation/empty-assign.c new file mode 100644 index 00000000..d1c3884f --- /dev/null +++ b/validation/empty-assign.c @@ -0,0 +1,13 @@ +static int foo(int a) +{ + a = ; // KO + return a; +} + +/* + * check-name: empty-assign + * + * check-error-start +empty-assign.c:3:11: error: expression expected before ';' + * check-error-end + */ diff --git a/validation/empty-initializer.c b/validation/empty-initializer.c new file mode 100644 index 00000000..95067999 --- /dev/null +++ b/validation/empty-initializer.c @@ -0,0 +1,9 @@ +static int i = ; // KO + +/* + * check-name: empty-initializer + * + * check-error-start +empty-initializer.c:1:16: error: expression expected before ';' + * check-error-end + */ |