mirror of
https://github.com/systemd/systemd.git
synced 2025-01-09 01:18:19 +03:00
Merge pull request #10366 from poettering/in-set-fixes
IN_SET() compile time check fixes
This commit is contained in:
commit
b4b3649a94
@ -56,10 +56,6 @@
|
||||
#endif
|
||||
|
||||
/* Temporarily disable some warnings */
|
||||
#define DISABLE_WARNING_DECLARATION_AFTER_STATEMENT \
|
||||
_Pragma("GCC diagnostic push"); \
|
||||
_Pragma("GCC diagnostic ignored \"-Wdeclaration-after-statement\"")
|
||||
|
||||
#define DISABLE_WARNING_FORMAT_NONLITERAL \
|
||||
_Pragma("GCC diagnostic push"); \
|
||||
_Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"")
|
||||
@ -314,20 +310,13 @@ static inline int __coverity_check__(int condition) {
|
||||
} while (false)
|
||||
|
||||
#if defined(static_assert)
|
||||
/* 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
|
||||
static_assert(expr, #expr);
|
||||
#else
|
||||
#define assert_cc(expr) \
|
||||
DISABLE_WARNING_DECLARATION_AFTER_STATEMENT; \
|
||||
struct CONCATENATE(_assert_struct_, __COUNTER__) { \
|
||||
char x[(expr) ? 0 : -1]; \
|
||||
}; \
|
||||
REENABLE_WARNING
|
||||
};
|
||||
#endif
|
||||
|
||||
#define assert_return(expr, r) \
|
||||
@ -426,8 +415,11 @@ static inline int __coverity_check__(int condition) {
|
||||
#define IN_SET(x, ...) \
|
||||
({ \
|
||||
bool _found = false; \
|
||||
/* If the build breaks in the line below, you need to extend the case macros */ \
|
||||
static _unused_ char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){__VA_ARGS__})/sizeof(int)]; \
|
||||
/* If the build breaks in the line below, you need to extend the case macros. (We use "long double" as \
|
||||
* type for the array, in the hope that checkers such as ubsan don't complain that the initializers for \
|
||||
* the array are not representable by the base type. Ideally we'd use typeof(x) as base type, but that \
|
||||
* doesn't work, as we want to use this on bitfields and gcc refuses typeof() on bitfields.) */ \
|
||||
assert_cc((sizeof((long double[]){__VA_ARGS__})/sizeof(long double)) <= 20); \
|
||||
switch(x) { \
|
||||
FOR_EACH_MAKE_CASE(__VA_ARGS__) \
|
||||
_found = true; \
|
||||
|
Loading…
Reference in New Issue
Block a user