From 2de83e09374abd10700e5f2bc4671318f182980b Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Thu, 9 Nov 2017 12:11:33 -0600 Subject: [PATCH] COMMON: Use C++11 static_assert when available This improves the output of static assertions in all compilers, and prevents problems in MSVC 2015 where the mechanism for triggering a compilation error in C++98 mode may cause errors when that compiler builds in release mode. Fixes Trac#10154. --- common/scummsys.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/common/scummsys.h b/common/scummsys.h index 4740127d2fb..5486ba27c66 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -154,6 +154,7 @@ #endif #ifndef STATIC_ASSERT +#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER > 1600) /** * Generates a compile-time assertion. * @@ -162,8 +163,21 @@ * time if the expression evaluates to false. */ #define STATIC_ASSERT(expression, message) \ - extern int STATIC_ASSERT_##message[(expression) ? 1 : -1]; \ - (void)(STATIC_ASSERT_##message); + static_assert((expression), #message) +#else + /** + * Generates a compile-time assertion. + * + * @param expression An expression that can be evaluated at compile time. + * @param message An underscore-delimited message to be presented at compile + * time if the expression evaluates to false. + */ + #define STATIC_ASSERT(expression, message) \ + do { \ + extern int STATIC_ASSERT_##message[(expression) ? 1 : -1]; \ + (void)(STATIC_ASSERT_##message); \ + } while (false) +#endif #endif // The following math constants are usually defined by the system math.h header, but