aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Snover2017-11-09 12:11:33 -0600
committerColin Snover2017-11-10 09:56:43 -0600
commit2de83e09374abd10700e5f2bc4671318f182980b (patch)
treea2e2f4e9347caf47bfedc1c8f3aa1b5be0543287
parent600fe749c5a6c680ac4bb515a28ae94985536d1d (diff)
downloadscummvm-rg350-2de83e09374abd10700e5f2bc4671318f182980b.tar.gz
scummvm-rg350-2de83e09374abd10700e5f2bc4671318f182980b.tar.bz2
scummvm-rg350-2de83e09374abd10700e5f2bc4671318f182980b.zip
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.
-rw-r--r--common/scummsys.h18
1 files changed, 16 insertions, 2 deletions
diff --git a/common/scummsys.h b/common/scummsys.h
index 4740127d2f..5486ba27c6 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