diff options
author | Andrew Sutton <asutton@lock3software.com> | 2019-11-27 15:09:22 +0000 |
---|---|---|
committer | Andrew Sutton <asutton@lock3software.com> | 2019-11-27 15:09:22 +0000 |
commit | be934e97d167d91aba6f98594bed0224630357f9 (patch) | |
tree | f46a1aaf67d858bb4a7c009120886384a823e531 /gcc/testsuite/g++.dg | |
parent | a99ec7a1f44254828f54e855dc9535794fe7a62b (diff) |
2019-11-27 Andrew Sutton <asutton@lock3software.com>
PR c++/88395
Prevent recursive satisfaction by adding requests to the instantiation
stack.
gcc/cp/
* constraint.cc (satisfy_declaration_constraints): Push tinst levels
around satisfaction.
gcc/testsuite/
* g++.dg/cpp2a/concepts-pr88395.C: New.
* g++.dg/cpp2a/concepts-recursive-sat1.C: New.
* g++.dg/cpp2a/concepts-recursive-sat2.C: New.
* g++.dg/cpp2a/concepts-recursive-sat3.C: New.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@278773 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat1.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat3.C | 12 |
4 files changed, 68 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C b/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C new file mode 100644 index 00000000000..ad24da9cb47 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++2a } } + +template <class T, class U> +concept Concept2 = requires (T t, U u) +{ + t += u; // { dg-error "template instantiation depth" } +}; + +template <class T> +concept Concept = Concept2 <T, T>; + +struct S +{ + template <Concept T> + constexpr S& operator += (T o); +}; + +constexpr S operator * (S a, S b) +{ + return a += b; +} + +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat1.C new file mode 100644 index 00000000000..ee83d560cf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat1.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++2a } } + +template<int N, typename T> +concept Foo = requires(T t) { foo<N + 1>(t); }; // { dg-error "template instantiation depth" } + +template<int N = 1, typename T = int> + requires Foo<N, T> +int foo(T t) +{ + return foo<N + 1>(t); +} + +int main(int, char**) +{ + return foo<1>(1); +} + +// { 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 new file mode 100644 index 00000000000..d76f12eb209 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++2a } } + +template<typename T> +concept Fooable = requires(T t) { foo(t); }; // { dg-error "template instantiation depth" } + +template<Fooable T> +void foo(T t) { } + +void test() +{ + struct S {} s; + foo(s); +} + +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat3.C new file mode 100644 index 00000000000..b8ca9164792 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat3.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++2a } } + +template<typename T> +concept Fooable = requires(T t) { foo(t); }; + +template<Fooable T> +void foo(T t) { } + +void test() +{ + foo(0); // { dg-error "unsatisfied constraints" } +} |