1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify %s 3*67e74705SXin Li 4*67e74705SXin Li namespace test0 { 5*67e74705SXin Li namespace N { } 6*67e74705SXin Li 7*67e74705SXin Li template<typename T> 8*67e74705SXin Li struct A { 9*67e74705SXin Li void f(); 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li template<typename T> 13*67e74705SXin Li struct B : A<T> { 14*67e74705SXin Li using A<T>::f; 15*67e74705SXin Li gtest0::B16*67e74705SXin Li void g() { 17*67e74705SXin Li using namespace N; 18*67e74705SXin Li f(); 19*67e74705SXin Li } 20*67e74705SXin Li }; 21*67e74705SXin Li 22*67e74705SXin Li template struct B<int>; 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li namespace test1 { 26*67e74705SXin Li template <class Derived> struct Visitor1 { 27*67e74705SXin Li void Visit(struct Object1*); 28*67e74705SXin Li }; 29*67e74705SXin Li template <class Derived> struct Visitor2 { 30*67e74705SXin Li void Visit(struct Object2*); // expected-note {{candidate function}} 31*67e74705SXin Li }; 32*67e74705SXin Li 33*67e74705SXin Li template <class Derived> struct JoinVisitor 34*67e74705SXin Li : Visitor1<Derived>, Visitor2<Derived> { 35*67e74705SXin Li typedef Visitor1<Derived> Base1; 36*67e74705SXin Li typedef Visitor2<Derived> Base2; 37*67e74705SXin Li 38*67e74705SXin Li void Visit(struct Object1*); // expected-note {{candidate function}} 39*67e74705SXin Li using Base2::Visit; 40*67e74705SXin Li }; 41*67e74705SXin Li 42*67e74705SXin Li class Knot : public JoinVisitor<Knot> { 43*67e74705SXin Li }; 44*67e74705SXin Li test()45*67e74705SXin Li void test() { 46*67e74705SXin Li Knot().Visit((struct Object1*) 0); 47*67e74705SXin Li Knot().Visit((struct Object2*) 0); 48*67e74705SXin Li Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}} 49*67e74705SXin Li } 50*67e74705SXin Li } 51*67e74705SXin Li 52*67e74705SXin Li // PR5847 53*67e74705SXin Li namespace test2 { 54*67e74705SXin Li namespace ns { 55*67e74705SXin Li void foo(); 56*67e74705SXin Li } 57*67e74705SXin Li bar(T * ptr)58*67e74705SXin Li template <class T> void bar(T* ptr) { 59*67e74705SXin Li using ns::foo; 60*67e74705SXin Li foo(); 61*67e74705SXin Li } 62*67e74705SXin Li 63*67e74705SXin Li template void bar(char *); 64*67e74705SXin Li } 65*67e74705SXin Li 66*67e74705SXin Li namespace test3 { 67*67e74705SXin Li template <typename T> struct t { 68*67e74705SXin Li struct s1 { 69*67e74705SXin Li T f1() const; 70*67e74705SXin Li }; 71*67e74705SXin Li struct s2 : s1 { 72*67e74705SXin Li using s1::f1; 73*67e74705SXin Li T f1() const; 74*67e74705SXin Li }; 75*67e74705SXin Li }; 76*67e74705SXin Li f2()77*67e74705SXin Li void f2() 78*67e74705SXin Li { 79*67e74705SXin Li t<int>::s2 a; 80*67e74705SXin Li t<int>::s2 const & b = a; 81*67e74705SXin Li b.f1(); 82*67e74705SXin Li } 83*67e74705SXin Li } 84*67e74705SXin Li 85*67e74705SXin Li namespace PR16936 { 86*67e74705SXin Li // Make sure both using decls are properly considered for 87*67e74705SXin Li // overload resolution. 88*67e74705SXin Li template<class> struct A { 89*67e74705SXin Li void access(int); 90*67e74705SXin Li }; 91*67e74705SXin Li template<class> struct B { 92*67e74705SXin Li void access(); 93*67e74705SXin Li }; 94*67e74705SXin Li template<class CELL> struct X : public A<CELL>, public B<CELL> { 95*67e74705SXin Li using A<CELL>::access; 96*67e74705SXin Li using B<CELL>::access; 97*67e74705SXin Li fPR16936::X98*67e74705SXin Li void f() { 99*67e74705SXin Li access(0); 100*67e74705SXin Li } 101*67e74705SXin Li }; 102*67e74705SXin Li f()103*67e74705SXin Li void f() { 104*67e74705SXin Li X<int> x; 105*67e74705SXin Li x.f(); 106*67e74705SXin Li } 107*67e74705SXin Li } 108*67e74705SXin Li 109*67e74705SXin Li namespace pr21923 { 110*67e74705SXin Li template <typename> struct Base { 111*67e74705SXin Li int field; 112*67e74705SXin Li void method(); 113*67e74705SXin Li }; 114*67e74705SXin Li template <typename Scalar> struct Derived : Base<Scalar> { 115*67e74705SXin Li using Base<Scalar>::field; 116*67e74705SXin Li using Base<Scalar>::method; m_fn1pr21923::Derived117*67e74705SXin Li static void m_fn1() { 118*67e74705SXin Li // expected-error@+1 {{invalid use of member 'field' in static member function}} 119*67e74705SXin Li (void)field; 120*67e74705SXin Li // expected-error@+1 {{invalid use of member 'field' in static member function}} 121*67e74705SXin Li (void)&field; 122*67e74705SXin Li // expected-error@+1 {{call to non-static member function without an object argument}} 123*67e74705SXin Li (void)method; 124*67e74705SXin Li // expected-error@+1 {{call to non-static member function without an object argument}} 125*67e74705SXin Li (void)&method; 126*67e74705SXin Li // expected-error@+1 {{call to non-static member function without an object argument}} 127*67e74705SXin Li method(); 128*67e74705SXin Li (void)&Base<Scalar>::field; 129*67e74705SXin Li (void)&Base<Scalar>::method; 130*67e74705SXin Li } 131*67e74705SXin Li #if __cplusplus >= 201103L 132*67e74705SXin Li // These usages are OK in C++11 due to the unevaluated context. 133*67e74705SXin Li enum { TheSize = sizeof(field) }; 134*67e74705SXin Li typedef decltype(field) U; 135*67e74705SXin Li #else 136*67e74705SXin Li // expected-error@+1 {{invalid use of non-static data member 'field'}} 137*67e74705SXin Li enum { TheSize = sizeof(field) }; 138*67e74705SXin Li #endif 139*67e74705SXin Li }; 140*67e74705SXin Li 141*67e74705SXin Li #if __cplusplus < 201103L 142*67e74705SXin Li // C++98 has an extra note for TheSize. 143*67e74705SXin Li // expected-note@+2 {{requested here}} 144*67e74705SXin Li #endif 145*67e74705SXin Li template class Derived<int>; // expected-note {{requested here}} 146*67e74705SXin Li 147*67e74705SXin Li // This is interesting because we form an UnresolvedLookupExpr in the static 148*67e74705SXin Li // function template and an UnresolvedMemberExpr in the instance function 149*67e74705SXin Li // template. As a result, we get slightly different behavior. 150*67e74705SXin Li struct UnresolvedTemplateNames { 151*67e74705SXin Li template <typename> void maybe_static(); 152*67e74705SXin Li #if __cplusplus < 201103L 153*67e74705SXin Li // expected-warning@+2 {{default template arguments for a function template are a C++11 extension}} 154*67e74705SXin Li #endif 155*67e74705SXin Li template <typename T, typename T::type = 0> static void maybe_static(); 156*67e74705SXin Li 157*67e74705SXin Li template <typename T> instance_methodpr21923::UnresolvedTemplateNames158*67e74705SXin Li void instance_method() { (void)maybe_static<T>(); } 159*67e74705SXin Li template <typename T> static_methodpr21923::UnresolvedTemplateNames160*67e74705SXin Li static void static_method() { 161*67e74705SXin Li // expected-error@+1 {{call to non-static member function without an object argument}} 162*67e74705SXin Li (void)maybe_static<T>(); 163*67e74705SXin Li } 164*67e74705SXin Li }; force_instantiation(UnresolvedTemplateNames x)165*67e74705SXin Livoid force_instantiation(UnresolvedTemplateNames x) { 166*67e74705SXin Li x.instance_method<int>(); 167*67e74705SXin Li UnresolvedTemplateNames::static_method<int>(); // expected-note {{requested here}} 168*67e74705SXin Li } 169*67e74705SXin Li } // pr21923 170