https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82594
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |diagnostic Status|UNCONFIRMED |NEW Last reconfirmed| |2017-10-17 Version|unknown |7.2.0 Ever confirmed|0 |1 Severity|normal |enhancement --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So if there are more than one overloads, the C++ front-end produces: t88.c: In function 'void initialize()': t88.c:13:35: error: no matching function for call to 'set_delete_thread(void (&)(S2*))' set_delete_thread (delete_thread); ^ t88.c:5:6: note: candidate: void set_delete_thread(S1*, void (*)(S2*)) void set_delete_thread (struct S1 *, void (*) (struct S2 *)); ^~~~~~~~~~~~~~~~~ t88.c:5:6: note: candidate expects 2 arguments, 1 provided t88.c:6:6: note: candidate: void set_delete_thread(S1*) void set_delete_thread (struct S1 *); ^~~~~~~~~~~~~~~~~ t88.c:6:6: note: no known conversion for argument 1 from 'void(S2*)' to 'S1*' But with only one overload, GCC produces: t88.c: In function 'void initialize()': t88.c:13:35: error: cannot convert 'void (*)(S2*)' to 'S1*' for argument '1' to 'void set_delete_thread(S1*, void (*)(S2*))' set_delete_thread (delete_thread); ^ I do think the C++ front-end's case with one overload set is actually can be improved. Note the C front-end produces: t88.c: In function 'initialize': t88.c:13:22: warning: passing argument 1 of 'set_delete_thread' from incompatible pointer type [-Wincompatible-pointer-types] set_delete_thread (delete_thread); ^~~~~~~~~~~~~ t88.c:5:6: note: expected 'struct S1 *' but argument is of type 'void (*)(struct S2 *)' void set_delete_thread (struct S1 *, void (*) (struct S2 *)); ^~~~~~~~~~~~~~~~~ t88.c:13:3: error: too few arguments to function 'set_delete_thread' set_delete_thread (delete_thread); ^~~~~~~~~~~~~~~~~ t88.c:5:6: note: declared here void set_delete_thread (struct S1 *, void (*) (struct S2 *)); ^~~~~~~~~~~~~~~~~