Commit 91d975b8 by Joseph Myers Committed by Joseph Myers

re PR c/23143 (parameter forward declarations broken)

	PR c/23143
	* c-parser.c (c_parser_parms_list_declarator): Call
	mark_forward_parm_decls.
	* c-decl.c (merge_decls): Only check DECL_IN_SYSTEM_HEADER for
	decls with visibility structure.

testsuite:
	* gcc.dg/parm-forwdecl-1.c, gcc.dg/parm-forwdecl-2.c,
	gcc.dg/parm-forwdecl-3.c, gcc.dg/parm-forwdecl-4.c: New tests.

From-SVN: r102581
parent 94ad79ea
2005-07-30 Joseph S. Myers <joseph@codesourcery.com>
PR c/23143
* c-parser.c (c_parser_parms_list_declarator): Call
mark_forward_parm_decls.
* c-decl.c (merge_decls): Only check DECL_IN_SYSTEM_HEADER for
decls with visibility structure.
2005-07-30 Paul Brook <paul@codesourcery.com> 2005-07-30 Paul Brook <paul@codesourcery.com>
* config/arm/arm.c (arm_coproc_mem_operand): Fix inaccurate comment. * config/arm/arm.c (arm_coproc_mem_operand): Fix inaccurate comment.
......
...@@ -1664,18 +1664,18 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) ...@@ -1664,18 +1664,18 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
&& !C_DECL_BUILTIN_PROTOTYPE (olddecl))) && !C_DECL_BUILTIN_PROTOTYPE (olddecl)))
DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl); DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl);
/* Merge the unused-warning information. */
if (DECL_IN_SYSTEM_HEADER (olddecl))
DECL_IN_SYSTEM_HEADER (newdecl) = 1;
else if (DECL_IN_SYSTEM_HEADER (newdecl))
DECL_IN_SYSTEM_HEADER (olddecl) = 1;
/* Merge the initialization information. */ /* Merge the initialization information. */
if (DECL_INITIAL (newdecl) == 0) if (DECL_INITIAL (newdecl) == 0)
DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
if (CODE_CONTAINS_STRUCT (TREE_CODE (olddecl), TS_DECL_WITH_VIS)) if (CODE_CONTAINS_STRUCT (TREE_CODE (olddecl), TS_DECL_WITH_VIS))
{ {
/* Merge the unused-warning information. */
if (DECL_IN_SYSTEM_HEADER (olddecl))
DECL_IN_SYSTEM_HEADER (newdecl) = 1;
else if (DECL_IN_SYSTEM_HEADER (newdecl))
DECL_IN_SYSTEM_HEADER (olddecl) = 1;
/* Merge the section attribute. /* Merge the section attribute.
We want to issue an error if the sections conflict but that must be We want to issue an error if the sections conflict but that must be
done later in decl_attributes since we are called before attributes done later in decl_attributes since we are called before attributes
......
...@@ -2463,6 +2463,7 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs) ...@@ -2463,6 +2463,7 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs)
{ {
tree new_attrs; tree new_attrs;
c_parser_consume_token (parser); c_parser_consume_token (parser);
mark_forward_parm_decls ();
new_attrs = c_parser_attributes (parser); new_attrs = c_parser_attributes (parser);
return c_parser_parms_list_declarator (parser, new_attrs); return c_parser_parms_list_declarator (parser, new_attrs);
} }
......
2005-07-30 Joseph S. Myers <joseph@codesourcery.com>
PR c/23143
* gcc.dg/parm-forwdecl-1.c, gcc.dg/parm-forwdecl-2.c,
gcc.dg/parm-forwdecl-3.c, gcc.dg/parm-forwdecl-4.c: New tests.
2005-07-29 Joseph S. Myers <joseph@codesourcery.com> 2005-07-29 Joseph S. Myers <joseph@codesourcery.com>
PR c/529 PR c/529
......
/* Test GNU parameter forward declarations. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
/* { dg-do compile } */
/* { dg-options "" } */
/* Valid uses. */
int f1(int a; int a);
int f2(int a; int a) { return 0; }
int f3(int a; int a; int a);
int f4(int a; int a; int a) { return 0; }
int f5(int a; int (*x)[a], int a);
int f6(int a; int (*x)[a], int a) { return 0; }
int f7(int a; int (*x)[a]; int (*y)[x[1][2]], int (*x)[a], int a);
int f8(int a; int (*x)[a]; int (*y)[x[1][2]], int (*x)[a], int a) { return 0; }
/* Strange uses accepted by GCC 4.0 but not by 3.4 and probably not
desirable to accept. */
int g1(int a;); /* { dg-error "just a forward declaration" "no parms" { xfail *-*-* } } */
int g2(int a; __attribute__((unused))); /* { dg-error "just a forward declaration" "no parms" { xfail *-*-* } } */
int g3(int;); /* { dg-error "just a forward declaration" "no parms" { xfail *-*-* } } */
int g4(int, long;); /* { dg-error "just a forward declaration" "no parms" { xfail *-*-* } } */
/* Invalid uses. */
int h1(int a; int b); /* { dg-error "just a forward declaration" } */
int h2(int; int b); /* { dg-error "just a forward declaration" } */
int h3(int a; long a); /* { dg-error "conflicting types|previous definition|just a forward declaration" } */
/* Test GNU parameter forward declarations. Warning with
-pedantic. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
/* { dg-do compile } */
/* { dg-options "-pedantic" } */
int f1(int a; int a); /* { dg-warning "warning: ISO C forbids forward parameter declarations" } */
int f2(int a; int a) { return 0; } /* { dg-warning "warning: ISO C forbids forward parameter declarations" } */
/* Test GNU parameter forward declarations. Error with
-pedantic-errors. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
/* { dg-do compile } */
/* { dg-options "-pedantic-errors" } */
int f1(int a; int a); /* { dg-error "error: ISO C forbids forward parameter declarations" } */
int f2(int a; int a) { return 0; } /* { dg-error "error: ISO C forbids forward parameter declarations" } */
/* Test GNU parameter forward declarations. OK with
-Wredundant-decls. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
/* { dg-do compile } */
/* { dg-options "-Wredundant-decls" } */
int f1(int a; int a);
int f2(int a; int a) { return 0; }
int f3(int a; int a; int a);
int f4(int a; int a; int a) { return 0; }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment