7#include <QtTest/qttestglobal.h>
8#include <QtTest/qtesttostring.h>
10#include <QtCore/qstring.h>
11#include <QtCore/qnamespace.h>
12#include <QtCore/qmetatype.h>
13#include <QtCore/qmetaobject.h>
14#include <QtCore/qsharedpointer.h>
15#include <QtCore/qtemporarydir.h>
16#include <QtCore/qthread.h>
17#include <QtCore/qxpfunctional.h>
21#ifndef QT_NO_EXCEPTIONS
27#ifndef QT_NO_EXCEPTIONS
29#ifdef QTEST_THROW_ON_FAILURE
30# define QTEST_FAIL_ACTION QTest::Internal::throwOnFail()
32# define QTEST_FAIL_ACTION do { QTest::Internal::maybeThrowOnFail(); return; } while (false)
35#ifdef QTEST_THROW_ON_SKIP
36# define QTEST_SKIP_ACTION QTest::Internal::throwOnSkip()
38# define QTEST_SKIP_ACTION do { QTest::Internal::maybeThrowOnSkip(); return; } while (false)
42# if defined(QTEST_THROW_ON_FAILURE) || defined(QTEST_THROW_ON_SKIP)
43# error QTEST_THROW_ON_FAILURE/SKIP require exception support enabled.
47#ifndef QTEST_FAIL_ACTION
48# define QTEST_FAIL_ACTION return
51#ifndef QTEST_SKIP_ACTION
52# define QTEST_SKIP_ACTION return
58#define QVERIFY(statement) \
60 if (!QTest::qVerify(static_cast<bool>(statement), #statement, "", __FILE__, __LINE__))\
64#define QFAIL(message) \
66 QTest::qFail(static_cast<const char *>(message), __FILE__, __LINE__);\
70#define QVERIFY2(statement, description) \
73 if (!QTest::qVerify(true, #statement, static_cast<const char *>(description), __FILE__, __LINE__))\
76 if (!QTest::qVerify(false, #statement, static_cast<const char *>(description), __FILE__, __LINE__))\
81#define QCOMPARE(actual, expected) \
83 if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\
87#define QCOMPARE_OP_IMPL(lhs, rhs, op, opId) \
89 if (!QTest::qCompareOp<QTest::ComparisonOperation::opId>(lhs, rhs, #lhs, #rhs, __FILE__, __LINE__)) \
93#define QCOMPARE_EQ(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, ==, Equal)
94#define QCOMPARE_NE(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, !=, NotEqual)
95#define QCOMPARE_LT(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, <, LessThan)
96#define QCOMPARE_LE(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, <=, LessThanOrEqual)
97#define QCOMPARE_GT(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, >, GreaterThan)
98#define QCOMPARE_GE(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, >=, GreaterThanOrEqual)
100#ifndef QT_NO_EXCEPTIONS
102# define QVERIFY_THROWS_NO_EXCEPTION(...) \
108 QTest::qCaught(nullptr, __FILE__, __LINE__); \
114#if QT_DEPRECATED_SINCE(6, 3)
117 "use QVERIFY_THROWS_EXCEPTION(type, expr...) instead")
118inline void useVerifyThrowsException() {}
120# define QVERIFY_EXCEPTION_THROWN(expression, exceptiontype) \
121 QVERIFY_THROWS_EXCEPTION(exceptiontype, QTest::useVerifyThrowsException(); expression)
124# define QVERIFY_THROWS_EXCEPTION(exceptiontype, ...) \
126 bool qverify_throws_exception_did_not_throw = false; \
129 QTest::qFail("Expected exception of type " #exceptiontype " to be thrown" \
130 " but no exception caught", __FILE__, __LINE__); \
131 qverify_throws_exception_did_not_throw = true; \
132 } QT_CATCH (const exceptiontype &) { \
135 QTest::qCaught(#exceptiontype, __FILE__, __LINE__); \
138 if (qverify_throws_exception_did_not_throw) \
151# define QVERIFY_THROWS_EXCEPTION(...) \
152 static_assert(false, "Support for exceptions is disabled")
153# define QVERIFY_THROWS_NO_EXCEPTION(...) \
154 static_assert(false, "Support for exceptions is disabled")
168#define QTRY_LOOP_IMPL(expr, timeoutValue, step) \
173 for (; qt_test_i < timeoutValue && !(QTest::runningTest() && QTest::currentTestResolved()) \
174 && !(expr); qt_test_i += step) { \
175 QTest::qWait(step); \
179#define QTRY_TIMEOUT_DEBUG_IMPL(expr, timeoutValue, step) \
180 if (!(QTest::runningTest() && QTest::currentTestResolved()) && !(expr)) { \
181 QTRY_LOOP_IMPL(expr, 2 * (timeoutValue), step) \
183 QFAIL(qPrintable(QTest::Internal::formatTryTimeoutDebugMessage(\
184 u8"" #expr, timeoutValue, timeoutValue + qt_test_i))); \
188#define QTRY_IMPL(expr, timeoutAsGiven)\
189 const auto qt_test_timeoutAsMs = [&] { \
191 using namespace std::chrono_literals; \
192 return std::chrono::milliseconds{timeoutAsGiven}; \
194 const int qt_test_step = qt_test_timeoutAsMs.count() < 350 ? qt_test_timeoutAsMs.count() / 7 + 1 : 50; \
195 const int qt_test_timeoutValue = qt_test_timeoutAsMs.count(); \
196 { QTRY_LOOP_IMPL(expr, qt_test_timeoutValue, qt_test_step) } \
197 QTRY_TIMEOUT_DEBUG_IMPL(expr, qt_test_timeoutValue, qt_test_step)
201#define QTRY_VERIFY_WITH_TIMEOUT(expr, timeout) \
203 QTRY_IMPL(expr, timeout) \
207#define QTRY_VERIFY(expr) QTRY_VERIFY_WITH_TIMEOUT(expr, 5s)
210#define QTRY_VERIFY2_WITH_TIMEOUT(expr, messageExpression, timeout) \
212 QTRY_IMPL(expr, timeout) \
213 QVERIFY2(expr, messageExpression); \
216#define QTRY_VERIFY2(expr, messageExpression) QTRY_VERIFY2_WITH_TIMEOUT(expr, messageExpression, 5s)
219#define QTRY_COMPARE_WITH_TIMEOUT(expr, expected, timeout) \
221 QTRY_IMPL((expr) == (expected), timeout) \
222 QCOMPARE(expr, expected); \
225#define QTRY_COMPARE(expr, expected) QTRY_COMPARE_WITH_TIMEOUT(expr, expected, 5s)
227#define QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, op, opId, timeout) \
229 using Q_Cmp = QTest::Internal::Compare<QTest::ComparisonOperation::opId>; \
230 QTRY_IMPL(Q_Cmp::compare((computed), (baseline)), timeout) \
231 QCOMPARE_OP_IMPL(computed, baseline, op, opId); \
234#define QTRY_COMPARE_EQ_WITH_TIMEOUT(computed, baseline, timeout) \
235 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, ==, Equal, timeout)
237#define QTRY_COMPARE_EQ(computed, baseline) QTRY_COMPARE_EQ_WITH_TIMEOUT(computed, baseline, 5s)
239#define QTRY_COMPARE_NE_WITH_TIMEOUT(computed, baseline, timeout) \
240 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, !=, NotEqual, timeout)
242#define QTRY_COMPARE_NE(computed, baseline) QTRY_COMPARE_NE_WITH_TIMEOUT(computed, baseline, 5s)
244#define QTRY_COMPARE_LT_WITH_TIMEOUT(computed, baseline, timeout) \
245 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, <, LessThan, timeout)
247#define QTRY_COMPARE_LT(computed, baseline) QTRY_COMPARE_LT_WITH_TIMEOUT(computed, baseline, 5s)
249#define QTRY_COMPARE_LE_WITH_TIMEOUT(computed, baseline, timeout) \
250 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, <=, LessThanOrEqual, timeout)
252#define QTRY_COMPARE_LE(computed, baseline) QTRY_COMPARE_LE_WITH_TIMEOUT(computed, baseline, 5s)
254#define QTRY_COMPARE_GT_WITH_TIMEOUT(computed, baseline, timeout) \
255 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, >, GreaterThan, timeout)
257#define QTRY_COMPARE_GT(computed, baseline) QTRY_COMPARE_GT_WITH_TIMEOUT(computed, baseline, 5s)
259#define QTRY_COMPARE_GE_WITH_TIMEOUT(computed, baseline, timeout) \
260 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, >=, GreaterThanOrEqual, timeout)
262#define QTRY_COMPARE_GE(computed, baseline) QTRY_COMPARE_GE_WITH_TIMEOUT(computed, baseline, 5s)
264#define QSKIP_INTERNAL(statement) \
266 QTest::qSkip(static_cast<const char *>(statement), __FILE__, __LINE__);\
270#define QSKIP(statement, ...) QSKIP_INTERNAL(statement)
272#define QEXPECT_FAIL(dataIndex, comment, mode)\
274 if (!QTest::qExpectFail(dataIndex, static_cast<const char *>(comment), QTest::mode, __FILE__, __LINE__))\
278#define QFETCH(Type, name)\
279 Type name = *static_cast<Type *>(QTest::qData(#name, ::qMetaTypeId<typename std::remove_cv<Type >::type>()))
281#define QFETCH_GLOBAL(Type, name)\
282 Type name = *static_cast<Type *>(QTest::qGlobalData(#name, ::qMetaTypeId<typename std::remove_cv<Type >::type>()))
284#define QTEST(actual, testElement)\
286 if (!QTest::qTest(actual, testElement, #actual, #testElement, __FILE__, __LINE__))\
290#ifdef QT_TESTCASE_BUILDDIR
292#ifndef QT_TESTCASE_SOURCEDIR
293#define QT_TESTCASE_SOURCEDIR nullptr
296# define QFINDTESTDATA(basepath)\
297 QTest::qFindTestData(basepath, __FILE__, __LINE__, QT_TESTCASE_BUILDDIR, QT_TESTCASE_SOURCEDIR)
299# define QFINDTESTDATA(basepath)\
300 QTest::qFindTestData(basepath, __FILE__, __LINE__)
303# define QEXTRACTTESTDATA(resourcePath) \
304 QTest::qExtractTestData(resourcePath)
320 template <ComparisonOperation>
struct Compare;
323 template <
typename T1,
typename T2>
static bool compare(T1 &&lhs, T2 &&rhs)
324 {
return std::forward<T1>(lhs) == std::forward<T2>(rhs); }
328 template <
typename T1,
typename T2>
static bool compare(T1 &&lhs, T2 &&rhs)
329 {
return std::forward<T1>(lhs) != std::forward<T2>(rhs); }
333 template <
typename T1,
typename T2>
static bool compare(T1 &&lhs, T2 &&rhs)
334 {
return std::forward<T1>(lhs) < std::forward<T2>(rhs); }
338 template <
typename T1,
typename T2>
static bool compare(T1 &&lhs, T2 &&rhs)
339 {
return std::forward<T1>(lhs) <= std::forward<T2>(rhs); }
343 template <
typename T1,
typename T2>
static bool compare(T1 &&lhs, T2 &&rhs)
344 {
return std::forward<T1>(lhs) > std::forward<T2>(rhs); }
348 template <
typename T1,
typename T2>
static bool compare(T1 &&lhs, T2 &&rhs)
349 {
return std::forward<T1>(lhs) >= std::forward<T2>(rhs); }
376 Q_TESTLIB_EXPORT
int qRun();
382#if QT_CONFIG(batch_test_support) || defined(Q_QDOC)
383 using TestEntryFunction = int (*)(int,
char **);
384 Q_TESTLIB_EXPORT
void qRegisterTestCase(
const QString &
name, TestEntryFunction entryFunction);
419 Q_TESTLIB_EXPORT
bool qVerify(
bool statement,
const char *statementStr,
const char *description,
430#if QT_DEPRECATED_SINCE(6, 3)
432 Q_TESTLIB_EXPORT
void qWarn(const
char *
message, const
char *
file =
nullptr,
int line = 0);
435#if QT_CONFIG(regularexpression)
440#if QT_CONFIG(regularexpression)
444#if QT_CONFIG(temporaryfile)
445 Q_TESTLIB_EXPORT QSharedPointer<QTemporaryDir> qExtractTestData(
const QString &dirName);
447 Q_TESTLIB_EXPORT
QString qFindTestData(
const char* basepath,
const char*
file =
nullptr,
int line = 0,
const char* builddir =
nullptr,
const char* sourcedir =
nullptr);
448 Q_TESTLIB_EXPORT
QString qFindTestData(
const QString& basepath,
const char*
file =
nullptr,
int line = 0,
const char* builddir =
nullptr,
const char *sourcedir =
nullptr);
450 Q_TESTLIB_EXPORT
void *
qData(
const char *tagName,
int typeId);
451 Q_TESTLIB_EXPORT
void *
qGlobalData(
const char *tagName,
int typeId);
452 Q_TESTLIB_EXPORT
void *
qElementData(
const char *elementName,
int metaTypeId);
466#if QT_DEPRECATED_SINCE(6, 4)
468 "or an overload that takes only failure message, if you "
469 "do not need to stringify the values")
470 Q_TESTLIB_EXPORT
bool compare_helper(
bool success, const
char *failureMsg,
471 char *actualVal,
char *expectedVal,
472 const
char *actual, const
char *
expected,
475#if QT_DEPRECATED_SINCE(6, 8)
477 "or an overload that takes only failure message, if you "
478 "do not need to stringify the values")
479 Q_TESTLIB_EXPORT
bool compare_helper(
bool success, const
char *failureMsg,
480 qxp::function_ref<const
char*()> actualVal,
481 qxp::function_ref<const
char*()> expectedVal,
482 const
char *actual, const
char *
expected,
485 Q_TESTLIB_EXPORT
bool compare_helper(
bool success,
const char *failureMsg,
486 const void *actualPtr,
const void *expectedPtr,
487 const char *(*actualFormatter)(
const void *),
488 const char *(*expectedFormatter)(
const void *),
489 const char *actual,
const char *
expected,
491 Q_TESTLIB_EXPORT
bool compare_helper(
bool success,
const char *failureMsg,
492 const char *actual,
const char *
expected,
497 template <
typename T>
500 using QIsSameTConstChar = std::is_same<T, const char*>;
501 static_assert(!QIsSameTConstChar::value,
"const char* is not allowed as a test data format.");
510 Q_TESTLIB_EXPORT
bool qCompare(
float const &
t1,
float const &
t2,
513 Q_TESTLIB_EXPORT
bool qCompare(
double const &
t1,
double const &
t2,
519#if QT_POINTER_SIZE == 8
524 Q_TESTLIB_EXPORT
bool qCompare(
unsigned t1,
unsigned t2,
const char *actual,
const char *
expected,
528 const char *actual,
const char *
expected,
531 const char *actual,
const char *
expected,
534 const char *actual,
const char *
expected,
537 const char *actual,
const char *
expected,
543 const char *actual,
const char *
expected,
549 const char *actual,
const char *
expected,
558 auto formatter = Internal::pointerToString<void>;
560 const_cast<const void *
>(
t1),
const_cast<const void *
>(
t2),
567 auto formatter = Internal::pointerToString<QObject>;
576 auto lhsFormatter = Internal::pointerToString<QObject>;
577 auto rhsFormatter = Internal::genericToString<std::nullptr_t>;
578 return compare_helper(
t1 ==
nullptr,
"Compared QObject pointers are not the same",
579 const_cast<const QObject *
>(
t1),
nullptr,
586 auto lhsFormatter = Internal::genericToString<std::nullptr_t>;
587 auto rhsFormatter = Internal::pointerToString<QObject>;
588 return compare_helper(
nullptr ==
t2,
"Compared QObject pointers are not the same",
589 nullptr,
const_cast<const QObject *
>(
t2),
596 auto lhsFormatter = Internal::pointerToString<void>;
597 auto rhsFormatter = Internal::genericToString<std::nullptr_t>;
599 const_cast<const void *
>(
t1),
nullptr,
606 auto lhsFormatter = Internal::genericToString<std::nullptr_t>;
607 auto rhsFormatter = Internal::pointerToString<void>;
609 nullptr,
const_cast<const void *
>(
t2),
613 template <
typename T1,
typename T2 = T1>
617 using D1 = std::decay_t<T1>;
618 using D2 = std::decay_t<T2>;
621 std::addressof(
t1), std::addressof(
t2),
622 genericToString<D1>, genericToString<D2>,
626 inline bool qCompare(
double const &
t1,
float const &
t2,
const char *actual,
632 inline bool qCompare(
float const &
t1,
double const &
t2,
const char *actual,
638 template <
typename T>
644 template <
typename T>
651 template <
typename T>
657 template <
typename T>
664 template <
typename T1,
typename T2>
670 template <
typename T1,
typename T2>
677 inline bool qCompare(
const char *
t1,
const char *
t2,
const char *actual,
703 inline bool qTest(
const T& actual,
const char *elementName,
const char *actualStr,
710#if QT_DEPRECATED_SINCE(6, 8)
712 Q_TESTLIB_EXPORT
bool reportResult(
bool success,
qxp::function_ref<const
char*()> lhs,
713 qxp::function_ref<const
char*()> rhs,
714 const
char *lhsExpr, const
char *rhsExpr,
718 Q_TESTLIB_EXPORT
bool reportResult(
bool success,
const void *lhs,
const void *rhs,
719 const char *(*lhsFormatter)(
const void*),
720 const char *(*rhsFormatter)(
const void*),
721 const char *lhsExpr,
const char *rhsExpr,
724 template <ComparisonOperation op,
typename T1,
typename T2 = T1>
725 inline bool qCompareOp(T1 &&lhs, T2 &&rhs,
const char *lhsExpr,
const char *rhsExpr,
728 using D1 = std::decay_t<T1>;
729 using D2 = std::decay_t<T2>;
734 bool result = Comparator::compare(std::forward<T1>(lhs), std::forward<T2>(rhs));
736 genericToString<D1>, genericToString<D2>,
743#define QWARN(msg) QTest::qWarn(static_cast<const char *>(msg), __FILE__, __LINE__)
\inmodule QtCore \reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
~ThrowOnFailDisabler()
Destructor.
ThrowOnFailDisabler()
Constructor.
ThrowOnFailEnabler()
Constructor.
~ThrowOnFailEnabler()
Destructor.
ThrowOnSkipDisabler()
Constructor.
~ThrowOnSkipDisabler()
Destructor.
~ThrowOnSkipEnabler()
Destructor.
ThrowOnSkipEnabler()
Constructor.
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
QList< QVariant > arguments
Combined button and popup list for selecting options.
const char * toString(QSizePolicy::Policy p)
const char * pointerToString(const void *arg)
Q_TESTLIB_EXPORT void maybeThrowOnFail()
Q_TESTLIB_EXPORT QString formatTryTimeoutDebugMessage(q_no_char8_t::QUtf8StringView expr, int timeout, int actual)
Q_TESTLIB_EXPORT void throwOnFail()
Q_TESTLIB_EXPORT void maybeThrowOnSkip()
Q_TESTLIB_EXPORT void throwOnSkip()
const char * genericToString(const void *arg)
const char * genericToString< char * >(const void *arg)
bool qTest(const T &actual, const char *elementName, const char *actualStr, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT int qRun()
Q_TESTLIB_EXPORT bool currentTestResolved()
Q_TESTLIB_EXPORT bool reportResult(bool success, const void *lhs, const void *rhs, const char *(*lhsFormatter)(const void *), const char *(*rhsFormatter)(const void *), const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line)
Q_TESTLIB_EXPORT QTestData & newRow(const char *dataTag)
Appends a new row to the current test data.
bool qCompareOp(T1 &&lhs, T2 &&rhs, const char *lhsExpr, const char *rhsExpr, const char *file, int line)
Q_TESTLIB_EXPORT bool qVerify(bool statement, const char *statementStr, const char *description, const char *file, int line)
Q_TESTLIB_EXPORT const char * currentTestFunction()
Returns the name of the test function that is currently executed.
Q_TESTLIB_EXPORT QObject * testObject()
Q_TESTLIB_EXPORT char keyToAscii(Qt::Key key)
Q_TESTLIB_EXPORT bool runningTest()
Q_TESTLIB_EXPORT void setMainSourcePath(const char *file, const char *builddir=nullptr)
Q_TESTLIB_EXPORT void * qElementData(const char *elementName, int metaTypeId)
Q_TESTLIB_EXPORT Qt::Key asciiToKey(char ascii)
void setThrowOnFail(bool enable) noexcept
Q_TESTLIB_EXPORT bool qExpectFail(const char *dataIndex, const char *comment, TestFailMode mode, const char *file, int line)
char * toString(const MyPoint &point)
Q_TESTLIB_EXPORT void * qData(const char *tagName, int typeId)
Q_TESTLIB_EXPORT bool currentTestFailed()
Returns true if the current test function has failed, otherwise false.
Q_TESTLIB_EXPORT void qInit(QObject *testObject, int argc=0, char **argv=nullptr)
void setThrowOnSkip(bool enable) noexcept
Q_TESTLIB_EXPORT bool compare_string_helper(const char *t1, const char *t2, const char *actual, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT void failOnWarning()
Q_DECL_COLD_FUNCTION Q_TESTLIB_EXPORT void qCaught(const char *expected, const char *what, const char *file, int line)
Q_TESTLIB_EXPORT QString qFindTestData(const char *basepath, const char *file=nullptr, int line=0, const char *builddir=nullptr, const char *sourcedir=nullptr)
Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const char *message)
Ignores messages created by qDebug(), qInfo() or qWarning().
bool compare_ptr_helper(const volatile void *t1, const volatile void *t2, const char *actual, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT void qSkip(const char *message, const char *file, int line)
bool qCompare(QString const &t1, QLatin1StringView const &t2, const char *actual, const char *expected, const char *file, int line)
void addColumn(const char *name, T *=nullptr)
Adds a column with type {T} to the current test data.
Q_TESTLIB_EXPORT const char * currentDataTag()
Returns the name of the current test data.
Q_TESTLIB_EXPORT int qExec(QObject *testObject, int argc=0, char **argv=nullptr)
Executes tests declared in testObject.
Q_TESTLIB_EXPORT bool compare_helper(bool success, const char *failureMsg, const void *actualPtr, const void *expectedPtr, const char *(*actualFormatter)(const void *), const char *(*expectedFormatter)(const void *), const char *actual, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT QTestData & addRow(const char *format,...) Q_ATTRIBUTE_FORMAT_PRINTF(1
Q_TESTLIB_EXPORT void qCleanup()
Q_TESTLIB_EXPORT void addColumnInternal(int id, const char *name)
Q_DECL_COLD_FUNCTION Q_TESTLIB_EXPORT void qFail(const char *message, const char *file, int line)
Q_TESTLIB_EXPORT void * qGlobalData(const char *tagName, int typeId)
Q_TESTLIB_EXPORT const char * currentAppName()
Returns the name of the binary that is currently executed.
#define Q_ATTRIBUTE_FORMAT_PRINTF(A, B)
#define Q_DECL_COLD_FUNCTION
GLbitfield GLuint64 timeout
[4]
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
[4]
GLuint GLsizei const GLchar * message
GLint GLsizei GLsizei GLenum format
#define QT_DEPRECATED_VERSION_X_6_3(text)
#define QT_DEPRECATED_VERSION_X_6_4(text)
#define QT_DEPRECATED_VERSION_X_6_8(text)
static bool compare(T1 &&lhs, T2 &&rhs)
static bool compare(T1 &&lhs, T2 &&rhs)
static bool compare(T1 &&lhs, T2 &&rhs)
static bool compare(T1 &&lhs, T2 &&rhs)
static bool compare(T1 &&lhs, T2 &&rhs)
static bool compare(T1 &&lhs, T2 &&rhs)