DECL_SIZE(x) is NULL if x is a flexible array member, but I forgot to
check it in r12-7962. Then if we increase the size of a struct with
flexible array member (by using aligned attribute), the code will
dereference NULL trying to use the "size" of the flexible array member.
gcc/
* config/mips/mips.cc (mips_function_arg): Check if DECL_SIZE is
NULL before dereferencing it.
gcc/testsuite/
* gcc.target/mips/pr102024-4.c: New test.
an ABI change. */
if (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (field))
continue;
- if (integer_zerop (DECL_SIZE (field)))
+ if (DECL_SIZE (field)
+ && integer_zerop (DECL_SIZE (field)))
{
zero_width_field_abi_change = true;
continue;
--- /dev/null
+// { dg-do compile }
+// { dg-options "-mabi=64 -mhard-float" }
+
+struct __attribute__((aligned(16))) test {
+ int x[0];
+ double b;
+ int f[];
+};
+
+void check(struct test) {} // { dg-message "the ABI for passing a value containing zero-width fields before an adjacent 64-bit floating-point field was changed in GCC 12.1" }