| // RUN: %clang_cc1 -fsyntax-only -verify %s | 
 |  | 
 | namespace test0 { | 
 |   namespace N { } | 
 |  | 
 |   template<typename T> | 
 |   struct A { | 
 |     void f(); | 
 |   }; | 
 |  | 
 |   template<typename T> | 
 |   struct B : A<T> { | 
 |     using A<T>::f; | 
 |  | 
 |     void g() { | 
 |       using namespace N; | 
 |       f(); | 
 |     } | 
 |   }; | 
 |  | 
 |   template struct B<int>; | 
 | } | 
 |  | 
 | namespace test1 { | 
 |   template <class Derived> struct Visitor1 { | 
 |     void Visit(struct Object1*); | 
 |   }; | 
 |   template <class Derived> struct Visitor2 { | 
 |     void Visit(struct Object2*); // expected-note {{candidate function}} | 
 |   }; | 
 |  | 
 |   template <class Derived> struct JoinVisitor | 
 |       : Visitor1<Derived>, Visitor2<Derived> { | 
 |     typedef Visitor1<Derived> Base1; | 
 |     typedef Visitor2<Derived> Base2; | 
 |  | 
 |     void Visit(struct Object1*);  // expected-note {{candidate function}} | 
 |     using Base2::Visit; | 
 |   }; | 
 |  | 
 |   class Knot : public JoinVisitor<Knot> { | 
 |   }; | 
 |  | 
 |   void test() { | 
 |     Knot().Visit((struct Object1*) 0); | 
 |     Knot().Visit((struct Object2*) 0); | 
 |     Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}} | 
 |   } | 
 | } | 
 |  | 
 | // PR5847 | 
 | namespace test2 { | 
 |   namespace ns { | 
 |     void foo(); | 
 |   } | 
 |  | 
 |   template <class T> void bar(T* ptr) { | 
 |     using ns::foo; | 
 |     foo(); | 
 |   } | 
 |  | 
 |   template void bar(char *); | 
 | } |