https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80311
Bug ID: 80311 Summary: Bound member functions extension allows bogus conversions Product: gcc Version: 7.0.1 Status: UNCONFIRMED Keywords: accepts-invalid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- struct X { int i = 0; int f() { return i; } }; int main() { X x; using fp = int (*)(); auto f = (fp)(&X::f); return f(); } This bogus attempt to use https://gcc.gnu.org/onlinedocs/gcc/Bound-member-functions.html fails, because there is no 'this' pointer provided for the call to the bound function. G++ should notice this and give a diagnostic, even with -Wno-pmf-conversions. The diagnostic should be given when converting to a function pointer that doesn't match the arguments that would be needed for the bound function. i.e. for (fp)(&X::f) or (fp)(x.*pmf) where that resovles to a pointer to: R Y::f(Args...) we should warn if fp is not R (*)(Y*, Args...). This should simply be an error, not a warning. I see no reason to allow the extension to form invalid function pointers. Code that really really wants to do so can always perform a conversion after forming the bound function pointer: struct X { int i = 0; int f() { return i; } }; int main() { X x; using wrong_type = int(*)(); using right_type = int(*)(X*); auto f = (wrong_type)(right_type)(&X::f); return ((right_type)f)(); } Maybe -fpermissive could cause it to be allowed without the extra conversion, for legacy code misusing the feature.