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:
parent
634e6f4910
commit
5421fae8b1
2 changed files with 13 additions and 0 deletions
|
@ -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))
|
||||
{
|
||||
|
|
11
gcc/testsuite/g++.dg/cpp2a/concepts-err2.C
Normal file
11
gcc/testsuite/g++.dg/cpp2a/concepts-err2.C
Normal 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" }
|
||||
}
|
Loading…
Add table
Reference in a new issue