+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.
+
2004-10-10 Kazu Hirata <kazu@cs.umass.edu>
* tree-cfg.c: Fix comment typos.
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;
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);
}
}
--- /dev/null
+/* 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" } */