From a915c29a7d63ccb88cfded75ba1c8c4919845e98 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 9 Mar 2023 17:01:48 -0500 Subject: [PATCH] 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. --- gcc/cp/lambda.cc | 4 ++++ gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc index c752622816d..212990a21bf 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 291e451ca1a..b18e6b62aa4 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 concept C1 = __is_same_as(T, int) @@ -61,4 +62,3 @@ int main(int, char**) return 0; } - -- 2.11.4.GIT