mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-29 17:20:11 +01:00
Squashed 'src/c-stdaux/' changes from 2d3877aabd7d..c37722ff2f55
c37722ff2f55 generic: use _c_boolean_expr_() in _c_{likely,unlikely}_()
8baa8831b17a generic: add _c_boolean_expr_() to preserved "-Wparentheses" warning
2cda8dc53a9a generic: use _c_likely_() in c_assert()
git-subtree-dir: src/c-stdaux
git-subtree-split: c37722ff2f5525caa6680e6114333222a9d468a4
This commit is contained in:
parent
634547635b
commit
cb275c5fef
1 changed files with 40 additions and 5 deletions
|
|
@ -119,6 +119,41 @@ extern "C" {
|
|||
# define _c_internal_always_inline_
|
||||
#endif
|
||||
|
||||
/**
|
||||
* _c_boolean_expr_() - Evaluate a boolean expression
|
||||
* @_x: Expression to evaluate
|
||||
*
|
||||
* Evaluate the given expression and convert the result to 1 or 0. In most
|
||||
* cases this is equivalent to ``(!!(_x))``. However, for given compilers this
|
||||
* avoids the parentheses to improve diagnostics with ``-Wparentheses``.
|
||||
*
|
||||
* Outside of macros, this has no added value.
|
||||
*
|
||||
* Return: Evaluates to the value of ``!!_x``.
|
||||
*/
|
||||
#define _c_boolean_expr_(_x) _c_internal_boolean_expr_(__COUNTER__, _x)
|
||||
#if defined(C_COMPILER_GNUC)
|
||||
# define _c_internal_boolean_expr_(_uniq, _x) \
|
||||
__extension__ ({ \
|
||||
int C_VAR(b, _uniq); \
|
||||
\
|
||||
/* \
|
||||
* Avoid any extra parentheses around the evaluation of `_x` to \
|
||||
* allow `-Wparentheses` to warn about use of `x = ...` and \
|
||||
* instead suggest `(x = ...)` or `x == ...`. \
|
||||
*/ \
|
||||
\
|
||||
if (_x) \
|
||||
C_VAR(b, _uniq) = 1; \
|
||||
else \
|
||||
C_VAR(b, _uniq) = 0; \
|
||||
\
|
||||
C_VAR(b, _uniq); \
|
||||
})
|
||||
#else
|
||||
# define _c_internal_boolean_expr_(_uniq, _x) (!!(_x))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* _c_likely_() - Likely attribute
|
||||
* @_x: Expression to evaluate
|
||||
|
|
@ -129,9 +164,9 @@ extern "C" {
|
|||
*/
|
||||
#define _c_likely_(_x) _c_internal_likely_(_x)
|
||||
#if defined(C_COMPILER_GNUC)
|
||||
# define _c_internal_likely_(_x) (__builtin_expect(!!(_x), 1))
|
||||
# define _c_internal_likely_(_x) (__builtin_expect(_c_boolean_expr_(_x), 1))
|
||||
#else
|
||||
# define _c_internal_likely_(_x) (!!(_x))
|
||||
# define _c_internal_likely_(_x) (_c_boolean_expr_(_x))
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
@ -165,9 +200,9 @@ extern "C" {
|
|||
*/
|
||||
#define _c_unlikely_(_x) _c_internal_unlikely_(_x)
|
||||
#if defined(C_COMPILER_GNUC)
|
||||
# define _c_internal_unlikely_(_x) (__builtin_expect(!!(_x), 0))
|
||||
# define _c_internal_unlikely_(_x) (__builtin_expect(_c_boolean_expr_(_x), 0))
|
||||
#else
|
||||
# define _c_internal_unlikely_(_x) (!!(_x))
|
||||
# define _c_internal_unlikely_(_x) (_c_boolean_expr_(_x))
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
@ -264,7 +299,7 @@ extern "C" {
|
|||
* optimize it away.
|
||||
*/
|
||||
#define c_assert(_x) ( \
|
||||
(bool)(_x) \
|
||||
_c_likely_(_x) \
|
||||
? assert(true && #_x) \
|
||||
: assert(false && #_x) \
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue