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> 2019-12-09 David Malcolm <dmalcolm@redhat.com>
* error.c (range_label_for_type_mismatch::get_text): Replace * 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, ...@@ -6242,6 +6242,10 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
result = error_mark_node; result = error_mark_node;
else else
{ {
tsubst_flags_t ocomplain = complain;
if (cand->rewritten ())
/* We'll wrap this call in another one. */
ocomplain &= ~tf_decltype;
if (cand->reversed ()) if (cand->reversed ())
{ {
/* We swapped these in add_candidate, swap them back now. */ /* 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, ...@@ -6251,7 +6255,7 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
"current function recursively with reversed " "current function recursively with reversed "
"arguments"); "arguments");
} }
result = build_over_call (cand, LOOKUP_NORMAL, complain); result = build_over_call (cand, LOOKUP_NORMAL, ocomplain);
} }
if (trivial_fn_p (cand->fn)) 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