diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2018-07-11 15:57:55 +0000 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2018-07-11 15:57:55 +0000 |
commit | 08f41d802a8323ca1e819f865747d7adfbfe87aa (patch) | |
tree | 09b53b8a2d36a0e5338b22d3846d979ecd42c563 | |
parent | c182cd68c97d59f56f63e54c2605d16061ae1f11 (diff) | |
parent | 0da62659396261dde73570e292d7b131f08124c7 (diff) | |
download | glib-08f41d802a8323ca1e819f865747d7adfbfe87aa.tar.gz |
Merge branch 'type-safe-g-clear-pointer-1425' into 'master'
gmem.h: Use __typeof__() in the g_clear_pointer() macro
Closes #1425
See merge request GNOME/glib!165
-rw-r--r-- | glib/gmem.h | 11 | ||||
-rw-r--r-- | gobject/gobject.c | 2 | ||||
-rw-r--r-- | gobject/gobject.h | 2 | ||||
-rw-r--r-- | gobject/tests/reference.c | 2 |
4 files changed, 14 insertions, 3 deletions
diff --git a/glib/gmem.h b/glib/gmem.h index 5cccb045c..bf262f66e 100644 --- a/glib/gmem.h +++ b/glib/gmem.h @@ -110,6 +110,16 @@ gpointer g_try_realloc_n (gpointer mem, gsize n_blocks, gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT; +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(__cplusplus) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58 +#define g_clear_pointer(pp, destroy) \ + G_STMT_START { \ + G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer)); \ + __typeof__(*(pp)) _ptr = *(pp); \ + *(pp) = NULL; \ + if (_ptr) \ + destroy (_ptr); \ + } G_STMT_END +#else /* __GNUC__ */ #define g_clear_pointer(pp, destroy) \ G_STMT_START { \ G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer)); \ @@ -127,6 +137,7 @@ gpointer g_try_realloc_n (gpointer mem, _destroy (_p); \ } \ } G_STMT_END +#endif /* __GNUC__ */ /** * g_steal_pointer: diff --git a/gobject/gobject.c b/gobject/gobject.c index 555ca3fae..efb8ecab5 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -3378,7 +3378,7 @@ g_object_unref (gpointer _object) **/ #undef g_clear_object void -g_clear_object (volatile GObject **object_ptr) +g_clear_object (GObject **object_ptr) { g_clear_pointer (object_ptr, g_object_unref); } diff --git a/gobject/gobject.h b/gobject/gobject.h index 838046fe0..9abe87330 100644 --- a/gobject/gobject.h +++ b/gobject/gobject.h @@ -668,7 +668,7 @@ G_STMT_START { \ G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec)) GLIB_AVAILABLE_IN_ALL -void g_clear_object (volatile GObject **object_ptr); +void g_clear_object (GObject **object_ptr); #define g_clear_object(object_ptr) g_clear_pointer ((object_ptr), g_object_unref) /** diff --git a/gobject/tests/reference.c b/gobject/tests/reference.c index b05150e96..9508ee741 100644 --- a/gobject/tests/reference.c +++ b/gobject/tests/reference.c @@ -132,7 +132,7 @@ test_clear (void) static void test_clear_function (void) { - volatile GObject *o = NULL; + GObject *o = NULL; GObject *tmp; (g_clear_object) (&o); |