Home | History | Annotate | Line # | Download | only in cp
      1 /* Perform the semantic phase of lambda parsing, i.e., the process of
      2    building tree structure, checking semantic consistency, and
      3    building RTL.  These routines are used both during actual parsing
      4    and during the instantiation of template functions.
      5 
      6    Copyright (C) 1998-2022 Free Software Foundation, Inc.
      7 
      8    This file is part of GCC.
      9 
     10    GCC is free software; you can redistribute it and/or modify it
     11    under the terms of the GNU General Public License as published by
     12    the Free Software Foundation; either version 3, or (at your option)
     13    any later version.
     14 
     15    GCC is distributed in the hope that it will be useful, but
     16    WITHOUT ANY WARRANTY; without even the implied warranty of
     17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     18    General Public License for more details.
     19 
     20 You should have received a copy of the GNU General Public License
     21 along with GCC; see the file COPYING3.  If not see
     22 <http://www.gnu.org/licenses/>.  */
     23 
     24 #include "config.h"
     25 #include "system.h"
     26 #include "coretypes.h"
     27 #include "cp-tree.h"
     28 #include "stringpool.h"
     29 #include "cgraph.h"
     30 #include "tree-iterator.h"
     31 #include "toplev.h"
     32 #include "gimplify.h"
     33 #include "target.h"
     34 #include "decl.h"
     35 
     36 /* Constructor for a lambda expression.  */
     37 
     38 tree
     39 build_lambda_expr (void)
     40 {
     41   tree lambda = make_node (LAMBDA_EXPR);
     42   LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda) = CPLD_NONE;
     43   LAMBDA_EXPR_CAPTURE_LIST         (lambda) = NULL_TREE;
     44   LAMBDA_EXPR_THIS_CAPTURE         (lambda) = NULL_TREE;
     45   LAMBDA_EXPR_REGEN_INFO           (lambda) = NULL_TREE;
     46   LAMBDA_EXPR_PENDING_PROXIES      (lambda) = NULL;
     47   LAMBDA_EXPR_MUTABLE_P            (lambda) = false;
     48   return lambda;
     49 }
     50 
     51 /* Create the closure object for a LAMBDA_EXPR.  */
     52 
     53 tree
     54 build_lambda_object (tree lambda_expr)
     55 {
     56   /* Build aggregate constructor call.
     57      - cp_parser_braced_list
     58      - cp_parser_functional_cast  */
     59   vec<constructor_elt, va_gc> *elts = NULL;
     60   tree node, expr, type;
     61 
     62   if (processing_template_decl || lambda_expr == error_mark_node)
     63     return lambda_expr;
     64 
     65   /* Make sure any error messages refer to the lambda-introducer.  */
     66   location_t loc = LAMBDA_EXPR_LOCATION (lambda_expr);
     67   iloc_sentinel il (loc);
     68 
     69   for (node = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr);
     70        node;
     71        node = TREE_CHAIN (node))
     72     {
     73       tree field = TREE_PURPOSE (node);
     74       tree val = TREE_VALUE (node);
     75 
     76       if (field == error_mark_node)
     77 	{
     78 	  expr = error_mark_node;
     79 	  goto out;
     80 	}
     81 
     82       if (TREE_CODE (val) == TREE_LIST)
     83 	val = build_x_compound_expr_from_list (val, ELK_INIT,
     84 					       tf_warning_or_error);
     85 
     86       if (DECL_P (val))
     87 	mark_used (val);
     88 
     89       /* Mere mortals can't copy arrays with aggregate initialization, so
     90 	 do some magic to make it work here.  */
     91       if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE)
     92 	val = build_array_copy (val);
     93       else if (DECL_NORMAL_CAPTURE_P (field)
     94 	       && !DECL_VLA_CAPTURE_P (field)
     95 	       && !TYPE_REF_P (TREE_TYPE (field)))
     96 	{
     97 	  /* "the entities that are captured by copy are used to
     98 	     direct-initialize each corresponding non-static data
     99 	     member of the resulting closure object."
    100 
    101 	     There's normally no way to express direct-initialization
    102 	     from an element of a CONSTRUCTOR, so we build up a special
    103 	     TARGET_EXPR to bypass the usual copy-initialization.  */
    104 	  val = force_rvalue (val, tf_warning_or_error);
    105 	  if (TREE_CODE (val) == TARGET_EXPR)
    106 	    TARGET_EXPR_DIRECT_INIT_P (val) = true;
    107 	}
    108 
    109       CONSTRUCTOR_APPEND_ELT (elts, DECL_NAME (field), val);
    110     }
    111 
    112   expr = build_constructor (init_list_type_node, elts);
    113   CONSTRUCTOR_IS_DIRECT_INIT (expr) = 1;
    114 
    115   /* N2927: "[The closure] class type is not an aggregate."
    116      But we briefly treat it as an aggregate to make this simpler.  */
    117   type = LAMBDA_EXPR_CLOSURE (lambda_expr);
    118   CLASSTYPE_NON_AGGREGATE (type) = 0;
    119   expr = finish_compound_literal (type, expr, tf_warning_or_error);
    120   protected_set_expr_location (expr, loc);
    121   CLASSTYPE_NON_AGGREGATE (type) = 1;
    122 
    123  out:
    124   return expr;
    125 }
    126 
    127 /* Return an initialized RECORD_TYPE for LAMBDA.
    128    LAMBDA must have its explicit captures already.  */
    129 
    130 tree
    131 begin_lambda_type (tree lambda)
    132 {
    133   /* Lambda names are nearly but not quite anonymous.  */
    134   tree name = make_anon_name ();
    135   IDENTIFIER_LAMBDA_P (name) = true;
    136 
    137   /* Create the new RECORD_TYPE for this lambda.  */
    138   tree type = xref_tag (/*tag_code=*/record_type, name);
    139   if (type == error_mark_node)
    140     return error_mark_node;
    141 
    142   /* Designate it as a struct so that we can use aggregate initialization.  */
    143   CLASSTYPE_DECLARED_CLASS (type) = false;
    144 
    145   /* Cross-reference the expression and the type.  */
    146   LAMBDA_EXPR_CLOSURE (lambda) = type;
    147   CLASSTYPE_LAMBDA_EXPR (type) = lambda;
    148 
    149   /* In C++17, assume the closure is literal; we'll clear the flag later if
    150      necessary.  */
    151   if (cxx_dialect >= cxx17)
    152     CLASSTYPE_LITERAL_P (type) = true;
    153 
    154   /* Clear base types.  */
    155   xref_basetypes (type, /*bases=*/NULL_TREE);
    156 
    157   /* Start the class.  */
    158   type = begin_class_definition (type);
    159 
    160   return type;
    161 }
    162 
    163 /* Given a LAMBDA_EXPR or closure type LAMBDA, return the op() of the
    164    closure type.  */
    165 
    166 tree
    167 lambda_function (tree lambda)
    168 {
    169   tree type;
    170   if (TREE_CODE (lambda) == LAMBDA_EXPR)
    171     type = LAMBDA_EXPR_CLOSURE (lambda);
    172   else
    173     type = lambda;
    174   gcc_assert (LAMBDA_TYPE_P (type));
    175   /* Don't let debug_tree cause instantiation.  */
    176   if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)
    177       && !COMPLETE_OR_OPEN_TYPE_P (type))
    178     return NULL_TREE;
    179   lambda = lookup_member (type, call_op_identifier,
    180 			  /*protect=*/0, /*want_type=*/false,
    181 			  tf_warning_or_error);
    182   if (lambda)
    183     lambda = STRIP_TEMPLATE (get_first_fn (lambda));
    184   return lambda;
    185 }
    186 
    187 /* True if EXPR is an expression whose type can be used directly in lambda
    188    capture.  Not to be used for 'auto'.  */
    189 
    190 static bool
    191 type_deducible_expression_p (tree expr)
    192 {
    193   if (!type_dependent_expression_p (expr))
    194     return true;
    195   if (BRACE_ENCLOSED_INITIALIZER_P (expr)
    196       || TREE_CODE (expr) == EXPR_PACK_EXPANSION)
    197     return false;
    198   tree t = non_reference (TREE_TYPE (expr));
    199   if (!t) return false;
    200   while (TREE_CODE (t) == POINTER_TYPE)
    201     t = TREE_TYPE (t);
    202   return currently_open_class (t);
    203 }
    204 
    205 /* Returns the type to use for the FIELD_DECL corresponding to the
    206    capture of EXPR.  EXPLICIT_INIT_P indicates whether this is a
    207    C++14 init capture, and BY_REFERENCE_P indicates whether we're
    208    capturing by reference.  */
    209 
    210 tree
    211 lambda_capture_field_type (tree expr, bool explicit_init_p,
    212 			   bool by_reference_p)
    213 {
    214   tree type;
    215   bool is_this = is_this_parameter (tree_strip_nop_conversions (expr));
    216 
    217   if (is_this)
    218     type = TREE_TYPE (expr);
    219   else if (explicit_init_p)
    220     {
    221       tree auto_node = make_auto ();
    222 
    223       type = auto_node;
    224       if (by_reference_p)
    225 	/* Add the reference now, so deduction doesn't lose
    226 	   outermost CV qualifiers of EXPR.  */
    227 	type = build_reference_type (type);
    228       if (uses_parameter_packs (expr))
    229 	/* Stick with 'auto' even if the type could be deduced.  */;
    230       else
    231 	type = do_auto_deduction (type, expr, auto_node);
    232     }
    233   else if (!type_deducible_expression_p (expr))
    234     {
    235       type = cxx_make_type (DECLTYPE_TYPE);
    236       DECLTYPE_TYPE_EXPR (type) = expr;
    237       DECLTYPE_FOR_LAMBDA_CAPTURE (type) = true;
    238       DECLTYPE_FOR_REF_CAPTURE (type) = by_reference_p;
    239       SET_TYPE_STRUCTURAL_EQUALITY (type);
    240     }
    241   else
    242     {
    243       STRIP_ANY_LOCATION_WRAPPER (expr);
    244 
    245       if (!by_reference_p && is_capture_proxy (expr))
    246 	{
    247 	  /* When capturing by-value another capture proxy from an enclosing
    248 	     lambda, consider the type of the corresponding field instead,
    249 	     as the proxy may be additionally const-qualifed if the enclosing
    250 	     lambda is non-mutable (PR94376).  */
    251 	  gcc_assert (TREE_CODE (DECL_VALUE_EXPR (expr)) == COMPONENT_REF);
    252 	  expr = TREE_OPERAND (DECL_VALUE_EXPR (expr), 1);
    253 	}
    254 
    255       type = non_reference (unlowered_expr_type (expr));
    256 
    257       if (by_reference_p || TREE_CODE (type) == FUNCTION_TYPE)
    258 	type = build_reference_type (type);
    259     }
    260 
    261   return type;
    262 }
    263 
    264 /* Returns true iff DECL is a lambda capture proxy variable created by
    265    build_capture_proxy.  */
    266 
    267 bool
    268 is_capture_proxy (tree decl)
    269 {
    270   /* Location wrappers should be stripped or otherwise handled by the
    271      caller before using this predicate.  */
    272   gcc_checking_assert (!location_wrapper_p (decl));
    273 
    274   return (VAR_P (decl)
    275 	  && DECL_HAS_VALUE_EXPR_P (decl)
    276 	  && !DECL_ANON_UNION_VAR_P (decl)
    277 	  && !DECL_DECOMPOSITION_P (decl)
    278 	  && !DECL_FNAME_P (decl)
    279 	  && !(DECL_ARTIFICIAL (decl)
    280 	       && DECL_LANG_SPECIFIC (decl)
    281 	       && DECL_OMP_PRIVATIZED_MEMBER (decl))
    282 	  && LAMBDA_FUNCTION_P (DECL_CONTEXT (decl)));
    283 }
    284 
    285 /* Returns true iff DECL is a capture proxy for a normal capture
    286    (i.e. without explicit initializer).  */
    287 
    288 bool
    289 is_normal_capture_proxy (tree decl)
    290 {
    291   if (!is_capture_proxy (decl))
    292     /* It's not a capture proxy.  */
    293     return false;
    294 
    295   return (DECL_LANG_SPECIFIC (decl)
    296 	  && DECL_CAPTURED_VARIABLE (decl));
    297 }
    298 
    299 /* Returns true iff DECL is a capture proxy for a normal capture
    300    of a constant variable.  */
    301 
    302 bool
    303 is_constant_capture_proxy (tree decl)
    304 {
    305   if (is_normal_capture_proxy (decl))
    306     return decl_constant_var_p (DECL_CAPTURED_VARIABLE (decl));
    307   return false;
    308 }
    309 
    310 /* VAR is a capture proxy created by build_capture_proxy; add it to the
    311    current function, which is the operator() for the appropriate lambda.  */
    312 
    313 void
    314 insert_capture_proxy (tree var)
    315 {
    316   if (is_normal_capture_proxy (var))
    317     {
    318       tree cap = DECL_CAPTURED_VARIABLE (var);
    319       if (CHECKING_P)
    320 	{
    321 	  gcc_assert (!is_normal_capture_proxy (cap));
    322 	  tree old = retrieve_local_specialization (cap);
    323 	  if (old)
    324 	    gcc_assert (DECL_CONTEXT (old) != DECL_CONTEXT (var));
    325 	}
    326       register_local_specialization (var, cap);
    327     }
    328 
    329   /* Put the capture proxy in the extra body block so that it won't clash
    330      with a later local variable.  */
    331   pushdecl_outermost_localscope (var);
    332 
    333   /* And put a DECL_EXPR in the STATEMENT_LIST for the same block.  */
    334   var = build_stmt (DECL_SOURCE_LOCATION (var), DECL_EXPR, var);
    335   tree stmt_list = (*stmt_list_stack)[1];
    336   gcc_assert (stmt_list);
    337   append_to_statement_list_force (var, &stmt_list);
    338 }
    339 
    340 /* We've just finished processing a lambda; if the containing scope is also
    341    a lambda, insert any capture proxies that were created while processing
    342    the nested lambda.  */
    343 
    344 void
    345 insert_pending_capture_proxies (void)
    346 {
    347   tree lam;
    348   vec<tree, va_gc> *proxies;
    349   unsigned i;
    350 
    351   if (!current_function_decl || !LAMBDA_FUNCTION_P (current_function_decl))
    352     return;
    353 
    354   lam = CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT (current_function_decl));
    355   proxies = LAMBDA_EXPR_PENDING_PROXIES (lam);
    356   for (i = 0; i < vec_safe_length (proxies); ++i)
    357     {
    358       tree var = (*proxies)[i];
    359       insert_capture_proxy (var);
    360     }
    361   release_tree_vector (LAMBDA_EXPR_PENDING_PROXIES (lam));
    362   LAMBDA_EXPR_PENDING_PROXIES (lam) = NULL;
    363 }
    364 
    365 /* Given REF, a COMPONENT_REF designating a field in the lambda closure,
    366    return the type we want the proxy to have: the type of the field itself,
    367    with added const-qualification if the lambda isn't mutable and the
    368    capture is by value.  */
    369 
    370 tree
    371 lambda_proxy_type (tree ref)
    372 {
    373   tree type;
    374   if (ref == error_mark_node)
    375     return error_mark_node;
    376   if (REFERENCE_REF_P (ref))
    377     ref = TREE_OPERAND (ref, 0);
    378   gcc_assert (TREE_CODE (ref) == COMPONENT_REF);
    379   type = TREE_TYPE (ref);
    380   if (!type || WILDCARD_TYPE_P (non_reference (type)))
    381     {
    382       type = cxx_make_type (DECLTYPE_TYPE);
    383       DECLTYPE_TYPE_EXPR (type) = ref;
    384       DECLTYPE_FOR_LAMBDA_PROXY (type) = true;
    385       SET_TYPE_STRUCTURAL_EQUALITY (type);
    386     }
    387   if (DECL_PACK_P (TREE_OPERAND (ref, 1)))
    388     type = make_pack_expansion (type);
    389   return type;
    390 }
    391 
    392 /* MEMBER is a capture field in a lambda closure class.  Now that we're
    393    inside the operator(), build a placeholder var for future lookups and
    394    debugging.  */
    395 
    396 static tree
    397 build_capture_proxy (tree member, tree init)
    398 {
    399   tree var, object, fn, closure, name, lam, type;
    400 
    401   if (PACK_EXPANSION_P (member))
    402     member = PACK_EXPANSION_PATTERN (member);
    403 
    404   closure = DECL_CONTEXT (member);
    405   fn = lambda_function (closure);
    406   lam = CLASSTYPE_LAMBDA_EXPR (closure);
    407 
    408   /* The proxy variable forwards to the capture field.  */
    409   object = build_fold_indirect_ref (DECL_ARGUMENTS (fn));
    410   object = finish_non_static_data_member (member, object, NULL_TREE);
    411   if (REFERENCE_REF_P (object))
    412     object = TREE_OPERAND (object, 0);
    413 
    414   /* Remove the __ inserted by add_capture.  */
    415   name = get_identifier (IDENTIFIER_POINTER (DECL_NAME (member)) + 2);
    416 
    417   type = lambda_proxy_type (object);
    418 
    419   if (name == this_identifier && !INDIRECT_TYPE_P (type))
    420     {
    421       type = build_pointer_type (type);
    422       type = cp_build_qualified_type (type, TYPE_QUAL_CONST);
    423       object = build_fold_addr_expr_with_type (object, type);
    424     }
    425 
    426   if (DECL_VLA_CAPTURE_P (member))
    427     {
    428       /* Rebuild the VLA type from the pointer and maxindex.  */
    429       tree field = next_initializable_field (TYPE_FIELDS (type));
    430       tree ptr = build_simple_component_ref (object, field);
    431       field = next_initializable_field (DECL_CHAIN (field));
    432       tree max = build_simple_component_ref (object, field);
    433       type = build_cplus_array_type (TREE_TYPE (TREE_TYPE (ptr)),
    434 				     build_index_type (max));
    435       type = build_reference_type (type);
    436       object = convert (type, ptr);
    437     }
    438 
    439   complete_type (type);
    440 
    441   var = build_decl (input_location, VAR_DECL, name, type);
    442   SET_DECL_VALUE_EXPR (var, object);
    443   DECL_HAS_VALUE_EXPR_P (var) = 1;
    444   DECL_ARTIFICIAL (var) = 1;
    445   TREE_USED (var) = 1;
    446   DECL_CONTEXT (var) = fn;
    447 
    448   if (DECL_NORMAL_CAPTURE_P (member))
    449     {
    450       if (DECL_VLA_CAPTURE_P (member))
    451 	{
    452 	  init = CONSTRUCTOR_ELT (init, 0)->value;
    453 	  init = TREE_OPERAND (init, 0); // Strip ADDR_EXPR.
    454 	  init = TREE_OPERAND (init, 0); // Strip ARRAY_REF.
    455 	}
    456       else
    457 	{
    458 	  if (PACK_EXPANSION_P (init))
    459 	    init = PACK_EXPANSION_PATTERN (init);
    460 	}
    461 
    462       if (INDIRECT_REF_P (init))
    463 	init = TREE_OPERAND (init, 0);
    464       STRIP_NOPS (init);
    465 
    466       gcc_assert (VAR_P (init) || TREE_CODE (init) == PARM_DECL);
    467       while (is_normal_capture_proxy (init))
    468 	init = DECL_CAPTURED_VARIABLE (init);
    469       retrofit_lang_decl (var);
    470       DECL_CAPTURED_VARIABLE (var) = init;
    471     }
    472 
    473   if (name == this_identifier)
    474     {
    475       gcc_assert (LAMBDA_EXPR_THIS_CAPTURE (lam) == member);
    476       LAMBDA_EXPR_THIS_CAPTURE (lam) = var;
    477     }
    478 
    479   if (fn == current_function_decl)
    480     insert_capture_proxy (var);
    481   else
    482     vec_safe_push (LAMBDA_EXPR_PENDING_PROXIES (lam), var);
    483 
    484   return var;
    485 }
    486 
    487 static GTY(()) tree ptr_id;
    488 static GTY(()) tree max_id;
    489 
    490 /* Return a struct containing a pointer and a length for lambda capture of
    491    an array of runtime length.  */
    492 
    493 static tree
    494 vla_capture_type (tree array_type)
    495 {
    496   tree type = xref_tag (record_type, make_anon_name ());
    497   xref_basetypes (type, NULL_TREE);
    498   type = begin_class_definition (type);
    499   if (!ptr_id)
    500     {
    501       ptr_id = get_identifier ("ptr");
    502       max_id = get_identifier ("max");
    503     }
    504   tree ptrtype = build_pointer_type (TREE_TYPE (array_type));
    505   tree field = build_decl (input_location, FIELD_DECL, ptr_id, ptrtype);
    506   finish_member_declaration (field);
    507   field = build_decl (input_location, FIELD_DECL, max_id, sizetype);
    508   finish_member_declaration (field);
    509   return finish_struct (type, NULL_TREE);
    510 }
    511 
    512 /* From an ID and INITIALIZER, create a capture (by reference if
    513    BY_REFERENCE_P is true), add it to the capture-list for LAMBDA,
    514    and return it.  If ID is `this', BY_REFERENCE_P says whether
    515    `*this' is captured by reference.  */
    516 
    517 tree
    518 add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p,
    519 	     bool explicit_init_p)
    520 {
    521   char *buf;
    522   tree type, member, name;
    523   bool vla = false;
    524   bool variadic = false;
    525   tree initializer = orig_init;
    526 
    527   if (PACK_EXPANSION_P (initializer))
    528     {
    529       initializer = PACK_EXPANSION_PATTERN (initializer);
    530       variadic = true;
    531     }
    532 
    533   if (TREE_CODE (initializer) == TREE_LIST
    534       /* A pack expansion might end up with multiple elements.  */
    535       && !PACK_EXPANSION_P (TREE_VALUE (initializer)))
    536     initializer = build_x_compound_expr_from_list (initializer, ELK_INIT,
    537 						   tf_warning_or_error);
    538   type = TREE_TYPE (initializer);
    539   if (type == error_mark_node)
    540     return error_mark_node;
    541 
    542   if (!dependent_type_p (type) && array_of_runtime_bound_p (type))
    543     {
    544       vla = true;
    545       if (!by_reference_p)
    546 	error ("array of runtime bound cannot be captured by copy, "
    547 	       "only by reference");
    548 
    549       /* For a VLA, we capture the address of the first element and the
    550 	 maximum index, and then reconstruct the VLA for the proxy.  */
    551       tree elt = cp_build_array_ref (input_location, initializer,
    552 				     integer_zero_node, tf_warning_or_error);
    553       initializer = build_constructor_va (init_list_type_node, 2,
    554 					  NULL_TREE, build_address (elt),
    555 					  NULL_TREE, array_type_nelts (type));
    556       type = vla_capture_type (type);
    557     }
    558   else if (!dependent_type_p (type)
    559 	   && variably_modified_type_p (type, NULL_TREE))
    560     {
    561       sorry ("capture of variably-modified type %qT that is not an N3639 array "
    562 	     "of runtime bound", type);
    563       if (TREE_CODE (type) == ARRAY_TYPE
    564 	  && variably_modified_type_p (TREE_TYPE (type), NULL_TREE))
    565 	inform (input_location, "because the array element type %qT has "
    566 		"variable size", TREE_TYPE (type));
    567       return error_mark_node;
    568     }
    569   else
    570     {
    571       type = lambda_capture_field_type (initializer, explicit_init_p,
    572 					by_reference_p);
    573       if (type == error_mark_node)
    574 	return error_mark_node;
    575 
    576       if (id == this_identifier && !by_reference_p)
    577 	{
    578 	  gcc_assert (INDIRECT_TYPE_P (type));
    579 	  type = TREE_TYPE (type);
    580 	  initializer = cp_build_fold_indirect_ref (initializer);
    581 	}
    582 
    583       if (dependent_type_p (type))
    584 	;
    585       else if (id != this_identifier && by_reference_p)
    586 	{
    587 	  if (!lvalue_p (initializer))
    588 	    {
    589 	      error ("cannot capture %qE by reference", initializer);
    590 	      return error_mark_node;
    591 	    }
    592 	}
    593       else
    594 	{
    595 	  /* Capture by copy requires a complete type.  */
    596 	  type = complete_type (type);
    597 	  if (!COMPLETE_TYPE_P (type))
    598 	    {
    599 	      error ("capture by copy of incomplete type %qT", type);
    600 	      cxx_incomplete_type_inform (type);
    601 	      return error_mark_node;
    602 	    }
    603 	  else if (!verify_type_context (input_location,
    604 					 TCTX_CAPTURE_BY_COPY, type))
    605 	    return error_mark_node;
    606 	}
    607     }
    608 
    609   /* Add __ to the beginning of the field name so that user code
    610      won't find the field with name lookup.  We can't just leave the name
    611      unset because template instantiation uses the name to find
    612      instantiated fields.  */
    613   buf = (char *) alloca (IDENTIFIER_LENGTH (id) + 3);
    614   buf[1] = buf[0] = '_';
    615   memcpy (buf + 2, IDENTIFIER_POINTER (id),
    616 	  IDENTIFIER_LENGTH (id) + 1);
    617   name = get_identifier (buf);
    618 
    619   if (variadic)
    620     {
    621       type = make_pack_expansion (type);
    622       if (explicit_init_p)
    623 	/* With an explicit initializer 'type' is auto, which isn't really a
    624 	   parameter pack in this context.  We will want as many fields as we
    625 	   have elements in the expansion of the initializer, so use its packs
    626 	   instead.  */
    627 	{
    628 	  PACK_EXPANSION_PARAMETER_PACKS (type)
    629 	    = uses_parameter_packs (initializer);
    630 	  PACK_EXPANSION_AUTO_P (type) = true;
    631 	}
    632     }
    633 
    634   /* Make member variable.  */
    635   member = build_decl (input_location, FIELD_DECL, name, type);
    636   DECL_VLA_CAPTURE_P (member) = vla;
    637 
    638   if (!explicit_init_p)
    639     /* Normal captures are invisible to name lookup but uses are replaced
    640        with references to the capture field; we implement this by only
    641        really making them invisible in unevaluated context; see
    642        qualify_lookup.  For now, let's make explicitly initialized captures
    643        always visible.  */
    644     DECL_NORMAL_CAPTURE_P (member) = true;
    645 
    646   if (id == this_identifier)
    647     LAMBDA_EXPR_THIS_CAPTURE (lambda) = member;
    648 
    649   /* Add it to the appropriate closure class if we've started it.  */
    650   if (current_class_type
    651       && current_class_type == LAMBDA_EXPR_CLOSURE (lambda))
    652     {
    653       if (COMPLETE_TYPE_P (current_class_type))
    654 	internal_error ("trying to capture %qD in instantiation of "
    655 			"generic lambda", id);
    656       finish_member_declaration (member);
    657     }
    658 
    659   tree listmem = member;
    660   if (variadic)
    661     {
    662       listmem = make_pack_expansion (member);
    663       initializer = orig_init;
    664     }
    665   LAMBDA_EXPR_CAPTURE_LIST (lambda)
    666     = tree_cons (listmem, initializer, LAMBDA_EXPR_CAPTURE_LIST (lambda));
    667 
    668   if (LAMBDA_EXPR_CLOSURE (lambda))
    669     return build_capture_proxy (member, initializer);
    670   /* For explicit captures we haven't started the function yet, so we wait
    671      and build the proxy from cp_parser_lambda_body.  */
    672   LAMBDA_CAPTURE_EXPLICIT_P (LAMBDA_EXPR_CAPTURE_LIST (lambda)) = true;
    673   return NULL_TREE;
    674 }
    675 
    676 /* Register all the capture members on the list CAPTURES, which is the
    677    LAMBDA_EXPR_CAPTURE_LIST for the lambda after the introducer.  */
    678 
    679 void
    680 register_capture_members (tree captures)
    681 {
    682   if (captures == NULL_TREE)
    683     return;
    684 
    685   register_capture_members (TREE_CHAIN (captures));
    686 
    687   tree field = TREE_PURPOSE (captures);
    688   if (PACK_EXPANSION_P (field))
    689     field = PACK_EXPANSION_PATTERN (field);
    690 
    691   finish_member_declaration (field);
    692 }
    693 
    694 /* Similar to add_capture, except this works on a stack of nested lambdas.
    695    BY_REFERENCE_P in this case is derived from the default capture mode.
    696    Returns the capture for the lambda at the bottom of the stack.  */
    697 
    698 tree
    699 add_default_capture (tree lambda_stack, tree id, tree initializer)
    700 {
    701   bool this_capture_p = (id == this_identifier);
    702   tree var = NULL_TREE;
    703   tree saved_class_type = current_class_type;
    704 
    705   for (tree node = lambda_stack;
    706        node;
    707        node = TREE_CHAIN (node))
    708     {
    709       tree lambda = TREE_VALUE (node);
    710 
    711       current_class_type = LAMBDA_EXPR_CLOSURE (lambda);
    712       if (DECL_PACK_P (initializer))
    713 	initializer = make_pack_expansion (initializer);
    714       var = add_capture (lambda,
    715                             id,
    716                             initializer,
    717                             /*by_reference_p=*/
    718 			    (this_capture_p
    719 			     || (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda)
    720 				 == CPLD_REFERENCE)),
    721 			    /*explicit_init_p=*/false);
    722       initializer = convert_from_reference (var);
    723 
    724       /* Warn about deprecated implicit capture of this via [=].  */
    725       if (cxx_dialect >= cxx20
    726 	  && this_capture_p
    727 	  && LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda) == CPLD_COPY)
    728 	{
    729 	  if (warning_at (LAMBDA_EXPR_LOCATION (lambda), OPT_Wdeprecated,
    730 			  "implicit capture of %qE via %<[=]%> is deprecated "
    731 			  "in C++20", this_identifier))
    732 	    inform (LAMBDA_EXPR_LOCATION (lambda), "add explicit %<this%> or "
    733 		    "%<*this%> capture");
    734 	}
    735     }
    736 
    737   current_class_type = saved_class_type;
    738 
    739   return var;
    740 }
    741 
    742 /* Return the capture pertaining to a use of 'this' in LAMBDA, in the
    743    form of an INDIRECT_REF, possibly adding it through default
    744    capturing, if ADD_CAPTURE_P is nonzero.  If ADD_CAPTURE_P is negative,
    745    try to capture but don't complain if we can't.  */
    746 
    747 tree
    748 lambda_expr_this_capture (tree lambda, int add_capture_p)
    749 {
    750   tree result;
    751 
    752   tree this_capture = LAMBDA_EXPR_THIS_CAPTURE (lambda);
    753 
    754   /* In unevaluated context this isn't an odr-use, so don't capture.  */
    755   if (cp_unevaluated_operand)
    756     add_capture_p = false;
    757 
    758   /* Try to default capture 'this' if we can.  */
    759   if (!this_capture)
    760     {
    761       tree lambda_stack = NULL_TREE;
    762       tree init = NULL_TREE;
    763       bool saw_complete = false;
    764 
    765       /* If we are in a lambda function, we can move out until we hit:
    766            1. a non-lambda function or NSDMI,
    767            2. a lambda function capturing 'this', or
    768            3. a non-default capturing lambda function.  */
    769       for (tree tlambda = lambda; ;)
    770 	{
    771 	  if (add_capture_p
    772 	      && LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (tlambda) == CPLD_NONE)
    773 	    /* tlambda won't let us capture 'this'.  */
    774 	    break;
    775 
    776 	  if (add_capture_p)
    777 	    lambda_stack = tree_cons (NULL_TREE,
    778 				      tlambda,
    779 				      lambda_stack);
    780 
    781 	  tree closure = LAMBDA_EXPR_CLOSURE (tlambda);
    782 	  if (COMPLETE_TYPE_P (closure))
    783 	    /* We're instantiating a generic lambda op(), the containing
    784 	       scope may be gone.  */
    785 	    saw_complete = true;
    786 
    787 	  tree containing_function
    788 	    = decl_function_context (TYPE_NAME (closure));
    789 
    790 	  tree ex = LAMBDA_EXPR_EXTRA_SCOPE (tlambda);
    791 	  if (ex && TREE_CODE (ex) == FIELD_DECL)
    792 	    {
    793 	      /* Lambda in an NSDMI.  We don't have a function to look up
    794 		 'this' in, but we can find (or rebuild) the fake one from
    795 		 inject_this_parameter.  */
    796 	      if (!containing_function && !saw_complete)
    797 		/* If we're parsing a lambda in a non-local class,
    798 		   we can find the fake 'this' in scope_chain.  */
    799 		init = scope_chain->x_current_class_ptr;
    800 	      else
    801 		/* Otherwise it's either gone or buried in
    802 		   function_context_stack, so make another.  */
    803 		init = build_this_parm (NULL_TREE, DECL_CONTEXT (ex),
    804 					TYPE_UNQUALIFIED);
    805 	      gcc_checking_assert
    806 		(init && (TREE_TYPE (TREE_TYPE (init))
    807 			  == current_nonlambda_class_type ()));
    808 	      break;
    809 	    }
    810 
    811 	  if (containing_function == NULL_TREE)
    812 	    /* We ran out of scopes; there's no 'this' to capture.  */
    813 	    break;
    814 
    815 	  if (!LAMBDA_FUNCTION_P (containing_function))
    816 	    {
    817 	      /* We found a non-lambda function.  */
    818 	      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (containing_function))
    819 		/* First parameter is 'this'.  */
    820 		init = DECL_ARGUMENTS (containing_function);
    821 	      break;
    822 	    }
    823 
    824 	  tlambda
    825             = CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT (containing_function));
    826 
    827           if (LAMBDA_EXPR_THIS_CAPTURE (tlambda))
    828 	    {
    829 	      /* An outer lambda has already captured 'this'.  */
    830 	      init = LAMBDA_EXPR_THIS_CAPTURE (tlambda);
    831 	      break;
    832 	    }
    833 	}
    834 
    835       if (init)
    836         {
    837           if (add_capture_p)
    838 	    this_capture = add_default_capture (lambda_stack,
    839 					        /*id=*/this_identifier,
    840 					        init);
    841           else
    842 	    this_capture = init;
    843         }
    844     }
    845 
    846   if (cp_unevaluated_operand)
    847     result = this_capture;
    848   else if (!this_capture)
    849     {
    850       if (add_capture_p == 1)
    851 	{
    852 	  error ("%<this%> was not captured for this lambda function");
    853 	  result = error_mark_node;
    854 	}
    855       else
    856 	result = NULL_TREE;
    857     }
    858   else
    859     {
    860       /* To make sure that current_class_ref is for the lambda.  */
    861       gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref))
    862 		  == LAMBDA_EXPR_CLOSURE (lambda));
    863 
    864       result = this_capture;
    865 
    866       /* If 'this' is captured, each use of 'this' is transformed into an
    867 	 access to the corresponding unnamed data member of the closure
    868 	 type cast (_expr.cast_ 5.4) to the type of 'this'. [ The cast
    869 	 ensures that the transformed expression is an rvalue. ] */
    870       result = rvalue (result);
    871     }
    872 
    873   return result;
    874 }
    875 
    876 /* Return the innermost LAMBDA_EXPR we're currently in, if any.  */
    877 
    878 tree
    879 current_lambda_expr (void)
    880 {
    881   tree type = current_class_type;
    882   while (type && !LAMBDA_TYPE_P (type))
    883     type = decl_type_context (TYPE_NAME (type));
    884   if (type)
    885     return CLASSTYPE_LAMBDA_EXPR (type);
    886   else
    887     return NULL_TREE;
    888 }
    889 
    890 /* Return the current LAMBDA_EXPR, if this is a resolvable dummy
    891    object.  NULL otherwise..  */
    892 
    893 static tree
    894 resolvable_dummy_lambda (tree object)
    895 {
    896   if (!is_dummy_object (object))
    897     return NULL_TREE;
    898 
    899   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (object));
    900   gcc_assert (!TYPE_PTR_P (type));
    901 
    902   if (type != current_class_type
    903       && current_class_type
    904       && LAMBDA_TYPE_P (current_class_type)
    905       && lambda_function (current_class_type)
    906       && DERIVED_FROM_P (type, nonlambda_method_basetype()))
    907     return CLASSTYPE_LAMBDA_EXPR (current_class_type);
    908 
    909   return NULL_TREE;
    910 }
    911 
    912 /* We don't want to capture 'this' until we know we need it, i.e. after
    913    overload resolution has chosen a non-static member function.  At that
    914    point we call this function to turn a dummy object into a use of the
    915    'this' capture.  */
    916 
    917 tree
    918 maybe_resolve_dummy (tree object, bool add_capture_p)
    919 {
    920   if (tree lam = resolvable_dummy_lambda (object))
    921     if (tree cap = lambda_expr_this_capture (lam, add_capture_p))
    922       if (cap != error_mark_node)
    923 	object = build_fold_indirect_ref (cap);
    924 
    925   return object;
    926 }
    927 
    928 /* When parsing a generic lambda containing an argument-dependent
    929    member function call we defer overload resolution to instantiation
    930    time.  But we have to know now whether to capture this or not.
    931    Do that if FNS contains any non-static fns.
    932    The std doesn't anticipate this case, but I expect this to be the
    933    outcome of discussion.  */
    934 
    935 void
    936 maybe_generic_this_capture (tree object, tree fns)
    937 {
    938   if (tree lam = resolvable_dummy_lambda (object))
    939     if (!LAMBDA_EXPR_THIS_CAPTURE (lam))
    940       {
    941 	/* We've not yet captured, so look at the function set of
    942 	   interest.  */
    943 	if (BASELINK_P (fns))
    944 	  fns = BASELINK_FUNCTIONS (fns);
    945 	bool id_expr = TREE_CODE (fns) == TEMPLATE_ID_EXPR;
    946 	if (id_expr)
    947 	  fns = TREE_OPERAND (fns, 0);
    948 
    949 	for (lkp_iterator iter (fns); iter; ++iter)
    950 	  if (((!id_expr && TREE_CODE (*iter) != USING_DECL)
    951 	       || TREE_CODE (*iter) == TEMPLATE_DECL)
    952 	      && DECL_NONSTATIC_MEMBER_FUNCTION_P (*iter))
    953 	    {
    954 	      /* Found a non-static member.  Capture this.  */
    955 	      lambda_expr_this_capture (lam, /*maybe*/-1);
    956 	      break;
    957 	    }
    958       }
    959 }
    960 
    961 /* Returns the innermost non-lambda function.  */
    962 
    963 tree
    964 current_nonlambda_function (void)
    965 {
    966   tree fn = current_function_decl;
    967   while (fn && LAMBDA_FUNCTION_P (fn))
    968     fn = decl_function_context (fn);
    969   return fn;
    970 }
    971 
    972 /* Returns the method basetype of the innermost non-lambda function, including
    973    a hypothetical constructor if inside an NSDMI, or NULL_TREE if none.  */
    974 
    975 tree
    976 nonlambda_method_basetype (void)
    977 {
    978   tree type = current_class_type;
    979   if (!type || !LAMBDA_TYPE_P (type))
    980     return current_class_ref ? type : NULL_TREE;
    981 
    982   while (true)
    983     {
    984       tree lam = CLASSTYPE_LAMBDA_EXPR (type);
    985       tree ex = LAMBDA_EXPR_EXTRA_SCOPE (lam);
    986       if (ex && TREE_CODE (ex) == FIELD_DECL)
    987 	/* Lambda in an NSDMI.  */
    988 	return DECL_CONTEXT (ex);
    989 
    990       tree fn = TYPE_CONTEXT (type);
    991       if (!fn || TREE_CODE (fn) != FUNCTION_DECL
    992 	  || !DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
    993 	/* No enclosing non-lambda method.  */
    994 	return NULL_TREE;
    995       if (!LAMBDA_FUNCTION_P (fn))
    996 	/* Found an enclosing non-lambda method.  */
    997 	return TYPE_METHOD_BASETYPE (TREE_TYPE (fn));
    998       type = DECL_CONTEXT (fn);
    999     }
   1000 }
   1001 
   1002 /* Like current_scope, but looking through lambdas.  */
   1003 
   1004 tree
   1005 current_nonlambda_scope (void)
   1006 {
   1007   tree scope = current_scope ();
   1008   for (;;)
   1009     {
   1010       if (TREE_CODE (scope) == FUNCTION_DECL
   1011 	  && LAMBDA_FUNCTION_P (scope))
   1012 	{
   1013 	  scope = CP_TYPE_CONTEXT (DECL_CONTEXT (scope));
   1014 	  continue;
   1015 	}
   1016       else if (LAMBDA_TYPE_P (scope))
   1017 	{
   1018 	  scope = CP_TYPE_CONTEXT (scope);
   1019 	  continue;
   1020 	}
   1021       break;
   1022     }
   1023   return scope;
   1024 }
   1025 
   1026 /* Helper function for maybe_add_lambda_conv_op; build a CALL_EXPR with
   1027    indicated FN and NARGS, but do not initialize the return type or any of the
   1028    argument slots.  */
   1029 
   1030 static tree
   1031 prepare_op_call (tree fn, int nargs)
   1032 {
   1033   tree t;
   1034 
   1035   t = build_vl_exp (CALL_EXPR, nargs + 3);
   1036   CALL_EXPR_FN (t) = fn;
   1037   CALL_EXPR_STATIC_CHAIN (t) = NULL;
   1038 
   1039   return t;
   1040 }
   1041 
   1042 /* Return true iff CALLOP is the op() for a generic lambda.  */
   1043 
   1044 bool
   1045 generic_lambda_fn_p (tree callop)
   1046 {
   1047   return (LAMBDA_FUNCTION_P (callop)
   1048 	  && DECL_TEMPLATE_INFO (callop)
   1049 	  && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (callop)));
   1050 }
   1051 
   1052 /* If the closure TYPE has a static op(), also add a conversion to function
   1053    pointer.  */
   1054 
   1055 void
   1056 maybe_add_lambda_conv_op (tree type)
   1057 {
   1058   bool nested = (cfun != NULL);
   1059   bool nested_def = decl_function_context (TYPE_MAIN_DECL (type));
   1060   tree callop = lambda_function (type);
   1061   tree lam = CLASSTYPE_LAMBDA_EXPR (type);
   1062 
   1063   if (LAMBDA_EXPR_CAPTURE_LIST (lam) != NULL_TREE
   1064       || LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam) != CPLD_NONE)
   1065     return;
   1066 
   1067   if (processing_template_decl)
   1068     return;
   1069 
   1070   bool const generic_lambda_p = generic_lambda_fn_p (callop);
   1071 
   1072   if (!generic_lambda_p && undeduced_auto_decl (callop))
   1073     {
   1074       /* If the op() wasn't deduced due to errors, give up.  */
   1075       gcc_assert (errorcount || sorrycount);
   1076       return;
   1077     }
   1078 
   1079   /* Non-generic non-capturing lambdas only have a conversion function to
   1080      pointer to function when the trailing requires-clause's constraints are
   1081      satisfied.  */
   1082   if (!generic_lambda_p && !constraints_satisfied_p (callop))
   1083     return;
   1084 
   1085   /* Non-template conversion operators are defined directly with build_call_a
   1086      and using DIRECT_ARGVEC for arguments (including 'this').  Templates are
   1087      deferred and the CALL is built in-place.  In the case of a deduced return
   1088      call op, the decltype expression, DECLTYPE_CALL, used as a substitute for
   1089      the return type is also built in-place.  The arguments of DECLTYPE_CALL in
   1090      the return expression may differ in flags from those in the body CALL.  In
   1091      particular, parameter pack expansions are marked PACK_EXPANSION_LOCAL_P in
   1092      the body CALL, but not in DECLTYPE_CALL.  */
   1093 
   1094   vec<tree, va_gc> *direct_argvec = 0;
   1095   tree decltype_call = 0, call = 0;
   1096   tree optype = TREE_TYPE (callop);
   1097   tree fn_result = TREE_TYPE (optype);
   1098 
   1099   tree thisarg = build_int_cst (TREE_TYPE (DECL_ARGUMENTS (callop)), 0);
   1100   if (generic_lambda_p)
   1101     {
   1102       ++processing_template_decl;
   1103 
   1104       /* Prepare the dependent member call for the static member function
   1105 	 '_FUN' and, potentially, prepare another call to be used in a decltype
   1106 	 return expression for a deduced return call op to allow for simple
   1107 	 implementation of the conversion operator.  */
   1108 
   1109       tree instance = cp_build_fold_indirect_ref (thisarg);
   1110       tree objfn = lookup_template_function (DECL_NAME (callop),
   1111 					     DECL_TI_ARGS (callop));
   1112       objfn = build_min (COMPONENT_REF, NULL_TREE,
   1113 			 instance, objfn, NULL_TREE);
   1114       int nargs = list_length (DECL_ARGUMENTS (callop)) - 1;
   1115 
   1116       call = prepare_op_call (objfn, nargs);
   1117       if (type_uses_auto (fn_result))
   1118 	decltype_call = prepare_op_call (objfn, nargs);
   1119     }
   1120   else
   1121     {
   1122       direct_argvec = make_tree_vector ();
   1123       direct_argvec->quick_push (thisarg);
   1124     }
   1125 
   1126   /* Copy CALLOP's argument list (as per 'copy_list') as FN_ARGS in order to
   1127      declare the static member function "_FUN" below.  For each arg append to
   1128      DIRECT_ARGVEC (for the non-template case) or populate the pre-allocated
   1129      call args (for the template case).  If a parameter pack is found, expand
   1130      it, flagging it as PACK_EXPANSION_LOCAL_P for the body call.  */
   1131 
   1132   tree fn_args = NULL_TREE;
   1133   {
   1134     int ix = 0;
   1135     tree src = DECL_CHAIN (DECL_ARGUMENTS (callop));
   1136     tree tgt = NULL;
   1137 
   1138     while (src)
   1139       {
   1140 	tree new_node = copy_node (src);
   1141 	/* We set DECL_CONTEXT of NEW_NODE to the statfn below.
   1142 	   Notice this is creating a recursive type!  */
   1143 
   1144 	/* Clear TREE_ADDRESSABLE on thunk arguments.  */
   1145 	TREE_ADDRESSABLE (new_node) = 0;
   1146 
   1147 	if (!fn_args)
   1148 	  fn_args = tgt = new_node;
   1149 	else
   1150 	  {
   1151 	    TREE_CHAIN (tgt) = new_node;
   1152 	    tgt = new_node;
   1153 	  }
   1154 
   1155 	mark_exp_read (tgt);
   1156 
   1157 	if (generic_lambda_p)
   1158 	  {
   1159 	    tree a = tgt;
   1160 	    if (DECL_PACK_P (tgt))
   1161 	      {
   1162 		a = make_pack_expansion (a);
   1163 		PACK_EXPANSION_LOCAL_P (a) = true;
   1164 	      }
   1165 	    CALL_EXPR_ARG (call, ix) = a;
   1166 
   1167 	    if (decltype_call)
   1168 	      {
   1169 		/* Avoid capturing variables in this context.  */
   1170 		++cp_unevaluated_operand;
   1171 		CALL_EXPR_ARG (decltype_call, ix) = forward_parm (tgt);
   1172 		--cp_unevaluated_operand;
   1173 	      }
   1174 
   1175 	    ++ix;
   1176 	  }
   1177 	else
   1178 	  vec_safe_push (direct_argvec, tgt);
   1179 
   1180 	src = TREE_CHAIN (src);
   1181       }
   1182   }
   1183 
   1184   if (generic_lambda_p)
   1185     {
   1186       if (decltype_call)
   1187 	{
   1188 	  fn_result = finish_decltype_type
   1189 	    (decltype_call, /*id_expression_or_member_access_p=*/false,
   1190 	     tf_warning_or_error);
   1191 	}
   1192     }
   1193   else
   1194     {
   1195       /* Don't warn on deprecated or unavailable lambda declarations, unless
   1196 	 the lambda is actually called.  */
   1197       auto du = make_temp_override (deprecated_state,
   1198 				    UNAVAILABLE_DEPRECATED_SUPPRESS);
   1199       call = build_call_a (callop, direct_argvec->length (),
   1200 			   direct_argvec->address ());
   1201     }
   1202 
   1203   CALL_FROM_THUNK_P (call) = 1;
   1204   SET_EXPR_LOCATION (call, UNKNOWN_LOCATION);
   1205 
   1206   tree stattype = build_function_type (fn_result, FUNCTION_ARG_CHAIN (callop));
   1207   stattype = (cp_build_type_attribute_variant
   1208 	      (stattype, TYPE_ATTRIBUTES (optype)));
   1209   if (flag_noexcept_type
   1210       && TYPE_NOTHROW_P (TREE_TYPE (callop)))
   1211     stattype = build_exception_variant (stattype, noexcept_true_spec);
   1212 
   1213   if (generic_lambda_p)
   1214     --processing_template_decl;
   1215 
   1216   /* First build up the conversion op.  */
   1217 
   1218   tree rettype = build_pointer_type (stattype);
   1219   tree name = make_conv_op_name (rettype);
   1220   tree thistype = cp_build_qualified_type (type, TYPE_QUAL_CONST);
   1221   tree fntype = build_method_type_directly (thistype, rettype, void_list_node);
   1222   /* DR 1722: The conversion function should be noexcept.  */
   1223   fntype = build_exception_variant (fntype, noexcept_true_spec);
   1224   tree convfn = build_lang_decl (FUNCTION_DECL, name, fntype);
   1225   SET_DECL_LANGUAGE (convfn, lang_cplusplus);
   1226   tree fn = convfn;
   1227   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
   1228   SET_DECL_ALIGN (fn, MINIMUM_METHOD_BOUNDARY);
   1229   grokclassfn (type, fn, NO_SPECIAL);
   1230   set_linkage_according_to_type (type, fn);
   1231   rest_of_decl_compilation (fn, namespace_bindings_p (), at_eof);
   1232   DECL_IN_AGGR_P (fn) = 1;
   1233   DECL_ARTIFICIAL (fn) = 1;
   1234   DECL_NOT_REALLY_EXTERN (fn) = 1;
   1235   DECL_DECLARED_INLINE_P (fn) = 1;
   1236   DECL_DECLARED_CONSTEXPR_P (fn) = DECL_DECLARED_CONSTEXPR_P (callop);
   1237   if (DECL_IMMEDIATE_FUNCTION_P (callop))
   1238     SET_DECL_IMMEDIATE_FUNCTION_P (fn);
   1239   DECL_ARGUMENTS (fn) = build_this_parm (fn, fntype, TYPE_QUAL_CONST);
   1240 
   1241   if (nested_def)
   1242     DECL_INTERFACE_KNOWN (fn) = 1;
   1243 
   1244   if (generic_lambda_p)
   1245     fn = add_inherited_template_parms (fn, DECL_TI_TEMPLATE (callop));
   1246 
   1247   add_method (type, fn, false);
   1248 
   1249   /* Generic thunk code fails for varargs; we'll complain in mark_used if
   1250      the conversion op is used.  */
   1251   if (varargs_function_p (callop))
   1252     {
   1253       DECL_DELETED_FN (fn) = 1;
   1254       return;
   1255     }
   1256 
   1257   /* Now build up the thunk to be returned.  */
   1258 
   1259   tree statfn = build_lang_decl (FUNCTION_DECL, fun_identifier, stattype);
   1260   SET_DECL_LANGUAGE (statfn, lang_cplusplus);
   1261   fn = statfn;
   1262   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
   1263   grokclassfn (type, fn, NO_SPECIAL);
   1264   set_linkage_according_to_type (type, fn);
   1265   rest_of_decl_compilation (fn, namespace_bindings_p (), at_eof);
   1266   DECL_IN_AGGR_P (fn) = 1;
   1267   DECL_ARTIFICIAL (fn) = 1;
   1268   DECL_NOT_REALLY_EXTERN (fn) = 1;
   1269   DECL_DECLARED_INLINE_P (fn) = 1;
   1270   DECL_STATIC_FUNCTION_P (fn) = 1;
   1271   DECL_DECLARED_CONSTEXPR_P (fn) = DECL_DECLARED_CONSTEXPR_P (callop);
   1272   if (DECL_IMMEDIATE_FUNCTION_P (callop))
   1273     SET_DECL_IMMEDIATE_FUNCTION_P (fn);
   1274   DECL_ARGUMENTS (fn) = fn_args;
   1275   for (tree arg = fn_args; arg; arg = DECL_CHAIN (arg))
   1276     {
   1277       /* Avoid duplicate -Wshadow warnings.  */
   1278       DECL_NAME (arg) = NULL_TREE;
   1279       DECL_CONTEXT (arg) = fn;
   1280     }
   1281   if (nested_def)
   1282     DECL_INTERFACE_KNOWN (fn) = 1;
   1283 
   1284   if (generic_lambda_p)
   1285     fn = add_inherited_template_parms (fn, DECL_TI_TEMPLATE (callop));
   1286 
   1287   if (flag_sanitize & SANITIZE_NULL)
   1288     /* Don't UBsan this function; we're deliberately calling op() with a null
   1289        object argument.  */
   1290     add_no_sanitize_value (fn, SANITIZE_UNDEFINED);
   1291 
   1292   add_method (type, fn, false);
   1293 
   1294   if (nested)
   1295     push_function_context ();
   1296   else
   1297     /* Still increment function_depth so that we don't GC in the
   1298        middle of an expression.  */
   1299     ++function_depth;
   1300 
   1301   /* Generate the body of the thunk.  */
   1302 
   1303   start_preparsed_function (statfn, NULL_TREE,
   1304 			    SF_PRE_PARSED | SF_INCLASS_INLINE);
   1305   tree body = begin_function_body ();
   1306   tree compound_stmt = begin_compound_stmt (0);
   1307   if (!generic_lambda_p)
   1308     {
   1309       set_flags_from_callee (call);
   1310       if (MAYBE_CLASS_TYPE_P (TREE_TYPE (call)))
   1311 	call = build_cplus_new (TREE_TYPE (call), call, tf_warning_or_error);
   1312     }
   1313   call = convert_from_reference (call);
   1314   finish_return_stmt (call);
   1315 
   1316   finish_compound_stmt (compound_stmt);
   1317   finish_function_body (body);
   1318 
   1319   fn = finish_function (/*inline_p=*/true);
   1320   if (!generic_lambda_p)
   1321     expand_or_defer_fn (fn);
   1322 
   1323   /* Generate the body of the conversion op.  */
   1324 
   1325   start_preparsed_function (convfn, NULL_TREE,
   1326 			    SF_PRE_PARSED | SF_INCLASS_INLINE);
   1327   body = begin_function_body ();
   1328   compound_stmt = begin_compound_stmt (0);
   1329 
   1330   /* decl_needed_p needs to see that it's used.  */
   1331   TREE_USED (statfn) = 1;
   1332   finish_return_stmt (decay_conversion (statfn, tf_warning_or_error));
   1333 
   1334   finish_compound_stmt (compound_stmt);
   1335   finish_function_body (body);
   1336 
   1337   fn = finish_function (/*inline_p=*/true);
   1338   if (!generic_lambda_p)
   1339     expand_or_defer_fn (fn);
   1340 
   1341   if (nested)
   1342     pop_function_context ();
   1343   else
   1344     --function_depth;
   1345 }
   1346 
   1347 /* True if FN is the static function "_FUN" that gets returned from the lambda
   1348    conversion operator.  */
   1349 
   1350 bool
   1351 lambda_static_thunk_p (tree fn)
   1352 {
   1353   return (fn && TREE_CODE (fn) == FUNCTION_DECL
   1354 	  && DECL_ARTIFICIAL (fn)
   1355 	  && DECL_STATIC_FUNCTION_P (fn)
   1356 	  && LAMBDA_TYPE_P (CP_DECL_CONTEXT (fn)));
   1357 }
   1358 
   1359 bool
   1360 call_from_lambda_thunk_p (tree call)
   1361 {
   1362   return (CALL_FROM_THUNK_P (call)
   1363 	  && lambda_static_thunk_p (current_function_decl));
   1364 }
   1365 
   1366 /* Returns true iff VAL is a lambda-related declaration which should
   1367    be ignored by unqualified lookup.  */
   1368 
   1369 bool
   1370 is_lambda_ignored_entity (tree val)
   1371 {
   1372   /* Look past normal, non-VLA capture proxies.  */
   1373   if (is_normal_capture_proxy (val)
   1374       && !variably_modified_type_p (TREE_TYPE (val), NULL_TREE))
   1375     return true;
   1376 
   1377   /* Always ignore lambda fields, their names are only for debugging.  */
   1378   if (TREE_CODE (val) == FIELD_DECL
   1379       && CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT (val)))
   1380     return true;
   1381 
   1382   /* None of the lookups that use qualify_lookup want the op() from the
   1383      lambda; they want the one from the enclosing class.  */
   1384   if (tree fns = maybe_get_fns (val))
   1385     if (LAMBDA_FUNCTION_P (OVL_FIRST (fns)))
   1386       return true;
   1387 
   1388   return false;
   1389 }
   1390 
   1391 /* Lambdas that appear in variable initializer or default argument scope
   1392    get that in their mangling, so we need to record it.  We might as well
   1393    use the count for function and namespace scopes as well.  */
   1394 static GTY(()) tree lambda_scope;
   1395 static GTY(()) int lambda_count;
   1396 struct GTY(()) tree_int
   1397 {
   1398   tree t;
   1399   int i;
   1400 };
   1401 static GTY(()) vec<tree_int, va_gc> *lambda_scope_stack;
   1402 
   1403 void
   1404 start_lambda_scope (tree decl)
   1405 {
   1406   tree_int ti;
   1407   gcc_assert (decl);
   1408   /* Once we're inside a function, we ignore variable scope and just push
   1409      the function again so that popping works properly.  */
   1410   if (current_function_decl && TREE_CODE (decl) == VAR_DECL)
   1411     decl = current_function_decl;
   1412   ti.t = lambda_scope;
   1413   ti.i = lambda_count;
   1414   vec_safe_push (lambda_scope_stack, ti);
   1415   if (lambda_scope != decl)
   1416     {
   1417       /* Don't reset the count if we're still in the same function.  */
   1418       lambda_scope = decl;
   1419       lambda_count = 0;
   1420     }
   1421 }
   1422 
   1423 void
   1424 record_lambda_scope (tree lambda)
   1425 {
   1426   LAMBDA_EXPR_EXTRA_SCOPE (lambda) = lambda_scope;
   1427   LAMBDA_EXPR_DISCRIMINATOR (lambda) = lambda_count++;
   1428   if (lambda_scope)
   1429     {
   1430       tree closure = LAMBDA_EXPR_CLOSURE (lambda);
   1431       gcc_checking_assert (closure);
   1432       maybe_attach_decl (lambda_scope, TYPE_NAME (closure));
   1433     }
   1434 }
   1435 
   1436 /* This lambda is an instantiation of a lambda in a template default argument
   1437    that got no LAMBDA_EXPR_EXTRA_SCOPE, so this shouldn't either.  But we do
   1438    need to use and increment the global count to avoid collisions.  */
   1439 
   1440 void
   1441 record_null_lambda_scope (tree lambda)
   1442 {
   1443   if (vec_safe_is_empty (lambda_scope_stack))
   1444     record_lambda_scope (lambda);
   1445   else
   1446     {
   1447       tree_int *p = lambda_scope_stack->begin();
   1448       LAMBDA_EXPR_EXTRA_SCOPE (lambda) = p->t;
   1449       LAMBDA_EXPR_DISCRIMINATOR (lambda) = p->i++;
   1450     }
   1451   gcc_assert (LAMBDA_EXPR_EXTRA_SCOPE (lambda) == NULL_TREE);
   1452 }
   1453 
   1454 void
   1455 finish_lambda_scope (void)
   1456 {
   1457   tree_int *p = &lambda_scope_stack->last ();
   1458   if (lambda_scope != p->t)
   1459     {
   1460       lambda_scope = p->t;
   1461       lambda_count = p->i;
   1462     }
   1463   lambda_scope_stack->pop ();
   1464 }
   1465 
   1466 tree
   1467 start_lambda_function (tree fco, tree lambda_expr)
   1468 {
   1469   /* Let the front end know that we are going to be defining this
   1470      function.  */
   1471   start_preparsed_function (fco,
   1472 			    NULL_TREE,
   1473 			    SF_PRE_PARSED | SF_INCLASS_INLINE);
   1474 
   1475   tree body = begin_function_body ();
   1476 
   1477   /* Push the proxies for any explicit captures.  */
   1478   for (tree cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
   1479        cap = TREE_CHAIN (cap))
   1480     build_capture_proxy (TREE_PURPOSE (cap), TREE_VALUE (cap));
   1481 
   1482   return body;
   1483 }
   1484 
   1485 /* Subroutine of prune_lambda_captures: CAP is a node in
   1486    LAMBDA_EXPR_CAPTURE_LIST.  Return the variable it captures for which we
   1487    might optimize away the capture, or NULL_TREE if there is no such
   1488    variable.  */
   1489 
   1490 static tree
   1491 var_to_maybe_prune (tree cap)
   1492 {
   1493   if (LAMBDA_CAPTURE_EXPLICIT_P (cap))
   1494     /* Don't prune explicit captures.  */
   1495     return NULL_TREE;
   1496 
   1497   tree mem = TREE_PURPOSE (cap);
   1498   if (!DECL_P (mem) || !DECL_NORMAL_CAPTURE_P (mem))
   1499     /* Packs and init-captures aren't captures of constant vars.  */
   1500     return NULL_TREE;
   1501 
   1502   tree init = TREE_VALUE (cap);
   1503   if (is_normal_capture_proxy (init))
   1504     init = DECL_CAPTURED_VARIABLE (init);
   1505   if (decl_constant_var_p (init))
   1506     return init;
   1507 
   1508   return NULL_TREE;
   1509 }
   1510 
   1511 /* walk_tree helper for prune_lambda_captures: Remember which capture proxies
   1512    for constant variables are actually used in the lambda body.
   1513 
   1514    There will always be a DECL_EXPR for the capture proxy; remember it when we
   1515    see it, but replace it with any other use.  */
   1516 
   1517 static tree
   1518 mark_const_cap_r (tree *t, int *walk_subtrees, void *data)
   1519 {
   1520   hash_map<tree,tree*> &const_vars = *(hash_map<tree,tree*>*)data;
   1521 
   1522   tree var = NULL_TREE;
   1523   if (TREE_CODE (*t) == DECL_EXPR)
   1524     {
   1525       tree decl = DECL_EXPR_DECL (*t);
   1526       if (is_constant_capture_proxy (decl))
   1527 	{
   1528 	  var = DECL_CAPTURED_VARIABLE (decl);
   1529 	  *walk_subtrees = 0;
   1530 	}
   1531     }
   1532   else if (!location_wrapper_p (*t) /* is_capture_proxy dislikes them.  */
   1533 	   && is_constant_capture_proxy (*t))
   1534     var = DECL_CAPTURED_VARIABLE (*t);
   1535 
   1536   if (var)
   1537     {
   1538       tree *&slot = const_vars.get_or_insert (var);
   1539       if (!slot || VAR_P (*t))
   1540 	slot = t;
   1541     }
   1542 
   1543   return NULL_TREE;
   1544 }
   1545 
   1546 /* We're at the end of processing a lambda; go back and remove any captures of
   1547    constant variables for which we've folded away all uses.  */
   1548 
   1549 static void
   1550 prune_lambda_captures (tree body)
   1551 {
   1552   tree lam = current_lambda_expr ();
   1553   if (!LAMBDA_EXPR_CAPTURE_OPTIMIZED (lam))
   1554     /* No uses were optimized away.  */
   1555     return;
   1556   if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam) == CPLD_NONE)
   1557     /* No default captures, and we don't prune explicit captures.  */
   1558     return;
   1559   /* Don't bother pruning in a template, we'll prune at instantiation time.  */
   1560   if (dependent_type_p (TREE_TYPE (lam)))
   1561     return;
   1562 
   1563   hash_map<tree,tree*> const_vars;
   1564 
   1565   cp_walk_tree_without_duplicates (&body, mark_const_cap_r, &const_vars);
   1566 
   1567   tree *fieldp = &TYPE_FIELDS (LAMBDA_EXPR_CLOSURE (lam));
   1568   for (tree *capp = &LAMBDA_EXPR_CAPTURE_LIST (lam); *capp; )
   1569     {
   1570       tree cap = *capp;
   1571       if (tree var = var_to_maybe_prune (cap))
   1572 	{
   1573 	  tree **use = const_vars.get (var);
   1574 	  if (use && TREE_CODE (**use) == DECL_EXPR)
   1575 	    {
   1576 	      /* All uses of this capture were folded away, leaving only the
   1577 		 proxy declaration.  */
   1578 
   1579 	      /* Splice the capture out of LAMBDA_EXPR_CAPTURE_LIST.  */
   1580 	      *capp = TREE_CHAIN (cap);
   1581 
   1582 	      /* And out of TYPE_FIELDS.  */
   1583 	      tree field = TREE_PURPOSE (cap);
   1584 	      while (*fieldp != field)
   1585 		fieldp = &DECL_CHAIN (*fieldp);
   1586 	      *fieldp = DECL_CHAIN (*fieldp);
   1587 
   1588 	      /* And remove the capture proxy declaration.  */
   1589 	      **use = void_node;
   1590 	      continue;
   1591 	    }
   1592 	}
   1593 
   1594       capp = &TREE_CHAIN (cap);
   1595     }
   1596 }
   1597 
   1598 void
   1599 finish_lambda_function (tree body)
   1600 {
   1601   finish_function_body (body);
   1602 
   1603   prune_lambda_captures (body);
   1604 
   1605   /* Finish the function and generate code for it if necessary.  */
   1606   tree fn = finish_function (/*inline_p=*/true);
   1607 
   1608   /* Only expand if the call op is not a template.  */
   1609   if (!DECL_TEMPLATE_INFO (fn))
   1610     expand_or_defer_fn (fn);
   1611 }
   1612 
   1613 #include "gt-cp-lambda.h"
   1614