From 234f46aead2f46eff4184a37d34a2e5032d83550 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sat, 3 Nov 2001 00:00:01 +0000 Subject: [PATCH] c-decl.c (pushdecl): Move block inside if conditional to remove possibility of a segfault. * 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 | 8 ++++++++ gcc/c-decl.c | 17 ++++++++++------- .../gcc.c-torture/compile/20001018-1.x | 2 -- 3 files changed, 18 insertions(+), 9 deletions(-) delete mode 100644 gcc/testsuite/gcc.c-torture/compile/20001018-1.x diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ba1dd7536d..195406f6821 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2001-11-02 Neil Booth + + * 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 * expmed.c (store_bit_field): Use simplify_gen_subreg to make diff --git a/gcc/c-decl.c b/gcc/c-decl.c index c840057f346..a907770c7b1 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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 index f41cdc29913..00000000000 --- a/gcc/testsuite/gcc.c-torture/compile/20001018-1.x +++ /dev/null @@ -1,2 +0,0 @@ -set torture_compile_xfail "*-*-*" -return 0 -- 2.30.2