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
{
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;
}
class Klass
{
- unsigned int local; // { dg-error "non-static" }
+ unsigned int local;
public:
bool dostuff();
};
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;
};
}
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>;
struct D {
- int &m; // { dg-error "invalid use of non-static data member" "" }
+ int &m; // { dg-message "" }
static int &s;
int 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;
struct foo {
static int baist;
- int bait; // { dg-error "non-static data member" }
+ int bait; // { dg-message "" }
void barf ();
static void barf (int);
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);
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);
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);
};
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" }
}
};
// 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 "" }
};
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" } .*
}
};
};
// { 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 "" } .*
// 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 ();
};
// { 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" }
}
// 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);
};
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; }