From be934e97d167d91aba6f98594bed0224630357f9 Mon Sep 17 00:00:00 2001 From: Andrew Sutton Date: Wed, 27 Nov 2019 15:09:22 +0000 Subject: 2019-11-27 Andrew Sutton 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/constraint.cc | 2 ++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C | 23 ++++++++++++++++++++++ .../g++.dg/cpp2a/concepts-recursive-sat1.C | 18 +++++++++++++++++ .../g++.dg/cpp2a/concepts-recursive-sat2.C | 15 ++++++++++++++ .../g++.dg/cpp2a/concepts-recursive-sat3.C | 12 +++++++++++ 7 files changed, 84 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-pr88395.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat1.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat2.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-recursive-sat3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f770e939d8..470a5271ded 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-11-27 Andrew Sutton + + PR c++/88395 + * constraint.cc (satisfy_declaration_constraints): Push tinst levels + around satisfaction. + 2019-11-27 Andrew Sutton Diagnose certain constraint errors as hard errors, but otherwise treat diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index d29c33a9bbf..9967b1ef996 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -2648,9 +2648,11 @@ satisfy_declaration_constraints (tree t, subst_info info) tree result = boolean_true_node; if (norm) { + push_tinst_level (t); push_access_scope (t); result = satisfy_associated_constraints (norm, args, info); pop_access_scope (t); + pop_tinst_level (); } if (info.quiet ()) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39728cf82ca..8605b0b38fa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-11-18 Andrew Sutton + + PR c++/88395 + * 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. + 2019-11-27 Vladimir Makarov PR rtl-optimization/90007 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 +concept Concept2 = requires (T t, U u) +{ + t += u; // { dg-error "template instantiation depth" } +}; + +template +concept Concept = Concept2 ; + +struct S +{ + template + 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 +concept Foo = requires(T t) { foo(t); }; // { dg-error "template instantiation depth" } + +template + requires Foo +int foo(T t) +{ + return foo(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 +concept Fooable = requires(T t) { foo(t); }; // { dg-error "template instantiation depth" } + +template +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 +concept Fooable = requires(T t) { foo(t); }; + +template +void foo(T t) { } + +void test() +{ + foo(0); // { dg-error "unsatisfied constraints" } +} -- cgit v1.2.3