summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2018-07-11 15:57:55 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2018-07-11 15:57:55 +0000
commit08f41d802a8323ca1e819f865747d7adfbfe87aa (patch)
tree09b53b8a2d36a0e5338b22d3846d979ecd42c563
parentc182cd68c97d59f56f63e54c2605d16061ae1f11 (diff)
parent0da62659396261dde73570e292d7b131f08124c7 (diff)
downloadglib-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.h11
-rw-r--r--gobject/gobject.c2
-rw-r--r--gobject/gobject.h2
-rw-r--r--gobject/tests/reference.c2
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);