From 558d1f815dbe96208954efba3bab256bbe7f106e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Sat, 31 Jul 2004 18:21:27 +0100 Subject: [PATCH] c-decl.c (diagnose_mismatched_decls): Give error for external redeclaration of identifier declared with no linkage... * c-decl.c (diagnose_mismatched_decls): Give error for external redeclaration of identifier declared with no linkage, not just warning with -Wtraditional. Do not check DECL_CONTEXT to give error for redeclaration with no linkage. testsuite: * gcc.dg/redecl-2.c: New test. From-SVN: r85386 --- gcc/ChangeLog | 7 ++++ gcc/c-decl.c | 16 +++++--- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gcc.dg/redecl-2.c | 68 +++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/redecl-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 719578fe754..226591d1dc4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-07-31 Joseph S. Myers + + * c-decl.c (diagnose_mismatched_decls): Give error for external + redeclaration of identifier declared with no linkage, not just + warning with -Wtraditional. Do not check DECL_CONTEXT to give + error for redeclaration with no linkage. + 2004-07-30 Geoffrey Keating Fariborz Jahanian diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b14d331cadc..27860b4bd29 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -1325,7 +1325,14 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, { if (DECL_EXTERNAL (newdecl)) { - if (warn_traditional) + if (!DECL_FILE_SCOPE_P (olddecl)) + { + error ("%Jextern declaration of %qD follows " + "declaration with no linkage", newdecl, newdecl); + locate_old_decl (olddecl, error); + return false; + } + else if (warn_traditional) { warning ("%Jnon-static declaration of '%D' follows " "static declaration", newdecl, newdecl); @@ -1347,13 +1354,10 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, } /* Two objects with the same name declared at the same block scope must both be external references (6.7p3). */ - else if (!DECL_FILE_SCOPE_P (newdecl) - && DECL_CONTEXT (newdecl) == DECL_CONTEXT (olddecl) - && (!DECL_EXTERNAL (newdecl) || !DECL_EXTERNAL (olddecl))) + else if (!DECL_FILE_SCOPE_P (newdecl)) { if (DECL_EXTERNAL (newdecl)) - error ("%Jextern declaration of '%D' follows " - "declaration with no linkage", newdecl, newdecl); + abort (); else if (DECL_EXTERNAL (olddecl)) error ("%Jdeclaration of '%D' with no linkage follows " "extern declaration", newdecl, newdecl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8bb22cd6325..28d487c4f54 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-07-31 Joseph S. Myers + + * gcc.dg/redecl-2.c: New test. + 2004-07-30 Geoffrey Keating * gcc.dg/darwin-longdouble.c: New file. diff --git a/gcc/testsuite/gcc.dg/redecl-2.c b/gcc/testsuite/gcc.dg/redecl-2.c new file mode 100644 index 00000000000..b1b7dc929de --- /dev/null +++ b/gcc/testsuite/gcc.dg/redecl-2.c @@ -0,0 +1,68 @@ +/* Test for multiple declarations of an identifier at same block + scope: only valid case is all extern. */ +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void +fa0 (void) +{ + int a0; /* { dg-error "previous declaration" } */ + int a0; /* { dg-error "redeclaration" } */ +} + +void +fa1 (void) +{ + int a1; /* { dg-error "previous declaration" } */ + static int a1; /* { dg-error "redeclaration" } */ +} + +void +fa2 (void) +{ + int a2; /* { dg-error "previous declaration" } */ + extern int a2; /* { dg-error "follows declaration with no linkage" } */ +} + +void +fa3 (void) +{ + static int a3; /* { dg-error "previous declaration" } */ + int a3; /* { dg-error "redeclaration" } */ +} + +void +fa4 (void) +{ + static int a4; /* { dg-error "previous declaration" } */ + static int a4; /* { dg-error "redeclaration" } */ +} + +void +fa5 (void) +{ + static int a5; /* { dg-error "previous declaration" } */ + extern int a5; /* { dg-error "follows declaration with no linkage" } */ +} + +void +fa6 (void) +{ + extern int a6; /* { dg-error "previous declaration" } */ + int a6; /* { dg-error "follows extern declaration" } */ +} + +void +fa7 (void) +{ + extern int a7; /* { dg-error "previous declaration" } */ + static int a7; /* { dg-error "follows extern declaration" } */ +} + +void +fa8 (void) +{ + extern int a8; + extern int a8; +} -- 2.30.2