1d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
2d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor
3d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregortemplate<typename T, typename U>
4d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregorstruct X0 : T::template apply<U> {
5d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor  X0(U u) : T::template apply<U>(u) { }
6d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor};
784d0a19828599e8623223632d59447fd498999cfDouglas Gregor
884d0a19828599e8623223632d59447fd498999cfDouglas Gregortemplate<typename T, typename U>
9d5ab9b0a0ae24f7d0f49f6f10fd1b247e64b3306Douglas Gregorstruct X1 : T::apply<U> { }; // expected-error{{use 'template' keyword to treat 'apply' as a dependent template name}}
1084d0a19828599e8623223632d59447fd498999cfDouglas Gregor
1184d0a19828599e8623223632d59447fd498999cfDouglas Gregortemplate<typename T>
1284d0a19828599e8623223632d59447fd498999cfDouglas Gregorstruct X2 : vector<T> { }; // expected-error{{unknown template name 'vector'}}
139edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
149edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregornamespace PR6031 {
159edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template<typename T>
169edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct A;
179edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
189edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template <class X>
199edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct C { };
209edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
219edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template <class TT>
229edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct II {
239edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    typedef typename A<TT>::type type;
249edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  };
259edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
269edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template <class TT>
279edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct FI : II<TT>
289edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  {
299edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    C<typename FI::type> a;
309edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  };
319edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
329edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template <class TT>
339edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct FI2
349edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  {
3583a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith    C<typename FI2::type> a; // expected-error{{no type named 'type' in 'FI2<TT>'}}
369edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  };
379edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
389edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template<typename T>
399edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct Base {
409edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    class Nested { };
419edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    template<typename U> struct MemberTemplate { };
429edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    int a;
439edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  };
449edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
459edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template<typename T>
469edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct HasDepBase : Base<T> {
479edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    int foo() {
489edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor      class HasDepBase::Nested nested;
499edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor      typedef typename HasDepBase::template MemberTemplate<T>::type type;
509edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor      return HasDepBase::a;
519edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    }
529edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  };
539edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor
549edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  template<typename T>
559edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  struct NoDepBase {
569edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    int foo() {
571eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor      class NoDepBase::Nested nested; // expected-error{{no class named 'Nested' in 'NoDepBase<T>'}}
589edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor      typedef typename NoDepBase::template MemberTemplate<T>::type type; // expected-error{{'MemberTemplate' following the 'template' keyword does not refer to a template}} \
599edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor      // FIXME: expected-error{{unqualified-id}}
607c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall      return NoDepBase::a; // expected-error{{no member named 'a' in 'NoDepBase<T>'}}
619edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor    }
629edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor  };
639edad9b6184c730a73dc9241c043ea3bae54189fDouglas Gregor}
647d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor
657d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregornamespace Ambig {
667d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  template<typename T>
677d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  struct Base1 {
687d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor    typedef int type; // expected-note{{member found by ambiguous name lookup}}
697d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  };
707d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor
717d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  struct Base2 {
727d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor    typedef float type; // expected-note{{member found by ambiguous name lookup}}
737d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  };
747d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor
757d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  template<typename T>
767d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  struct Derived : Base1<T>, Base2 {
777d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor    typedef typename Derived::type type; // expected-error{{member 'type' found in multiple base classes of different types}}
787d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor    type *foo(float *fp) { return fp; }
797d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  };
807d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor
817d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor  Derived<int> di; // expected-note{{instantiation of}}
827d3f576dc9ea6e866757abcd1736eb7e7433c325Douglas Gregor}
830707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor
840707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregornamespace PR6081 {
850707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  template<typename T>
860707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  struct A { };
870707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor
880707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  template<typename T>
890707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  class B : public A<T>
900707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  {
910707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  public:
920707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    template< class X >
930707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    void f0(const X & k)
940707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    {
950707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor      this->template f1<int>()(k);
960707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    }
970707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  };
980707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor
990707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  template<typename T>
1000707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  class C
1010707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  {
1020707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  public:
1030707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    template< class X >
1040707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    void f0(const X & k)
1050707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    {
1060707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor      this->template f1<int>()(k); // expected-error{{'f1' following the 'template' keyword does not refer to a template}} \
107200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor      // FIXME: expected-error{{unqualified-id}} \
108200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor      // expected-error{{function-style cast or type construction}} \
109200b2921390bd75a659be3c77011e9a5548b7273Douglas Gregor      // expected-error{{expected expression}}
1100707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor    }
1110707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor  };
1120707bc504c392c8bd214a463f07b01809a23daa5Douglas Gregor}
1135fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor
1145fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregornamespace PR6413 {
1155fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor  template <typename T> class Base_A { };
1165fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor
1175fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor  class Base_B { };
1185fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor
1195fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor  template <typename T>
1205fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor  class Derived
1215fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor    : public virtual Base_A<T>
1225fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor    , public virtual Base_B
1235fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor  { };
1245fe8c04009eff540ebaa0cceb2e75c3908322e11Douglas Gregor}
125bbbd54e97944e88396061ff104564f155c122988Douglas Gregor
126bbbd54e97944e88396061ff104564f155c122988Douglas Gregornamespace PR5812 {
127bbbd54e97944e88396061ff104564f155c122988Douglas Gregor  template <class T> struct Base {
128bbbd54e97944e88396061ff104564f155c122988Douglas Gregor    Base* p;
129bbbd54e97944e88396061ff104564f155c122988Douglas Gregor  };
130bbbd54e97944e88396061ff104564f155c122988Douglas Gregor
131bbbd54e97944e88396061ff104564f155c122988Douglas Gregor  template <class T> struct Derived: public Base<T> {
132bbbd54e97944e88396061ff104564f155c122988Douglas Gregor    typename Derived::Base* p; // meaning Derived::Base<T>
133bbbd54e97944e88396061ff104564f155c122988Douglas Gregor  };
134bbbd54e97944e88396061ff104564f155c122988Douglas Gregor
135bbbd54e97944e88396061ff104564f155c122988Douglas Gregor  Derived<int> di;
136bbbd54e97944e88396061ff104564f155c122988Douglas Gregor}
137