From e07b83663e961bdd8025e56e7916b72b3463b1c3 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 4 Oct 2017 17:54:59 +0000 Subject: [PATCH] [C++ PATCH] give builtin types consistent name https://gcc.gnu.org/ml/gcc-patches/2017-10/msg00201.html Give builtin types the correct name. * name-lookup.c (set_global_binding): Assert name is DECL_NAME. * decl.c (record_builtin_type): Reimplement, use new TYPE_DECL for rname. From-SVN: r253426 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl.c | 52 ++++++++++++++++++++++++++-------------------------- gcc/cp/name-lookup.c | 1 + 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 035a1b7..277b646 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2017-10-04 Nathan Sidwell + + Give builtin types the correct name. + * name-lookup.c (set_global_binding): Assert name is DECL_NAME. + * decl.c (record_builtin_type): Reimplement, use new TYPE_DECL for + rname. + 2017-10-04 Paolo Carlini Andrew Pinski diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index ce45c11..99f0af2 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3895,47 +3895,47 @@ make_unbound_class_template (tree context, tree name, tree parm_list, /* Push the declarations of builtin types into the global namespace. RID_INDEX is the index of the builtin type in the array RID_POINTERS. NAME is the name used when looking up the builtin - type. TYPE is the _TYPE node for the builtin type. */ + type. TYPE is the _TYPE node for the builtin type. + + The calls to SET_IDENTIFIER_GLOBAL_VALUE below should be + eliminated. Built-in types should not be looked up name; their + names are keywords that the parser can recognize. However, there + is code in c-common.c that uses identifier_global_value to look up + built-in types by name. */ void record_builtin_type (enum rid rid_index, const char* name, tree type) { - tree rname = NULL_TREE, tname = NULL_TREE; - tree tdecl = NULL_TREE; + tree decl = NULL_TREE; - if ((int) rid_index < (int) RID_MAX) - rname = ridpointers[(int) rid_index]; if (name) - tname = get_identifier (name); - - /* The calls to SET_IDENTIFIER_GLOBAL_VALUE below should be - eliminated. Built-in types should not be looked up name; their - names are keywords that the parser can recognize. However, there - is code in c-common.c that uses identifier_global_value to look - up built-in types by name. */ - if (tname) { - tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, tname, type); + tree tname = get_identifier (name); + tree tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, tname, type); DECL_ARTIFICIAL (tdecl) = 1; SET_IDENTIFIER_GLOBAL_VALUE (tname, tdecl); + decl = tdecl; } - if (rname) - { - if (!tdecl) + + if ((int) rid_index < (int) RID_MAX) + if (tree rname = ridpointers[(int) rid_index]) + if (!decl || DECL_NAME (decl) != rname) { - tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, rname, type); - DECL_ARTIFICIAL (tdecl) = 1; + tree rdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, rname, type); + DECL_ARTIFICIAL (rdecl) = 1; + SET_IDENTIFIER_GLOBAL_VALUE (rname, rdecl); + if (!decl) + decl = rdecl; } - SET_IDENTIFIER_GLOBAL_VALUE (rname, tdecl); - } - - if (!TYPE_NAME (type)) - TYPE_NAME (type) = tdecl; - if (tdecl) - debug_hooks->type_decl (tdecl, 0); + if (decl) + { + if (!TYPE_NAME (type)) + TYPE_NAME (type) = decl; + debug_hooks->type_decl (decl, 0); + } } /* Push a type into the namespace so that the back ends ignore it. */ diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 0111d8d..c72a7f4 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4847,6 +4847,7 @@ set_global_binding (tree name, tree val) { bool subtime = timevar_cond_start (TV_NAME_LOOKUP); + gcc_checking_assert (name == DECL_NAME (val)); tree *slot = find_namespace_slot (global_namespace, name, true); tree old = MAYBE_STAT_DECL (*slot); -- 2.7.4