]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: local class memfn synth from noexcept context [PR113063]
authorPatrick Palka <ppalka@redhat.com>
Thu, 5 Sep 2024 18:31:00 +0000 (14:31 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 5 Sep 2024 18:31:00 +0000 (14:31 -0400)
commit37977343ff4f9dcb047d966d8cbaa222964763f9
treeaacb3a3af08fa566f09f425f0900b3b9f5d5ccdd
parentc880fca6cdb16c5efe3a12ee7ecdb2435f5e7105
c++: local class memfn synth from noexcept context [PR113063]

Extending the PR113063 testcase to additionally constant evaluate the <=>
expression causes us to trip over the assert in cxx_eval_call_expression

  /* We used to shortcut trivial constructor/op= here, but nowadays
     we can only get a trivial function here with -fno-elide-constructors.  */
  gcc_checking_assert (!trivial_fn_p (fun)
                       || !flag_elide_constructors
                       /* We don't elide constructors when processing
                          a noexcept-expression.  */
                       || cp_noexcept_operand);

since the local class's <=> was first used and therefore synthesized in
a noexcept context and so its definition contains unelided trivial
constructors.

This patch fixes this by clearing cp_noexcept_operand alongside
cp_unevaluated_context in the function-local case of
maybe_push_to_top_level.

PR c++/113063

gcc/cp/ChangeLog:

* name-lookup.cc (local_state_t): Clear and restore
cp_noexcept_operand as well.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/spaceship-synth16.C: Also constant evaluate
the <=> expression.
* g++.dg/cpp2a/spaceship-synth16a.C: Likewise.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/name-lookup.cc
gcc/testsuite/g++.dg/cpp2a/spaceship-synth16.C
gcc/testsuite/g++.dg/cpp2a/spaceship-synth16a.C