diff --git a/include/nm-macros-internal.h b/include/nm-macros-internal.h index fe45787d2d..291dc0742a 100644 --- a/include/nm-macros-internal.h +++ b/include/nm-macros-internal.h @@ -159,13 +159,15 @@ #define _NM_IN_SET_EVAL_N2(op, x, n, ...) _NM_IN_SET_EVAL_##n(op, x, __VA_ARGS__) #define _NM_IN_SET_EVAL_N(op, x, n, ...) _NM_IN_SET_EVAL_N2(op, x, n, __VA_ARGS__) -/* does not do short-circuit evaluation to get a more function-like behavior - * ("|" instead of "||"). Use NM_IN_SET_SC() if you want that */ -#define NM_IN_SET(x, ...) _NM_IN_SET_EVAL_N(| , x, NM_NARG (__VA_ARGS__), __VA_ARGS__) +/* Beware that this does short-circuit evaluation (use "||" instead of "|") + * which has a possibly unexpected non-function-like behavior. + * Use NM_IN_SET_SE if you need all arguments to be evaluted. */ +#define NM_IN_SET(x, ...) _NM_IN_SET_EVAL_N(||, x, NM_NARG (__VA_ARGS__), __VA_ARGS__) -/* "SC" stands for "short-cirtuit". It will only evaluate the arguments - * until a match is found. */ -#define NM_IN_SET_SC(x, ...) _NM_IN_SET_EVAL_N(||, x, NM_NARG (__VA_ARGS__), __VA_ARGS__) +/* "SE" stands for "side-effect". Contrary to NM_IN_SET(), this does not do + * short-circuit evaluation, which can make a difference if the arguments have + * side-effects. */ +#define NM_IN_SET_SE(x, ...) _NM_IN_SET_EVAL_N(|, x, NM_NARG (__VA_ARGS__), __VA_ARGS__) /*****************************************************************************/ diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index 7240b0ec7d..86751df40d 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -4745,52 +4745,51 @@ test_nm_in_set (void) _ASSERT (1, NM_IN_SET (-1, G(-1))); _ASSERT (2, !NM_IN_SET (-1, G( 1), G( 2))); - _ASSERT (2, NM_IN_SET (-1, G(-1), G( 2))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N( 2))); _ASSERT (2, NM_IN_SET (-1, G( 1), G(-1))); - _ASSERT (2, NM_IN_SET (-1, G(-1), G(-1))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N(-1))); _ASSERT (3, !NM_IN_SET (-1, G( 1), G( 2), G( 3))); - _ASSERT (3, NM_IN_SET (-1, G(-1), G( 2), G( 3))); - _ASSERT (3, NM_IN_SET (-1, G( 1), G(-1), G( 3))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N( 2), N( 3))); + _ASSERT (2, NM_IN_SET (-1, G( 1), G(-1), N( 3))); _ASSERT (3, NM_IN_SET (-1, G( 1), G( 2), G(-1))); - _ASSERT (3, NM_IN_SET (-1, G( 1), G(-1), G(-1))); - _ASSERT (3, NM_IN_SET (-1, G(-1), G( 2), G(-1))); - _ASSERT (3, NM_IN_SET (-1, G(-1), G(-1), G( 3))); - _ASSERT (3, NM_IN_SET (-1, G(-1), G(-1), G(-1))); + _ASSERT (2, NM_IN_SET (-1, G( 1), G(-1), N(-1))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N( 2), N(-1))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N(-1), N( 3))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N(-1), N(-1))); _ASSERT (4, !NM_IN_SET (-1, G( 1), G( 2), G( 3), G( 4))); - _ASSERT (4, NM_IN_SET (-1, G(-1), G( 2), G( 3), G( 4))); - _ASSERT (4, NM_IN_SET (-1, G( 1), G(-1), G( 3), G( 4))); - _ASSERT (4, NM_IN_SET (-1, G( 1), G( 2), G(-1), G( 4))); + _ASSERT (1, NM_IN_SET (-1, G(-1), N( 2), N( 3), N( 4))); + _ASSERT (2, NM_IN_SET (-1, G( 1), G(-1), N( 3), N( 4))); + _ASSERT (3, NM_IN_SET (-1, G( 1), G( 2), G(-1), N( 4))); _ASSERT (4, NM_IN_SET (-1, G( 1), G( 2), G( 3), G(-1))); - _ASSERT (5, NM_IN_SET (-1, G( 1), G( 2), G( 3), G(-1), G( 5))); + _ASSERT (4, NM_IN_SET (-1, G( 1), G( 2), G( 3), G(-1), G( 5))); - _ASSERT (1, !NM_IN_SET_SC (-1, G( 1))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1))); + _ASSERT (1, !NM_IN_SET_SE (-1, G( 1))); + _ASSERT (1, NM_IN_SET_SE (-1, G(-1))); - _ASSERT (2, !NM_IN_SET_SC (-1, G( 1), G( 2))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2))); - _ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N(-1))); + _ASSERT (2, !NM_IN_SET_SE (-1, G( 1), G( 2))); + _ASSERT (2, NM_IN_SET_SE (-1, G(-1), G( 2))); + _ASSERT (2, NM_IN_SET_SE (-1, G( 1), G(-1))); + _ASSERT (2, NM_IN_SET_SE (-1, G(-1), G(-1))); - _ASSERT (3, !NM_IN_SET_SC (-1, G( 1), G( 2), G( 3))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2), N( 3))); - _ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1), N( 3))); - _ASSERT (3, NM_IN_SET_SC (-1, G( 1), G( 2), G(-1))); - _ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1), N(-1))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2), N(-1))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N(-1), N( 3))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N(-1), N(-1))); + _ASSERT (3, !NM_IN_SET_SE (-1, G( 1), G( 2), G( 3))); + _ASSERT (3, NM_IN_SET_SE (-1, G(-1), G( 2), G( 3))); + _ASSERT (3, NM_IN_SET_SE (-1, G( 1), G(-1), G( 3))); + _ASSERT (3, NM_IN_SET_SE (-1, G( 1), G( 2), G(-1))); + _ASSERT (3, NM_IN_SET_SE (-1, G( 1), G(-1), G(-1))); + _ASSERT (3, NM_IN_SET_SE (-1, G(-1), G( 2), G(-1))); + _ASSERT (3, NM_IN_SET_SE (-1, G(-1), G(-1), G( 3))); + _ASSERT (3, NM_IN_SET_SE (-1, G(-1), G(-1), G(-1))); - _ASSERT (4, !NM_IN_SET_SC (-1, G( 1), G( 2), G( 3), G( 4))); - _ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2), N( 3), N( 4))); - _ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1), N( 3), N( 4))); - _ASSERT (3, NM_IN_SET_SC (-1, G( 1), G( 2), G(-1), N( 4))); - _ASSERT (4, NM_IN_SET_SC (-1, G( 1), G( 2), G( 3), G(-1))); - - _ASSERT (4, NM_IN_SET_SC (-1, G( 1), G( 2), G( 3), G(-1), G( 5))); + _ASSERT (4, !NM_IN_SET_SE (-1, G( 1), G( 2), G( 3), G( 4))); + _ASSERT (4, NM_IN_SET_SE (-1, G(-1), G( 2), G( 3), G( 4))); + _ASSERT (4, NM_IN_SET_SE (-1, G( 1), G(-1), G( 3), G( 4))); + _ASSERT (4, NM_IN_SET_SE (-1, G( 1), G( 2), G(-1), G( 4))); + _ASSERT (4, NM_IN_SET_SE (-1, G( 1), G( 2), G( 3), G(-1))); + _ASSERT (5, NM_IN_SET_SE (-1, G( 1), G( 2), G( 3), G(-1), G( 5))); #undef G #undef N #undef _ASSERT