diff --git a/include/fmt/format.h b/include/fmt/format.h index fc61330de3ea..76dacc971d08 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -153,7 +153,10 @@ FMT_END_NAMESPACE #ifndef FMT_USE_USER_DEFINED_LITERALS // EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs. -# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ +// +// 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 >= 409 || \ FMT_MSC_VERSION >= 1900) && \ (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480) # define FMT_USE_USER_DEFINED_LITERALS 1 @@ -4459,7 +4462,7 @@ template constexpr auto operator""_a() { return detail::udl_arg(); } # else -constexpr auto operator"" _a(const char* s, size_t) -> detail::udl_arg { +constexpr auto operator""_a(const char* s, size_t) -> detail::udl_arg { return {s}; } # endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6f614d134ecf..ec97ac29a724 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -175,7 +175,12 @@ if (FMT_PEDANTIC) endif () # These tests are disabled on Windows because they take too long. -if (FMT_PEDANTIC AND NOT WIN32) +# They are disabled on GCC < 4.9 because it can not parse UDLs without +# a space after `operator""` but that is an incorrect syntax for any more +# modern compiler. +if (FMT_PEDANTIC AND NOT WIN32 AND NOT ( + CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND + CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) # Test if incorrect API usages produce compilation error. add_test(compile-error-test ${CMAKE_CTEST_COMMAND} --build-and-test