diff options
| -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 */ |
