c++: Fix static initialization from <=>.
authorJason Merrill <jason@redhat.com>
Mon, 10 Feb 2020 13:05:06 +0000 (14:05 +0100)
committerJason Merrill <jason@redhat.com>
Tue, 11 Feb 2020 08:17:42 +0000 (09:17 +0100)
commitdfffecb802681fbdb56629d3bdd96491ac660be0
treec39d43ce40c0895261f2d7993ac4b5a8c783bcba
parenta6ee556c7659877bb59b719f11ca2153e86ded59
c++: Fix static initialization from <=>.

Constant evaluation of genericize_spaceship produced a CONSTRUCTOR, which we
then wanted to bind to a reference, which we can't do.  So wrap the result
in a TARGET_EXPR so we get something with an address.

We also need to handle treating the result of cxx_eval_binary_expression as
a glvalue for SPACESHIP_EXPR.

My earlier change to add uid_sensitive to maybe_constant_value was wrong; we
don't even look at the cache when manifestly_const_eval, and I failed to
adjust the later call to cxx_eval_outermost_constant_expr.

gcc/cp/ChangeLog
2020-02-11  Jason Merrill  <jason@redhat.com>

PR c++/93650
PR c++/90691
* constexpr.c (maybe_constant_value): Correct earlier change.
(cxx_eval_binary_expression) [SPACESHIP_EXPR]: Pass lval through.
* method.c (genericize_spaceship): Wrap result in TARGET_EXPR.
gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/cp/method.c
gcc/testsuite/g++.dg/cpp2a/spaceship-constexpr2.C [new file with mode: 0644]