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
This commit is contained in:
Jason Merrill 2014-09-22 15:22:37 -04:00 committed by Jason Merrill
parent a546927c6a
commit 6863c41a15
14 changed files with 32 additions and 35 deletions

View File

@ -1,5 +1,8 @@
2014-09-22 Jason Merrill <jason@redhat.com>
* 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

View File

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

View File

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

View File

@ -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>;

View File

@ -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;

View File

@ -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);

View File

@ -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);
};

View File

@ -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" }
}
};

View File

@ -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 "" }
};

View File

@ -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" } .*
}
};
};

View File

@ -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 "" } .*

View File

@ -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 ();
};

View File

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

View File

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