diff options
Diffstat (limited to 'clang/test/SemaTemplate/instantiate-using-decl.cpp')
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-using-decl.cpp | 82 | 
1 files changed, 82 insertions, 0 deletions
| diff --git a/clang/test/SemaTemplate/instantiate-using-decl.cpp b/clang/test/SemaTemplate/instantiate-using-decl.cpp new file mode 100644 index 0000000..1bfcb7a --- /dev/null +++ b/clang/test/SemaTemplate/instantiate-using-decl.cpp @@ -0,0 +1,82 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +namespace test0 { +  namespace N { } + +  template<typename T> +  struct A { +    void f(); +  }; + +  template<typename T> +  struct B : A<T> { +    using A<T>::f; + +    void g() { +      using namespace N; +      f(); +    } +  }; + +  template struct B<int>; +} + +namespace test1 { +  template <class Derived> struct Visitor1 { +    void Visit(struct Object1*); +  }; +  template <class Derived> struct Visitor2 { +    void Visit(struct Object2*); // expected-note {{candidate function}} +  }; + +  template <class Derived> struct JoinVisitor +      : Visitor1<Derived>, Visitor2<Derived> { +    typedef Visitor1<Derived> Base1; +    typedef Visitor2<Derived> Base2; + +    void Visit(struct Object1*);  // expected-note {{candidate function}} +    using Base2::Visit; +  }; + +  class Knot : public JoinVisitor<Knot> { +  }; + +  void test() { +    Knot().Visit((struct Object1*) 0); +    Knot().Visit((struct Object2*) 0); +    Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}} +  } +} + +// PR5847 +namespace test2 { +  namespace ns { +    void foo(); +  } + +  template <class T> void bar(T* ptr) { +    using ns::foo; +    foo(); +  } + +  template void bar(char *); +} + +namespace test3 { +  template <typename T> struct t { +    struct s1 { +      T f1() const; +    }; +    struct s2 : s1 { +      using s1::f1; +      T f1() const; +    }; +  }; + +  void f2() +  { +    t<int>::s2 a; +    t<int>::s2 const & b = a; +    b.f1(); +  } +} | 
