c++: constrained lambda error-recovery [PR108972]
authorJason Merrill <jason@redhat.com>
Thu, 9 Mar 2023 22:01:48 +0000 (17:01 -0500)
committerJason Merrill <jason@redhat.com>
Fri, 10 Mar 2023 18:49:45 +0000 (13:49 -0500)
Better not to ICE after various valid errors.

PR c++/108972

gcc/cp/ChangeLog:

* lambda.cc (compare_lambda_template_head): Check more
for error_mark_node.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-lambda3.C: Run at lower std levels,
but expect errors.

gcc/cp/lambda.cc
gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C

index c752622..212990a 100644 (file)
@@ -1537,6 +1537,8 @@ compare_lambda_template_head (tree tmpl_a, tree tmpl_b)
          if (parm_a == error_mark_node)
            return false;
          parm_a = TREE_VALUE (parm_a);
+         if (parm_a == error_mark_node)
+           return false;
          if (DECL_VIRTUAL_P (parm_a))
            parm_a = NULL_TREE;
        }
@@ -1548,6 +1550,8 @@ compare_lambda_template_head (tree tmpl_a, tree tmpl_b)
          if (parm_b == error_mark_node)
            return false;
          parm_b = TREE_VALUE (parm_b);
+         if (parm_b == error_mark_node)
+           return false;
          if (DECL_VIRTUAL_P (parm_b))
            parm_b = NULL_TREE;
        }
index 291e451..b18e6b6 100644 (file)
@@ -1,4 +1,5 @@
-// { dg-do run { target c++20 } }
+// { dg-do run }
+// { dg-excess-errors "" { target { ! concepts } } } (PR108972)
 
 template<typename T>
 concept C1 = __is_same_as(T, int)
@@ -61,4 +62,3 @@ int main(int, char**)
 
   return 0;
 }
-