@@ -836,43 +836,37 @@ extern void ExceptionalCondition(const char *conditionName,
836836 * The macro StaticAssertDecl() is suitable for use at file scope (outside of
837837 * any function).
838838 *
839+ * On recent C++ compilers, we can use standard static_assert().
840+ *
839841 * Otherwise we fall back on a kluge that assumes the compiler will complain
840842 * about a negative width for a struct bit-field. This will not include a
841843 * helpful error message, but it beats not getting an error at all.
842844 */
843- #ifndef __cplusplus
844- #ifdef HAVE__STATIC_ASSERT
845+ #if !defined( __cplusplus ) && defined( HAVE__STATIC_ASSERT )
846+ /* Default C implementation */
845847#define StaticAssertStmt (condition , errmessage ) \
846848 do { _Static_assert(condition, errmessage); } while(0)
847849#define StaticAssertExpr (condition , errmessage ) \
848850 ((void) ({ StaticAssertStmt(condition, errmessage); true; }))
849851#define StaticAssertDecl (condition , errmessage ) \
850852 _Static_assert(condition, errmessage)
851- #else /* !HAVE__STATIC_ASSERT */
852- #define StaticAssertStmt (condition , errmessage ) \
853- ((void) sizeof(struct { int static_assert_failure : (condition) ? 1 : -1; }))
854- #define StaticAssertExpr (condition , errmessage ) \
855- StaticAssertStmt(condition, errmessage)
856- #define StaticAssertDecl (condition , errmessage ) \
857- extern void static_assert_func(int static_assert_failure[(condition) ? 1 : -1])
858- #endif /* HAVE__STATIC_ASSERT */
859- #else /* C++ */
860- #if defined(__cpp_static_assert ) && __cpp_static_assert >= 200410
853+ #elif defined(__cplusplus ) && __cpp_static_assert >= 200410
854+ /* Default C++ implementation */
861855#define StaticAssertStmt (condition , errmessage ) \
862856 static_assert(condition, errmessage)
863857#define StaticAssertExpr (condition , errmessage ) \
864858 ({ static_assert(condition, errmessage); })
865859#define StaticAssertDecl (condition , errmessage ) \
866860 static_assert(condition, errmessage)
867- #else /* !__cpp_static_assert */
861+ #else
862+ /* Fallback implementation for C and C++ */
868863#define StaticAssertStmt (condition , errmessage ) \
869- do { struct static_assert_struct { int static_assert_failure : (condition) ? 1 : -1; }; } while(0 )
864+ ((void) sizeof( struct { int static_assert_failure : (condition) ? 1 : -1; }) )
870865#define StaticAssertExpr (condition , errmessage ) \
871- ((void) ({ StaticAssertStmt(condition, errmessage); }) )
866+ StaticAssertStmt(condition, errmessage)
872867#define StaticAssertDecl (condition , errmessage ) \
873868 extern void static_assert_func(int static_assert_failure[(condition) ? 1 : -1])
874- #endif /* __cpp_static_assert */
875- #endif /* C++ */
869+ #endif
876870
877871
878872/*
0 commit comments