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
This commit is contained in:
parent
ff8e215992
commit
8bf872f9e8
@ -1,3 +1,8 @@
|
||||
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
|
||||
|
18
gcc/c-decl.c
18
gcc/c-decl.c
@ -1813,22 +1813,18 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
|
||||
|| TREE_NO_WARNING (olddecl))
|
||||
return true; /* Allow OLDDECL to continue in use. */
|
||||
|
||||
if (pedantic && !flag_isoc1x)
|
||||
if (variably_modified_type_p (newtype, NULL))
|
||||
{
|
||||
error ("redefinition of typedef %q+D with variably modified type",
|
||||
newdecl);
|
||||
locate_old_decl (olddecl);
|
||||
}
|
||||
else if (pedantic && !flag_isoc1x)
|
||||
{
|
||||
pedwarn (input_location, OPT_pedantic,
|
||||
"redefinition of typedef %q+D", newdecl);
|
||||
locate_old_decl (olddecl);
|
||||
}
|
||||
else if (variably_modified_type_p (newtype, NULL))
|
||||
{
|
||||
/* Whether there is a constraint violation for the types not
|
||||
being the same cannot be determined at compile time; a
|
||||
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);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1,3 +1,9 @@
|
||||
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.
|
||||
|
@ -3,7 +3,8 @@
|
||||
/* { dg-options "-std=c1x -pedantic-errors" } */
|
||||
|
||||
/* 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>
|
||||
|
||||
@ -60,9 +61,10 @@ f (void)
|
||||
typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */
|
||||
typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */
|
||||
typedef int AV[a]; /* { dg-message "previous declaration" } */
|
||||
typedef int AV[b-1]; /* { dg-warning "may be a constraint violation at runtime" } */
|
||||
typedef int AAa[a];
|
||||
typedef int AV[b-1]; /* { dg-error "redefinition" } */
|
||||
typedef int AAa[a]; /* { dg-message "previous declaration" } */
|
||||
typedef int AAb[b-1];
|
||||
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" } */
|
||||
}
|
||||
|
@ -1,18 +0,0 @@
|
||||
/* 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user