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