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 > -- >
