(pushdecl): Use lookup_name_current_level_global instead of lookup_name for extern...
authorJim Wilson <wilson@gcc.gnu.org>
Mon, 2 May 1994 20:48:11 +0000 (13:48 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Mon, 2 May 1994 20:48:11 +0000 (13:48 -0700)
(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

gcc/c-decl.c

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