PR c++/92531 - ICE with noexcept(lambda).
authorJason Merrill <jason@redhat.com>
Fri, 17 Jan 2020 13:37:49 +0000 (08:37 -0500)
committerJason Merrill <jason@redhat.com>
Fri, 17 Jan 2020 14:25:01 +0000 (09:25 -0500)
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
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/constexpr-lambda25.C [new file with mode: 0644]

index d76675e6f7cba032e33c7cee45ac88492e8cf3fa..62d8acfad5a46d1ce0fcecfb58cc83bf069a3961 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-17  Jason Merrill  <jason@redhat.com>
+
+       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  <jakub@redhat.com>
 
        PR c++/93228
index 872f8ff8f52c7c907b10c99b5d432280f0ba4642..1b3d07b1a5279f1253700080aff08c2852ae4ef9 100644 (file)
@@ -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 (file)
index 0000000..74db03f
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/92531
+// { dg-do compile { target c++17 } }
+
+template <typename XK>
+void ky () noexcept ([]{}); // IFNDR
+// Optional error: void(*)() to bool conv in converted constant expression
+// { dg-prune-output "converted constant expression" }