Avoid a space in the UDL definition except on GCC before 4.9

Clang 18 has grown a warning about the space being deprecated which
is enabled by default in their nightly binaries. However GCC before 4.9
will reject the UDL definition unless there is a space there, so we need
to keep the space conditionally for it.
This commit is contained in:
Dana Jansens 2023-08-23 22:25:34 -04:00 committed by GitHub
parent 0bffed8957
commit b84b3bed47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -152,12 +152,21 @@ FMT_END_NAMESPACE
#ifndef FMT_USE_USER_DEFINED_LITERALS
// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs.
//
// GCC before 4.9 requires a space in `operator"" _a` which is invalid in later
// compiler versions.
# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \
FMT_MSC_VERSION >= 1900) && \
(!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480)
# define FMT_USE_USER_DEFINED_LITERALS 1
# if FMT_GCC_VERSION > 0 && FMT_GCC_VERSION < 409
# define FMT_WHITESPACE_IN_USER_DEFINED_LITERALS 1
# else
# define FMT_WHITESPACE_IN_USER_DEFINED_LITERALS 0
# endif
# else
# define FMT_USE_USER_DEFINED_LITERALS 0
# define FMT_WHITESPACE_IN_USER_DEFINED_LITERALS 0
# endif
#endif
@ -4427,10 +4436,14 @@ template <detail_exported::fixed_string Str> constexpr auto operator""_a() {
using char_t = remove_cvref_t<decltype(Str.data[0])>;
return detail::udl_arg<char_t, sizeof(Str.data) / sizeof(char_t), Str>();
}
# else
# elif FMT_WHITESPACE_IN_USER_DEFINED_LITERALS
constexpr auto operator"" _a(const char* s, size_t) -> detail::udl_arg<char> {
return {s};
}
# else
constexpr auto operator""_a(const char* s, size_t) -> detail::udl_arg<char> {
return {s};
}
# endif
} // namespace literals
#endif // FMT_USE_USER_DEFINED_LITERALS