Build fails with `-Werror=strict-aliasing`
CFLAGS="-O2 -Werror=strict-aliasing" CXXFLAGS="$CFLAGS" meson setup build
[1/556] Compiling C object panels/common/liblanguage.a.p/cc-vertical-row.c.o
FAILED: panels/common/liblanguage.a.p/cc-vertical-row.c.o
ccache cc -Ipanels/common/liblanguage.a.p -Ipanels/common -I../panels/common -I. -I.. -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/lib64/libffi/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/uuid -I/usr/include/json-c -I/usr/include/gsettings-desktop-schemas -I/usr/include/libadwaita-1 -I/usr/include/gtk-4.0 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/libpng16 -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/graphene-1.0 -I/usr/lib64/graphene-1.0/include -I/usr/include/appstream -I/usr/include/gio-unix-2.0 -I/usr/include/gnome-desktop-4.0 -I/usr/include/libxml2 -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -O0 -g -DHAVE_CONFIG_H -Wcast-align -Wmissing-field-initializers -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wno-strict-aliasing -Wno-sign-compare -O2 -Werror=strict-aliasing -fPIC -pthread -mfpmath=sse -msse -msse2 -mfpmath=sse -msse -msse2 -MD -MQ panels/common/liblanguage.a.p/cc-vertical-row.c.o -MF panels/common/liblanguage.a.p/cc-vertical-row.c.o.d -o panels/common/liblanguage.a.p/cc-vertical-row.c.o -c ../panels/common/cc-vertical-row.c
In file included from /usr/lib64/glib-2.0/include/glibconfig.h:9,
from /usr/include/glib-2.0/glib/gtypes.h:34,
from /usr/include/glib-2.0/glib/galloca.h:34,
from /usr/include/glib-2.0/glib.h:32,
from /usr/include/gtk-4.0/gtk/css/gtkcss.h:29,
from /usr/include/gtk-4.0/gtk/gtk.h:29,
from /usr/include/libadwaita-1/adwaita.h:9,
from ../panels/common/cc-vertical-row.h:25,
from ../panels/common/cc-vertical-row.c:23:
../panels/common/cc-vertical-row.c: In function ‘cc_vertical_row_dispose’:
../panels/common/cc-vertical-row.c:192:20: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
192 | g_clear_pointer ((GtkWidget**)&priv->header, gtk_widget_unparent);
/usr/include/glib-2.0/glib/gmacros.h:870:47: note: in definition of macro ‘G_STATIC_ASSERT’
870 | #define G_STATIC_ASSERT(expr) _Static_assert (expr, "Expression evaluates to false")
| ^~~~
../panels/common/cc-vertical-row.c:192:3: note: in expansion of macro ‘g_clear_pointer’
192 | g_clear_pointer ((GtkWidget**)&priv->header, gtk_widget_unparent);
| ^~~~~~~~~~~~~~~
In file included from /usr/include/glib-2.0/glib/gatomic.h:30,
from /usr/include/glib-2.0/glib/gthread.h:34,
from /usr/include/glib-2.0/glib/gasyncqueue.h:34,
from /usr/include/glib-2.0/glib.h:34:
../panels/common/cc-vertical-row.c:192:20: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
192 | g_clear_pointer ((GtkWidget**)&priv->header, gtk_widget_unparent);
/usr/include/glib-2.0/glib/glib-typeof.h:39:36: note: in definition of macro ‘glib_typeof’
39 | #define glib_typeof(t) __typeof__ (t)
| ^
../panels/common/cc-vertical-row.c:192:3: note: in expansion of macro ‘g_clear_pointer’
192 | g_clear_pointer ((GtkWidget**)&priv->header, gtk_widget_unparent);
| ^~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
ninja: build stopped: subcommand failed.
In panels/common/cc-vertical-row.c
, we have
g_clear_pointer ((GtkWidget**)&priv->header, gtk_widget_unparent);
The same issue occurs elsewhere as well:
../panels/wwan/cc-wwan-device-page.c:539:3: note: in expansion of macro ‘g_clear_pointer’
539 | g_clear_pointer ((GtkWindow **)&self->network_dialog, gtk_window_destroy);
| ^~~~~~~~~~~~~~~
../panels/wwan/cc-wwan-device-page.c:540:3: note: in expansion of macro ‘g_clear_pointer’
540 | g_clear_pointer ((GtkWindow **)&self->sim_lock_dialog, gtk_window_destroy);
| ^~~~~~~~~~~~~~~
../panels/thunderbolt/cc-bolt-panel.c:958:20: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
958 | g_clear_pointer ((GtkWindow **) &self->device_dialog, gtk_window_destroy);
I don't think we can use GTK_WINDOW
here, since g_clear_pointer
wants to clear the pointer itself.
Do we need a g_clear_pointer
variant that internally casts the argument to the appropriate type or something, or is there a better way to solve this?