Use static_assert for STATIC_ASSERT for C++11 onwards
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 27 Jul 2016 14:49:06 +0000 (14:49 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Wed, 27 Jul 2016 14:49:06 +0000 (14:49 +0000)
C++11 has a
  static_assert (COND, MESSAGE)
which gives more readable error messages for STATIC_ASSERT than our
current implementation.

This patch makes us use it if __cplusplus >= 201103L

There's also a provisional static_assert (COND) in C++1z, but presumably
we should wait until that one is fully standardized before using it.

gcc/ChangeLog:
* system.h (STATIC_ASSERT): Use static_assert if building
with C++11 onwards.

From-SVN: r238786

gcc/ChangeLog
gcc/system.h

index d2a2953..e00b2c4 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-27  David Malcolm  <dmalcolm@redhat.com>
+
+       * system.h (STATIC_ASSERT): Use static_assert if building
+       with C++11 onwards.
+
 2016-07-27  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/72517
index 78a7da6..8a17197 100644 (file)
@@ -752,9 +752,14 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
 #define STATIC_CONSTANT_P(X) (false && (X))
 #endif
 
-/* Until we can use C++11's static_assert.  */
+/* static_assert (COND, MESSAGE) is available in C++11 onwards.  */
+#if __cplusplus >= 201103L
+#define STATIC_ASSERT(X) \
+  static_assert ((X), #X)
+#else
 #define STATIC_ASSERT(X) \
   typedef int assertion1[(X) ? 1 : -1] ATTRIBUTE_UNUSED
+#endif
 
 /* Provide a fake boolean type.  We make no attempt to use the
    C99 _Bool, as it may not be available in the bootstrap compiler,