From eff9c61dfb082cb3ea26f354d795e4098ec76866 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 17 Jan 2020 08:37:49 -0500 Subject: [PATCH] PR c++/92531 - ICE with noexcept(lambda). This was failing because uses_template_parms didn't recognize LAMBDA_EXPR as a kind of expression. Instead of trying to enumerate all the different varieties of expression and then aborting if what's left isn't error_mark_node, let's handle error_mark_node and then assume anything else is an expression. * pt.c (uses_template_parms): Don't try to enumerate all the expression cases. --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 17 +++-------------- gcc/testsuite/g++.dg/cpp1z/constexpr-lambda25.C | 7 +++++++ 3 files changed, 16 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-lambda25.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d76675e6f7c..62d8acfad5a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-01-17 Jason Merrill + + PR c++/92531 - ICE with noexcept(lambda). + * pt.c (uses_template_parms): Don't try to enumerate all the + expression cases. + 2020-01-17 Jakub Jelinek PR c++/93228 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 872f8ff8f52..1b3d07b1a52 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10537,22 +10537,11 @@ uses_template_parms (tree t) || uses_template_parms (TREE_CHAIN (t))); else if (TREE_CODE (t) == TYPE_DECL) dependent_p = dependent_type_p (TREE_TYPE (t)); - else if (DECL_P (t) - || EXPR_P (t) - || TREE_CODE (t) == TEMPLATE_PARM_INDEX - || TREE_CODE (t) == OVERLOAD - || BASELINK_P (t) - || identifier_p (t) - || TREE_CODE (t) == TRAIT_EXPR - || TREE_CODE (t) == CONSTRUCTOR - || CONSTANT_CLASS_P (t)) + else if (t == error_mark_node) + dependent_p = false; + else dependent_p = (type_dependent_expression_p (t) || value_dependent_expression_p (t)); - else - { - gcc_assert (t == error_mark_node); - dependent_p = false; - } processing_template_decl = saved_processing_template_decl; diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda25.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda25.C new file mode 100644 index 00000000000..74db03ff569 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda25.C @@ -0,0 +1,7 @@ +// PR c++/92531 +// { dg-do compile { target c++17 } } + +template +void ky () noexcept ([]{}); // IFNDR +// Optional error: void(*)() to bool conv in converted constant expression +// { dg-prune-output "converted constant expression" } -- 2.30.2