@@ -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;
}
@@ -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:
@@ -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
*/
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> --- evaluate.c | 1 + expand.c | 8 ++++++++ validation/expand/compound-literal.c | 1 - validation/linear/compound-literal02.c | 1 - 4 files changed, 9 insertions(+), 2 deletions(-)