c++: ICE in requires-expressions with invalid args [PR95735]
authorMarek Polacek <polacek@redhat.com>
Thu, 18 Jun 2020 13:38:42 +0000 (09:38 -0400)
committerMarek Polacek <polacek@redhat.com>
Thu, 18 Jun 2020 15:51:01 +0000 (11:51 -0400)
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
gcc/testsuite/g++.dg/cpp2a/concepts-err2.C [new file with mode: 0644]

index 9732e3b78c7bdafbb19ccfb96d37ad5b4b26a42c..1c0759edcae09d3dc84f457648c3e5a740710663 100644 (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))
     {
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C
new file mode 100644 (file)
index 0000000..c0372a6
--- /dev/null
@@ -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" }
+}