From 1fb81d83a8857770be56df19c8a3b4e0ca87c71c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 10 Dec 2019 15:06:58 -0500 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 6 +++++- gcc/testsuite/g++.dg/cpp2a/spaceship-decltype1.C | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/spaceship-decltype1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 51407878bba..b640e15ec29 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-12-10 Jason Merrill + + 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 * error.c (range_label_for_type_mismatch::get_text): Replace diff --git a/gcc/cp/call.c b/gcc/cp/call.c index ce942977f45..48d49b7ec87 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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)) diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-decltype1.C b/gcc/testsuite/g++.dg/cpp2a/spaceship-decltype1.C new file mode 100644 index 00000000000..bc673b2e020 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/spaceship-decltype1.C @@ -0,0 +1,11 @@ +// PR c++/92560 +// { dg-do compile { target c++2a } } + +#include + +struct X +{ + friend std::strong_ordering operator<=>(X, X); +} x; + +using T = decltype(x < x); -- 2.30.2