public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-6715] c++: checking ICE with diagnosed constraint recursion [PR100288]
@ 2023-03-16 18:23 Patrick Palka
  0 siblings, 0 replies; only message in thread
From: Patrick Palka @ 2023-03-16 18:23 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:c630157fd01140dbce120c1409c413a97dc17104

commit r13-6715-gc630157fd01140dbce120c1409c413a97dc17104
Author: Patrick Palka <ppalka@redhat.com>
Date:   Thu Mar 16 14:22:54 2023 -0400

    c++: checking ICE with diagnosed constraint recursion [PR100288]
    
    When satisfaction_cache::get detects constraint recursion, it asserts
    that entry->result is empty.  This makes sense when we're initially
    detecting/diagnosing recursion from the inner recursive call, but
    afterwards from the outer recursive call the recursion error is treated
    like any other unrelated constraint failure encountered during
    satisfaction, and we set entry->result to whatever the satisfaction
    value ended up being.
    
    Perhaps we should keep entry->result cleared in this case, but that'd
    require the inner recursive call to communicate to the outer recursive
    call that constraint recursion occurred, likely via setting entry->result
    to some sentinel value, which doesn't seem to be worth the complexity.
    So this patch just relaxes the problematic assert to accept non-empty
    entry->result as long as we've already issued an error.
    
            PR c++/100288
    
    gcc/cp/ChangeLog:
    
            * constraint.cc (satisfaction_cache::get): Relax overly strict
            checking assert in the constraint recursion case.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/concepts-recursive-sat5.C: New test.

Diff:
---
 gcc/cp/constraint.cc                                 |  2 +-
 gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat5.C | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index a28c85178fe..273d15ab097 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -2705,7 +2705,7 @@ satisfaction_cache::get ()
   if (entry->evaluating)
     {
       /* If we get here, it means satisfaction is self-recursive.  */
-      gcc_checking_assert (!entry->result);
+      gcc_checking_assert (!entry->result || seen_error ());
       if (info.noisy ())
 	error_at (EXPR_LOCATION (ATOMIC_CONSTR_EXPR (entry->atom)),
 		  "satisfaction of atomic constraint %qE depends on itself",
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat5.C
new file mode 100644
index 00000000000..ba564873a20
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat5.C
@@ -0,0 +1,13 @@
+// PR c++/100288
+// { dg-do compile { target c++20 } }
+
+struct A { };
+
+template<typename T> concept pipeable = requires(A a, T t) { a | t; }; // { dg-error "depends on itself" }
+
+template<pipeable T> void operator|(A, T);
+
+void f(A tab) {
+  tab | 1; // { dg-error "no match" }
+  tab | 1; // { dg-error "no match" }
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-16 18:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-16 18:23 [gcc r13-6715] c++: checking ICE with diagnosed constraint recursion [PR100288] Patrick Palka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).