Commit 11f91bbd authored by Daniel Stone's avatar Daniel Stone

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's avatarDaniel Stone <>
Reviewed-by: Pekka Paalanen's avatarPekka Paalanen <>
parent bdebc317
......@@ -47,10 +47,6 @@
#ifndef static_assert
#define static_assert(cond, msg)
struct focus_state {
struct desktop_shell *shell;
struct weston_seat *seat;
......@@ -100,6 +100,40 @@ extern "C" {
(type *)( (char *)__mptr - offsetof(type,member) );})
* 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
#ifdef __cplusplus
......@@ -41,10 +41,6 @@
#include "shared/helpers.h"
#include "libweston-desktop/libweston-desktop.h"
#ifndef static_assert
#define static_assert(cond, msg)
struct desktest_shell {
struct wl_listener compositor_destroy_listener;
struct weston_desktop *desktop;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment