Commit 8bf872f9 by Joseph Myers Committed by Joseph Myers

c-decl.c (diagnose_mismatched_decls): Give an error for redefining a typedef…

c-decl.c (diagnose_mismatched_decls): Give an error for redefining a typedef with variably modified type.

	* c-decl.c (diagnose_mismatched_decls): Give an error for
	redefining a typedef with variably modified type.

testsuite:
	* gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
	variably modified typedefs.
	* gcc.dg/c1x-typedef-2.c: Remove.

From-SVN: r171172
parent ff8e2159
2011-03-18 Joseph Myers <joseph@codesourcery.com> 2011-03-18 Joseph Myers <joseph@codesourcery.com>
* c-decl.c (diagnose_mismatched_decls): Give an error for
redefining a typedef with variably modified type.
2011-03-18 Joseph Myers <joseph@codesourcery.com>
* c-decl.c (grokfield): Don't allow typedefs for structures or * c-decl.c (grokfield): Don't allow typedefs for structures or
unions with no tag by default. unions with no tag by default.
* doc/extend.texi (Unnamed Fields): Update. * doc/extend.texi (Unnamed Fields): Update.
......
...@@ -1813,20 +1813,16 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, ...@@ -1813,20 +1813,16 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
|| TREE_NO_WARNING (olddecl)) || TREE_NO_WARNING (olddecl))
return true; /* Allow OLDDECL to continue in use. */ return true; /* Allow OLDDECL to continue in use. */
if (pedantic && !flag_isoc1x) if (variably_modified_type_p (newtype, NULL))
{ {
pedwarn (input_location, OPT_pedantic, error ("redefinition of typedef %q+D with variably modified type",
"redefinition of typedef %q+D", newdecl); newdecl);
locate_old_decl (olddecl); locate_old_decl (olddecl);
} }
else if (variably_modified_type_p (newtype, NULL)) else if (pedantic && !flag_isoc1x)
{ {
/* Whether there is a constraint violation for the types not pedwarn (input_location, OPT_pedantic,
being the same cannot be determined at compile time; a "redefinition of typedef %q+D", newdecl);
warning that there may be one at runtime is considered
appropriate (WG14 reflector message 11743, 8 May 2009). */
warning (0, "redefinition of typedef %q+D may be a constraint "
"violation at runtime", newdecl);
locate_old_decl (olddecl); locate_old_decl (olddecl);
} }
......
2011-03-18 Joseph Myers <joseph@codesourcery.com> 2011-03-18 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
variably modified typedefs.
* gcc.dg/c1x-typedef-2.c: Remove.
2011-03-18 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/c1x-anon-struct-1.c: Don't test use of typedefs. * gcc.dg/c1x-anon-struct-1.c: Don't test use of typedefs.
* gcc.dg/c1x-anon-struct-3.c: New test. * gcc.dg/c1x-anon-struct-3.c: New test.
* gcc.dg/anon-struct-11.c: Update. * gcc.dg/anon-struct-11.c: Update.
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
/* { dg-options "-std=c1x -pedantic-errors" } */ /* { dg-options "-std=c1x -pedantic-errors" } */
/* C1X permits typedefs to be redeclared to the same type, but not to /* C1X permits typedefs to be redeclared to the same type, but not to
different-but-compatible types. */ different-but-compatible types, and not when the type is variably
modified. */
#include <limits.h> #include <limits.h>
...@@ -60,9 +61,10 @@ f (void) ...@@ -60,9 +61,10 @@ f (void)
typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */ typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */
typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */ typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */
typedef int AV[a]; /* { dg-message "previous declaration" } */ typedef int AV[a]; /* { dg-message "previous declaration" } */
typedef int AV[b-1]; /* { dg-warning "may be a constraint violation at runtime" } */ typedef int AV[b-1]; /* { dg-error "redefinition" } */
typedef int AAa[a]; typedef int AAa[a]; /* { dg-message "previous declaration" } */
typedef int AAb[b-1]; typedef int AAb[b-1];
typedef AAa *VF(void); /* { dg-message "previous declaration" } */ typedef AAa *VF(void); /* { dg-message "previous declaration" } */
typedef AAb *VF(void); /* { dg-warning "may be a constraint violation at runtime" } */ typedef AAb *VF(void); /* { dg-error "redefinition" } */
typedef AAa AAa; /* { dg-error "redefinition" } */
} }
/* Test typedef redeclaration in C1X. Side effects from duplicate
declarations still apply. */
/* { dg-do run } */
/* { dg-options "-std=c1x -pedantic-errors" } */
extern void exit (int);
extern void abort (void);
int
main (void)
{
int a = 1, b = 1;
typedef int T[++a]; /* { dg-message "previous declaration" } */
typedef int T[++b]; /* { dg-warning "may be a constraint violation at runtime" } */
if (a != 2 || b != 2)
abort ();
exit (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