diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-12-17 22:18:07 -0500 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2020-12-17 22:18:07 -0500 |
commit | 79f57d5cb070bb02ea0a34b5f42658d6659b19a8 (patch) | |
tree | b7dba72ed8e157d1c7895c62e038be36cba7a903 /gcc/testsuite | |
parent | 20f292863f6ed230335c443893d4db664a8140d0 (diff) | |
download | gcc-79f57d5cb070bb02ea0a34b5f42658d6659b19a8.zip gcc-79f57d5cb070bb02ea0a34b5f42658d6659b19a8.tar.gz gcc-79f57d5cb070bb02ea0a34b5f42658d6659b19a8.tar.bz2 |
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.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat4.C | 13 |
3 files changed, 18 insertions, 9 deletions
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 <class T, class U> -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 <class T> @@ -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<typename T> -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<Fooable T> 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 <class T, class U> concept C = requires(T t, U u) { t * u; }; +// { dg-message "required for the satisfaction of 'C<T, Rep>' .with T = Int<int>; Rep = int." "" { target *-*-* } .-1 } +// { dg-error "depends on itself" "" { target *-*-* } .-2 } + +template <class Rep> struct Int { + template <class T> requires C<T, Rep> friend void operator*(T, Int) { } + template <class T> requires C<T, Rep> friend void operator*(Int, T) { } +}; + +void f() { 0 * Int<int>{}; } |