aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <jsm@polyomino.org.uk>2004-07-31 18:21:27 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2004-07-31 18:21:27 +0100
commit558d1f815dbe96208954efba3bab256bbe7f106e (patch)
tree37c2094176ebe279ec60f8c89c341f5502370a4b
parent2347da644d23390399cc060fe3f2358314efc1b6 (diff)
downloadgcc-558d1f815dbe96208954efba3bab256bbe7f106e.zip
gcc-558d1f815dbe96208954efba3bab256bbe7f106e.tar.gz
gcc-558d1f815dbe96208954efba3bab256bbe7f106e.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-decl.c16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/redecl-2.c68
4 files changed, 89 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 719578f..226591d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-07-31 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * 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 <geoffk@apple.com>
Fariborz Jahanian <fjahanian@apple.com>
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index b14d331..27860b4 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 8bb22cd..28d487c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-07-31 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * gcc.dg/redecl-2.c: New test.
+
2004-07-30 Geoffrey Keating <geoffk@apple.com>
* 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 0000000..b1b7dc9
--- /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 <jsm@polyomino.org.uk> */
+/* { 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;
+}