Commit 72479e32 by Andrew Sutton Committed by Andrew Sutton

re PR c++/88395 (ICE: Segmentation fault signal terminated program cc1plus, with…

re PR c++/88395 (ICE: Segmentation fault signal terminated program cc1plus, with -std=c++2a -fconcepts)

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.

From-SVN: r278773
parent 864233f1
2019-11-27 Andrew Sutton <asutton@lock3software.com> 2019-11-27 Andrew Sutton <asutton@lock3software.com>
PR c++/88395
* constraint.cc (satisfy_declaration_constraints): Push tinst levels
around satisfaction.
2019-11-27 Andrew Sutton <asutton@lock3software.com>
Diagnose certain constraint errors as hard errors, but otherwise treat Diagnose certain constraint errors as hard errors, but otherwise treat
them the same as normal SFINAE-type errors. Also, generally clean up them the same as normal SFINAE-type errors. Also, generally clean up
the satisfaction functions. the satisfaction functions.
......
...@@ -2648,9 +2648,11 @@ satisfy_declaration_constraints (tree t, subst_info info) ...@@ -2648,9 +2648,11 @@ satisfy_declaration_constraints (tree t, subst_info info)
tree result = boolean_true_node; tree result = boolean_true_node;
if (norm) if (norm)
{ {
push_tinst_level (t);
push_access_scope (t); push_access_scope (t);
result = satisfy_associated_constraints (norm, args, info); result = satisfy_associated_constraints (norm, args, info);
pop_access_scope (t); pop_access_scope (t);
pop_tinst_level ();
} }
if (info.quiet ()) if (info.quiet ())
......
2019-11-18 Andrew Sutton <asutton@lock3software.com>
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 <vmakarov@redhat.com> 2019-11-27 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/90007 PR rtl-optimization/90007
......
// { 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" }
// { 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" }
// { 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" }
// { 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" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment