[C++ PATCH] give builtin types consistent name
authorNathan Sidwell <nathan@acm.org>
Wed, 4 Oct 2017 17:54:59 +0000 (17:54 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 4 Oct 2017 17:54:59 +0000 (17:54 +0000)
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
gcc/cp/decl.c
gcc/cp/name-lookup.c

index 035a1b7..277b646 100644 (file)
@@ -1,3 +1,10 @@
+2017-10-04  Nathan Sidwell  <nathan@acm.org>
+
+       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  <paolo.carlini@oracle.com>
            Andrew Pinski  <apinski@cavium.com>
 
index ce45c11..99f0af2 100644 (file)
@@ -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.  */
index 0111d8d..c72a7f4 100644 (file)
@@ -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);