aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-decl.c
diff options
context:
space:
mode:
authorNeil Booth <neil@daikokuya.demon.co.uk>2001-11-03 00:00:01 +0000
committerNeil Booth <neil@gcc.gnu.org>2001-11-03 00:00:01 +0000
commit234f46aead2f46eff4184a37d34a2e5032d83550 (patch)
treec8da6e748a16b85ed36daaf4bb7209f4529cdd55 /gcc/c-decl.c
parent1b5e9d7e1bd9a954485d45171ffc19e66bcb4edb (diff)
downloadgcc-234f46aead2f46eff4184a37d34a2e5032d83550.zip
gcc-234f46aead2f46eff4184a37d34a2e5032d83550.tar.gz
gcc-234f46aead2f46eff4184a37d34a2e5032d83550.tar.bz2
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
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r--gcc/c-decl.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index c840057..a907770 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)