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}}
 | |
|   }
 | |
| 
 | |
| }
 | 
