]> granicus.if.org Git - postgresql/commitdiff
Add support for static assertions in C++
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 30 Aug 2016 16:00:00 +0000 (12:00 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 26 Dec 2017 15:45:07 +0000 (10:45 -0500)
This allows modules written in C++ to use or include header files that
use StaticAssertStmt() etc.

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
src/include/c.h

index 11fcffbae3954da4941d005f36fa8cbe92ecc746..22535a7debb4820fe0ceab5d2c449be190090539 100644 (file)
@@ -754,6 +754,7 @@ typedef NameData *Name;
  * about a negative width for a struct bit-field.  This will not include a
  * helpful error message, but it beats not getting an error at all.
  */
+#ifndef __cplusplus
 #ifdef HAVE__STATIC_ASSERT
 #define StaticAssertStmt(condition, errmessage) \
        do { _Static_assert(condition, errmessage); } while(0)
@@ -765,6 +766,19 @@ typedef NameData *Name;
 #define StaticAssertExpr(condition, errmessage) \
        StaticAssertStmt(condition, errmessage)
 #endif                                                 /* HAVE__STATIC_ASSERT */
+#else                                                  /* C++ */
+#if defined(__cpp_static_assert) && __cpp_static_assert >= 200410
+#define StaticAssertStmt(condition, errmessage) \
+       static_assert(condition, errmessage)
+#define StaticAssertExpr(condition, errmessage) \
+       StaticAssertStmt(condition, errmessage)
+#else
+#define StaticAssertStmt(condition, errmessage) \
+       do { struct static_assert_struct { int static_assert_failure : (condition) ? 1 : -1; }; } while(0)
+#define StaticAssertExpr(condition, errmessage) \
+       ({ StaticAssertStmt(condition, errmessage); })
+#endif
+#endif                                                 /* C++ */
 
 
 /*