// RUN: %clang_cc1 -fsyntax-only -verify %s typedef double A; template class B { typedef int A; }; template struct X : B { static A a; }; int a0[sizeof(X::a) == sizeof(double) ? 1 : -1]; // PR4365. template class Q; template class R : Q {T current;}; namespace test0 { template class Base { public: void instance_foo(); static void static_foo(); class Inner { public: void instance_foo(); static void static_foo(); }; }; template class Derived1 : Base { public: void test0() { Base::static_foo(); Base::instance_foo(); } void test1() { Base::Inner::static_foo(); Base::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } static void test2() { Base::static_foo(); Base::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } static void test3() { Base::Inner::static_foo(); Base::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } }; template class Derived2 : Base::Inner { public: void test0() { Base::static_foo(); Base::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } void test1() { Base::Inner::static_foo(); Base::Inner::instance_foo(); } static void test2() { Base::static_foo(); Base::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } static void test3() { Base::Inner::static_foo(); Base::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} } }; void test0() { Derived1 d1; d1.test0(); d1.test1(); // expected-note {{in instantiation of member function}} d1.test2(); // expected-note {{in instantiation of member function}} d1.test3(); // expected-note {{in instantiation of member function}} Derived2 d2; d2.test0(); // expected-note {{in instantiation of member function}} d2.test1(); d2.test2(); // expected-note {{in instantiation of member function}} d2.test3(); // expected-note {{in instantiation of member function}} } } namespace test1 { template struct Base { void foo(T); // expected-note {{must qualify identifier to find this declaration in dependent base class}} }; template struct Derived : Base { void doFoo(T v) { foo(v); // expected-error {{use of undeclared identifier}} } }; template struct Derived; // expected-note {{requested here}} } namespace PR8966 { template class MyClassCore { }; template class MyClass : public MyClassCore { public: enum { N }; // static member declaration static const char* array [N]; void f() { MyClass::InBase = 17; } }; // static member definition template const char* MyClass::array [MyClass::N] = { "A", "B", "C" }; }