aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-03-09 17:01:48 -0500
committerJason Merrill <jason@redhat.com>2023-03-10 13:49:45 -0500
commita915c29a7d63ccb88cfded75ba1c8c4919845e98 (patch)
tree20cb58c518a09c09063a761cfcb542a59234853c
parent4d0baeae315ebe7d0ec7682ea3e7c0516027c2b8 (diff)
downloadgcc-a915c29a7d63ccb88cfded75ba1c8c4919845e98.zip
gcc-a915c29a7d63ccb88cfded75ba1c8c4919845e98.tar.gz
gcc-a915c29a7d63ccb88cfded75ba1c8c4919845e98.tar.bz2
c++: constrained lambda error-recovery [PR108972]
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.
-rw-r--r--gcc/cp/lambda.cc4
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C4
2 files changed, 6 insertions, 2 deletions
diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
index c752622..212990a 100644
--- a/gcc/cp/lambda.cc
+++ b/gcc/cp/lambda.cc
@@ -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;
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C
index 291e451..b18e6b6 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C
@@ -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;
}
-