163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s
 | 
						|
 | 
						|
// Note: the formatting in this test case is intentionally funny, with
 | 
						|
// nested-name-specifiers stretched out vertically so that we can
 | 
						|
// match up diagnostics per-line and still verify that we're getting
 | 
						|
// good source-location information.
 | 
						|
 | 
						|
namespace outer {
 | 
						|
  namespace inner {
 | 
						|
    template<typename T>
 | 
						|
    struct X0 {
 | 
						|
    };
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct add_reference {
 | 
						|
  typedef T& type;
 | 
						|
};
 | 
						|
 | 
						|
namespace outer_alias = outer;
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct UnresolvedUsingValueDeclTester {
 | 
						|
  using outer::inner::X0<
 | 
						|
          typename add_reference<T>::type 
 | 
						|
    * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
        >::value;
 | 
						|
};
 | 
						|
 | 
						|
UnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct UnresolvedUsingTypenameDeclTester {
 | 
						|
  using outer::inner::X0<
 | 
						|
          typename add_reference<T>::type 
 | 
						|
    * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
        >::value;
 | 
						|
};
 | 
						|
 | 
						|
UnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
 | 
						|
template<typename T, typename U>
 | 
						|
struct PseudoDestructorExprTester {
 | 
						|
  void f(T *t) {
 | 
						|
    t->T::template Inner<typename add_reference<U>::type 
 | 
						|
      * // expected-error{{as a pointer to a reference of type}}
 | 
						|
      >::Blarg::~Blarg();
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
struct HasInnerTemplate {
 | 
						|
  template<typename T>
 | 
						|
  struct Inner;
 | 
						|
 | 
						|
  typedef HasInnerTemplate T;
 | 
						|
};
 | 
						|
 | 
						|
void PseudoDestructorExprCheck(
 | 
						|
                    PseudoDestructorExprTester<HasInnerTemplate, float> tester) {
 | 
						|
  tester.f(0); // expected-note{{in instantiation of member function}}
 | 
						|
}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct DependentScopedDeclRefExpr {
 | 
						|
  void f() {
 | 
						|
    outer_alias::inner::X0<typename add_reference<T>::type 
 | 
						|
      * // expected-error{{as a pointer to a reference of type}}
 | 
						|
      >::value = 17;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) {
 | 
						|
  t.f(); // expected-note{{in instantiation of member function}}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct TypenameTypeTester {
 | 
						|
  typedef typename outer::inner::X0<
 | 
						|
          typename add_reference<T>::type 
 | 
						|
    * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
        >::type type;
 | 
						|
};
 | 
						|
 | 
						|
TypenameTypeTester<int> TypenameTypeCheck; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
template<typename T, typename U>
 | 
						|
struct DependentTemplateSpecializationTypeTester {
 | 
						|
  typedef typename T::template apply<typename add_reference<U>::type 
 | 
						|
                                     * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
                                     >::type type;
 | 
						|
};
 | 
						|
 | 
						|
struct HasApply {
 | 
						|
  template<typename T>
 | 
						|
  struct apply {
 | 
						|
    typedef T type;
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
DependentTemplateSpecializationTypeTester<HasApply, int> DTSTCheck; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
template<typename T, typename U>
 | 
						|
struct DependentTemplateSpecializationTypeTester2 {
 | 
						|
  typedef typename T::template apply<typename add_reference<U>::type 
 | 
						|
                                     * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
                                     > type;
 | 
						|
};
 | 
						|
 | 
						|
DependentTemplateSpecializationTypeTester2<HasApply, int> DTSTCheck2; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
template<typename T, typename U>
 | 
						|
struct DependentTemplateSpecializationTypeTester3 :
 | 
						|
  T::template apply<typename add_reference<U>::type 
 | 
						|
                                     * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
                                     >
 | 
						|
{};
 | 
						|
 | 
						|
DependentTemplateSpecializationTypeTester3<HasApply, int> DTSTCheck3; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
template<typename T, typename U>
 | 
						|
struct DependentTemplateSpecializationTypeTester4 {
 | 
						|
  typedef class T::template apply<typename add_reference<U>::type 
 | 
						|
                                     * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
                                     > type;
 | 
						|
};
 | 
						|
 | 
						|
DependentTemplateSpecializationTypeTester4<HasApply, int> DTSTCheck4; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
template<template<class T> class TTP>
 | 
						|
struct AcceptedTemplateTemplateParameter {
 | 
						|
};
 | 
						|
 | 
						|
template<typename T, typename U>
 | 
						|
struct DependentTemplateTemplateArgumentTester {
 | 
						|
  typedef AcceptedTemplateTemplateParameter<
 | 
						|
            T::
 | 
						|
            template apply<
 | 
						|
              typename add_reference<U>::type
 | 
						|
              * // expected-error{{declared as a pointer to a reference of type}}
 | 
						|
            >::
 | 
						|
            template X>
 | 
						|
    type;
 | 
						|
};
 | 
						|
 | 
						|
DependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck; // expected-note{{in instantiation of template class}}
 | 
						|
 | 
						|
namespace PR9388 {
 | 
						|
  namespace std {
 | 
						|
    template<typename T>     class vector     {
 | 
						|
    };
 | 
						|
  }
 | 
						|
  template<typename T> static void foo(std::vector<T*> &V) {
 | 
						|
    __PRETTY_FUNCTION__; // expected-warning{{expression result unused}}
 | 
						|
  }
 | 
						|
  void bar(std::vector<int*> &Blocks) {
 | 
						|
    foo(Blocks); // expected-note{{in instantiation of}}
 | 
						|
  }
 | 
						|
 | 
						|
}
 |