Commit 1fb81d83 by Jason Merrill Committed by Jason Merrill

PR c++/92560 - ICE with decltype and rewritten operator.

A call as the immediate operand of decltype is handled differently; we don't
create an object of the return type as we do normally.  But in the case of a
rewritten operator, we're adding another call as a wrapper, so the inner
call doesn't get the special handling.

	* call.c (build_new_op_1): Clear tf_decltype on inner call.

From-SVN: r279183
parent 42aed357
2019-12-10 Jason Merrill <jason@redhat.com>
PR c++/92560 - ICE with decltype and rewritten operator.
* call.c (build_new_op_1): Clear tf_decltype on inner call.
2019-12-09 David Malcolm <dmalcolm@redhat.com>
* error.c (range_label_for_type_mismatch::get_text): Replace
......
......@@ -6242,6 +6242,10 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
result = error_mark_node;
else
{
tsubst_flags_t ocomplain = complain;
if (cand->rewritten ())
/* We'll wrap this call in another one. */
ocomplain &= ~tf_decltype;
if (cand->reversed ())
{
/* We swapped these in add_candidate, swap them back now. */
......@@ -6251,7 +6255,7 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
"current function recursively with reversed "
"arguments");
}
result = build_over_call (cand, LOOKUP_NORMAL, complain);
result = build_over_call (cand, LOOKUP_NORMAL, ocomplain);
}
if (trivial_fn_p (cand->fn))
......
// PR c++/92560
// { dg-do compile { target c++2a } }
#include <compare>
struct X
{
friend std::strong_ordering operator<=>(X, X);
} x;
using T = decltype(x < x);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment