aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-10-04 17:54:59 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-10-04 17:54:59 +0000
commite07b83663e961bdd8025e56e7916b72b3463b1c3 (patch)
treed5d394cf4cd8a033c411e8a75cdd6a12d39b79a7
parentd21f2166b03cfda6b689398f7839520d66123708 (diff)
downloadgcc-e07b83663e961bdd8025e56e7916b72b3463b1c3.zip
gcc-e07b83663e961bdd8025e56e7916b72b3463b1c3.tar.gz
gcc-e07b83663e961bdd8025e56e7916b72b3463b1c3.tar.bz2
[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
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl.c52
-rw-r--r--gcc/cp/name-lookup.c1
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 <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>
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);