Evaluate arguments of sizeof that are structs of variable size.
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.
This commit is contained in:
parent
3d7ccbc1ef
commit
0631faf87a
@ -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),
|
||||
|
18
gcc/testsuite/gcc.dg/vla-stexp-1.c
Normal file
18
gcc/testsuite/gcc.dg/vla-stexp-1.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user