From 5421fae8b17c7401f3a4ac5b9f414a47f7bda379 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Thu, 18 Jun 2020 09:38:42 -0400 Subject: [PATCH] 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. --- gcc/cp/pt.c | 2 ++ gcc/testsuite/g++.dg/cpp2a/concepts-err2.C | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-err2.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9732e3b..1c0759e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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)) { diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C new file mode 100644 index 0000000..c0372a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C @@ -0,0 +1,11 @@ +// PR c++/95735 +// { dg-do compile { target concepts } } + +template + requires requires { F(); } +bool v{}; + +void f() { + int x; + static_assert(v<[&] { x++; }>); // { dg-error "not a constant expression" } +} -- 2.7.4