c-decl.c (diagnose_mismatched_decls): Give error for external redeclaration of identi...
authorJoseph Myers <jsm@polyomino.org.uk>
Sat, 31 Jul 2004 17:21:27 +0000 (18:21 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Sat, 31 Jul 2004 17:21:27 +0000 (18:21 +0100)
* 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
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/redecl-2.c [new file with mode: 0644]

index 719578fe7545c76e2c478d7fe2234ff9f6473781..226591d1dc4bb57838a4999c41fa116f1a24249b 100644 (file)
@@ -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>
 
index b14d331cadcb224afaf45fad0128cb604b8beb69..27860b4bd29916171d89ec01e7bdaee3e1ffedfe 100644 (file)
@@ -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);
index 8bb22cd6325659590ae673366c677226e4797015..28d487c4f54d4da73957ac17f3d8f2fecc478118 100644 (file)
@@ -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 (file)
index 0000000..b1b7dc9
--- /dev/null
@@ -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;
+}