]> git.ipfire.org Git - thirdparty/gcc.git/commit - libstdc++-v3/testsuite/18_support/comparisons/algorithms/partial_order.cc
c++: Fix defaulted <=> fallback to < and == [PR96299]
authorJason Merrill <jason@redhat.com>
Sat, 5 Dec 2020 02:48:43 +0000 (21:48 -0500)
committerJason Merrill <jason@redhat.com>
Tue, 8 Dec 2020 20:12:25 +0000 (15:12 -0500)
commit4ed1dc1275bba89af92bfc7d97c21b376e4c29c3
tree03acc5cf7dbc5e9e56aa34664cdd835c803cd181
parenta988a398d6daef3072cd2d07a21980911d8f93fc
c++: Fix defaulted <=> fallback to < and == [PR96299]

I thought I had implemented P1186R3, but apparently I didn't read it closely
enough to understand the point of the paper, namely that for a defaulted
operator<=>, if a member type doesn't have a viable operator<=>, we will use
its operator< and operator== if the defaulted operator has an specific
comparison category as its return type; the compiler can't guess if it
should be strong_ordering or something else, but the user can make that
choice explicit.

The libstdc++ test change was necessary because of the change in
genericize_spaceship from op0 > op1 to op1 < op0; this should be equivalent,
but isn't because of PR88173.

gcc/cp/ChangeLog:

PR c++/96299
* cp-tree.h (build_new_op): Add overload that omits some parms.
(genericize_spaceship): Add location_t parm.
* constexpr.c (cxx_eval_binary_expression): Pass it.
* cp-gimplify.c (genericize_spaceship): Pass it.
* method.c (genericize_spaceship): Handle class-type arguments.
(build_comparison_op): Fall back to op</== when appropriate.

gcc/testsuite/ChangeLog:

PR c++/96299
* g++.dg/cpp2a/spaceship-synth-neg2.C: Move error.
* g++.dg/cpp2a/spaceship-p1186.C: New test.

libstdc++-v3/ChangeLog:

PR c++/96299
* testsuite/18_support/comparisons/algorithms/partial_order.cc:
One more line needs to use VERIFY instead of static_assert.
gcc/cp/constexpr.c
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/cp/method.c
gcc/testsuite/g++.dg/cpp2a/spaceship-p1186.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/spaceship-synth-neg2.C
libstdc++-v3/testsuite/18_support/comparisons/algorithms/partial_order.cc