diff --git a/include/fmt/format.h b/include/fmt/format.h index 9b4f7357..9909e19f 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -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 constexpr auto operator""_a() { using char_t = remove_cvref_t; return detail::udl_arg(); } -# else +# elif FMT_WHITESPACE_IN_USER_DEFINED_LITERALS constexpr auto operator"" _a(const char* s, size_t) -> detail::udl_arg { return {s}; } +# else +constexpr auto operator""_a(const char* s, size_t) -> detail::udl_arg { + return {s}; +} # endif } // namespace literals #endif // FMT_USE_USER_DEFINED_LITERALS