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>
dev
Daniel Stone 6 years ago
parent bdebc3170e
commit 11f91bbd36
  1. 4
      desktop-shell/shell.c
  2. 34
      shared/helpers.h
  3. 4
      tests/weston-test-desktop-shell.c

@ -47,10 +47,6 @@
#define DEFAULT_NUM_WORKSPACES 1 #define DEFAULT_NUM_WORKSPACES 1
#define DEFAULT_WORKSPACE_CHANGE_ANIMATION_LENGTH 200 #define DEFAULT_WORKSPACE_CHANGE_ANIMATION_LENGTH 200
#ifndef static_assert
#define static_assert(cond, msg)
#endif
struct focus_state { struct focus_state {
struct desktop_shell *shell; struct desktop_shell *shell;
struct weston_seat *seat; struct weston_seat *seat;

@ -100,6 +100,40 @@ extern "C" {
(type *)( (char *)__mptr - offsetof(type,member) );}) (type *)( (char *)__mptr - offsetof(type,member) );})
#endif #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 #ifdef __cplusplus
} }
#endif #endif

@ -41,10 +41,6 @@
#include "shared/helpers.h" #include "shared/helpers.h"
#include "libweston-desktop/libweston-desktop.h" #include "libweston-desktop/libweston-desktop.h"
#ifndef static_assert
#define static_assert(cond, msg)
#endif
struct desktest_shell { struct desktest_shell {
struct wl_listener compositor_destroy_listener; struct wl_listener compositor_destroy_listener;
struct weston_desktop *desktop; struct weston_desktop *desktop;

Loading…
Cancel
Save