| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %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}} | 
 | } | 
 |  | 
 | namespace PR8966 { | 
 |   template <class T> | 
 |   class MyClassCore | 
 |   { | 
 |   }; | 
 |  | 
 |   template <class T> | 
 |   class MyClass : public MyClassCore<T> | 
 |   { | 
 |   public: | 
 |     enum  { | 
 |       N | 
 |     }; | 
 |  | 
 |     // static member declaration | 
 |     static const char* array [N]; | 
 |  | 
 |     void f() { | 
 |       MyClass<T>::InBase = 17; | 
 |     } | 
 |   }; | 
 |  | 
 |   // static member definition | 
 |   template <class T> | 
 |   const char* MyClass<T>::array [MyClass<T>::N] = { "A", "B", "C" }; | 
 | } | 
 |  | 
 | namespace std { | 
 |   inline namespace v1 { | 
 |     template<typename T> struct basic_ostream; | 
 |   } | 
 |   namespace inner { | 
 |     template<typename T> struct vector {}; | 
 |   } | 
 |   using inner::vector; | 
 |   template<typename T, typename U> struct pair {}; | 
 |   typedef basic_ostream<char> ostream; | 
 |   extern ostream cout; | 
 |   std::ostream &operator<<(std::ostream &out, const char *); | 
 | } | 
 |  | 
 | namespace PR10053 { | 
 |   template<typename T> struct A { | 
 |     T t; | 
 |     A() { | 
 |       f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}} | 
 |     } | 
 |   }; | 
 |  | 
 |   void f(int&); // expected-note {{'f' should be declared prior to the call site}} | 
 |  | 
 |   A<int> a; // expected-note {{in instantiation of member function}} | 
 |  | 
 |  | 
 |   namespace N { | 
 |     namespace M { | 
 |       template<typename T> int g(T t) { | 
 |         f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}} | 
 |       }; | 
 |     } | 
 |  | 
 |     void f(char&); // expected-note {{'f' should be declared prior to the call site}} | 
 |   } | 
 |  | 
 |   void f(char&); | 
 |  | 
 |   int k = N::M::g<char>(0);; // expected-note {{in instantiation of function}} | 
 |  | 
 |  | 
 |   namespace O { | 
 |     void f(char&); // expected-note {{candidate function not viable}} | 
 |  | 
 |     template<typename T> struct C { | 
 |       static const int n = f(T()); // expected-error {{no matching function}} | 
 |     }; | 
 |   } | 
 |  | 
 |   int f(double); // no note, shadowed by O::f | 
 |   O::C<double> c; // expected-note {{requested here}} | 
 |  | 
 |  | 
 |   // Example from www/compatibility.html | 
 |   namespace my_file { | 
 |     template <typename T> T Squared(T x) { | 
 |       return Multiply(x, x); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} | 
 |     } | 
 |  | 
 |     int Multiply(int x, int y) { // expected-note {{should be declared prior to the call site}} | 
 |       return x * y; | 
 |     } | 
 |  | 
 |     int main() { | 
 |       Squared(5); // expected-note {{here}} | 
 |     } | 
 |   } | 
 |  | 
 |   // Example from www/compatibility.html | 
 |   namespace my_file2 { | 
 |     template<typename T> | 
 |     void Dump(const T& value) { | 
 |       std::cout << value << "\n"; // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} | 
 |     } | 
 |  | 
 |     namespace ns { | 
 |       struct Data {}; | 
 |     } | 
 |  | 
 |     std::ostream& operator<<(std::ostream& out, ns::Data data) { // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2::ns'}} | 
 |       return out << "Some data"; | 
 |     } | 
 |  | 
 |     void Use() { | 
 |       Dump(ns::Data()); // expected-note {{here}} | 
 |     } | 
 |   } | 
 |  | 
 |   namespace my_file2_a { | 
 |     template<typename T> | 
 |     void Dump(const T &value) { | 
 |       print(std::cout, value); // expected-error 4{{neither visible in the template definition nor found by argument-dependent lookup}} | 
 |     } | 
 |  | 
 |     namespace ns { | 
 |       struct Data {}; | 
 |     } | 
 |     namespace ns2 { | 
 |       struct Data {}; | 
 |     } | 
 |  | 
 |     std::ostream &print(std::ostream &out, int); // expected-note-re {{should be declared prior to the call site$}} | 
 |     std::ostream &print(std::ostream &out, ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns'}} | 
 |     std::ostream &print(std::ostream &out, std::vector<ns2::Data>); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns2'}} | 
 |     std::ostream &print(std::ostream &out, std::pair<ns::Data, ns2::Data>); // expected-note {{should be declared prior to the call site or in an associated namespace of one of its arguments}} | 
 |  | 
 |     void Use() { | 
 |       Dump(0); // expected-note {{requested here}} | 
 |       Dump(ns::Data()); // expected-note {{requested here}} | 
 |       Dump(std::vector<ns2::Data>()); // expected-note {{requested here}} | 
 |       Dump(std::pair<ns::Data, ns2::Data>()); // expected-note {{requested here}} | 
 |     } | 
 |   } | 
 |  | 
 |   namespace unary { | 
 |     template<typename T> | 
 |     T Negate(const T& value) { | 
 |       return !value; // expected-error {{call to function 'operator!' that is neither visible in the template definition nor found by argument-dependent lookup}} | 
 |     } | 
 |  | 
 |     namespace ns { | 
 |       struct Data {}; | 
 |     } | 
 |  | 
 |     ns::Data operator!(ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::unary::ns'}} | 
 |  | 
 |     void Use() { | 
 |       Negate(ns::Data()); // expected-note {{requested here}} | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | namespace PR10187 { | 
 |   namespace A { | 
 |     template<typename T> | 
 |     struct S { | 
 |       void f() { | 
 |         for (auto &a : e) | 
 |           __range(a); // expected-error {{undeclared identifier '__range'}} | 
 |       } | 
 |       int e[10]; | 
 |     }; | 
 |     void g() { | 
 |       S<int>().f(); // expected-note {{here}} | 
 |     } | 
 |   } | 
 |  | 
 |   namespace B { | 
 |     template<typename T> void g(); // expected-note {{not viable}} | 
 |     template<typename T> void f() { | 
 |       g<int>(T()); // expected-error {{no matching function}} | 
 |     } | 
 |  | 
 |     namespace { | 
 |       struct S {}; | 
 |     } | 
 |     void g(S); | 
 |  | 
 |     template void f<S>(); // expected-note {{here}} | 
 |   } | 
 | } |