1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 20d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 3fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCallnamespace test0 { 4fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall namespace N { } 5fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 6fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall template<typename T> 7fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall struct A { 8fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall void f(); 9fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall }; 10fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 11fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall template<typename T> 12fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall struct B : A<T> { 13fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall using A<T>::f; 14fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 15fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall void g() { 16fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall using namespace N; 17fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall f(); 18fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall } 19fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall }; 20fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 21fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall template struct B<int>; 22fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall} 230d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 24fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCallnamespace test1 { 25fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall template <class Derived> struct Visitor1 { 26fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall void Visit(struct Object1*); 27fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall }; 28fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall template <class Derived> struct Visitor2 { 29fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall void Visit(struct Object2*); // expected-note {{candidate function}} 30fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall }; 31fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 32fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall template <class Derived> struct JoinVisitor 33fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall : Visitor1<Derived>, Visitor2<Derived> { 34fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall typedef Visitor1<Derived> Base1; 35fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall typedef Visitor2<Derived> Base2; 36fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 37fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall void Visit(struct Object1*); // expected-note {{candidate function}} 38fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall using Base2::Visit; 39fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall }; 40fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 417002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall class Knot : public JoinVisitor<Knot> { 42fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall }; 43fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall 44fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall void test() { 45fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall Knot().Visit((struct Object1*) 0); 46fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall Knot().Visit((struct Object2*) 0); 47fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}} 48fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall } 49fda8e12774921e3cac3ebcba1148bcf4479ddd7aJohn McCall} 50323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 51323c310efa0abd7a786b0303501186b5f33eb8d7John McCall// PR5847 52323c310efa0abd7a786b0303501186b5f33eb8d7John McCallnamespace test2 { 53323c310efa0abd7a786b0303501186b5f33eb8d7John McCall namespace ns { 54323c310efa0abd7a786b0303501186b5f33eb8d7John McCall void foo(); 55323c310efa0abd7a786b0303501186b5f33eb8d7John McCall } 56323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 57323c310efa0abd7a786b0303501186b5f33eb8d7John McCall template <class T> void bar(T* ptr) { 58323c310efa0abd7a786b0303501186b5f33eb8d7John McCall using ns::foo; 59323c310efa0abd7a786b0303501186b5f33eb8d7John McCall foo(); 60323c310efa0abd7a786b0303501186b5f33eb8d7John McCall } 61323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 62323c310efa0abd7a786b0303501186b5f33eb8d7John McCall template void bar(char *); 63323c310efa0abd7a786b0303501186b5f33eb8d7John McCall} 641b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor 651b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregornamespace test3 { 661b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor template <typename T> struct t { 671b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor struct s1 { 681b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor T f1() const; 691b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor }; 701b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor struct s2 : s1 { 711b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor using s1::f1; 721b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor T f1() const; 731b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor }; 741b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor }; 751b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor 761b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor void f2() 771b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor { 781b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor t<int>::s2 a; 791b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor t<int>::s2 const & b = a; 801b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor b.f1(); 811b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor } 821b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor} 8313b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman 8413b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedmannamespace PR16936 { 8513b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman // Make sure both using decls are properly considered for 8613b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman // overload resolution. 8713b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman template<class> struct A { 8813b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman void access(int); 8913b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman }; 9013b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman template<class> struct B { 9113b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman void access(); 9213b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman }; 9313b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman template<class CELL> struct X : public A<CELL>, public B<CELL> { 9413b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman using A<CELL>::access; 9513b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman using B<CELL>::access; 9613b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman 9713b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman void f() { 9813b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman access(0); 9913b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman } 10013b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman }; 10113b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman 10213b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman void f() { 10313b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman X<int> x; 10413b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman x.f(); 10513b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman } 10613b572c9e84729b4bd5f00d0f1452a4b93211cdeEli Friedman} 107