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