// RUN: clang-cc -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 { void instance_foo(); static void static_foo(); class Inner { void instance_foo(); static void static_foo(); }; }; template class Derived1 : Base { 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 { 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}} } }