mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 18:46:40 +00:00

Word on the grapevine was that the committee had some discussion that ended with unanimous agreement on eliminating relational function pointer comparisons. We wanted to be bold and just ban all of them cold turkey. But then we chickened out at the last second and are going for eliminating just the spaceship overload candidate instead, for now. See D104680 for reference. This should be fine and "safe", because the only possible semantic change this would cause is that overload resolution could possibly be ambiguous if there was another viable candidate equally as good. But to save face a little we are going to: * Issue an "error" for three-way comparisons on function pointers. But all this is doing really is changing one vague error message, from an "invalid operands to binary expression" into an "ordered comparison of function pointers", which sounds more like we mean business. * Otherwise "warn" that comparing function pointers like that is totally not cool (unless we are told to keep quiet about this). Signed-off-by: Matheus Izvekov <mizvekov@gmail.com> Reviewed By: rsmith Differential Revision: https://reviews.llvm.org/D104892
28 lines
1.6 KiB
C++
28 lines
1.6 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s
|
|
|
|
using fp0_t = void (*)();
|
|
using fp1_t = int (*)();
|
|
|
|
extern fp0_t a, b;
|
|
extern fp1_t c;
|
|
|
|
bool eq0 = a == b;
|
|
bool ne0 = a != b;
|
|
bool lt0 = a < b; // expected-warning {{ordered comparison of function pointers ('fp0_t' (aka 'void (*)()') and 'fp0_t')}}
|
|
bool le0 = a <= b; // expected-warning {{ordered comparison of function pointers}}
|
|
bool gt0 = a > b; // expected-warning {{ordered comparison of function pointers}}
|
|
bool ge0 = a >= b; // expected-warning {{ordered comparison of function pointers}}
|
|
auto tw0 = a <=> b; // expected-error {{ordered comparison of function pointers}}
|
|
|
|
bool eq1 = a == c; // expected-error {{comparison of distinct pointer types}}
|
|
bool ne1 = a != c; // expected-error {{comparison of distinct pointer types}}
|
|
bool lt1 = a < c; // expected-warning {{ordered comparison of function pointers ('fp0_t' (aka 'void (*)()') and 'fp1_t' (aka 'int (*)()'))}}
|
|
// expected-error@-1 {{comparison of distinct pointer types}}
|
|
bool le1 = a <= c; // expected-warning {{ordered comparison of function pointers}}
|
|
// expected-error@-1 {{comparison of distinct pointer types}}
|
|
bool gt1 = a > c; // expected-warning {{ordered comparison of function pointers}}
|
|
// expected-error@-1 {{comparison of distinct pointer types}}
|
|
bool ge1 = a >= c; // expected-warning {{ordered comparison of function pointers}}
|
|
// expected-error@-1 {{comparison of distinct pointer types}}
|
|
auto tw1 = a <=> c; // expected-error {{ordered comparison of function pointers}}
|