Improve behaviors when disabling exceptions

This commit is contained in:
Carter Li 2015-03-14 14:37:02 +08:00
parent b8c36498f2
commit 593d3aef9e

View File

@ -66,10 +66,24 @@ using fmt::internal::Arg;
#ifndef FMT_THROW #ifndef FMT_THROW
# if FMT_EXCEPTIONS # if FMT_EXCEPTIONS
# define FMT_THROW(x) throw x # define FMT_THROW(x) throw x
# define FMT_RETURN_AFTER_THROW(x)
# else # else
# define FMT_THROW(x) assert(false) # ifdef DEBUG
# define FMT_RETURN_AFTER_THROW(x) return x # define FMT_THROW(x) assert(false && #x)
# elif defined _MSC_VER
# define FMT_THROW(x) __assume(0)
# elif defined __clang__ || FMT_GCC_VERSION >= 405
# define FMT_THROW(x) __builtin_unreachable()
# else
# define FMT_THROW(x) std::abort()
# endif
# endif
#endif
#ifndef FMT_NORETURN
# if defined __GNUC__ || defined __clang__
# define FMT_NORETURN __attribute__((__noreturn__))
# elif defined _MSC_VER
# define FMT_NORETURN __declspec(noreturn)
# endif # endif
#endif #endif
@ -257,9 +271,9 @@ class WidthHandler : public fmt::internal::ArgVisitor<WidthHandler, unsigned> {
public: public:
explicit WidthHandler(fmt::FormatSpec &spec) : spec_(spec) {} explicit WidthHandler(fmt::FormatSpec &spec) : spec_(spec) {}
FMT_NORETURN
unsigned visit_unhandled_arg() { unsigned visit_unhandled_arg() {
FMT_THROW(fmt::FormatError("width is not integer")); FMT_THROW(fmt::FormatError("width is not integer"));
FMT_RETURN_AFTER_THROW(0);
} }
template <typename T> template <typename T>
@ -279,9 +293,9 @@ class WidthHandler : public fmt::internal::ArgVisitor<WidthHandler, unsigned> {
class PrecisionHandler : class PrecisionHandler :
public fmt::internal::ArgVisitor<PrecisionHandler, int> { public fmt::internal::ArgVisitor<PrecisionHandler, int> {
public: public:
FMT_NORETURN
unsigned visit_unhandled_arg() { unsigned visit_unhandled_arg() {
FMT_THROW(fmt::FormatError("precision is not integer")); FMT_THROW(fmt::FormatError("precision is not integer"));
FMT_RETURN_AFTER_THROW(0);
} }
template <typename T> template <typename T>