pspp-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Cascaded casts


From: Friedrich Beckmann
Subject: Re: Cascaded casts
Date: Tue, 25 Aug 2020 13:16:47 +0200

Hi John,

the relevant warning without the change is here:

../pspp/src/ui/gui/psppire-acr.c: In function ‘on_change_button_clicked’:
../pspp/src/ui/gui/psppire-acr.c:186:22: warning: cast between incompatible 
function types from ‘void (*)(GtkTreePath *)’ {aka ‘void (*)(struct 
_GtkTreePath *)’} to ‘void (*)(void *, void *)’ [-Wcast-function-type]
   g_list_foreach (l, (GFunc) gtk_tree_path_free, NULL);

You can see the full build log here: 
http://caeis.etech.fh-augsburg.de:8010/#/builders/4/builds/26

On debian-buster the compiler is gcc8 while on sid the compiler is gcc10.

GFunc is defined with two parameters: 
https://developer.gnome.org/glib/stable/glib-Doubly-Linked-Lists.html#GFunc

while gtk_tree_path_free has only one:

https://developer.gnome.org/gtk3/stable/GtkTreeModel.html#gtk-tree-path-free

I guess it is the same behaviour that resulted in this macro

https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#G-SOURCE-FUNC:CAPS

A discussion about this check is here:

https://gitlab.gnome.org/GNOME/gnome-terminal/-/issues/96

resulting in this cast. Root cause seems to be that the behaviour for different 
number of arguments is undefined.

http://c0x.coding-guidelines.com/6.5.2.2.html

The clang compiler version 9 does not issue this warning.

Fritz

> Am 25.08.2020 um 07:00 schrieb John Darrington <john@darrington.wattle.id.au>:
> 
> I don't understand this commit, and I think it just makes the code
> harder to read:
> 
> 
>    commit ceaed4a17cb3b0a14c89f10b72a636f94af97e7a
>    Author: Friedrich Beckmann <friedrich.beckmann@gmx.de>
>    Date:   Mon Aug 24 11:19:33 2020 +0200
> 
>        Warnings: function type cast for g_list_foreach
> 
>        I added a cast for the functions used in g_list_foreach. Without
>        the cast, the warning
>        warning: cast between incompatible function types
>        is reported.
> 
>    diff --git a/src/ui/gui/dialog-common.c b/src/ui/gui/dialog-common.c
>    index f167034b1..1b29c4a3b 100644
>    --- a/src/ui/gui/dialog-common.c
>    +++ b/src/ui/gui/dialog-common.c
>    @@ -112,7 +112,7 @@ homogeneous_types (GtkWidget *source, GtkWidget *dest)
>           have_type = true;
>         }
> 
>    -  g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
>    +  g_list_foreach (list, (GFunc) (void (*)(void)) gtk_tree_path_free, 
> NULL);
> 
> 
> gtk_tree_path_free is already cast to GFunc,  so what good does it do to first
> cast it to something else, and _then_ to GFunc without using it?   You say 
> that
> something is reporting this as a "cast between incompatible types" - That is
> what casts are for  -  to make incompatible types compatible.
> 
> Before, we had:
> 
>  (void (*) (GtkTreePath *)   -> (void (*) (void *, void *))
> 
> Now we have:
> 
>  (void (*) (GtkTreePath *)  -> (void (*) (void))  -> (void (*) (void *, void 
> *))
> 
> What good does the intermediate cast do?  Which tool is issuing a warning?
> 
> J'
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]