Fix compilation error in old compilers

This commit is contained in:
Ivan Shynkarenka 2016-09-19 18:34:58 +03:00
parent 611e81ec27
commit 24aa82a2c6
2 changed files with 21 additions and 0 deletions

View File

@ -156,6 +156,15 @@ typedef __int64 intmax_t;
# include <utility> // for std::move # include <utility> // for std::move
#endif #endif
#ifndef FMT_HAS_THREAD_LOCAL
// Thread local storage are available in GCC since version 4.8
// (https://gcc.gnu.org/projects/cxx-status.html) and in Visual C++
// since version 2015.
# define FMT_HAS_THREAD_LOCAL \
(FMT_HAS_FEATURE(cxx_thread_local) || \
(FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900)
#endif
// Check if exceptions are disabled. // Check if exceptions are disabled.
#if defined(__GNUC__) && !defined(__EXCEPTIONS) #if defined(__GNUC__) && !defined(__EXCEPTIONS)
# define FMT_EXCEPTIONS 0 # define FMT_EXCEPTIONS 0
@ -1427,7 +1436,10 @@ class ArgList {
return args_[index]; return args_[index];
} }
#if FMT_HAS_THREAD_LOCAL
// Cross-thread serialization facility // Cross-thread serialization facility
template <typename Char> template <typename Char>
void serialize(std::vector<uint8_t>& buffer) const; void serialize(std::vector<uint8_t>& buffer) const;
template <typename Char> template <typename Char>
@ -1440,8 +1452,11 @@ private:
static void serialize_extra_data(uint8_t*& data_buffer, const internal::Arg& arg); static void serialize_extra_data(uint8_t*& data_buffer, const internal::Arg& arg);
template <typename Char> template <typename Char>
static void deserialize_extra_data(uint8_t*& data_buffer, internal::Arg& arg); static void deserialize_extra_data(uint8_t*& data_buffer, internal::Arg& arg);
#endif
}; };
#if FMT_HAS_THREAD_LOCAL
// Cross-thread serialization facility // Cross-thread serialization facility
template <typename Char> template <typename Char>
@ -1658,6 +1673,8 @@ inline ArgList ArgList::deserialize(std::vector<uint8_t>& buffer)
return args_list; return args_list;
} }
#endif
#define FMT_DISPATCH(call) static_cast<Impl*>(this)->call #define FMT_DISPATCH(call) static_cast<Impl*>(this)->call
/** /**

View File

@ -1654,6 +1654,8 @@ TEST(FormatTest, CustomArgFormatter) {
custom_format("{}", 42); custom_format("{}", 42);
} }
#if FMT_HAS_THREAD_LOCAL
std::string serialize_deserialize(const char *format_str, fmt::ArgList args) { std::string serialize_deserialize(const char *format_str, fmt::ArgList args) {
std::vector<uint8_t> buffer; std::vector<uint8_t> buffer;
args.serialize<char>(buffer); args.serialize<char>(buffer);
@ -1681,3 +1683,5 @@ TEST(FormatTest, Serialization) {
EXPECT_EQ(serialize_deserialize("Elapsed time: {s:.2f} seconds", "s"_a = 1.23), "Elapsed time: 1.23 seconds"); EXPECT_EQ(serialize_deserialize("Elapsed time: {s:.2f} seconds", "s"_a = 1.23), "Elapsed time: 1.23 seconds");
EXPECT_EQ(serialize_deserialize("The answer is {}"_format(42).c_str()), "The answer is 42"); EXPECT_EQ(serialize_deserialize("The answer is {}"_format(42).c_str()), "The answer is 42");
} }
#endif