Prevent nested fmt::arg

This commit is contained in:
jamboree 2015-06-09 17:14:39 +08:00
parent bbcb6e8394
commit 8bfc7dfcea

View File

@ -164,10 +164,12 @@ inline uint32_t clzll(uint64_t x) {
// This should be used in the private: declarations for a class // This should be used in the private: declarations for a class
#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ #if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \
(FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800 (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800
# define FMT_DELETED_OR_UNDEFINED = delete
# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ # define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \ TypeName(const TypeName&) = delete; \
TypeName& operator=(const TypeName&) = delete TypeName& operator=(const TypeName&) = delete
#else #else
# define FMT_DELETED_OR_UNDEFINED
# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ # define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \ TypeName(const TypeName&); \
TypeName& operator=(const TypeName&) TypeName& operator=(const TypeName&)
@ -968,11 +970,9 @@ class MakeValue : public Arg {
return IsConvertibleToInt<T>::value ? Arg::INT : Arg::CUSTOM; return IsConvertibleToInt<T>::value ? Arg::INT : Arg::CUSTOM;
} }
template <typename Char_> MakeValue(const NamedArg<Char> &value) { pointer = &value; }
MakeValue(const NamedArg<Char_> &value) { pointer = &value; }
template <typename Char_> static uint64_t type(const NamedArg<Char> &) { return Arg::NAMED_ARG; }
static uint64_t type(const NamedArg<Char_> &) { return Arg::NAMED_ARG; }
}; };
template <typename Char> template <typename Char>
@ -2745,6 +2745,12 @@ template <typename T>
inline internal::NamedArg<wchar_t> arg(WStringRef name, const T &arg) { inline internal::NamedArg<wchar_t> arg(WStringRef name, const T &arg) {
return internal::NamedArg<wchar_t>(name, arg); return internal::NamedArg<wchar_t>(name, arg);
} }
template <typename Char>
void arg(StringRef name, const internal::NamedArg<Char>&) FMT_DELETED_OR_UNDEFINED;
template <typename Char>
void arg(WStringRef name, const internal::NamedArg<Char>&) FMT_DELETED_OR_UNDEFINED;
} }
#if FMT_GCC_VERSION #if FMT_GCC_VERSION