summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-12-05 12:46:43 -0800
committerMarge Bot <eric+marge@anholt.net>2020-12-10 16:48:36 +0000
commit6fe84c5dda2f5935787c428347cf16ec1b1a5a30 (patch)
treec082a9844ce647f658e9d71c3a7782cc85633ad5
parent5a082911cdaf9a7b04d14c8ec60ad83cd063a524 (diff)
util: Allow STATIC_ASSERT() everywhere
Remove -Werror=vla from c_msvc_compat_args so we can use STATIC_ASSERT() in core code. We have a CI job for this. (And arguably we could probably just drop c_msvc_compat_args entirely.) Signed-off-by: Rob Clark <robdclark@chromium.org> Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7941>
-rw-r--r--meson.build2
-rwxr-xr-xscons/gallium.py1
-rw-r--r--src/util/macros.h21
3 files changed, 18 insertions, 6 deletions
diff --git a/meson.build b/meson.build
index 6118efc6dc1..a925746a654 100644
--- a/meson.build
+++ b/meson.build
@@ -1090,7 +1090,7 @@ else
# Check for C and C++ arguments for MSVC compatibility. These are only used
# in parts of the mesa code base that need to compile with MSVC, mainly
# common code
- foreach a : ['-Werror=pointer-arith', '-Werror=vla', '-Werror=gnu-empty-initializer']
+ foreach a : ['-Werror=pointer-arith', '-Werror=gnu-empty-initializer']
if cc.has_argument(a)
c_msvc_compat_args += a
endif
diff --git a/scons/gallium.py b/scons/gallium.py
index e831912c761..03d11e440a1 100755
--- a/scons/gallium.py
+++ b/scons/gallium.py
@@ -86,7 +86,6 @@ def install_shared_library(env, sources, version = ()):
def msvc2013_compat(env):
if env['gcc']:
env.Append(CCFLAGS = [
- '-Werror=vla',
'-Werror=pointer-arith',
])
diff --git a/src/util/macros.h b/src/util/macros.h
index 9b313c172ed..3483428bc5d 100644
--- a/src/util/macros.h
+++ b/src/util/macros.h
@@ -66,13 +66,26 @@
/**
* Static (compile-time) assertion.
- * Basically, use COND to dimension an array. If COND is false/zero the
- * array size will be -1 and we'll get a compilation error.
*/
-#define STATIC_ASSERT(COND) \
- do { \
+#if defined(_MSC_VER)
+ /* MSVC doesn't like VLA's, but it also dislikes zero length arrays
+ * (which gcc is happy with), so we have to define STATIC_ASSERT()
+ * slightly differently.
+ */
+# define STATIC_ASSERT(COND) do { \
+ (void) sizeof(char [(COND) != 0]); \
+ } while (0)
+#elif defined(__GNUC__)
+ /* This version of STATIC_ASSERT() relies on VLAs. If COND is
+ * false/zero, the array size will be -1 and we'll get a compile
+ * error
+ */
+# define STATIC_ASSERT(COND) do { \
(void) sizeof(char [1 - 2*!(COND)]); \
} while (0)
+#else
+# define STATIC_ASSERT(COND) do { } while (0)
+#endif
/**