aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--evaluate.c1
-rw-r--r--expand.c8
-rw-r--r--validation/expand/compound-literal.c1
-rw-r--r--validation/linear/compound-literal02.c1
4 files changed, 9 insertions, 2 deletions
diff --git a/evaluate.c b/evaluate.c
index f6dfcced..70d76523 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -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.
diff --git a/expand.c b/expand.c
index e8e50b08..aba20b8c 100644
--- a/expand.c
+++ b/expand.c
@@ -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
*/