From 6863c41a15ac58554cd413c1dcde9f43d9dba4c0 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 22 Sep 2014 15:22:37 -0400 Subject: [PATCH] semantics.c (finish_non_static_data_member): In diagnostic, give error at point of use and note at point of declaration. * semantics.c (finish_non_static_data_member): In diagnostic, give error at point of use and note at point of declaration. From-SVN: r215479 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/semantics.c | 6 +++--- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C | 4 ++-- gcc/testsuite/g++.dg/lookup/scoped8.C | 4 ++-- gcc/testsuite/g++.dg/other/ptrmem2.C | 4 ++-- gcc/testsuite/g++.dg/template/dependent-expr5.C | 6 +++--- gcc/testsuite/g++.dg/template/error15.C | 4 ++-- gcc/testsuite/g++.dg/template/error42.C | 8 ++++---- gcc/testsuite/g++.old-deja/g++.brendan/crash18.C | 4 ++-- gcc/testsuite/g++.old-deja/g++.brendan/nest1.C | 4 ++-- gcc/testsuite/g++.old-deja/g++.brendan/static1.C | 2 +- gcc/testsuite/g++.old-deja/g++.bugs/900213_01.C | 2 +- gcc/testsuite/g++.old-deja/g++.gb/scope06.C | 6 ++---- gcc/testsuite/g++.old-deja/g++.law/cvt11.C | 10 +++------- 14 files changed, 32 insertions(+), 35 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f209e15794e..d6db39f9367 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-09-22 Jason Merrill + * semantics.c (finish_non_static_data_member): In diagnostic, give + error at point of use and note at point of declaration. + PR c++/63320 PR c++/60463 PR c++/60755 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 1d81028dc21..6e04e5efd16 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1692,10 +1692,10 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) { if (current_function_decl && DECL_STATIC_FUNCTION_P (current_function_decl)) - error ("invalid use of member %q+D in static member function", decl); + error ("invalid use of member %qD in static member function", decl); else - error ("invalid use of non-static data member %q+D", decl); - error ("from this location"); + error ("invalid use of non-static data member %qD", decl); + inform (DECL_SOURCE_LOCATION (decl), "declared here"); return error_mark_node; } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C index 9c76d34496d..fa8a6e63a93 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C @@ -3,7 +3,7 @@ class Klass { - unsigned int local; // { dg-error "non-static" } + unsigned int local; public: bool dostuff(); }; @@ -11,7 +11,7 @@ public: bool Klass::dostuff() { auto f = []() -> bool { - if (local & 1) { return true; } // { dg-error "not captured|this location" } + if (local & 1) { return true; } // { dg-error "not captured|non-static" } return false; }; } diff --git a/gcc/testsuite/g++.dg/lookup/scoped8.C b/gcc/testsuite/g++.dg/lookup/scoped8.C index 2764f75c135..c5645ee3729 100644 --- a/gcc/testsuite/g++.dg/lookup/scoped8.C +++ b/gcc/testsuite/g++.dg/lookup/scoped8.C @@ -7,12 +7,12 @@ struct A { - int i; // { dg-error "non-static" } + int i; // { dg-message "" } }; template struct B { - int foo() { return A::i; } // { dg-error "this location" } + int foo() { return A::i; } // { dg-error "non-static" } }; template struct B<0>; diff --git a/gcc/testsuite/g++.dg/other/ptrmem2.C b/gcc/testsuite/g++.dg/other/ptrmem2.C index d267df15be1..335f492c58d 100644 --- a/gcc/testsuite/g++.dg/other/ptrmem2.C +++ b/gcc/testsuite/g++.dg/other/ptrmem2.C @@ -8,7 +8,7 @@ struct D { - int &m; // { dg-error "invalid use of non-static data member" "" } + int &m; // { dg-message "" } static int &s; int Foo (); @@ -29,7 +29,7 @@ int D::Foo () int Foo () { f1( &D::m); // { dg-error "cannot create pointer to ref" "" } - f1( &(D::m)); // { dg-error "from this location" "" } + f1( &(D::m)); // { dg-error "non-static" } f2( &D::s); // ok f2( &(D::s)); // ok return 0; diff --git a/gcc/testsuite/g++.dg/template/dependent-expr5.C b/gcc/testsuite/g++.dg/template/dependent-expr5.C index ecb7a67da8e..8d14553352d 100644 --- a/gcc/testsuite/g++.dg/template/dependent-expr5.C +++ b/gcc/testsuite/g++.dg/template/dependent-expr5.C @@ -18,7 +18,7 @@ template void bindb(F (T::*f)(void)) {} // { dg-message "note" struct foo { static int baist; - int bait; // { dg-error "non-static data member" } + int bait; // { dg-message "" } void barf (); static void barf (int); @@ -31,7 +31,7 @@ struct foo { bar() { bind (&baist); bind (&foo::baist); - bind (&bait); // { dg-error "from this location" } + bind (&bait); // { dg-error "non-static data member" } bind (&foo::bait); bind (&baikst); @@ -83,7 +83,7 @@ struct foo { barT() { bind (&baist); bind (&foo::baist); - bind (&bait); // { dg-error "from this location" } + bind (&bait); // { dg-error "non-static data member" } bind (&foo::bait); bind (&baikst); diff --git a/gcc/testsuite/g++.dg/template/error15.C b/gcc/testsuite/g++.dg/template/error15.C index b7c7bc8ca47..86936581cfd 100644 --- a/gcc/testsuite/g++.dg/template/error15.C +++ b/gcc/testsuite/g++.dg/template/error15.C @@ -9,9 +9,9 @@ template class B { protected: - A a; // { dg-error "" } + A a; // { dg-message "" } - void f(const A * a1 = &a); // { dg-error "this location" } + void f(const A * a1 = &a); // { dg-error "non-static" } void g(void); }; diff --git a/gcc/testsuite/g++.dg/template/error42.C b/gcc/testsuite/g++.dg/template/error42.C index 0d651e31620..3c66ed0289d 100644 --- a/gcc/testsuite/g++.dg/template/error42.C +++ b/gcc/testsuite/g++.dg/template/error42.C @@ -3,18 +3,18 @@ template struct A { - int i; // { dg-error "invalid use of non-static data member" } + int i; // { dg-message "" } friend void foo () { - int x[i]; // { dg-error "from this location" } + int x[i]; // { dg-error "non-static data member" } } }; struct B { - int j; // { dg-error "invalid use of non-static data member" } + int j; // { dg-message "" } friend int bar () { - return j; // { dg-error "from this location" } + return j; // { dg-error "non-static data member" } } }; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/crash18.C b/gcc/testsuite/g++.old-deja/g++.brendan/crash18.C index 3119f02ede2..aa605ef71fa 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/crash18.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/crash18.C @@ -8,11 +8,11 @@ public: // Friend functions so that v == x works as does x == v works friend int operator==(void *v, const Pix& x) // { dg-message "previously" } - { return v == index; } // { dg-error "from this location" } + { return v == index; } // { dg-error "non-static" } // ??? should be operator!= friend int operator==(void *v, const Pix& x) // { dg-error "redefinition" } { return v != index; } private: // friend class List; - element *index; // { dg-error "invalid use of non-static data member" } + element *index; // { dg-message "" } }; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/nest1.C b/gcc/testsuite/g++.old-deja/g++.brendan/nest1.C index 842b2f692e6..07ba77884fe 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/nest1.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/nest1.C @@ -3,12 +3,12 @@ int x; class enclose { public: - int x; // { dg-error "non-static" } + int x; // { dg-message "" } class inner { public: void f (int i) { - x = i;// { dg-error "" } .* + x = i;// { dg-error "non-static" } .* } }; }; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/static1.C b/gcc/testsuite/g++.old-deja/g++.brendan/static1.C index cb839237705..cba5551d8f9 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/static1.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/static1.C @@ -1,4 +1,4 @@ // { dg-do assemble } // GROUPS passed static -class A { public: int a; };// { dg-error "" } .* +class A { public: int a; };// { dg-message "" } .* void foo7 () { A::a = 3; }// { dg-error "" } .* diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900213_01.C b/gcc/testsuite/g++.old-deja/g++.bugs/900213_01.C index e7feb947336..9a16a7457b0 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900213_01.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900213_01.C @@ -12,7 +12,7 @@ // keywords: non-static members, member pointers, scope resolution struct struct0 { - int struct0_data_member_0; /* { dg-error "" } gets error from below */ + int struct0_data_member_0; /* { dg-message "" } gets error from below */ int struct0_function_member_0 (); }; diff --git a/gcc/testsuite/g++.old-deja/g++.gb/scope06.C b/gcc/testsuite/g++.old-deja/g++.gb/scope06.C index cbcc4fde125..658cbe113fc 100644 --- a/gcc/testsuite/g++.old-deja/g++.gb/scope06.C +++ b/gcc/testsuite/g++.old-deja/g++.gb/scope06.C @@ -1,16 +1,14 @@ // { dg-do assemble } -// { dg-prune-output "non-static data member initializers" } // GROUPS passed gb scope struct C { struct D { int x; void foo (); }; - const int Ok = 0; // { dg-error "" } initialization forbidden + const int Ok = 0; // { dg-error "" "" { target { ! c++11 } } } initialization forbidden }; void C::D::foo () { - // { dg-prune-output "from this location" } - x = Ok; + x = Ok; // { dg-error "non-static" } } diff --git a/gcc/testsuite/g++.old-deja/g++.law/cvt11.C b/gcc/testsuite/g++.old-deja/g++.law/cvt11.C index 53dd1e9076d..383cded430b 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/cvt11.C +++ b/gcc/testsuite/g++.old-deja/g++.law/cvt11.C @@ -6,15 +6,11 @@ // Message-Id: <9211101908.AA13557@tera.com> // Subject: type cast of qualified const member breaks g++2.3.1 -// Ignore extra errors in C++0x mode. -// { dg-prune-output "non-static data member initializers" } -// { dg-prune-output "from this location" } -// { dg-prune-output "uninitialized" } #include class Thing{ private: int x; - public: const int N = -1; // { dg-error "" } bad initialization +public: const int N = -1; // { dg-error "" "" { target { ! c++11 } } } bad initialization Thing(int y); }; @@ -23,10 +19,10 @@ class Bar{ public: void doit(void); }; void Bar::doit(void) { int i, j; - i = Thing::N; + i = Thing::N; // { dg-error "non-static" } printf("i = %d\n", i); - j = (int)Thing::N; + j = (int)Thing::N; // { dg-error "non-static" } printf("i = %d\n", j); } Thing::Thing(int y) { x = y; } -- 2.30.2