From: jsm28 Date: Sun, 10 Oct 2004 19:20:35 +0000 (+0000) Subject: PR c/17881 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=a207ca5e3585840c64774150e19c319b59954d14 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88850 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba5c10c7641..32049a0ae99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-10-10 Joseph S. Myers + + 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 * tree-cfg.c: Fix comment typos. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index f2f9a27d7c3..4d6d24bcb74 100644 --- a/gcc/c-decl.c +++ b/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); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a264cc0f424..28a26b2eb76 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-10-10 Joseph S. Myers + + PR c/17881 + * parm-incomplete-1.c: New test. + 2004-10-09 Mark Mitchell PR c++/17867 diff --git a/gcc/testsuite/gcc.dg/parm-incomplete-1.c b/gcc/testsuite/gcc.dg/parm-incomplete-1.c new file mode 100644 index 00000000000..3ec713ed612 --- /dev/null +++ b/gcc/testsuite/gcc.dg/parm-incomplete-1.c @@ -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 */ +/* { 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" } */