Permalink
Browse files

patch 7.4.2358

Problem:    Compiler warnings with Solaris Studio when using GTK3.
Solution:   Define FUNC2GENERIC depending on the system. (Kazunobu Kuriyama)
  • Loading branch information...
1 parent 4664371 commit d47d83745ff450232328ca7a4b8b00b31bad22fc @brammool brammool committed Sep 9, 2016
Showing with 40 additions and 12 deletions.
  1. +26 −0 src/gui.h
  2. +2 −2 src/gui_beval.c
  3. +10 −10 src/gui_gtk_f.c
  4. +2 −0 src/version.c
View
@@ -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 */
View
@@ -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),
View
@@ -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
View
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2358,
+/**/
2357,
/**/
2356,

0 comments on commit d47d837

Please sign in to comment.