diff options
author | Daniel Stone <daniels@collabora.com> | 2018-07-09 13:05:59 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2018-07-09 15:39:20 +0100 |
commit | 11f91bbd36e7ebdc01fb6c2b29bcab53aec7209e (patch) | |
tree | 3152b5d85ead447d4dc8e4dd77af58ebdf695b2a | |
parent | bdebc3170e5816d6e2d34b36d4643c53634a0e41 (diff) | |
download | weston-11f91bbd36e7ebdc01fb6c2b29bcab53aec7209e.tar.gz |
helpers: Move static_assert definition to shared
Collect the fallback definitions of static_assert() from desktop-shell
and the test shell, and move them to helpers.h. This allows code
throughout the tree to use static_assert() for build-time assertions,
where it is supported by the compiler.
As GCC goes out of its way to only add static_assert() when C11 has been
explicitly requested - which we don't do - make sure to use the more
widely available _Static_assert() if that is provided.
This will be used in future patches to ensure two array lengths don't go
out of sync.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r-- | desktop-shell/shell.c | 4 | ||||
-rw-r--r-- | shared/helpers.h | 34 | ||||
-rw-r--r-- | tests/weston-test-desktop-shell.c | 4 |
3 files changed, 34 insertions, 8 deletions
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 8b7a23ad..ea3c4535 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -47,10 +47,6 @@ #define DEFAULT_NUM_WORKSPACES 1 #define DEFAULT_WORKSPACE_CHANGE_ANIMATION_LENGTH 200 -#ifndef static_assert -#define static_assert(cond, msg) -#endif - struct focus_state { struct desktop_shell *shell; struct weston_seat *seat; diff --git a/shared/helpers.h b/shared/helpers.h index 46f745d1..0ebcc4a4 100644 --- a/shared/helpers.h +++ b/shared/helpers.h @@ -100,6 +100,40 @@ extern "C" { (type *)( (char *)__mptr - offsetof(type,member) );}) #endif +/** + * Build-time static assertion support + * + * A build-time equivalent to assert(), will generate a compilation error + * if the supplied condition does not evaluate true. + * + * The following example demonstrates use of static_assert to ensure that + * arrays which are supposed to mirror each other have a consistent + * size. + * + * This is only a fallback definition; support must be provided by the + * compiler itself. + * + * @code + * int small[4]; + * long expanded[4]; + * + * static_assert(ARRAY_LENGTH(small) == ARRAY_LENGTH(expanded), + * "size mismatch between small and expanded arrays"); + * for (i = 0; i < ARRAY_LENGTH(small); i++) + * expanded[i] = small[4]; + * @endcode + * + * @param condition Expression to check for truth + * @param msg Message to print on failure + */ +#ifndef static_assert +# ifdef _Static_assert +# define static_assert(cond, msg) _Static_assert(cond, msg) +# else +# define static_assert(cond, msg) +# endif +#endif + #ifdef __cplusplus } #endif diff --git a/tests/weston-test-desktop-shell.c b/tests/weston-test-desktop-shell.c index de844251..c780316d 100644 --- a/tests/weston-test-desktop-shell.c +++ b/tests/weston-test-desktop-shell.c @@ -41,10 +41,6 @@ #include "shared/helpers.h" #include "libweston-desktop/libweston-desktop.h" -#ifndef static_assert -#define static_assert(cond, msg) -#endif - struct desktest_shell { struct wl_listener compositor_destroy_listener; struct weston_desktop *desktop; |