# 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