From f63afd161fb27132d394d0664ef7eb8ff38b8422 Mon Sep 17 00:00:00 2001 From: Sean McBride Date: Mon, 9 May 2022 14:03:51 -0400 Subject: [PATCH] Fixed all clang -Wsigned-enum-bitfield warnings (#2882) Made enums involved in bitfields unsigned by specifying their underlying type as unsigned char. Due to a bug, when specifying an underlying type, gcc < 9.3 warns about bitfields not being big enough to hold the enum, even though they are. So keep the plain enum for old gcc. An example of the bug is here: https://godbolt.org/z/58aEv8zEq --- include/fmt/core.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/include/fmt/core.h b/include/fmt/core.h index 36c92f667086..8dea0508a249 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -2029,14 +2029,23 @@ template class basic_format_args { // between clang and gcc on ARM (#1919). using format_args = basic_format_args; -// We cannot use enum classes as bit fields because of a gcc bug +// We cannot use enum classes as bit fields because of a gcc bug, +// so we put them in namespaces instead. // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414. +// Additionally, if an underlying type is specified, older gcc incorrectly warns +// that the type is too small for all the enum values. +// Both these bugs are fixed as of gcc 9.3. +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 903 +# define FMT_ENUM_UNDERLYING_TYPE(type) +#else +# define FMT_ENUM_UNDERLYING_TYPE(type) : type +#endif namespace align { -enum type { none, left, right, center, numeric }; +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char) { none, left, right, center, numeric }; } using align_t = align::type; namespace sign { -enum type { none, minus, plus, space }; +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char) { none, minus, plus, space }; } using sign_t = sign::type;