From 1d3e12c469e5f5627c2e271232e1a3d8a88783be Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 2 Oct 2020 04:58:57 -0700 Subject: [PATCH] c++: Simplify __FUNCTION__ creation I had reason to wander into cp_make_fname, and noticed it's the only caller of cp_fname_init. Folding it in makes the code simpler. gcc/cp/ * cp-tree.h (cp_fname_init): Delete declaration. * decl.c (cp_fname_init): Merge into only caller ... (cp_make_fname): ... here & refactor. --- gcc/cp/cp-tree.h | 1 - gcc/cp/decl.c | 85 ++++++++++++++++++------------------------------ 2 files changed, 32 insertions(+), 54 deletions(-) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index fda5ffa4036..9f948aee2d8 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6514,7 +6514,6 @@ extern tree create_implicit_typedef (tree, tree); extern int local_variable_p (const_tree); extern tree register_dtor_fn (tree); extern tmpl_spec_kind current_tmpl_spec_kind (int); -extern tree cp_fname_init (const char *, tree *); extern tree cxx_builtin_function (tree decl); extern tree cxx_builtin_function_ext_scope (tree decl); extern tree cxx_simulate_builtin_function_decl (tree); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d2a8d4012ab..6b306ee4667 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4592,38 +4592,6 @@ cxx_init_decl_processing (void) using_eh_for_cleanups (); } -/* Generate an initializer for a function naming variable from - NAME. NAME may be NULL, to indicate a dependent name. TYPE_P is - filled in with the type of the init. */ - -tree -cp_fname_init (const char* name, tree *type_p) -{ - tree domain = NULL_TREE; - tree type; - tree init = NULL_TREE; - size_t length = 0; - - if (name) - { - length = strlen (name); - domain = build_index_type (size_int (length)); - init = build_string (length + 1, name); - } - - type = cp_build_qualified_type (char_type_node, TYPE_QUAL_CONST); - type = build_cplus_array_type (type, domain); - - *type_p = type; - - if (init) - TREE_TYPE (init) = type; - else - init = error_mark_node; - - return init; -} - /* Create the VAR_DECL for __FUNCTION__ etc. ID is the name to give the decl, LOC is the location to give the decl, NAME is the initialization string and TYPE_DEP indicates whether NAME depended @@ -4634,31 +4602,45 @@ cp_fname_init (const char* name, tree *type_p) static tree cp_make_fname_decl (location_t loc, tree id, int type_dep) { - const char * name = NULL; - bool release_name = false; + tree domain = NULL_TREE; + tree init = NULL_TREE; + if (!(type_dep && in_template_function ())) { + const char *name = NULL; + bool release_name = false; + if (current_function_decl == NULL_TREE) name = "top level"; - else if (type_dep == 1) /* __PRETTY_FUNCTION__ */ - name = cxx_printable_name (current_function_decl, 2); - else if (type_dep == 0) /* __FUNCTION__ */ + else if (type_dep == 0) { + /* __FUNCTION__ */ name = fname_as_string (type_dep); release_name = true; } else - gcc_unreachable (); + { + /* __PRETTY_FUNCTION__ */ + gcc_checking_assert (type_dep == 1); + name = cxx_printable_name (current_function_decl, 2); + } + + size_t length = strlen (name); + domain = build_index_type (size_int (length)); + init = build_string (length + 1, name); + if (release_name) + free (const_cast (name)); } - tree type; - tree init = cp_fname_init (name, &type); - tree decl = build_decl (loc, VAR_DECL, id, type); - if (release_name) - free (CONST_CAST (char *, name)); + tree type = cp_build_qualified_type (char_type_node, TYPE_QUAL_CONST); + type = build_cplus_array_type (type, domain); - /* As we're using pushdecl_with_scope, we must set the context. */ - DECL_CONTEXT (decl) = current_function_decl; + if (init) + TREE_TYPE (init) = type; + else + init = error_mark_node; + + tree decl = build_decl (loc, VAR_DECL, id, type); TREE_READONLY (decl) = 1; DECL_ARTIFICIAL (decl) = 1; @@ -4667,13 +4649,10 @@ cp_make_fname_decl (location_t loc, tree id, int type_dep) TREE_USED (decl) = 1; - if (init) - { - SET_DECL_VALUE_EXPR (decl, init); - DECL_HAS_VALUE_EXPR_P (decl) = 1; - /* For decl_constant_var_p. */ - DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = 1; - } + SET_DECL_VALUE_EXPR (decl, init); + DECL_HAS_VALUE_EXPR_P (decl) = 1; + /* For decl_constant_var_p. */ + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = 1; if (current_function_decl) { @@ -4685,7 +4664,7 @@ cp_make_fname_decl (location_t loc, tree id, int type_dep) else { DECL_THIS_STATIC (decl) = true; - pushdecl_top_level_and_finish (decl, NULL_TREE); + decl = pushdecl_top_level_and_finish (decl, NULL_TREE); } return decl; -- 2.30.2