summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/global/qglobal.h9
-rw-r--r--tests/auto/corelib/global/qglobal/tst_qglobal.cpp68
2 files changed, 77 insertions, 0 deletions
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 5f8e6be893..ee601859b7 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -1785,6 +1785,15 @@ Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *
# endif
#endif
+// Intentionally undefined
+template <bool Test> class QStaticAssertFailure;
+template <> class QStaticAssertFailure<true> {};
+
+#define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
+#define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
+#define Q_STATIC_ASSERT(...) \
+ enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<bool(__VA_ARGS__)>)}
+
Q_CORE_EXPORT void qt_check_pointer(const char *, int);
Q_CORE_EXPORT void qBadAlloc();
diff --git a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp
index 85aa03f642..9dc78a14c0 100644
--- a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp
+++ b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp
@@ -52,6 +52,7 @@ private slots:
void qassert();
void qtry();
void checkptr();
+ void qstaticassert();
};
void tst_QGlobal::qIsNull()
@@ -267,5 +268,72 @@ void tst_QGlobal::checkptr()
QCOMPARE(q_check_ptr(c), c);
}
+// Check Q_STATIC_ASSERT, It should compile
+// note that, we are not able to test Q_STATIC_ASSERT(false), to do it manually someone has
+// to replace expressions (in the asserts) one by one to false, and check if it breaks build.
+class MyTrue
+{
+public:
+ MyTrue()
+ {
+ Q_STATIC_ASSERT(true);
+ Q_STATIC_ASSERT(!false);
+ }
+ ~MyTrue()
+ {
+ Q_STATIC_ASSERT(true);
+ Q_STATIC_ASSERT(!false);
+ }
+ Q_STATIC_ASSERT(true);
+ Q_STATIC_ASSERT(!false);
+};
+
+struct MyExpresion
+{
+ void foo()
+ {
+ Q_STATIC_ASSERT(sizeof(MyTrue) > 0);
+ Q_STATIC_ASSERT(sizeof(MyTrue) > 0);
+ }
+private:
+ Q_STATIC_ASSERT(sizeof(MyTrue) > 0);
+ Q_STATIC_ASSERT(sizeof(MyTrue) > 0);
+};
+
+struct TypeDef
+{
+ typedef int T;
+ Q_STATIC_ASSERT(sizeof(T));
+};
+
+template<typename T1, typename T2>
+struct Template
+{
+ static const bool True = true;
+ typedef typename T1::T DependentType;
+ Q_STATIC_ASSERT(True);
+ Q_STATIC_ASSERT(!!True);
+ Q_STATIC_ASSERT(sizeof(DependentType));
+ Q_STATIC_ASSERT(!!sizeof(DependentType));
+};
+
+struct MyTemplate
+{
+ Q_STATIC_ASSERT(Template<TypeDef, int>::True);
+ Q_STATIC_ASSERT(!!Template<TypeDef, int>::True);
+};
+
+void tst_QGlobal::qstaticassert()
+{
+ // Force compilation of these classes
+ MyTrue tmp1;
+ MyExpresion tmp2;
+ MyTemplate tmp3;
+ Q_UNUSED(tmp1);
+ Q_UNUSED(tmp2);
+ Q_UNUSED(tmp3);
+ QVERIFY(true); // if the test compiles it has passed.
+}
+
QTEST_MAIN(tst_QGlobal)
#include "tst_qglobal.moc"