c-decl.c (diagnose_mismatched_decls): Give error for external redeclaration of identifier declared with no linkage...

* c-decl.c (diagnose_mismatched_decls): Give error for external
	redeclaration of identifier declared with no linkage, not just
	warning with -Wtraditional.  Do not check DECL_CONTEXT to give
	error for redeclaration with no linkage.

testsuite:
	* gcc.dg/redecl-2.c: New test.

From-SVN: r85386
This commit is contained in:
Joseph Myers 2004-07-31 18:21:27 +01:00 committed by Joseph Myers
parent 2347da644d
commit 558d1f815d
4 changed files with 89 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2004-07-31 Joseph S. Myers <jsm@polyomino.org.uk>
* c-decl.c (diagnose_mismatched_decls): Give error for external
redeclaration of identifier declared with no linkage, not just
warning with -Wtraditional. Do not check DECL_CONTEXT to give
error for redeclaration with no linkage.
2004-07-30 Geoffrey Keating <geoffk@apple.com>
Fariborz Jahanian <fjahanian@apple.com>

View File

@ -1325,7 +1325,14 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
{
if (DECL_EXTERNAL (newdecl))
{
if (warn_traditional)
if (!DECL_FILE_SCOPE_P (olddecl))
{
error ("%Jextern declaration of %qD follows "
"declaration with no linkage", newdecl, newdecl);
locate_old_decl (olddecl, error);
return false;
}
else if (warn_traditional)
{
warning ("%Jnon-static declaration of '%D' follows "
"static declaration", newdecl, newdecl);
@ -1347,13 +1354,10 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
}
/* Two objects with the same name declared at the same block
scope must both be external references (6.7p3). */
else if (!DECL_FILE_SCOPE_P (newdecl)
&& DECL_CONTEXT (newdecl) == DECL_CONTEXT (olddecl)
&& (!DECL_EXTERNAL (newdecl) || !DECL_EXTERNAL (olddecl)))
else if (!DECL_FILE_SCOPE_P (newdecl))
{
if (DECL_EXTERNAL (newdecl))
error ("%Jextern declaration of '%D' follows "
"declaration with no linkage", newdecl, newdecl);
abort ();
else if (DECL_EXTERNAL (olddecl))
error ("%Jdeclaration of '%D' with no linkage follows "
"extern declaration", newdecl, newdecl);

View File

@ -1,3 +1,7 @@
2004-07-31 Joseph S. Myers <jsm@polyomino.org.uk>
* gcc.dg/redecl-2.c: New test.
2004-07-30 Geoffrey Keating <geoffk@apple.com>
* gcc.dg/darwin-longdouble.c: New file.

View File

@ -0,0 +1,68 @@
/* Test for multiple declarations of an identifier at same block
scope: only valid case is all extern. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* { dg-do compile } */
/* { dg-options "" } */
void
fa0 (void)
{
int a0; /* { dg-error "previous declaration" } */
int a0; /* { dg-error "redeclaration" } */
}
void
fa1 (void)
{
int a1; /* { dg-error "previous declaration" } */
static int a1; /* { dg-error "redeclaration" } */
}
void
fa2 (void)
{
int a2; /* { dg-error "previous declaration" } */
extern int a2; /* { dg-error "follows declaration with no linkage" } */
}
void
fa3 (void)
{
static int a3; /* { dg-error "previous declaration" } */
int a3; /* { dg-error "redeclaration" } */
}
void
fa4 (void)
{
static int a4; /* { dg-error "previous declaration" } */
static int a4; /* { dg-error "redeclaration" } */
}
void
fa5 (void)
{
static int a5; /* { dg-error "previous declaration" } */
extern int a5; /* { dg-error "follows declaration with no linkage" } */
}
void
fa6 (void)
{
extern int a6; /* { dg-error "previous declaration" } */
int a6; /* { dg-error "follows extern declaration" } */
}
void
fa7 (void)
{
extern int a7; /* { dg-error "previous declaration" } */
static int a7; /* { dg-error "follows extern declaration" } */
}
void
fa8 (void)
{
extern int a8;
extern int a8;
}