/* 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. */