summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2018-07-13 18:40:25 +0200
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2018-07-13 18:40:25 +0200
commit5d953603f30f0452cb9da35e3083a3fc145c3f57 (patch)
tree311ccd2264d138b275037866303b41befbd41f2b
parentfd8536f95018551150e5e1026545f2f7c036d119 (diff)
downloadglibmm-5d953603f30f0452cb9da35e3083a3fc145c3f57.tar.gz
Avoid compiler warnings from function pointer conversions
gcc8 -Wextra prints a warning when reinterpret_cast is used for conversion between different types of function pointers. Avoid that by instead using a union with members of the two types of function pointers. See https://github.com/libsigcplusplus/libsigcplusplus/issues/1
-rw-r--r--gio/giomm/socketsource.cc24
-rw-r--r--glib/glibmm/main.cc23
-rw-r--r--tests/glibmm_vector/main.cc13
3 files changed, 52 insertions, 8 deletions
diff --git a/gio/giomm/socketsource.cc b/gio/giomm/socketsource.cc
index af1e9740..8bad8f5b 100644
--- a/gio/giomm/socketsource.cc
+++ b/gio/giomm/socketsource.cc
@@ -54,6 +54,19 @@ giomm_socketsource_callback(GSocket*, GIOCondition condition, void* user_data)
return giomm_generic_socket_callback(slot, condition);
}
+GSourceFunc giomm_socketsource_cb_as_gsourcefunc()
+{
+ // Conversion between different types of function pointers with
+ // reinterpret_cast can make gcc8 print a warning.
+ // https://github.com/libsigcplusplus/libsigcplusplus/issues/1
+ union {
+ GSourceFunc ps;
+ decltype(&giomm_socketsource_callback) pss;
+ } u;
+ u.pss = &giomm_socketsource_callback;
+ return u.ps;
+}
+
} // anonymous namespace
namespace Gio
@@ -72,8 +85,13 @@ SignalSocket::connect(const sigc::slot<bool, Glib::IOCondition>& slot,
{
GSource* const source =
g_socket_create_source(socket->gobj(), (GIOCondition)condition, Glib::unwrap(cancellable));
- return Glib::Source::attach_signal_source(
- slot, priority, source, context_, (GSourceFunc)&giomm_signalsocket_callback);
+
+ union {
+ GSourceFunc ps;
+ decltype(&giomm_signalsocket_callback) pss;
+ } u;
+ u.pss = &giomm_signalsocket_callback;
+ return Glib::Source::attach_signal_source(slot, priority, source, context_, u.ps);
}
SignalSocket
@@ -96,7 +114,7 @@ SocketSource::SocketSource(const Glib::RefPtr<Socket>& socket, Glib::IOCondition
const Glib::RefPtr<Cancellable>& cancellable)
: IOSource(
g_socket_create_source(socket->gobj(), (GIOCondition)condition, Glib::unwrap(cancellable)),
- (GSourceFunc)&giomm_socketsource_callback)
+ giomm_socketsource_cb_as_gsourcefunc())
{
}
diff --git a/glib/glibmm/main.cc b/glib/glibmm/main.cc
index 30a294c4..45ba817e 100644
--- a/glib/glibmm/main.cc
+++ b/glib/glibmm/main.cc
@@ -278,6 +278,19 @@ glibmm_iosource_callback(GIOChannel*, GIOCondition condition, void* data)
return 0;
}
+GSourceFunc glibmm_iosource_cb_as_gsourcefunc()
+{
+ // Conversion between different types of function pointers with
+ // reinterpret_cast can make gcc8 print a warning.
+ // https://github.com/libsigcplusplus/libsigcplusplus/issues/1
+ union {
+ GSourceFunc ps;
+ decltype(&glibmm_iosource_callback) pios;
+ } u;
+ u.pios = &glibmm_iosource_callback;
+ return u.ps;
+}
+
/* Only used by SignalChildWatch::connect().
* These don't use Glib::Source, to avoid the unnecessary overhead
* of a completely unused wrapper object.
@@ -540,8 +553,12 @@ SignalChildWatch::connect(const sigc::slot<void, GPid, int>& slot, GPid pid, int
if (priority != G_PRIORITY_DEFAULT)
g_source_set_priority(source, priority);
- g_source_set_callback(source, (GSourceFunc)&glibmm_child_watch_callback, conn_node,
- &SourceConnectionNode::destroy_notify_callback);
+ union {
+ GSourceFunc ps;
+ decltype(&glibmm_child_watch_callback) pcw;
+ } u;
+ u.pcw = &glibmm_child_watch_callback;
+ g_source_set_callback(source, u.ps, conn_node, &SourceConnectionNode::destroy_notify_callback);
conn_node->install(source);
g_source_attach(source, context_);
@@ -1309,7 +1326,7 @@ IOSource::IOSource(PollFD::fd_t fd, IOCondition condition) : poll_fd_(fd, condit
IOSource::IOSource(const Glib::RefPtr<IOChannel>& channel, IOCondition condition)
: Source(g_io_create_watch(channel->gobj(), (GIOCondition)condition),
- (GSourceFunc)&glibmm_iosource_callback)
+ glibmm_iosource_cb_as_gsourcefunc())
{
}
diff --git a/tests/glibmm_vector/main.cc b/tests/glibmm_vector/main.cc
index 31138cf0..0f039356 100644
--- a/tests/glibmm_vector/main.cc
+++ b/tests/glibmm_vector/main.cc
@@ -196,14 +196,23 @@ public:
~Cache()
{
+ // Conversion between different types of function pointers with
+ // reinterpret_cast can make gcc8 print a warning.
+ // https://github.com/libsigcplusplus/libsigcplusplus/issues/1
+ union {
+ GFunc pf;
+ decltype(&g_object_unref) pou;
+ } u;
+ u.pou = &g_object_unref;
+
if (glist_)
{
- g_list_foreach(glist_, reinterpret_cast<GFunc>(g_object_unref), nullptr);
+ g_list_foreach(glist_, u.pf, nullptr);
g_list_free(glist_);
}
if (gslist_)
{
- g_slist_foreach(gslist_, reinterpret_cast<GFunc>(g_object_unref), nullptr);
+ g_slist_foreach(gslist_, u.pf, nullptr);
g_slist_free(gslist_);
}
if (garray_)