mips: Fix an ICE caused by r12-7962
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.
This commit is contained in:
parent
2a82301d40
commit
be07535d0f
2 changed files with 12 additions and 1 deletions
|
@ -6054,7 +6054,8 @@ mips_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
|
|||
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;
|
||||
|
|
10
gcc/testsuite/gcc.target/mips/pr102024-4.c
Normal file
10
gcc/testsuite/gcc.target/mips/pr102024-4.c
Normal file
|
@ -0,0 +1,10 @@
|
|||
// { 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" }
|
Loading…
Add table
Reference in a new issue