commit 99ef5c20fe8566fbfbe14e085f765d2c3f05b252
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Sep 22 13:43:18 2014 -0400

    	* semantics.c (finish_non_static_data_member): In diagnostic, give
    	error at point of use and note at point of declaration.

diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 1d81028..6e04e5e 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 9c76d34..fa8a6e6 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 2764f75..c5645ee 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 <int> 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 d267df1..335f492 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 ecb7a67..8d14553 100644
--- a/gcc/testsuite/g++.dg/template/dependent-expr5.C
+++ b/gcc/testsuite/g++.dg/template/dependent-expr5.C
@@ -18,7 +18,7 @@ template<class F, class T> 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 b7c7bc8..8693658 100644
--- a/gcc/testsuite/g++.dg/template/error15.C
+++ b/gcc/testsuite/g++.dg/template/error15.C
@@ -9,9 +9,9 @@ template <class T>
 class B {
 protected:
     
-  A<T> a; // { dg-error "" }
+  A<T> a; // { dg-message "" }
     
-  void f(const A<T> * a1 = &a); // { dg-error "this location" }
+  void f(const A<T> * 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 0d651e3..3c66ed0 100644
--- a/gcc/testsuite/g++.dg/template/error42.C
+++ b/gcc/testsuite/g++.dg/template/error42.C
@@ -3,18 +3,18 @@
 
 template <int> 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 3119f02..aa605ef 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<T>;
-    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 842b2f6..07ba778 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 cb83923..cba5551 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 e7feb94..9a16a74 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 cbcc4fd..658cbe1 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 53dd1e9..383cded 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 <stdio.h>
 
 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; }
