| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- // RUN: %clang_cc1 -fsyntax-only -verify %s
- template<typename T, typename U>
- struct X0 : T::template apply<U> {
- X0(U u) : T::template apply<U>(u) { }
- };
- template<typename T, typename U>
- struct X1 : T::apply<U> { }; // expected-error{{use 'template' keyword to treat 'apply' as a dependent template name}}
- template<typename T>
- struct X2 : vector<T> { }; // expected-error{{unknown template name 'vector'}}
- namespace PR6031 {
- template<typename T>
- struct A;
- template <class X>
- struct C { };
- template <class TT>
- struct II {
- typedef typename A<TT>::type type;
- };
- template <class TT>
- struct FI : II<TT>
- {
- C<typename FI::type> a;
- };
- template <class TT>
- struct FI2
- {
- C<typename FI2::type> a; // expected-error{{no type named 'type' in 'FI2<TT>'}}
- };
- template<typename T>
- struct Base {
- class Nested { };
- template<typename U> struct MemberTemplate { };
- int a;
- };
- template<typename T>
- struct HasDepBase : Base<T> {
- int foo() {
- class HasDepBase::Nested nested;
- typedef typename HasDepBase::template MemberTemplate<T>::type type;
- return HasDepBase::a;
- }
- };
- template<typename T>
- struct NoDepBase {
- int foo() {
- class NoDepBase::Nested nested; // expected-error{{no class named 'Nested' in 'NoDepBase<T>'}}
- typedef typename NoDepBase::template MemberTemplate<T>::type type; // expected-error{{'MemberTemplate' following the 'template' keyword does not refer to a template}} \
- // FIXME: expected-error{{unqualified-id}}
- return NoDepBase::a; // expected-error{{no member named 'a' in 'NoDepBase<T>'}}
- }
- };
- }
- namespace Ambig {
- template<typename T>
- struct Base1 {
- typedef int type; // expected-note{{member found by ambiguous name lookup}}
- };
- struct Base2 {
- typedef float type; // expected-note{{member found by ambiguous name lookup}}
- };
- template<typename T>
- struct Derived : Base1<T>, Base2 {
- typedef typename Derived::type type; // expected-error{{member 'type' found in multiple base classes of different types}}
- type *foo(float *fp) { return fp; }
- };
- Derived<int> di; // expected-note{{instantiation of}}
- }
- namespace PR6081 {
- template<typename T>
- struct A { };
- template<typename T>
- class B : public A<T>
- {
- public:
- template< class X >
- void f0(const X & k)
- {
- this->template f1<int>()(k);
- }
- };
- template<typename T>
- class C
- {
- public:
- template< class X >
- void f0(const X & k)
- {
- this->template f1<int>()(k); // expected-error{{'f1' following the 'template' keyword does not refer to a template}} \
- // FIXME: expected-error{{unqualified-id}} \
- // expected-error{{function-style cast or type construction}} \
- // expected-error{{expected expression}}
- }
- };
- }
- namespace PR6413 {
- template <typename T> class Base_A { };
-
- class Base_B { };
-
- template <typename T>
- class Derived
- : public virtual Base_A<T>
- , public virtual Base_B
- { };
- }
- namespace PR5812 {
- template <class T> struct Base {
- Base* p;
- };
- template <class T> struct Derived: public Base<T> {
- typename Derived::Base* p; // meaning Derived::Base<T>
- };
- Derived<int> di;
- }
|