PR c++/86969 - ICE with constexpr if and recursive generic lambdas.
authorJason Merrill <jason@redhat.com>
Fri, 1 Mar 2019 00:08:21 +0000 (19:08 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 1 Mar 2019 00:08:21 +0000 (19:08 -0500)
* class.c, lambda.c, pt.c: Revert earlier change.
* lambda.c (add_capture): Don't special-case capture of dependent
VLA.

From-SVN: r269292

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/lambda.c
gcc/cp/pt.c

index 3124aa9e02f63a39949c86555c63d7224934c75b..30cc1ce46b3a315c58d8afc247085731b4bb5198 100644 (file)
@@ -1,5 +1,10 @@
 2019-02-28  Jason Merrill  <jason@redhat.com>
 
+       PR c++/86969 - ICE with constexpr if and recursive generic lambdas.
+       * class.c, lambda.c, pt.c: Revert earlier change.
+       * lambda.c (add_capture): Don't special-case capture of dependent
+       VLA.
+
        * name-lookup.c (print_binding_level): Print this_entity.
 
 2019-02-27  Marek Polacek  <polacek@redhat.com>
index 830ede56af8b5e5e8d65af4cd4f3bd4151e3d680..f44acfd62b5eaaaf230173d1fc020360a78bb748 100644 (file)
@@ -7246,7 +7246,6 @@ finish_struct (tree t, tree attributes)
     error ("trying to finish struct, but kicked out due to previous parse errors");
 
   if (processing_template_decl && at_function_scope_p ()
-      && TYPE_CONTEXT (t) == current_function_decl
       /* Lambdas are defined by the LAMBDA_EXPR.  */
       && !LAMBDA_TYPE_P (t))
     add_stmt (build_min (TAG_DEFN, t));
index c25df2fbc0ee63ccfddffa6f68c20f3ddaccede7..e7f0fda65be6c45f86d7a8db9b82a3e4d5352cce 100644 (file)
@@ -479,31 +479,9 @@ static GTY(()) tree max_id;
    an array of runtime length.  */
 
 static tree
-vla_capture_type (tree array_type, tree lambda)
+vla_capture_type (tree array_type)
 {
-  tree closure = LAMBDA_EXPR_CLOSURE (lambda);
-  tree type = make_class_type (RECORD_TYPE);
-  cp_binding_level *slev = current_binding_level;
-  if (closure)
-    {
-      /* If we're already inside the lambda body, force the capture type out
-        into the enclosing context, so we don't crash trying to instantiate
-        the capture field in tsubst_lambda_expr.  We won't have a TAG_DEFN
-        from finish_struct in the enclosing context, which we work around in
-        tsubst_lambda_expr.  */
-      TYPE_CONTEXT (type) = TYPE_CONTEXT (closure);
-      cp_binding_level *b = current_binding_level;
-      for (;; b = b->level_chain)
-       if (b->this_entity == closure)
-         {
-           while (b->this_entity == closure)
-             b = b->level_chain;
-           break;
-         }
-      current_binding_level = b;
-    }
-  type = pushtag (make_anon_name (), type, ts_current);
-  current_binding_level = slev;
+  tree type = xref_tag (record_type, make_anon_name (), ts_current, false);
   xref_basetypes (type, NULL_TREE);
   type = begin_class_definition (type);
   if (!ptr_id)
@@ -549,7 +527,7 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p,
   if (type == error_mark_node)
     return error_mark_node;
 
-  if (array_of_runtime_bound_p (type))
+  if (!dependent_type_p (type) && array_of_runtime_bound_p (type))
     {
       vla = true;
       if (!by_reference_p)
@@ -563,7 +541,7 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p,
       initializer = build_constructor_va (init_list_type_node, 2,
                                          NULL_TREE, build_address (elt),
                                          NULL_TREE, array_type_nelts (type));
-      type = vla_capture_type (type, lambda);
+      type = vla_capture_type (type);
     }
   else if (!dependent_type_p (type)
           && variably_modified_type_p (type, NULL_TREE))
index 673ea8e2258136722b09651d9b65879fde0f081e..d678e27807810a2353a6f3ebdbc60ff79a953025 100644 (file)
@@ -17989,10 +17989,6 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
       if (PACK_EXPANSION_P (ofield))
        ofield = PACK_EXPANSION_PATTERN (ofield);
       tree field = tsubst_decl (ofield, args, complain);
-      if (DECL_VLA_CAPTURE_P (ofield))
-       /* The type of a VLA capture might not have a TAG_DEFN in the enclosing
-          context, so complete it here.  */
-       complete_type (TREE_TYPE (field));
 
       if (DECL_PACK_P (ofield) && !DECL_NORMAL_CAPTURE_P (ofield))
        {