]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Evaluate arguments of sizeof that are structs of variable size.
authorMartin Uecker <muecker@gwdg.de>
Tue, 10 Aug 2021 05:42:51 +0000 (07:42 +0200)
committerMartin Uecker <muecker@gwdg.de>
Tue, 10 Aug 2021 05:49:57 +0000 (07:49 +0200)
Evaluate arguments of sizeof for all types of variable size
and not just for VLAs. This fixes some issues related to
[PR29970] where statement expressions need to be evaluated
so that the size is well defined.

2021-08-10  Martin Uecker  <muecker@gwdg.de>

gcc/c/
PR c/29970
* c-typeck.c (c_expr_sizeof_expr): Evaluate
size expressions for structs of variable size.

gcc/testsuite/
PR c/29970
* gcc.dg/vla-stexp-1.c: New test.

gcc/c/c-typeck.c
gcc/testsuite/gcc.dg/vla-stexp-1.c [new file with mode: 0644]

index 5d6565bdaa936b365730f6c7a99e2b30cc40266a..c5bf3372321f5a7de8871dadc87e44f6617dc9f1 100644 (file)
@@ -2992,7 +2992,7 @@ c_expr_sizeof_expr (location_t loc, struct c_expr expr)
       c_last_sizeof_loc = loc;
       ret.original_code = SIZEOF_EXPR;
       ret.original_type = NULL;
-      if (c_vla_type_p (TREE_TYPE (folded_expr)))
+      if (C_TYPE_VARIABLE_SIZE (TREE_TYPE (folded_expr)))
        {
          /* sizeof is evaluated when given a vla (C99 6.5.3.4p2).  */
          ret.value = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret.value),
diff --git a/gcc/testsuite/gcc.dg/vla-stexp-1.c b/gcc/testsuite/gcc.dg/vla-stexp-1.c
new file mode 100644 (file)
index 0000000..97d6693
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR29970*/
+/* { dg-do run } */
+/* { dg-options "-Wall -O0" } */
+
+int foo(void)
+{
+       int n = 0;
+       return sizeof(*({ n = 10; struct foo { int x[n]; } x; &x; }));
+}
+
+
+int main()
+{
+       if (sizeof(struct foo { int x[10]; }) != foo())
+               __builtin_abort();
+
+       return 0;
+}