Hi,

another straightforward DECL_SOURCE_LOCATION (TYPE_MAIN_DECL consistent with the one I used in build_anon_union_vars. Tested x86_64-linux.

Thanks, Paolo.

/////////////////////
/cp
2019-10-11  Paolo Carlini  <paolo.carl...@oracle.com>

        * decl.c (check_tag_decl): Use DECL_SOURCE_LOCATION.

/testsuite
2019-10-11  Paolo Carlini  <paolo.carl...@oracle.com>

        * g++.dg/cpp0x/constexpr-union5.C: Test location(s) too.
        * g++.dg/diagnostic/bitfld2.C: Likewise.
        * g++.dg/ext/anon-struct1.C: Likewise.
        * g++.dg/ext/anon-struct6.C: Likewise.
        * g++.dg/ext/flexary19.C: Likewise.
        * g++.dg/ext/flexary9.C: Likewise.
        * g++.dg/template/error17.C: Likewise.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 276845)
+++ cp/decl.c   (working copy)
@@ -4992,7 +4992,8 @@ check_tag_decl (cp_decl_specifier_seq *declspecs,
 
       if (TREE_CODE (declared_type) != UNION_TYPE
          && !in_system_header_at (input_location))
-       pedwarn (input_location, OPT_Wpedantic, "ISO C++ prohibits anonymous 
structs");
+       pedwarn (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (declared_type)),
+                OPT_Wpedantic, "ISO C++ prohibits anonymous structs");
     }
 
   else
Index: testsuite/g++.dg/cpp0x/constexpr-union5.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-union5.C   (revision 276845)
+++ testsuite/g++.dg/cpp0x/constexpr-union5.C   (working copy)
@@ -23,16 +23,16 @@ SA((a.i == 42));
 
 struct B
 {
-  struct {
+  struct {                     // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct" }
     int h;
-    struct {
+    struct {                   // { dg-warning "12:ISO C\\+\\+ prohibits 
anonymous struct" }
       union {
        unsigned char i;
        int j;
       };
       int k;
-    };                         // { dg-warning "anonymous struct" }
-  };                           // { dg-warning "anonymous struct" }
+    };
+  };
   int l;
 
   constexpr B(): h(1), i(2), k(3), l(4) {}
Index: testsuite/g++.dg/diagnostic/bitfld2.C
===================================================================
--- testsuite/g++.dg/diagnostic/bitfld2.C       (revision 276845)
+++ testsuite/g++.dg/diagnostic/bitfld2.C       (working copy)
@@ -6,4 +6,4 @@ template<int> struct A
   struct {} : 2;   // { dg-error "expected ';' after struct" "expected" }
 };
 // { dg-error "ISO C.. forbids declaration" "declaration" { target *-*-* } 6 }
-// { dg-error "ISO C.. prohibits anonymous" "anonymous" { target *-*-* } 6 }
+// { dg-error "10:ISO C.. prohibits anonymous" "anonymous" { target *-*-* } 6 }
Index: testsuite/g++.dg/ext/anon-struct1.C
===================================================================
--- testsuite/g++.dg/ext/anon-struct1.C (revision 276845)
+++ testsuite/g++.dg/ext/anon-struct1.C (working copy)
@@ -19,7 +19,7 @@ char testD[sizeof(C::D) == sizeof(A) ? 1 : -1];
 
 /* GNU extension.  */
 struct E {
-  struct { char z; };          /* { dg-error "prohibits anonymous structs" } */
+  struct { char z; };          /* { dg-error "10:ISO C\\+\\+ prohibits 
anonymous structs" } */
   char e;
 };
 
@@ -45,6 +45,6 @@ char testH[sizeof(H) == 2 * sizeof(A) ? 1 : -1];
 
 /* Make sure __extension__ gets turned back off.  */
 struct I {
-  struct { char z; };          /* { dg-error "prohibits anonymous structs" } */
+  struct { char z; };          /* { dg-error "10:ISO C\\+\\+ prohibits 
anonymous structs" } */
   char i;
 };
Index: testsuite/g++.dg/ext/anon-struct6.C
===================================================================
--- testsuite/g++.dg/ext/anon-struct6.C (revision 276845)
+++ testsuite/g++.dg/ext/anon-struct6.C (working copy)
@@ -3,8 +3,8 @@
 struct A
 {
   struct
-  {
+  { // { dg-error "3:ISO C\\+\\+ prohibits anonymous structs" }
     struct { static int i; }; // { dg-error "prohibits anonymous 
structs|non-static data members|unnamed class" }
     void foo() { i; } // { dg-error "public non-static data" }
-  }; // { dg-error "prohibits anonymous structs" }
+  };
 };
Index: testsuite/g++.dg/ext/flexary19.C
===================================================================
--- testsuite/g++.dg/ext/flexary19.C    (revision 276845)
+++ testsuite/g++.dg/ext/flexary19.C    (working copy)
@@ -146,13 +146,13 @@ struct S16
 {
   int i;
 
-  struct {          // { dg-warning "invalid use" }
+  struct {          // { dg-warning "10:ISO C\\+\\+ prohibits anonymous 
struct|invalid use" }
     // A flexible array as a sole member of an anonymous struct is
     // rejected with an error in C mode but emits just a pedantic
     // warning in C++.  Other than excessive pedantry there is no
     // reason to reject it.
     int a[];
-  };                // { dg-warning "anonymous struct" }
+  };
 };
 
 struct S17
@@ -177,9 +177,9 @@ struct S19
 {
   int i;
 
-  struct {          // { dg-warning "invalid use" }
+  struct {          // { dg-warning "10:ISO C\\+\\+ prohibits anonymous 
struct|invalid use" }
     int j, a[];     // { dg-message "declared here" }
-  };                // { dg-warning "anonymous struct" }
+  };
 };
 
 struct S20
@@ -198,10 +198,10 @@ struct S21
   static int i;
   typedef int A[];
 
-  struct {          // { dg-warning "invalid use" }
+  struct {          // { dg-warning "10:ISO C\\+\\+ prohibits anonymous 
struct|invalid use" }
     int j;
     A a;            // { dg-message "declared here" }
-  };                // { dg-warning "anonymous struct" }
+  };
 };
 
 struct S22
@@ -215,11 +215,11 @@ struct S22
 
 struct S23
 {
-  struct {
+  struct {          // { dg-warning "10:ISO C\\+\\+ prohibits anonymous 
struct" }
     static int i;   // { dg-error "static data member" }
 
     int a[];        // { dg-error "in an otherwise empty" }
-  };                // { dg-warning "anonymous struct" }
+  };
 };
 
 struct S24
@@ -296,11 +296,11 @@ union A
 
 union B
 {
-  struct {
-    struct {        // { dg-warning "invalid use" }
+  struct {          // { dg-warning "10:ISO C\\+\\+ prohibits anonymous 
struct" }
+    struct {        // { dg-warning "12:ISO C\\+\\+ prohibits anonymous 
struct|invalid use" }
       int i, a[];   // { dg-message "declared here" }
-    };              // { dg-warning "anonymous struct" }
-  };                // { dg-warning "anonymous struct" }
+    };
+  };
   int j;
 };
 
Index: testsuite/g++.dg/ext/flexary9.C
===================================================================
--- testsuite/g++.dg/ext/flexary9.C     (revision 276845)
+++ testsuite/g++.dg/ext/flexary9.C     (working copy)
@@ -282,64 +282,64 @@ struct S_S_S_x {
 
 struct Anon1 {
   int n;
-  struct {                  // { dg-warning "invalid use \[^\n\r\]* with a 
zero-size array" }
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct|invalid use \[^\n\r\]* with a zero-size array" }
     int good[0];            // { dg-warning "forbids zero-size array" }
-  };                        // { dg-warning "anonymous struct" }
+  };
 };
 
 ASSERT_AT_END (Anon1, good);
 
 struct Anon2 {
-  struct {                  // { dg-warning "invalid use" }
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct|invalid use" }
     int n;
-    struct {
+    struct {                // { dg-warning "12:ISO C\\+\\+ prohibits 
anonymous struct" }
       int good[0];          // { dg-warning "zero-size array" }
-    };                      // { dg-warning "anonymous struct" }
-  };                        // { dg-warning "anonymous struct" }
+    };
+  };
 };
 
 ASSERT_AT_END (Anon2, good);
 
 struct Anon3 {
-  struct {                  // { dg-warning "invalid use" }
-    struct {
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct|invalid use" }
+    struct {                // { dg-warning "12:ISO C\\+\\+ prohibits 
anonymous struct" }
       int n;
       int good[0];          // { dg-warning "zero-size array" }
-    };                      // { dg-warning "anonymous struct" }
-  };                        // { dg-warning "anonymous struct" }
+    };
+  };
 };
 
 ASSERT_AT_END (Anon3, good);
 
 struct Anon4 {
-  struct {
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct" }
     int in_empty_struct[0]; // { dg-warning "zero-size array|in an otherwise 
empty" }
-  };                        // { dg-warning "anonymous struct" }
+  };
 };
 
 struct Anon5 {
-  struct {
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct" }
     int not_at_end[0];      // { dg-warning "zero-size array|not at end" }
-  };                        // { dg-warning "anonymous struct" }
+  };
   int n;
 };
 
 struct Anon6 {
-  struct {
-    struct {
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct" }
+    struct {                // { dg-warning "12:ISO C\\+\\+ prohibits 
anonymous struct" }
       int not_at_end[0];    // { dg-warning "zero-size array|not at end" }
-    };                      // { dg-warning "anonymous struct" }
+    };
     int n;
-  };                        // { dg-warning "anonymous struct" }
+  };
 };
 
 
 struct Anon7 {
-  struct {
-    struct {
+  struct {                  // { dg-warning "10:ISO C\\+\\+ prohibits 
anonymous struct" }
+    struct {                // { dg-warning "12:ISO C\\+\\+ prohibits 
anonymous struct" }
       int not_at_end[0];    // { dg-warning "zero-size array|not at end" }
-    };                      // { dg-warning "anonymous struct" }
-  };                        // { dg-warning "anonymous struct" }
+    };
+  };
   int n;
 };
 
Index: testsuite/g++.dg/template/error17.C
===================================================================
--- testsuite/g++.dg/template/error17.C (revision 276845)
+++ testsuite/g++.dg/template/error17.C (working copy)
@@ -4,6 +4,6 @@ template <typename T>
 void
 foo()
 {
-  union { struct { }; }; // { dg-error "prohibits anonymous struct" "anon" }
+  union { struct { }; }; // { dg-error "18:ISO C\\+\\+ prohibits anonymous 
struct" }
   // { dg-error "18:anonymous struct not inside" "not inside" { target *-*-* } 
.-1 }
 }

Reply via email to