mirror of git://gcc.gnu.org/git/gcc.git
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>
|
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
|
||||||
|
|
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))
|
|| 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))
|
||||||
|
{
|
||||||
|
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,
|
pedwarn (input_location, OPT_pedantic,
|
||||||
"redefinition of typedef %q+D", newdecl);
|
"redefinition of typedef %q+D", newdecl);
|
||||||
locate_old_decl (olddecl);
|
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;
|
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>
|
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.
|
||||||
|
|
|
@ -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)
|
||||||
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" } */
|
||||||
}
|
}
|
||||||
|
|
|
@ -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