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