13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
28197c48a5bedf9418f8616ee4b6ed98e4bfd2ed3Anders Carlsson
3956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCallnamespace test0 {
4956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  namespace N { }
5956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
6956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  template<typename T>
7956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  struct A {
8956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    void f();
9956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  };
10956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
11956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  template<typename T>
12956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  struct B : A<T> {
13956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    using A<T>::f;
14956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
15956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    void g() {
16956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall      using namespace N;
17956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall      f();
18956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    }
19956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  };
20956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
21956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  template struct B<int>;
22956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall}
238197c48a5bedf9418f8616ee4b6ed98e4bfd2ed3Anders Carlsson
24956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCallnamespace test1 {
25956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  template <class Derived> struct Visitor1 {
26956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    void Visit(struct Object1*);
27956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  };
28956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  template <class Derived> struct Visitor2 {
29956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    void Visit(struct Object2*); // expected-note {{candidate function}}
30956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  };
31956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
32956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  template <class Derived> struct JoinVisitor
33956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall      : Visitor1<Derived>, Visitor2<Derived> {
34956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    typedef Visitor1<Derived> Base1;
35956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    typedef Visitor2<Derived> Base2;
36956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
37956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    void Visit(struct Object1*);  // expected-note {{candidate function}}
38956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    using Base2::Visit;
39956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  };
40956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
414f4bd835ccc14c54177e9e7ad97bbdd09b161630John McCall  class Knot : public JoinVisitor<Knot> {
42956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  };
43956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall
44956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  void test() {
45956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    Knot().Visit((struct Object1*) 0);
46956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    Knot().Visit((struct Object2*) 0);
47956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall    Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}}
48956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall  }
49956affe43fe9655a9ffa93ffbc8f0458a854ec58John McCall}
50d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall
51d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall// PR5847
52d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCallnamespace test2 {
53d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall  namespace ns {
54d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall    void foo();
55d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall  }
56d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall
57d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall  template <class T> void bar(T* ptr) {
58d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall    using ns::foo;
59d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall    foo();
60d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall  }
61d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall
62d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall  template void bar(char *);
63d57d3121e3fce60c5f6d73ab8964a28c09c1f1f7John McCall}
649e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor
659e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregornamespace test3 {
669e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor  template <typename T> struct t {
679e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    struct s1 {
689e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor      T f1() const;
699e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    };
709e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    struct s2 : s1 {
719e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor      using s1::f1;
729e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor      T f1() const;
739e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    };
749e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor  };
759e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor
769e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor  void f2()
779e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor  {
789e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    t<int>::s2 a;
799e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    t<int>::s2 const & b = a;
809e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor    b.f1();
819e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor  }
829e6b8f7e5f2cd40c8f8484d63b26d03131d4e62eDouglas Gregor}
83