On Wed, Sep 22, 2021 at 09:43:23AM -0500, Bill Schmidt wrote: > > How previously? is this one that will need all the backports? > > No, the change happened recently on trunk.
It is actually more complex. Both C and C++ FEs thought they were removing zero bit fields, but neither did that, then the non-working code from C FE has been removed, and finally in 4.5 the C++ FE has been "fixed" to remove zero bit fields "correctly". And 12 is going to remove the removal, but marks FIELD_DECLs that were in 4.5-11 removed and now aren't for -Wpsabi purposes. So, for most backends, C and C++ was ABI compatible in presence of :0 initially, then for several got incompatible in 4.5 and now is time to decide for each backend what to do according to their psABI, if :0 should be ignored or not during the function arg/return value passing decisions. > > > --- a/gcc/config/rs6000/rs6000-call.c > > > +++ b/gcc/config/rs6000/rs6000-call.c > > > @@ -6227,7 +6227,7 @@ const struct altivec_builtin_types > > > altivec_overloaded_builtins[] = { > > > static int > > > rs6000_aggregate_candidate (const_tree type, machine_mode *modep, > > > - int *empty_base_seen) > > > + int *empty_base_seen, int *zero_width_bf_seen) > > > { > > > machine_mode mode; > > > HOST_WIDE_INT size; > > > @@ -6298,7 +6298,8 @@ rs6000_aggregate_candidate (const_tree type, > > > machine_mode *modep, > > > return -1; > > > count = rs6000_aggregate_candidate (TREE_TYPE (type), modep, > > > - empty_base_seen); > > > + empty_base_seen, > > > + zero_width_bf_seen); > > > if (count == -1 > > > || !index > > > || !TYPE_MAX_VALUE (index) > > > @@ -6336,6 +6337,12 @@ rs6000_aggregate_candidate (const_tree type, > > > machine_mode *modep, > > > if (TREE_CODE (field) != FIELD_DECL) > > > continue; > > > + if (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (field)) > > > + { > > > + *zero_width_bf_seen = 1; > > > + continue; > > > + } So, from what you wrote, :0 in the ppc* psABIs the intent is that :0 is not ignored, right? In that case I don't really understand the above (the continue in particular). Because the continue means it is ignored for C++ and not ignored for C, so basically you return to the 4.5-11 ABI incompatibility between C and C++. C++ :0 will have DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD set, C :0 will not... Jakub