forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			137 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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;
 | 
						|
}
 |