(pushdecl): Use lookup_name_current_level_global instead of lookup_name for extern references.
(pushdecl): Use lookup_name_current_level_global instead of lookup_name for extern references. Don't return duplicate decl if it came from the global binding level, and there exists a conflicting decl in an intervening block. (lookup_name_current_level_global); New function. From-SVN: r7189
This commit is contained in:
parent
53dd962232
commit
e32fe22499
32
gcc/c-decl.c
32
gcc/c-decl.c
@ -1828,7 +1828,7 @@ pushdecl (x)
|
||||
int line;
|
||||
|
||||
if (DECL_EXTERNAL (x) && TREE_PUBLIC (x))
|
||||
t = lookup_name (name);
|
||||
t = lookup_name_current_level_global (name);
|
||||
else
|
||||
t = lookup_name_current_level (name);
|
||||
if (t != 0 && t == error_mark_node)
|
||||
@ -1869,7 +1869,12 @@ pushdecl (x)
|
||||
IDENTIFIER_POINTER (name));
|
||||
}
|
||||
|
||||
return t;
|
||||
/* If this is a global decl, and there exists a conflicting local
|
||||
decl in a parent block, then we can't return as yet, because we
|
||||
need to register this decl in the current binding block. */
|
||||
if (! DECL_EXTERNAL (x) || ! TREE_PUBLIC (x)
|
||||
|| lookup_name (name) == t)
|
||||
return t;
|
||||
}
|
||||
|
||||
/* If we are processing a typedef statement, generate a whole new
|
||||
@ -2609,6 +2614,29 @@ lookup_name_current_level (name)
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
/* Similar to `lookup_name_current_level' but also look at the global binding
|
||||
level. */
|
||||
|
||||
tree
|
||||
lookup_name_current_level_global (name)
|
||||
tree name;
|
||||
{
|
||||
register tree t = 0;
|
||||
|
||||
if (current_binding_level == global_binding_level)
|
||||
return IDENTIFIER_GLOBAL_VALUE (name);
|
||||
|
||||
if (IDENTIFIER_LOCAL_VALUE (name) != 0)
|
||||
for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
|
||||
if (DECL_NAME (t) == name)
|
||||
break;
|
||||
|
||||
if (t == 0)
|
||||
t = IDENTIFIER_GLOBAL_VALUE (name);
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
/* Create the predefined scalar types of C,
|
||||
and some nodes representing standard constants (0, 1, (void *)0).
|
||||
|
Loading…
Reference in New Issue
Block a user