c-decl.c (pushdecl): Move block inside if conditional to remove possibility of a...
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sat, 3 Nov 2001 00:00:01 +0000 (00:00 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sat, 3 Nov 2001 00:00:01 +0000 (00:00 +0000)
* c-decl.c (pushdecl): Move block inside if conditional to remove
possibility of a segfault.  Lookup block-level extern
variables in enclosing scopes correctly.

* testsuite/gcc.c-torture/compile/20001018-1.x: Remove XFAIL.

From-SVN: r46726

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/gcc.c-torture/compile/20001018-1.x [deleted file]

index 5ba1dd7536da055a3cf51a59ec656859de06aa0c..195406f68211a04a4b824c1602f2ffeff75526e5 100644 (file)
@@ -1,3 +1,11 @@
+2001-11-02  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * c-decl.c (pushdecl): Move block inside if conditional to remove
+       possibility of a segfault.  Lookup block-level extern
+       variables in enclosing scopes correctly.
+
+       * testsuite/gcc.c-torture/compile/20001018-1.x: Remove XFAIL.
+
 2001-11-02  Aldy Hernandez  <aldyh@redhat.com>
 
         * expmed.c (store_bit_field): Use simplify_gen_subreg to make
index c840057f346dc6ba3974f180b1d020d47685a452..a907770c7b13d21a8dde8aaa82b661dde7dee3b4 100644 (file)
@@ -2115,25 +2115,28 @@ pushdecl (x)
       && DECL_INITIAL (x) == 0 && DECL_EXTERNAL (x))
     DECL_CONTEXT (x) = 0;
 
-  if (warn_nested_externs && DECL_EXTERNAL (x) && b != global_binding_level
-      && x != IDENTIFIER_IMPLICIT_DECL (name)
-      /* Don't print error messages for __FUNCTION__ and __PRETTY_FUNCTION__ */
-      && !DECL_IN_SYSTEM_HEADER (x))
-    warning ("nested extern declaration of `%s'", IDENTIFIER_POINTER (name));
-
   if (name)
     {
       const char *file;
       int line;
       int different_binding_level = 0;
 
+      if (warn_nested_externs
+         && DECL_EXTERNAL (x)
+         && b != global_binding_level
+         && x != IDENTIFIER_IMPLICIT_DECL (name)
+         /* No error messages for __FUNCTION__ and __PRETTY_FUNCTION__.  */
+         && !DECL_IN_SYSTEM_HEADER (x))
+       warning ("nested extern declaration of `%s'",
+                IDENTIFIER_POINTER (name));
+
       t = lookup_name_current_level (name);
       /* Don't type check externs here when -traditional.  This is so that
         code with conflicting declarations inside blocks will get warnings
         not errors.  X11 for instance depends on this.  */
       if (! t && DECL_EXTERNAL (x) && TREE_PUBLIC (x) && ! flag_traditional)
        {
-         t = IDENTIFIER_GLOBAL_VALUE (name);
+         t = lookup_name (name);
          /* Type decls at global scope don't conflict with externs declared
             inside lexical blocks.  */
          if (t && TREE_CODE (t) == TYPE_DECL)
diff --git a/gcc/testsuite/gcc.c-torture/compile/20001018-1.x b/gcc/testsuite/gcc.c-torture/compile/20001018-1.x
deleted file mode 100644 (file)
index f41cdc2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-set torture_compile_xfail "*-*-*"
-return 0