chiark / gitweb /
util: get rid of warnings around assert_cc() macro
authorLennart Poettering <lennart@poettering.net>
Thu, 20 Feb 2014 17:05:56 +0000 (18:05 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 20 Feb 2014 17:07:01 +0000 (18:07 +0100)
Suggested by Holger Schurig.

src/shared/macro.h

index dfbc20142f753172ee8708f5e5aa94eca27fa66b..959a9f7fb1533cd11d918ffee7fcc1b8ea22b19f 100644 (file)
 #define _alignas_(x) __attribute__((aligned(__alignof(x))))
 #define _cleanup_(x) __attribute__((cleanup(x)))
 
 #define _alignas_(x) __attribute__((aligned(__alignof(x))))
 #define _cleanup_(x) __attribute__((cleanup(x)))
 
+/* Temporarily disable some warnings */
+#define DISABLE_WARNING_DECLARATION_AFTER_STATEMENT                     \
+        _Pragma("GCC diagnostic push");                                 \
+        _Pragma("GCC diagnostic ignored \"-Wdeclaration-after-statement\"")
+
+#define REENABLE_WARNING                                                \
+        _Pragma("GCC diagnostic pop")
+
 /* automake test harness */
 #define EXIT_TEST_SKIP 77
 
 /* automake test harness */
 #define EXIT_TEST_SKIP 77
 
@@ -154,9 +162,20 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
         } while (false)
 
 #if defined(static_assert)
         } while (false)
 
 #if defined(static_assert)
-#define assert_cc(expr) static_assert(expr, #expr)
+/* static_assert() is sometimes defined in a way that trips up
+ * -Wdeclaration-after-statement, hence let's temporarily turn off
+ * this warning around it. */
+#define assert_cc(expr)                                                 \
+        DISABLE_WARNING_DECLARATION_AFTER_STATEMENT;                    \
+        static_assert(expr, #expr);                                     \
+        REENABLE_WARNING
 #else
 #else
-#define assert_cc(expr) struct UNIQUE(_assert_struct_) { char x[(expr) ? 0 : -1]; };
+#define assert_cc(expr)                                                 \
+        DISABLE_WARNING_DECLARATION_AFTER_STATEMENT;                    \
+        struct UNIQUE(_assert_struct_) {                                \
+                char x[(expr) ? 0 : -1];                                \
+        };                                                              \
+        REENABLE_WARNING
 #endif
 
 #define assert_return(expr, r)                                          \
 #endif
 
 #define assert_return(expr, r)                                          \