summaryrefslogtreecommitdiff
blob: 4cb6473d58c520d2af082024f2b8c1ef2d97a00b (plain)
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