aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-06-18 09:38:42 -0400
committerMarek Polacek <polacek@redhat.com>2020-06-18 11:51:01 -0400
commit5421fae8b17c7401f3a4ac5b9f414a47f7bda379 (patch)
treeb88d96cc1e3a715222c69b501a1d96d9815b1ce4
parent634e6f49101c92ccb83ad3d65f975162582c5dea (diff)
downloadgcc-5421fae8b17c7401f3a4ac5b9f414a47f7bda379.zip
gcc-5421fae8b17c7401f3a4ac5b9f414a47f7bda379.tar.gz
gcc-5421fae8b17c7401f3a4ac5b9f414a47f7bda379.tar.bz2
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.
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-err2.C11
2 files changed, 13 insertions, 0 deletions
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 <auto F>
+ requires requires { F(); }
+bool v{};
+
+void f() {
+ int x;
+ static_assert(v<[&] { x++; }>); // { dg-error "not a constant expression" }
+}