PR c++/92560 - ICE with decltype and rewritten operator.
authorJason Merrill <jason@redhat.com>
Tue, 10 Dec 2019 20:06:58 +0000 (15:06 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 10 Dec 2019 20:06:58 +0000 (15:06 -0500)
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
gcc/cp/call.c
gcc/testsuite/g++.dg/cpp2a/spaceship-decltype1.C [new file with mode: 0644]

index 51407878bbaa16163b1957999db6b6ff79c2cfe4..b640e15ec2924a1ec38166ff4a286e7787989d2d 100644 (file)
@@ -1,3 +1,8 @@
+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
index ce942977f45e350e12418edba44739b75e2265b5..48d49b7ec876e9f0b32ead4c1c9a22dedeffecfe 100644 (file)
@@ -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 (file)
index 0000000..bc673b2
--- /dev/null
@@ -0,0 +1,11 @@
+// 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);