From: Alexandre Oliva Date: Thu, 30 Nov 2023 06:40:51 +0000 (-0300) Subject: c++: mark short-enums as packed X-Git-Tag: basepoints/gcc-15~4152 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=792936a0669c00982d4325e0113903a75b71a9c7;p=thirdparty%2Fgcc.git c++: mark short-enums as packed Unlike C, C++ doesn't mark enums shortened by -fshort-enums as packed. This makes for undesirable warning differences between C and C++, e.g. c-c++-common/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early*.c triggers a warning about a type cast from a pointer to enum that, when packed, might not be sufficiently aligned. This change is not enough for that warning to trigger. The tree expression generated by the C++ front-end is also a little too complicated for us get to the base pointer. A separate patch takes care of that. for gcc/cp/ChangeLog * decl.cc (finish_enum_value_list): Set TYPE_PACKED if use_short_enum, and propagate it to variants. --- diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index bce806819d50..2f2dbb8d1072 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -16913,6 +16913,12 @@ finish_enum_value_list (tree enumtype) /* If -fstrict-enums, still constrain TYPE_MIN/MAX_VALUE. */ if (flag_strict_enums) set_min_and_max_values_for_integral_type (enumtype, precision, sgn); + + if (use_short_enum) + { + TYPE_PACKED (enumtype) = use_short_enum; + fixup_attribute_variants (enumtype); + } } else underlying_type = ENUM_UNDERLYING_TYPE (enumtype);