g_clear_pointer: work around gcc helpfulness
authorDan Winship <danw@gnome.org>
Thu, 10 May 2012 17:29:39 +0000 (13:29 -0400)
committerDan Winship <danw@gnome.org>
Thu, 17 May 2012 14:47:05 +0000 (10:47 -0400)
gcc gets upset when we do "((GDestroyNotify) destroy) (_p)" because
it's non-portable. But we don't care; we already know glib wouldn't
work on any platform where different pointer types have different
calling conventions. So tweak the code to avoid the warning.

https://bugzilla.gnome.org/show_bug.cgi?id=674634

glib/gmem.h

index 597bfdf..c50f46e 100644 (file)
@@ -103,6 +103,8 @@ gpointer g_try_realloc_n  (gpointer  mem,
     /* Only one access, please */                                              \
     gpointer *_pp = (gpointer *) (pp);                                         \
     gpointer _p;                                                               \
+    /* This assignment is needed to avoid a gcc warning */                     \
+    GDestroyNotify _destroy = (GDestroyNotify) (destroy);                      \
                                                                                \
     (void) (0 ? (gpointer) *(pp) : 0);                                         \
     do                                                                         \
@@ -110,7 +112,7 @@ gpointer g_try_realloc_n  (gpointer  mem,
     while G_UNLIKELY (!g_atomic_pointer_compare_and_exchange (_pp, _p, NULL)); \
                                                                                \
     if (_p)                                                                    \
-      ((GDestroyNotify) (destroy)) (_p);                                       \
+      _destroy (_p);                                                           \
   } G_STMT_END
 
 /* Optimise: avoid the call to the (slower) _n function if we can