c++: ICE in requires-expressions with invalid args [PR95735]

This ICE-on-invalid goes back to GCC 6.  In finish_template_variable,
if coerce_innermost_template_parms returns error_mark_node, we pass
it down to constraints_satisfied_p and that error_mark_node flows
down to various satisfy_* functions and then to various tsubst_*
functions, where we crash.  diagnose_constraints also doesn't cope
with error arglist, so I think we should just return as in the
patch below.

gcc/cp/ChangeLog:

	PR c++/95735
	* pt.c (finish_template_variable): Return if
	coerce_innermost_template_parms return error_mark_node.

gcc/testsuite/ChangeLog:

	PR c++/95735
	* g++.dg/cpp2a/concepts-err2.C: New test.
This commit is contained in:
Marek Polacek 2020-06-18 09:38:42 -04:00
parent 634e6f4910
commit 5421fae8b1
2 changed files with 13 additions and 0 deletions

View File

@ -10154,6 +10154,8 @@ finish_template_variable (tree var, tsubst_flags_t complain)
arglist = coerce_innermost_template_parms (parms, arglist, templ, complain,
/*req_all*/true,
/*use_default*/true);
if (arglist == error_mark_node)
return error_mark_node;
if (flag_concepts && !constraints_satisfied_p (templ, arglist))
{

View File

@ -0,0 +1,11 @@
// PR c++/95735
// { dg-do compile { target concepts } }
template <auto F>
requires requires { F(); }
bool v{};
void f() {
int x;
static_assert(v<[&] { x++; }>); // { dg-error "not a constant expression" }
}