1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# Fixes "error: throw will always call terminate() [-Werror=terminate]". Gentoo bug 612978.
--- a/src/tlAssert.h.old
+++ b/src/tlAssert.h
@@ -27,6 +27,16 @@
#include "config.h"
+// For >=C++11, mark assertion_failed() with attribute [[noreturn]] and call std::terminate().
+// Or else, throw int(0) to tell the compiler that the assertion will not return.
+#if __cplusplus < 201103L
+#define ATTRIB_ASSERT KLAYOUT_DLL
+#define END_ASSERT throw int(0)
+#else
+#define ATTRIB_ASSERT [[noreturn]] KLAYOUT_DLL
+#define END_ASSERT std::terminate()
+#endif
+
namespace tl
{
@@ -34,10 +44,10 @@
* @brief The corresponding assert macro
*/
-KLAYOUT_DLL void assertion_failed (const char *filename, unsigned int line, const char *condition);
+ATTRIB_ASSERT void assertion_failed (const char *filename, unsigned int line, const char *condition);
// the throw int(0) instruction will tell the compiler that the assertion will not return
-#define tl_assert(COND) if (!(COND)) { tl::assertion_failed (__FILE__, __LINE__, #COND); throw int(0); }
+#define tl_assert(COND) if (!(COND)) { tl::assertion_failed (__FILE__, __LINE__, #COND); END_ASSERT; }
} // namespace tl
|