From 65491a2dfe00bfcf9f09a8d6eab60234b56c8cc4 Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Thu, 12 Nov 2020 13:58:53 +0100 Subject: [PATCH] Do not disable incompatible-pointer-types-discards-qualifiers This reverts commit b3710e9a2af402a2b620de570b062294e11190eb. That check is very valuable for our code, but it causes issue with glib >= 2.67.0 when building with clang. The reason is a combination of two commits in glib, firstly fdda405b6b1b which adds a g_atomic_pointer_{set,get} variants that enforce stricter type checking (by removing an extra cast) for compilers that support __typeof__, and commit dce24dc4492d which effectively enabled the new variant of glib's atomic code for clang. This will not be necessary when glib's issue #600 [0] (8 years old) is fixed. Thankfully, MR #1719 [1], which is supposed to deal with this issue was opened 3 weeks ago, so there is a slight sliver of hope. [0] https://gitlab.gnome.org/GNOME/glib/-/issues/600 [1] https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1719 Signed-off-by: Martin Kletzander --- meson.build | 3 --- src/util/glibcompat.h | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 565a5f12e2..3bc92b0dd5 100644 --- a/meson.build +++ b/meson.build @@ -405,9 +405,6 @@ cc_flags += [ # so use this Clang-specific arg to keep it quiet '-Wno-typedef-redefinition', - # Clang complains about casts in G_DEFINE_TYPE(...) - '-Wno-incompatible-pointer-types-discards-qualifiers', - # We don't use -Wc++-compat so we have to enable it explicitly '-Wjump-misses-init', diff --git a/src/util/glibcompat.h b/src/util/glibcompat.h index 6f50a76f3c..457f6ba797 100644 --- a/src/util/glibcompat.h +++ b/src/util/glibcompat.h @@ -20,6 +20,30 @@ #include #include +#include + +#if defined(__clang__) && GLIB_CHECK_VERSION(2, 67, 0) +/* + * Clang detects (valid) issue in G_DEFINE_TYPE and derivatives starting with + * glib >= 2.67.0. See https://gitlab.gnome.org/GNOME/glib/-/issues/600 + * + * For that we need to disable the one check that produces an error in our + * builds when using any G_DEFINE_TYPE* macro. Thankfully all those macros end + * up using _G_DEFINE_TYPE_EXTENDED_BEGIN. Because with that we can redefine + * this one macro to cover all use cases. The macro is defined the same way it + * is defined in glib (with a very low probability of being changed thanks to a + * comment above it). + */ +# undef _G_DEFINE_TYPE_EXTENDED_BEGIN + +# define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types-discards-qualifiers\"") \ + _G_DEFINE_TYPE_EXTENDED_BEGIN_PRE(TypeName, type_name, TYPE_PARENT) \ + _G_DEFINE_TYPE_EXTENDED_BEGIN_REGISTER(TypeName, type_name, TYPE_PARENT, flags) \ + _Pragma("GCC diagnostic pop") + +#endif /* __clang__ */ gchar * vir_g_canonicalize_filename(const gchar *filename, const gchar *relative_to);