This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch for redeclarations at block scope


I was looking at fixing bug 13801 (composite types for external
declarations not handled properly, caused by Zack's overhaul of
c-decl.c though we got some cases wrong before then), and found this
other (independent) bug in handling redeclarations; declaring the same
identifier more than once at block scope, where one but not all
declarations were extern, was not diagnosed even though code to
diagnose it was present.  (Testsuite logs showed no instances of the
messages from that code.)

It seemed worthwhile to separate fixing this bug from fixing bug
13801, and the 68-line testcase for this bug from the 1180-line
testcase for bug 13801 and related cases (some of which have never
been handled properly).

The following patch fixes the current bug.  Bootstrapped with no
regressions on i686-pc-linux-gnu.  Applied to mainline.  This is a
regression from 2.95 that has been present since 3.0.x, but given the
changes in c-decl.c post-3.4 I don't propose preparing a patch for 3.4
branch.

-- 
Joseph S. Myers               http://www.srcf.ucam.org/~jsm28/gcc/
    jsm@polyomino.org.uk (personal mail)
    jsm28@gcc.gnu.org (Bugzilla assignments and CCs)

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.

testsuite:
2004-07-31  Joseph S. Myers  <jsm@polyomino.org.uk>

	* gcc.dg/redecl-2.c: New test.

diff -rupN GCC.orig/gcc/c-decl.c GCC/gcc/c-decl.c
--- GCC.orig/gcc/c-decl.c	2004-07-29 16:50:34.000000000 +0000
+++ GCC/gcc/c-decl.c	2004-07-30 21:03:14.000000000 +0000
@@ -1325,7 +1325,14 @@ diagnose_mismatched_decls (tree newdecl,
 	{
 	  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,
 	}
       /* 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 -rupN GCC.orig/gcc/testsuite/gcc.dg/redecl-2.c GCC/gcc/testsuite/gcc.dg/redecl-2.c
--- GCC.orig/gcc/testsuite/gcc.dg/redecl-2.c	1970-01-01 00:00:00.000000000 +0000
+++ GCC/gcc/testsuite/gcc.dg/redecl-2.c	2004-07-31 15:23:39.000000000 +0000
@@ -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;
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]