From ebef2ad1360c80ad62de5f4a1c4e7e4051725c1c Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 10 Sep 2014 20:37:51 -0700 Subject: [PATCH] Make the empty Q_ASSERT still check its argument for validity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the side-effect that variables and functions in the argument are now "used". This means we don't need to #ifndef functions only used in assertions: the compiler will eliminate them by dead code elimination. Due to the mandatory short-circuiting of the condition, no functions will ever be called and this expands to no more code than before. On the negative side, because we won't get warnings for unused variables initialized outside the Q_ASSERT, non-inlineable calls will not be elminated by dead code elimination, so they will remain in release code without warnings. Because of the expanded code now in Q_ASSERT, the Intel compiler's optimizer gets thrown: it complains that the non-void function is failing to return anything, so I had to add two return statements. Change-Id: I1bb79c9637a2771ef1ec093f901b8d2443788bd6 Reviewed-by: Marc Mutz Reviewed-by: Jędrzej Nowacki --- src/corelib/global/qglobal.h | 2 +- src/corelib/io/qtemporaryfile.cpp | 1 + src/corelib/kernel/qtranslator.cpp | 1 + src/gui/text/qtextdocument_p.cpp | 2 -- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 928bf138352..4a21ab88d89 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -655,7 +655,7 @@ Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) #if !defined(Q_ASSERT) # if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) -# define Q_ASSERT(cond) qt_noop() +# define Q_ASSERT(cond) do { } while (false && (cond)) # else # define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) # endif diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 4a9aafcf0bc..c96d0504f45 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -222,6 +222,7 @@ static bool createFileFromTemplate(NativeFileHandle &file, } Q_ASSERT(false); + return false; } //************* QTemporaryFileEngine diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 33827926c69..5687a6c3a35 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -273,6 +273,7 @@ static uint numerusHelper(int n, const uchar *rules, uint rulesSize) } Q_ASSERT(false); + return 0; } class QTranslatorPrivate : public QObjectPrivate diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp index 8ff15106e34..d30ff78b8fe 100644 --- a/src/gui/text/qtextdocument_p.cpp +++ b/src/gui/text/qtextdocument_p.cpp @@ -125,14 +125,12 @@ static bool isValidBlockSeparator(QChar ch) || ch == QTextEndOfFrame; } -#if !defined(QT_NO_DEBUG) || defined(QT_FORCE_ASSERTS) static bool noBlockInString(const QString &str) { return !str.contains(QChar::ParagraphSeparator) && !str.contains(QTextBeginningOfFrame) && !str.contains(QTextEndOfFrame); } -#endif bool QTextUndoCommand::tryMerge(const QTextUndoCommand &other) {