https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89494
--- Comment #20 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, we are running into PR33916 here, not very much reduced test: class function_arg_info { public: function_arg_info () : type (0), mode (0), named (false), pass_by_reference (false) {} function_arg_info (int mode, bool named) : type (0), mode (mode), named (named), pass_by_reference (false) {} void *type; int mode; unsigned int named : 1; unsigned int pass_by_reference : 1; }; struct args_size { long long int constant; void *var; }; struct locate_and_pad_arg_data { struct args_size size; struct args_size offset; struct args_size slot_offset; struct args_size alignment_pad; int where_pad; unsigned int boundary; }; struct assign_parm_data_one { void *nominal_type; function_arg_info arg; void *entry_parm; void *stack_parm; int nominal_mode; int passed_mode; struct locate_and_pad_arg_data locate; int partial; }; void foo (struct assign_parm_data_one *data) { *data = assign_parm_data_one (); } shows that GCC 4.2.1 (and earlier too) will only clear arg.type, arg.mode, arg.named and arg.pass_by_reference of a temporary before memcpying that temporary to *data. Thus, my proposal is: 2020-04-15 Jakub Jelinek <ja...@redhat.com> PR bootstrap/89494 * function.c (assign_parm_find_data_types): Add workaround for BROKEN_VALUE_INITIALIZATION compilers. --- gcc/function.c.jj 2020-01-12 11:54:36.606410497 +0100 +++ gcc/function.c 2020-04-15 14:15:29.269495427 +0200 @@ -2414,7 +2414,15 @@ assign_parm_find_data_types (struct assi { int unsignedp; +#ifndef BROKEN_VALUE_INITIALIZATION *data = assign_parm_data_one (); +#else + /* Old versions of GCC used to miscompile the above by only initializing + the members with explicit constructors and copying garbage + to the other members. */ + assign_parm_data_one zero_data = {}; + *data = zero_data; +#endif /* NAMED_ARG is a misnomer. We really mean 'non-variadic'. */ if (!cfun->stdarg)