From: Thiago Macieira Date: Fri, 23 Mar 2012 22:05:17 +0000 (-0300) Subject: Mark qt_assert and qFatal as non-returning functions (excpt. MSVC) X-Git-Tag: 071012110112~1533 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5d0da01b54e5b4c94ca8bdcf87cb87b98c3a4fa4;p=profile%2Fivi%2Fqtbase.git Mark qt_assert and qFatal as non-returning functions (excpt. MSVC) This allows the compiler to optimise the code a bit better: since they don't return, it can assume in the code after the Q_ASSERT that the condition was true. MSVC is the exception: with MSVC, we have the CrtDbgReport dialog, which allows the developer to continue execution, inside the debugger. Therefore, we can't mark any of those functions as non-returning because they can, after all, return. Unfortunately, the Q_ASSERT usually expands to no code in release mode, so the improvement in code generation happens in debug mode only... Change-Id: I4d542d6853cd51c71ffab1d563ed64ef7c419115 Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 0828a3d..f3c3b78 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -896,6 +896,10 @@ inline void qUnused(T &x) { (void)x; } class QString; Q_CORE_EXPORT QString qt_error_string(int errorCode = -1); + +#ifndef Q_CC_MSVC +Q_NORETURN +#endif Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line); #if !defined(Q_ASSERT) @@ -910,6 +914,9 @@ Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line); #define QT_NO_PAINT_DEBUG #endif +#ifndef Q_CC_MSVC +Q_NORETURN +#endif Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *file, int line); #if !defined(Q_ASSERT_X) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index f30df92..81fe82a 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -201,6 +201,9 @@ void QMessageLogger::fatal(const char *msg, ...) va_list ap; va_start(ap, msg); // use variable arg list qt_message(QtFatalMsg, context, msg, ap); +#ifndef Q_CC_MSVC + Q_UNREACHABLE(); +#endif va_end(ap); } diff --git a/src/corelib/global/qlogging.h b/src/corelib/global/qlogging.h index 29313bd..0860ef7 100644 --- a/src/corelib/global/qlogging.h +++ b/src/corelib/global/qlogging.h @@ -113,6 +113,10 @@ public: __attribute__ ((format (printf, 2, 3))) #endif ; + +#ifndef Q_CC_MSVC + Q_NORETURN +#endif void fatal(const char *msg, ...) #if defined(Q_CC_GNU) && !defined(__INSURE__) __attribute__ ((format (printf, 2, 3)))