mirror of
https://github.com/fmtlib/fmt.git
synced 2025-09-26 22:50:55 +02:00
Add FMT_CUSTOM_ASSERT_FAIL (#4505)
That way one can provide ones own implementation for assert_fail, which is moved out of the detail namespace. For binary compatibility the detail version stays to call the outer version.
This commit is contained in:
@@ -348,6 +348,9 @@ template <typename T> constexpr auto max_of(T a, T b) -> T {
|
|||||||
return a > b ? a : b;
|
return a > b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FMT_NORETURN FMT_API void assert_fail(const char* file, int line,
|
||||||
|
const char* message);
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
// Suppresses "unused variable" warnings with the method described in
|
// Suppresses "unused variable" warnings with the method described in
|
||||||
// https://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/.
|
// https://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/.
|
||||||
@@ -388,7 +391,7 @@ FMT_NORETURN FMT_API void assert_fail(const char* file, int line,
|
|||||||
# define FMT_ASSERT(condition, message) \
|
# define FMT_ASSERT(condition, message) \
|
||||||
((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \
|
((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \
|
||||||
? (void)0 \
|
? (void)0 \
|
||||||
: fmt::detail::assert_fail(__FILE__, __LINE__, (message)))
|
: ::fmt::assert_fail(__FILE__, __LINE__, (message)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FMT_USE_INT128
|
#ifdef FMT_USE_INT128
|
||||||
|
@@ -31,14 +31,22 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
|
#ifndef FMT_CUSTOM_ASSERT_FAIL
|
||||||
FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
|
FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
|
||||||
// Use unchecked std::fprintf to avoid triggering another assertion when
|
// Use unchecked std::fprintf to avoid triggering another assertion when
|
||||||
// writing to stderr fails.
|
// writing to stderr fails.
|
||||||
fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
|
fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
// For binary compatibility.
|
||||||
|
FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
|
||||||
|
::fmt::assert_fail(file, line, message);
|
||||||
|
}
|
||||||
|
|
||||||
FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
|
FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
|
||||||
string_view message) noexcept {
|
string_view message) noexcept {
|
||||||
|
@@ -170,8 +170,7 @@ template <typename T> struct iterator_traits<fmt::basic_appender<T>> {
|
|||||||
#elif FMT_USE_EXCEPTIONS
|
#elif FMT_USE_EXCEPTIONS
|
||||||
# define FMT_THROW(x) throw x
|
# define FMT_THROW(x) throw x
|
||||||
#else
|
#else
|
||||||
# define FMT_THROW(x) \
|
# define FMT_THROW(x) ::fmt::assert_fail(__FILE__, __LINE__, (x).what())
|
||||||
::fmt::detail::assert_fail(__FILE__, __LINE__, (x).what())
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of
|
// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of
|
||||||
|
Reference in New Issue
Block a user