mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-23 10:42:11 +01:00
We can get a "-Wcast-align", if the target type that we cast to ("ct") has a larger alignment than GTypeInstance. That can happen on i686 architecture, if the GObject type has larger alignment than the parent struct (or GObject). Since on i686, embeding a "long long" or a "long double" in a struct still does not increase the alignment beyond 4 bytes, this usually only happens when using the __attribute__() to increase the alignment (or to have a field that has the alignment increased). It can happen on x86_64 when having a "long double" field. The compiler warning is hard to avoid but not very useful, because it purely operates on the pointer types at compile time. G_TYPE_CHECK_INSTANCE_CAST() instead asserts (in non-optimized mode) that the pointer really points to the expected GTypeInstance (and if that's the case, then the alignment should be suitable already). This is like in commit ed553e8e309d ('gtype: Eliminate -Wcast-align warnings with G_TYPE_CHECK_INSTANCE_CAST'). But also fix the optimized code path. With the unpatched G_TYPE_CHECK_INSTANCE_CAST() macro, the unit test would now show the problem (with gcc-9.3.1-2.fc30.i686 or gcc-12.2.1-4.fc37.x86_64): $ export G_DISABLE_CAST_CHECKS=1 $ export CFLAGS='-Wcast-align=strict' $ meson build $ ninja -C build ... In file included from ../gobject/gobject.h:26, from ../gobject/gbinding.h:31, from ../glib/glib-object.h:24, from ../gobject/tests/objects-refcount1.c:2: ../gobject/tests/objects-refcount1.c: In function ‘my_test_dispose’: ../gobject/gtype.h:2523:42: warning: cast increases required alignment of target type [-Wcast-align] 2523 | # define _G_TYPE_CIC(ip, gt, ct) ((ct*) ip) | ^ ../gobject/gtype.h:517:66: note: in expansion of macro ‘_G_TYPE_CIC’ 517 | #define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type) (_G_TYPE_CIC ((instance), (g_type), c_type)) | ^~~~~~~~~~~ ../gobject/tests/objects-refcount1.c:9:37: note: in expansion of macro ‘G_TYPE_CHECK_INSTANCE_CAST’ 9 | #define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) | ^~~~~~~~~~~~~~~~~~~~~~~~~~ ../gobject/tests/objects-refcount1.c:96:10: note: in expansion of macro ‘MY_TEST’ 96 | test = MY_TEST (object); | ^~~~~~~