https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94721
Bug ID: 94721 Summary: C++2a: Three-way comparison operator for function pointers rejected Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: daniel.kruegler at googlemail dot com Target Milestone: --- Using the compiler flags -Wall -Wextra -std=c++2a -pedantic the following code example //------------------ #include <compare> void foo() {} void bar() {} int main() { auto p1 = &foo; auto p2 = &bar; return (p1 <=> p2) != 0 ? 0 : 1; } //------------------ is rejected: >>>>>>>>>>>>>>> prog.cc: In function 'int main()': prog.cc:10:14: error: invalid operands of types 'void (*)()' and 'void (*)()' to binary 'operator<=>' 10 | return (p1 <=> p2) != 0 ? 0 : 1; | ~~ ^~~ ~~ | | | | | void (*)() | void (*)() <<<<<<<<<<<<<<< This code should be accepted, because according to [over.built] p18: "For every T, where T is [..] a pointer type, there exist candidate operator functions of the form [..] R operator<=>(T, T); where R is the result type specified in 7.6.8." And 7.6.8 [expr.spaceship] p7 says: "[..] If two pointer operands p and q compare equal (7.6.10), p <=> q yields std::strong_ordering::equal; if p and q compare unequal, p <=> q yields std::strong_ordering::less if q compares greater than p and std::strong_ordering::greater if p compares greater than q (7.6.9). Otherwise, the result is unspecified."