On Sun, Jan 25, 2026 at 5:16 AM Roger Sayle <[email protected]> wrote:
>
>
> This patch resolves PR middle-end/122348, an ICE caused by passing a
> initialized structure containing a flexible array member by value.
> The semantics in C99 (and since gcc 4.4) are that the zero sized array
> at the end of the structure is ignored when passing by value.  Hence
> for the structure in the PR:
>
> struct S {
>     int a;
>     int b[];
> } s = { 0, { 42 } };
>
> when passed by value, sizeof(s) is considered to be 4 bytes, and on
> x86_64 passed in the 32-bit %edi register.  Unfortunately, the code
> in store_constructor isn't expecting initialized fields where the
> type's DECL_SIZE is NULL, which leads to the ICE.  Fixed by explicitly
> ignoring fields where DECL_SIZE is NULL_TREE.  On x86_64, passing "s"
> now compiles to just:
>
> f:      xorl    %edi, %edi
>         jmp     foo
>
>
> This patch has been tested on x86_64-pc-linux-gnu with make bootstrap
> and make -k check, both with and without --target_board=unix{-m32}
> with no new failures.  Ok for mainline?

Ok.

>
> 2026-01-25  Roger Sayle  <[email protected]>
>
> gcc/ChangeLog
>         * gcc/expr.cc (store_constructor): Ignore fields where DECL_SIZE is
> NULL_TREE,
>         i.e. flexible array members.
>
> gcc/testsuite/ChangeLog
>         * g++.dg/pr122348.C: New C++ testcase.
>         * gcc.dg/pr122348.c: New C testcase.
>
>
> Thanks in advance,
> Roger
> --
>

Reply via email to