Mark qt_assert and qFatal as non-returning functions (excpt. MSVC)
authorThiago Macieira <thiago.macieira@intel.com>
Fri, 23 Mar 2012 22:05:17 +0000 (19:05 -0300)
committerQt by Nokia <qt-info@nokia.com>
Thu, 19 Apr 2012 20:15:16 +0000 (22:15 +0200)
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 <oswald.buddenhagen@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/global/qglobal.h
src/corelib/global/qlogging.cpp
src/corelib/global/qlogging.h

index 0828a3d..f3c3b78 100644 (file)
@@ -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)
index f30df92..81fe82a 100644 (file)
@@ -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);
 }
 
index 29313bd..0860ef7 100644 (file)
@@ -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)))