mirror of git://gcc.gnu.org/git/gcc.git
re PR c/79983 (Improve enum and struct redefinition diagnostic)
PR c/79983 * c-decl.c (start_struct): Use the location of TYPE_STUB_DECL of ref. (start_enum): Use the location of TYPE_STUB_DECL of enumtype. * gcc.dg/pr79983.c: New test. From-SVN: r248927
This commit is contained in:
parent
100d0700a8
commit
dc94972832
|
|
@ -1,3 +1,10 @@
|
|||
2017-06-06 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c/79983
|
||||
* c-decl.c (start_struct): Use the location of TYPE_STUB_DECL of
|
||||
ref.
|
||||
(start_enum): Use the location of TYPE_STUB_DECL of enumtype.
|
||||
|
||||
2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||
|
||||
* c-parser.c (c_parser_binary_expression): Implement the
|
||||
|
|
|
|||
|
|
@ -7453,6 +7453,9 @@ start_struct (location_t loc, enum tree_code code, tree name,
|
|||
ref = lookup_tag (code, name, true, &refloc);
|
||||
if (ref && TREE_CODE (ref) == code)
|
||||
{
|
||||
if (TYPE_STUB_DECL (ref))
|
||||
refloc = DECL_SOURCE_LOCATION (TYPE_STUB_DECL (ref));
|
||||
|
||||
if (TYPE_SIZE (ref))
|
||||
{
|
||||
if (code == UNION_TYPE)
|
||||
|
|
@ -8185,7 +8188,10 @@ start_enum (location_t loc, struct c_enum_contents *the_enum, tree name)
|
|||
/* Update type location to the one of the definition, instead of e.g.
|
||||
a forward declaration. */
|
||||
else if (TYPE_STUB_DECL (enumtype))
|
||||
DECL_SOURCE_LOCATION (TYPE_STUB_DECL (enumtype)) = loc;
|
||||
{
|
||||
enumloc = DECL_SOURCE_LOCATION (TYPE_STUB_DECL (enumtype));
|
||||
DECL_SOURCE_LOCATION (TYPE_STUB_DECL (enumtype)) = loc;
|
||||
}
|
||||
|
||||
if (C_TYPE_BEING_DEFINED (enumtype))
|
||||
error_at (loc, "nested redefinition of %<enum %E%>", name);
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
2017-06-06 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c/79983
|
||||
* gcc.dg/pr79983.c: New test.
|
||||
|
||||
2017-06-06 David S. Miller <davem@davemloft.net>
|
||||
|
||||
* gcc.target/sparc/sparc-ret-3.c: New test.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
/* PR c/79983 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
struct S;
|
||||
struct S { int i; }; /* { dg-message "originally defined here" } */
|
||||
struct S { int i, j; }; /* { dg-error "redefinition of 'struct S'" } */
|
||||
|
||||
enum E;
|
||||
enum E { A, B, C }; /* { dg-message "originally defined here" } */
|
||||
enum E { D, F }; /* { dg-error "nested redefinition of 'enum E'|redeclaration of 'enum E'" } */
|
||||
|
||||
union U;
|
||||
union U { int i; }; /* { dg-message "originally defined here" } */
|
||||
union U { int i; double d; }; /* { dg-error "redefinition of 'union U'" } */
|
||||
Loading…
Reference in New Issue