8#include <QtCore/qcompilerdetection.h>
9#include <QtCore/qtconfigmacros.h>
10#include <QtCore/qtcoreexports.h>
11#include <QtCore/qtnoop.h>
14#pragma qt_class(QtAssert)
15#pragma qt_sync_stop_processing
20#if defined(__cplusplus
)
22#if !defined(Q_CC_MSVC_ONLY)
26Q_CORE_EXPORT
void qt_assert(
const char *assertion,
const char *file,
int line)
noexcept;
29# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
30# define Q_ASSERT(cond) static_cast<void>(false && (cond))
32# define Q_ASSERT(cond) ((cond) ? static_cast<void>(0
) : QT_PREPEND_NAMESPACE(qt_assert)(#cond, __FILE__, __LINE__))
36#if !defined(Q_CC_MSVC_ONLY)
41void qt_assert_x(
const char *where,
const char *what,
const char *file,
int line)
noexcept;
42inline bool qt_no_assert_x(
bool,
const char *,
const char *)
noexcept {
return false; }
44#if !defined(Q_ASSERT_X)
45# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
46# define Q_ASSERT_X(cond, where, what)
47 static_cast<void>(false && QT_PREPEND_NAMESPACE(qt_no_assert_x)(bool(cond), where, what))
49# define Q_ASSERT_X(cond, where, what) ((cond) ? static_cast<void>(0
) : QT_PREPEND_NAMESPACE(qt_assert_x)(where, what, __FILE__, __LINE__))
59# define Q_PRE_X(cond, what)
64Q_NORETURN Q_DECL_COLD_FUNCTION
65Q_CORE_EXPORT
void qBadAlloc();
67#ifdef QT_NO_EXCEPTIONS
68# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
69# define Q_CHECK_PTR(p) qt_noop()
71# define Q_CHECK_PTR(p) do {if (!(p)) QT_PREPEND_NAMESPACE(qt_check_pointer)(__FILE__,__LINE__);} while (false)
74# define Q_CHECK_PTR(p) do { if (!(p)) QT_PREPEND_NAMESPACE(qBadAlloc)(); } while (false)
78inline T *q_check_ptr(T *p) { Q_CHECK_PTR(p);
return p; }
81#define Q_UNREACHABLE()
83 Q_ASSERT_X(false, "Q_UNREACHABLE()", "Q_UNREACHABLE was reached");
87#ifndef Q_UNREACHABLE_RETURN
88# ifdef Q_COMPILER_COMPLAINS_ABOUT_RETURN_AFTER_UNREACHABLE
89# define Q_UNREACHABLE_RETURN(...) Q_UNREACHABLE()
91# define Q_UNREACHABLE_RETURN(...) do { Q_UNREACHABLE
(); return __VA_ARGS__; } while (0
)
95Q_DECL_DEPRECATED_X(
"Q_ASSUME() is deprecated because it can produce worse code than when it's absent; "
96 "use C++23 [[assume]] instead")
97inline bool qt_assume_is_deprecated(
bool cond)
noexcept {
return cond; }
99 [] (bool valueOfExpression) {
100 Q_ASSERT_X(valueOfExpression, "Q_ASSUME()", "Assumption in Q_ASSUME(\"" #Expr "\") was not correct");
101 Q_ASSUME_IMPL(valueOfExpression);
102 }(qt_assume_is_deprecated(Expr))
107# define Q_PRESUME_IMPL(assumption) __builtin_assume(assumption)
108#elif __has_cpp_attribute(assume)
110# define Q_PRESUME_IMPL(assumption) [[assume(assumption)]]
111#elif defined(Q_CC_MSVC)
112# define Q_PRESUME_IMPL(assumption) __assume(assumption)
114# define Q_PRESUME_IMPL(assumption) (void)0
117#define Q_PRESUME(assumption)
120 Q_PRESUME_IMPL
(assumption);
125# define Q_STATIC_ASSERT(Condition) static_assert(bool(Condition), #Condition)
126# define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
128#elif defined(Q_COMPILER_STATIC_ASSERT)
130# define Q_STATIC_ASSERT(Condition) _Static_assert(!!(Condition), #Condition)
131# define Q_STATIC_ASSERT_X(Condition, Message) _Static_assert(!!(Condition), Message)
134# define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
135# define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
137# define Q_STATIC_ASSERT(Condition)
138 typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) [(Condition) ? 1
: -1
];
140# define Q_STATIC_ASSERT(Condition)
141 typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) [(Condition) ? 1
: -1
];
143# define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept
QT_BEGIN_NAMESPACE Q_NORETURN void qAbort()
void qt_check_pointer(const char *n, int l) noexcept
#define Q_ASSERT_X(cond, x, msg)