static tree start_cdtor (int method_type) { tree fnname = get_file_function_name (method_type); tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node); tree body; start_function (void_list_node_1, build_nt (CALL_EXPR, fnname, tree_cons (NULL_TREE, NULL_TREE, void_list_node_1), NULL_TREE), NULL_TREE); store_parm_decls (); current_function_cannot_inline = "static constructors and destructors cannot be inlined"; body = c_begin_compound_stmt (); pushlevel (0); clear_last_expr (); add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0); return body; }
void genrtl_do_pushlevel (void) { emit_line_note (input_location); clear_last_expr (); }
void synthesize_method (tree fndecl) { bool nested = (current_function_decl != NULL_TREE); tree context = decl_function_context (fndecl); bool need_body = true; tree stmt; if (at_eof) import_export_decl (fndecl); /* If we've been asked to synthesize a clone, just synthesize the cloned function instead. Doing so will automatically fill in the body for the clone. */ if (DECL_CLONED_FUNCTION_P (fndecl)) { synthesize_method (DECL_CLONED_FUNCTION (fndecl)); return; } /* We may be in the middle of deferred access check. Disable it now. */ push_deferring_access_checks (dk_no_deferred); if (! context) push_to_top_level (); else if (nested) push_function_context_to (context); /* Put the function definition at the position where it is needed, rather than within the body of the class. That way, an error during the generation of the implicit body points at the place where the attempt to generate the function occurs, giving the user a hint as to why we are attempting to generate the function. */ DECL_SOURCE_LOCATION (fndecl) = input_location; interface_unknown = 1; start_function (NULL_TREE, fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED); clear_last_expr (); stmt = begin_function_body (); if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR) { do_build_assign_ref (fndecl); need_body = false; } else if (DECL_CONSTRUCTOR_P (fndecl)) { tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl); if (arg_chain != void_list_node) do_build_copy_constructor (fndecl); else if (TYPE_NEEDS_CONSTRUCTING (current_class_type)) finish_mem_initializers (NULL_TREE); } /* If we haven't yet generated the body of the function, just generate an empty compound statement. */ if (need_body) { tree compound_stmt; compound_stmt = begin_compound_stmt (/*has_no_scope=*/false); finish_compound_stmt (compound_stmt); } finish_function_body (stmt); expand_or_defer_fn (finish_function (0)); extract_interface_info (); if (! context) pop_from_top_level (); else if (nested) pop_function_context_from (context); pop_deferring_access_checks (); }