diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-01-21 01:23:17 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-09-26 18:10:44 +0200 |
commit | 233e61d2cfe5fbdaf6de482afebc483ac196f353 (patch) | |
tree | 85c0750a9fc5f2139656a24b19e8e9a7d0a7890b | |
parent | 7a3cc9608ed2531f7fa0b6704c27bdddaa5053b7 (diff) | |
download | sparse-233e61d2cfe5fbdaf6de482afebc483ac196f353.tar.gz |
expand: add missing expansion of compound literals
Compound literals, like all other expressions, need to be be
expanded before linearization, but this is currently not done.
As consequence, some builtins are unexpectedly still present,
same for EXPR_TYPEs, ... with error messages like:
warning: unknown expression
at linearization.
Fix this by adding the missing expansion of compound literals.
Note: as explained in the code itself, it's not totally clear
how compound literals can be identified after evaluation.
The code here consider all anonymous symbols with an
initializer as being a compound literal.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | evaluate.c | 1 | ||||
-rw-r--r-- | expand.c | 8 | ||||
-rw-r--r-- | validation/expand/compound-literal.c | 1 | ||||
-rw-r--r-- | validation/linear/compound-literal02.c | 1 |
4 files changed, 9 insertions, 2 deletions
@@ -2935,6 +2935,7 @@ static struct symbol *evaluate_cast(struct expression *expr) * initializer, in which case we need to pass * the type value down to that initializer rather * than trying to evaluate it as an expression + * (cfr. compound literals: C99 & C11 6.5.2.5). * * A more complex case is when the initializer is * dereferenced as part of a post-fix expression. @@ -61,6 +61,14 @@ static int expand_symbol_expression(struct expression *expr) expr->taint = 0; return 0; } + + // expand compound literals (C99 & C11 6.5.2.5) + // FIXME: is this the correct way to identify them? + // All compound literals are anonymous but is + // the reverse true? + if (sym->initializer && !expr->symbol_name) + return expand_expression(sym->initializer); + /* The cost of a symbol expression is lower for on-stack symbols */ return (sym->ctype.modifiers & (MOD_STATIC | MOD_EXTERN)) ? 2 : 1; } diff --git a/validation/expand/compound-literal.c b/validation/expand/compound-literal.c index 7401b019..034164bc 100644 --- a/validation/expand/compound-literal.c +++ b/validation/expand/compound-literal.c @@ -13,7 +13,6 @@ static void foo(struct s *p) /* * check-name: compound-literal * check-command: test-linearize $file - * check-known-to-fail * * check-output-start foo: diff --git a/validation/linear/compound-literal02.c b/validation/linear/compound-literal02.c index 87b98d76..6ed5809e 100644 --- a/validation/linear/compound-literal02.c +++ b/validation/linear/compound-literal02.c @@ -13,7 +13,6 @@ int bar(void) * check-name: compound-literal02.c * check-command: test-linearize -Wno-decl $file * - * check-known-to-fail * check-output-ignore * check-output-contains: ret\\..*\\$6 */ |