From: Jakub Jelinek Date: Wed, 25 Aug 2021 20:35:21 +0000 (+0200) Subject: c++: Fix up value initialization of structs with zero width bitfields [PR102019] X-Git-Tag: basepoints/gcc-13~5170 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ab84eda5548119908c4e24c6ad953dd7c00a5b7;p=thirdparty%2Fgcc.git c++: Fix up value initialization of structs with zero width bitfields [PR102019] The removal of remove_zero_width_bit_fields, in addition to triggering some ABI issues that need solving anyway (ABI incompatibility between C and C++) also resulted in UB inside of gcc, we now call build_zero_init which calls build_int_cst on an integral type with TYPE_PRECISION of 0. Fixed by ignoring the zero width bitfields. I understand build_value_init_noctor wants to initialize to 0 even unnamed bitfields (of non-zero width), at least until we have some CONSTRUCTOR flag that says that even all the padding bits should be cleared. 2021-08-25 Jakub Jelinek PR c++/102019 * init.c (build_value_init_noctor): Ignore unnamed zero-width bitfields. --- diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 229c84e1d74d..1426f9a54345 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -427,6 +427,11 @@ build_value_init_noctor (tree type, tsubst_flags_t complain) == NULL_TREE)) continue; + /* Ignore unnamed zero-width bitfields. */ + if (DECL_UNNAMED_BIT_FIELD (field) + && integer_zerop (DECL_SIZE (field))) + continue; + /* We could skip vfields and fields of types with user-defined constructors, but I think that won't improve performance at all; it should be simpler in general just