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 bug 17881


This patch fixes bug 17881 by disabling a warning for incomplete
parameter types in function declarations that are not definitions,
except for the case of void types (where the function can't be defined
or called and it is far from clear which cases implementations are
required to accept).

Bootstrapped with no regressions on i686-pc-linux-gnu.  Applied to
mainline.

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

2004-10-10  Joseph S. Myers  <jsm@polyomino.org.uk>

	PR c/17881
	* c-decl.c (grokparms): Don't warn for parameters of incomplete
	type in declarations that are not definitions except for the case
	of parameters of void type.

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

	PR c/17881
	* parm-incomplete-1.c: New test.

diff -rupN GCC.orig/gcc/c-decl.c GCC/gcc/c-decl.c
--- GCC.orig/gcc/c-decl.c	2004-10-10 00:44:10.000000000 +0000
+++ GCC/gcc/c-decl.c	2004-10-10 14:25:12.000000000 +0000
@@ -4648,10 +4648,14 @@ grokparms (struct c_arg_info *arg_info, 
       tree parm, type, typelt;
       unsigned int parmno;
 
-      /* If the arg types are incomplete in a declaration, they must
-	 include undefined tags.  These tags can never be defined in
-	 the scope of the declaration, so the types can never be
-	 completed, and no call can be compiled successfully.  */
+      /* If there is a parameter of incomplete type in a definition,
+	 this is an error.  In a declaration this is valid, and a
+	 struct or union type may be completed later, before any calls
+	 or definition of the function.  In the case where the tag was
+	 first declared within the parameter list, a warning has
+	 already been given.  If a parameter has void type, then
+	 however the function cannot be defined or called, so
+	 warn.  */
 
       for (parm = arg_info->parms, typelt = arg_types, parmno = 1;
 	   parm;
@@ -4675,13 +4679,13 @@ grokparms (struct c_arg_info *arg_info, 
 		  TREE_VALUE (typelt) = error_mark_node;
 		  TREE_TYPE (parm) = error_mark_node;
 		}
-	      else
+	      else if (VOID_TYPE_P (type))
 		{
 		  if (DECL_NAME (parm))
-		    warning ("%Jparameter %u (%qD) has incomplete type",
+		    warning ("%Jparameter %u (%qD) has void type",
 			     parm, parmno, parm);
 		  else
-		    warning ("%Jparameter %u has incomplete type",
+		    warning ("%Jparameter %u has void type",
 			     parm, parmno);
 		}
 	    }
diff -rupN GCC.orig/gcc/testsuite/gcc.dg/parm-incomplete-1.c GCC/gcc/testsuite/gcc.dg/parm-incomplete-1.c
--- GCC.orig/gcc/testsuite/gcc.dg/parm-incomplete-1.c	1970-01-01 00:00:00.000000000 +0000
+++ GCC/gcc/testsuite/gcc.dg/parm-incomplete-1.c	2004-10-10 14:29:02.000000000 +0000
@@ -0,0 +1,28 @@
+/* Test warnings and errors for incomplete parameter types.  Should
+   not be warned for in declarations that are not definitions: bug
+   17881.  Void types may be a special case, especially for unnamed
+   parameters and when qualified or with a storage class specifier;
+   see C90 6.5.4.3, DR#017 Q14, C90 TC1, DR#157, C99 J.2 (referencing
+   C99 6.7.5.3); the precise rules are unclear.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s;
+void f (struct s);
+void (*g)(struct s);
+struct t { void (*p)(struct s); };
+
+struct s { int b; };
+void h (struct s x) { }
+
+void j(struct t2); /* { dg-warning "warning: 'struct t2' declared inside parameter list" } */
+/* { dg-warning "its scope is only" "explanation" { target *-*-* } 19 } */
+
+union u;
+
+void v(union u x) { } /* { dg-error "error: parameter 1 \\('x'\\) has incomplete type" } */
+
+void p(void x); /* { dg-warning "warning: parameter 1 \\('x'\\) has void type" } */
+
+void q(const void x); /* { dg-warning "warning: parameter 1 \\('x'\\) has void type" } */


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