re PR c/17881 (Incomplete type warning is issued even for prototypes)
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: * parm-incomplete-1.c: New test. From-SVN: r88850
This commit is contained in:
parent
a780ad2f43
commit
bba5733fee
4 changed files with 51 additions and 7 deletions
|
@ -1,3 +1,10 @@
|
|||
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.
|
||||
|
|
18
gcc/c-decl.c
18
gcc/c-decl.c
|
@ -4648,10 +4648,14 @@ grokparms (struct c_arg_info *arg_info, bool funcdef_flag)
|
|||
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, bool funcdef_flag)
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2004-10-10 Joseph S. Myers <jsm@polyomino.org.uk>
|
||||
|
||||
PR c/17881
|
||||
* parm-incomplete-1.c: New test.
|
||||
|
||||
2004-10-09 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/17867
|
||||
|
|
28
gcc/testsuite/gcc.dg/parm-incomplete-1.c
Normal file
28
gcc/testsuite/gcc.dg/parm-incomplete-1.c
Normal file
|
@ -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" } */
|
Loading…
Add table
Reference in a new issue