Merge branch 'add-g-has-typeof-1440' into 'master'

gmacros: Add new private g_has_typeof to abstract __typeof__ checks

Closes #1440

See merge request GNOME/glib!172
diff --git a/glib/gmacros.h b/glib/gmacros.h
index cfeb9a0..9b8ef0e 100644
--- a/glib/gmacros.h
+++ b/glib/gmacros.h
@@ -111,6 +111,18 @@
 #endif
 
 /*
+ * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
+ * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
+ * to factor the check out from callers.
+ *
+ * This symbol is private.
+ */
+#undef g_has_typeof
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(__cplusplus)
+#define g_has_typeof
+#endif
+
+/*
  * Clang feature detection: http://clang.llvm.org/docs/LanguageExtensions.html
  * These are not available on GCC, but since the pre-processor doesn't do
  * operator short-circuiting, we can't use it in a statement or we'll get:
diff --git a/glib/gmem.h b/glib/gmem.h
index 3028094..1860d01 100644
--- a/glib/gmem.h
+++ b/glib/gmem.h
@@ -110,7 +110,7 @@
 			   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
+#if defined(g_has_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58
 #define g_clear_pointer(pp, destroy)                                           \
   G_STMT_START {                                                               \
     G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer));                       \
diff --git a/glib/grcbox.h b/glib/grcbox.h
index 23b417f..e66f1ff 100644
--- a/glib/grcbox.h
+++ b/glib/grcbox.h
@@ -71,7 +71,7 @@
 #define g_atomic_rc_box_new0(type) \
   ((type *) g_atomic_rc_box_alloc0 (sizeof (type)))
 
-#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(_cplusplus)
+#ifdef g_has_typeof
 /* Type check to avoid assigning references to different types */
 # define g_rc_box_acquire(mem_block) \
   ((__typeof__(mem_block)) (g_rc_box_acquire) (mem_block))
diff --git a/gobject/gobject.h b/gobject/gobject.h
index 9abe873..b5648f1 100644
--- a/gobject/gobject.h
+++ b/gobject/gobject.h
@@ -507,7 +507,7 @@
 void        g_object_remove_weak_pointer      (GObject        *object, 
                                                gpointer       *weak_pointer_location);
 
-#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(__cplusplus) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_56
+#if defined(g_has_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_56
 /* Make reference APIs type safe with macros */
 #define g_object_ref(Obj)      ((__typeof__(Obj)) (g_object_ref) (Obj))
 #define g_object_ref_sink(Obj) ((__typeof__(Obj)) (g_object_ref_sink) (Obj))