From 79f57d5cb070bb02ea0a34b5f42658d6659b19a8 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Thu, 17 Dec 2020 22:18:07 -0500 Subject: c++: Diagnose self-recursive satisfaction This patch further extends the satisfaction_cache class to diagnose self-recursive satisfaction. gcc/cp/ChangeLog: * constraint.cc (sat_entry::evaluating): New member. (satisfaction_cache::get): If entry->evaluating, diagnose self-recursive satisfaction. Otherwise, set entry->evaluating if we're not reusing a cached satisfaction result. (satisfaction_cache::save): Clear entry->evaluating. (satisfy_atom): Set up diagnosing_failed_constraint before the first call to get(). gcc/testsuite/ChangeLog: PR c++/96840 * g++.dg/cpp2a/concepts-pr88395.C: Adjust to expect the self-recursive satisfaction to get directly diagnosed. * g++.dg/cpp2a/concepts-recursive-sat2.C: Likewise. * g++.dg/cpp2a/concepts-recursive-sat4.C: New test. --- gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C | 8 +++----- gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C | 6 ++---- gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat4.C | 13 +++++++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat4.C (limited to 'gcc/testsuite') diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C b/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C index 1c25252..e1792e1 100644 --- a/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C @@ -1,9 +1,9 @@ // { dg-do compile { target c++20 } } template -concept Concept2 = requires (T t, U u) +concept Concept2 = requires (T t, U u) // { dg-error "depends on itself" } { - t += u; // { dg-error "template instantiation depth" } + t += u; }; template @@ -17,7 +17,5 @@ struct S constexpr S operator * (S a, S b) { - return a += b; + return a += b; // { dg-error "no match" } } - -// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C index 992fcbb..9bc96f5 100644 --- a/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C @@ -1,7 +1,7 @@ // { dg-do compile { target c++20 } } template -concept Fooable = requires(T t) { foo(t); }; // { dg-error "template instantiation depth" } +concept Fooable = requires(T t) { foo(t); }; // { dg-error "depends on itself" } template void foo(T t) { } @@ -9,7 +9,5 @@ void foo(T t) { } void test() { struct S {} s; - foo(s); + foo(s); // { dg-error "no match" } } - -// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat4.C b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat4.C new file mode 100644 index 0000000..18d126e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat4.C @@ -0,0 +1,13 @@ +// PR c++/96840 +// { dg-do compile { target c++20 } } + +template concept C = requires(T t, U u) { t * u; }; +// { dg-message "required for the satisfaction of 'C' .with T = Int; Rep = int." "" { target *-*-* } .-1 } +// { dg-error "depends on itself" "" { target *-*-* } .-2 } + +template struct Int { + template requires C friend void operator*(T, Int) { } + template requires C friend void operator*(Int, T) { } +}; + +void f() { 0 * Int{}; } -- cgit v1.1