1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 namespace test0 { 4 namespace N { } 5 6 template<typename T> 7 struct A { 8 void f(); 9 }; 10 11 template<typename T> 12 struct B : A<T> { 13 using A<T>::f; 14 gtest0::B15 void g() { 16 using namespace N; 17 f(); 18 } 19 }; 20 21 template struct B<int>; 22 } 23 24 namespace test1 { 25 template <class Derived> struct Visitor1 { 26 void Visit(struct Object1*); 27 }; 28 template <class Derived> struct Visitor2 { 29 void Visit(struct Object2*); // expected-note {{candidate function}} 30 }; 31 32 template <class Derived> struct JoinVisitor 33 : Visitor1<Derived>, Visitor2<Derived> { 34 typedef Visitor1<Derived> Base1; 35 typedef Visitor2<Derived> Base2; 36 37 void Visit(struct Object1*); // expected-note {{candidate function}} 38 using Base2::Visit; 39 }; 40 41 class Knot : public JoinVisitor<Knot> { 42 }; 43 test()44 void test() { 45 Knot().Visit((struct Object1*) 0); 46 Knot().Visit((struct Object2*) 0); 47 Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}} 48 } 49 } 50 51 // PR5847 52 namespace test2 { 53 namespace ns { 54 void foo(); 55 } 56 bar(T * ptr)57 template <class T> void bar(T* ptr) { 58 using ns::foo; 59 foo(); 60 } 61 62 template void bar(char *); 63 } 64 65 namespace test3 { 66 template <typename T> struct t { 67 struct s1 { 68 T f1() const; 69 }; 70 struct s2 : s1 { 71 using s1::f1; 72 T f1() const; 73 }; 74 }; 75 f2()76 void f2() 77 { 78 t<int>::s2 a; 79 t<int>::s2 const & b = a; 80 b.f1(); 81 } 82 } 83 84 namespace PR16936 { 85 // Make sure both using decls are properly considered for 86 // overload resolution. 87 template<class> struct A { 88 void access(int); 89 }; 90 template<class> struct B { 91 void access(); 92 }; 93 template<class CELL> struct X : public A<CELL>, public B<CELL> { 94 using A<CELL>::access; 95 using B<CELL>::access; 96 fPR16936::X97 void f() { 98 access(0); 99 } 100 }; 101 f()102 void f() { 103 X<int> x; 104 x.f(); 105 } 106 } 107