Merge branch 'th/gtype-cast-align-warning' into 'main'

gtype: avoid "-Wcast-align" warning with optimized G_TYPE_CHECK_INSTANCE_CAST()

See merge request GNOME/glib!3139
This commit is contained in:
Philip Withnall 2022-12-19 09:30:56 +00:00
commit 953f4fc25f
3 changed files with 27 additions and 4 deletions

View File

@ -2520,8 +2520,8 @@ const gchar * g_type_name_from_class (GTypeClass *g_class);
/* --- implementation bits --- */
#if defined(G_DISABLE_CAST_CHECKS) || defined(__OPTIMIZE__)
# define _G_TYPE_CIC(ip, gt, ct) ((ct*) ip)
# define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp)
# define _G_TYPE_CIC(ip, gt, ct) ((ct*) (void *) ip)
# define _G_TYPE_CCC(cp, gt, ct) ((ct*) (void *) cp)
#else
# define _G_TYPE_CIC(ip, gt, ct) \
((ct*) (void *) g_type_check_instance_cast ((GTypeInstance*) ip, gt))

View File

@ -76,7 +76,13 @@ gobject_tests = {
'signalgroup' : {},
'testing' : {},
'type-flags' : {},
'objects-refcount1' : {},
'objects-refcount1' : {
'c_args': cc.get_supported_arguments([
'-DG_DISABLE_CAST_CHECKS',
'-Werror',
'-Wcast-align=strict',
]),
},
'objects-refcount2' : {'suite' : ['slow']},
'properties-refcount1' : {},
'properties-refcount2' : {'suite' : ['slow']},

View File

@ -15,10 +15,27 @@
typedef struct _GTest GTest;
typedef struct _GTestClass GTestClass;
#if G_GNUC_CHECK_VERSION (4, 0)
/* Increase the alignment of GTest to check whether
* G_TYPE_CHECK_INSTANCE_CAST() would trigger a "-Wcast-align=strict" warning.
* That would happen, when trying to cast a "GObject*" to "GTest*", if latter
* has larger alignment.
*
* Note that merely adding a int64 field to GTest does not increase the
* alignment above 4 bytes on i386, hence use the __attribute__((__aligned__())).
*/
#define _GTest_increase_alignment __attribute__((__aligned__(__alignof(gint64))))
#else
#define _GTest_increase_alignment
#endif
struct _GTest
{
GObject object;
};
/* See _GTest_increase_alignment. */
long double increase_alignment2;
} _GTest_increase_alignment;
struct _GTestClass
{