| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| typedef double A; |
| template<typename T> class B { |
| typedef int A; |
| }; |
| |
| template<typename T> struct X : B<T> { |
| static A a; |
| }; |
| |
| int a0[sizeof(X<int>::a) == sizeof(double) ? 1 : -1]; |
| |
| // PR4365. |
| template<class T> class Q; |
| template<class T> class R : Q<T> {T current;}; |
| |
| |
| namespace test0 { |
| template <class T> class Base { |
| public: |
| void instance_foo(); |
| static void static_foo(); |
| class Inner { |
| public: |
| void instance_foo(); |
| static void static_foo(); |
| }; |
| }; |
| |
| template <class T> class Derived1 : Base<T> { |
| public: |
| void test0() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); |
| } |
| |
| void test1() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| static void test2() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| static void test3() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| }; |
| |
| template <class T> class Derived2 : Base<T>::Inner { |
| public: |
| void test0() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| void test1() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); |
| } |
| |
| static void test2() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| static void test3() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| }; |
| |
| void test0() { |
| Derived1<int> 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<int> 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 <class T> struct Base { |
| void foo(T); // expected-note {{must qualify identifier to find this declaration in dependent base class}} |
| }; |
| |
| template <class T> struct Derived : Base<T> { |
| void doFoo(T v) { |
| foo(v); // expected-error {{use of undeclared identifier}} |
| } |
| }; |
| |
| template struct Derived<int>; // expected-note {{requested here}} |
| } |