summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2017-06-06 17:40:34 +0000
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2017-06-06 17:40:34 +0000
commit1d1d0f3759a9786f63e5e36e8a4733ff9ac10e77 (patch)
tree411298b442a48b3524633e5f64427bfa4c5ed550
parent94165f282d937d77793448842b224a2c63653798 (diff)
downloadgcc-1d1d0f3759a9786f63e5e36e8a4733ff9ac10e77.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@248927 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-decl.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr79983.c15
4 files changed, 34 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index d849b014fec..63cd3d4ab79 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index f2b8096d84a..3a0a4f51737 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8b456276571..bdd579ad67b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/pr79983.c b/gcc/testsuite/gcc.dg/pr79983.c
new file mode 100644
index 00000000000..84aae691318
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr79983.c
@@ -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'" } */