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)
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
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;
+}
\f
/* Create the predefined scalar types of C,
and some nodes representing standard constants (0, 1, (void *)0).