Commit dc949728 by Marek Polacek Committed by Marek Polacek

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
parent 100d0700
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);
......
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.
......
/* 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'" } */
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