# HG changeset patch # User Christian Brabandt # Date 1473453907 -7200 # Node ID 51888fb2599fe0b47be3ab1539d3fc191f02128a # Parent 7172d313819c6922823590b2f45b9b2593382764 commit https://github.com/vim/vim/commit/d47d83745ff450232328ca7a4b8b00b31bad22fc Author: Bram Moolenaar Date: Fri Sep 9 22:13:24 2016 +0200 patch 7.4.2358 Problem: Compiler warnings with Solaris Studio when using GTK3. Solution: Define FUNC2GENERIC depending on the system. (Kazunobu Kuriyama) diff --git a/src/gui.h b/src/gui.h --- 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 */ diff --git a/src/gui_beval.c b/src/gui_beval.c --- a/src/gui_beval.c +++ b/src/gui_beval.c @@ -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), diff --git a/src/gui_gtk_f.c b/src/gui_gtk_f.c --- a/src/gui_gtk_f.c +++ b/src/gui_gtk_f.c @@ -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, { #if GTK_CHECK_VERSION(3,0,0) g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget), - G_CALLBACK(>k_form_child_map), child); + FUNC2GENERIC(>k_form_child_map), child); g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget), - G_CALLBACK(>k_form_child_unmap), child); + FUNC2GENERIC(>k_form_child_unmap), child); #else gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget), - GTK_SIGNAL_FUNC(>k_form_child_map), child); + GTK_SIGNAL_FUNC(>k_form_child_map), child); gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget), - GTK_SIGNAL_FUNC(>k_form_child_unmap), child); + GTK_SIGNAL_FUNC(>k_form_child_unmap), child); #endif /* FIXME: This will cause problems for reparenting NO_WINDOW diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2358, +/**/ 2357, /**/ 2356,