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 }
}