]> granicus.if.org Git - vim/commitdiff
patch 7.4.2358 v7.4.2358
authorBram Moolenaar <Bram@vim.org>
Fri, 9 Sep 2016 20:13:24 +0000 (22:13 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 9 Sep 2016 20:13:24 +0000 (22:13 +0200)
Problem:    Compiler warnings with Solaris Studio when using GTK3.
Solution:   Define FUNC2GENERIC depending on the system. (Kazunobu Kuriyama)

src/gui.h
src/gui_beval.c
src/gui_gtk_f.c
src/version.c

index d44a2e26a853386e0774baf6ca05fe5d841f84d8..476971624c7737e381082ebc520287a7c524073a 100644 (file)
--- a/src/gui.h
+++ b/src/gui.h
@@ -541,3 +541,29 @@ typedef enum
 # define CONVERT_FROM_UTF8(String) (String)
 # define CONVERT_FROM_UTF8_FREE(String) ((String) = (char_u *)NULL)
 #endif /* FEAT_GUI_GTK */
+
+#ifdef FEAT_GUI_GTK
+/*
+ * The second parameter of g_signal_handlers_disconnect_by_func() is supposed
+ * to be a function pointer which was passed to g_signal_connect_*() somewhere
+ * previously, and hence it must be of type GCallback, i.e., void (*)(void).
+ *
+ * Meanwhile, g_signal_handlers_disconnect_by_func() is a macro calling
+ * g_signal_handlers_disconnect_matched(), and the second parameter of the
+ * former is to be passed to the sixth parameter of the latter the type of
+ * which, however, is declared as void * in the function signature.
+ *
+ * While the ISO C Standard does not require that function pointers be
+ * interconvertible to void *, widely-used compilers such as gcc and clang
+ * do such conversion implicitly and automatically on some platforms without
+ * issuing any warning.
+ *
+ * For Solaris Studio, that is not the case.  An explicit type cast is needed
+ * to suppress warnings on that particular conversion.
+ */
+# if defined(__SUNPRO_C) && defined(USE_GTK3)
+#  define FUNC2GENERIC(func) (void *)(func)
+# else
+#  define FUNC2GENERIC(func) G_CALLBACK(func)
+# endif
+#endif /* FEAT_GUI_GTK */
index ac1df47d0d032acc5f646eb9f66ddc47b920e511..4a7c06ed9cf20df3b3b28a3674c371b1d602cedc 100644 (file)
@@ -508,7 +508,7 @@ removeEventHandler(BalloonEval *beval)
     /* LINTED: avoid warning: dubious operation on enum */
 # if GTK_CHECK_VERSION(3,0,0)
     g_signal_handlers_disconnect_by_func(G_OBJECT(beval->target),
-                                        G_CALLBACK(target_event_cb),
+                                        FUNC2GENERIC(target_event_cb),
                                         beval);
 # else
     gtk_signal_disconnect_by_func((GtkObject*)(beval->target),
@@ -522,7 +522,7 @@ removeEventHandler(BalloonEval *beval)
        /* LINTED: avoid warning: dubious operation on enum */
 # if GTK_CHECK_VERSION(3,0,0)
        g_signal_handlers_disconnect_by_func(G_OBJECT(gui.mainwin),
-                                            G_CALLBACK(mainwin_event_cb),
+                                            FUNC2GENERIC(mainwin_event_cb),
                                             beval);
 # else
        gtk_signal_disconnect_by_func((GtkObject*)(gui.mainwin),
index 931a9395ab8809b7b9e3e57ff6f85f6283f44722..182fe82f96120a1bfb51e1789c36724cbbdfd7bd 100644 (file)
@@ -505,18 +505,18 @@ gtk_form_unrealize(GtkWidget *widget)
        {
 #if GTK_CHECK_VERSION(3,0,0)
            g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
-                   G_CALLBACK(gtk_form_child_map),
+                   FUNC2GENERIC(gtk_form_child_map),
                    child);
            g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
-                   G_CALLBACK(gtk_form_child_unmap),
+                   FUNC2GENERIC(gtk_form_child_unmap),
                    child);
 #else
            gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
-                                         GTK_SIGNAL_FUNC(gtk_form_child_map),
-                                         child);
+                   GTK_SIGNAL_FUNC(gtk_form_child_map),
+                   child);
            gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
-                                         GTK_SIGNAL_FUNC(gtk_form_child_unmap),
-                                         child);
+                   GTK_SIGNAL_FUNC(gtk_form_child_unmap),
+                   child);
 #endif
 
            gdk_window_set_user_data(child->window, NULL);
@@ -793,14 +793,14 @@ gtk_form_remove(GtkContainer *container, GtkWidget *widget)
        {
 #if GTK_CHECK_VERSION(3,0,0)
            g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
-                                         G_CALLBACK(&gtk_form_child_map), child);
+                   FUNC2GENERIC(&gtk_form_child_map), child);
            g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
-                                         G_CALLBACK(&gtk_form_child_unmap), child);
+                   FUNC2GENERIC(&gtk_form_child_unmap), child);
 #else
            gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
-                                         GTK_SIGNAL_FUNC(&gtk_form_child_map), child);
+                   GTK_SIGNAL_FUNC(&gtk_form_child_map), child);
            gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
-                                         GTK_SIGNAL_FUNC(&gtk_form_child_unmap), child);
+                   GTK_SIGNAL_FUNC(&gtk_form_child_unmap), child);
 #endif
 
            /* FIXME: This will cause problems for reparenting NO_WINDOW
index de3d5fc970ad78ad5b5ae6370d75c40938967b9f..0767d4afd1f8adbc6711541739640585e01c4ce4 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2358,
 /**/
     2357,
 /**/