tree maybe_resolve_dummy (tree object, bool add_capture_p) { if (!is_dummy_object (object)) return object; tree type = TYPE_MAIN_VARIANT (TREE_TYPE (object)); gcc_assert (!TYPE_PTR_P (type)); if (type != current_class_type && current_class_type && LAMBDA_TYPE_P (current_class_type) && lambda_function (current_class_type) && DERIVED_FROM_P (type, current_nonlambda_class_type ())) { /* In a lambda, need to go through 'this' capture. */ tree lam = CLASSTYPE_LAMBDA_EXPR (current_class_type); tree cap = lambda_expr_this_capture (lam, add_capture_p); if (cap && cap != error_mark_node) object = build_x_indirect_ref (EXPR_LOCATION (object), cap, RO_NULL, tf_warning_or_error); } return object; }
static const char * cxx_dwarf_name (tree t, int verbosity) { gcc_assert (DECL_P (t)); if (DECL_NAME (t) && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDA_TYPE_P (t))) return NULL; if (verbosity >= 2) return decl_as_dwarf_string (t, TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS); return lang_decl_dwarf_name (t, verbosity, false); }
tree lambda_function (tree lambda) { tree type; if (TREE_CODE (lambda) == LAMBDA_EXPR) type = LAMBDA_EXPR_CLOSURE (lambda); else type = lambda; gcc_assert (LAMBDA_TYPE_P (type)); /* Don't let debug_tree cause instantiation. */ if (CLASSTYPE_TEMPLATE_INSTANTIATION (type) && !COMPLETE_OR_OPEN_TYPE_P (type)) return NULL_TREE; lambda = lookup_member (type, ansi_opname (CALL_EXPR), /*protect=*/0, /*want_type=*/false, tf_warning_or_error); if (lambda) lambda = STRIP_TEMPLATE (get_first_fn (lambda)); return lambda; }
tree current_nonlambda_scope (void) { tree scope = current_scope (); for (;;) { if (TREE_CODE (scope) == FUNCTION_DECL && LAMBDA_FUNCTION_P (scope)) { scope = CP_TYPE_CONTEXT (DECL_CONTEXT (scope)); continue; } else if (LAMBDA_TYPE_P (scope)) { scope = CP_TYPE_CONTEXT (scope); continue; } break; } return scope; }
tree nonlambda_method_basetype (void) { tree fn, type; if (!current_class_ref) return NULL_TREE; type = current_class_type; if (!LAMBDA_TYPE_P (type)) return type; /* Find the nearest enclosing non-lambda function. */ fn = TYPE_NAME (type); do fn = decl_function_context (fn); while (fn && LAMBDA_FUNCTION_P (fn)); if (!fn || !DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)) return NULL_TREE; return TYPE_METHOD_BASETYPE (TREE_TYPE (fn)); }