diff --git a/src/gui.h b/src/gui.h
index 508b7cf..a2d8f6a 100644
--- 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
index 9800c53..ac81f66 100644
--- 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.c b/src/gui_gtk.c
index 81320dd..f3a1872 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -223,7 +223,8 @@ typedef struct IconNames {
     const char *file_name;
 } IconNames;
 
-static IconNames stock_vim_icons[] = {
+static IconNames stock_vim_icons[] =
+{
     { "vim-build-tags", "stock_vim_build_tags.png" },
     { "vim-find-help", "stock_vim_find_help.png" },
     { "vim-save-all", "stock_vim_save_all.png" },
diff --git a/src/gui_gtk_f.c b/src/gui_gtk_f.c
index 838a4ca..6109c32 100644
--- 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, 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
