1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 // Note: the formatting in this test case is intentionally funny, with 4 // nested-name-specifiers stretched out vertically so that we can 5 // match up diagnostics per-line and still verify that we're getting 6 // good source-location information. 7 8 namespace outer { 9 namespace inner { 10 template<typename T> 11 struct X0 { 12 }; 13 } 14 } 15 16 template<typename T> 17 struct add_reference { 18 typedef T& type; 19 }; 20 21 namespace outer_alias = outer; 22 23 template<typename T> 24 struct UnresolvedUsingValueDeclTester { 25 using outer::inner::X0< 26 typename add_reference<T>::type 27 * // expected-error{{declared as a pointer to a reference of type}} 28 >::value; 29 }; 30 31 UnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}} 32 33 template<typename T> 34 struct UnresolvedUsingTypenameDeclTester { 35 using outer::inner::X0< 36 typename add_reference<T>::type 37 * // expected-error{{declared as a pointer to a reference of type}} 38 >::value; 39 }; 40 41 UnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}} 42 43 44 template<typename T, typename U> 45 struct PseudoDestructorExprTester { 46 void f(T *t) { 47 t->T::template Inner<typename add_reference<U>::type 48 * // expected-error{{as a pointer to a reference of type}} 49 >::Blarg::~Blarg(); 50 } 51 }; 52 53 struct HasInnerTemplate { 54 template<typename T> 55 struct Inner; 56 57 typedef HasInnerTemplate T; 58 }; 59 60 void PseudoDestructorExprCheck( 61 PseudoDestructorExprTester<HasInnerTemplate, float> tester) { 62 tester.f(0); // expected-note{{in instantiation of member function}} 63 } 64 65 template<typename T> 66 struct DependentScopedDeclRefExpr { 67 void f() { 68 outer_alias::inner::X0<typename add_reference<T>::type 69 * // expected-error{{as a pointer to a reference of type}} 70 >::value = 17; 71 } 72 }; 73 74 void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) { 75 t.f(); // expected-note{{in instantiation of member function}} 76 } 77 78 79 template<typename T> 80 struct TypenameTypeTester { 81 typedef typename outer::inner::X0< 82 typename add_reference<T>::type 83 * // expected-error{{declared as a pointer to a reference of type}} 84 >::type type; 85 }; 86 87 TypenameTypeTester<int> TypenameTypeCheck; // expected-note{{in instantiation of template class}} 88 89 template<typename T, typename U> 90 struct DependentTemplateSpecializationTypeTester { 91 typedef typename T::template apply<typename add_reference<U>::type 92 * // expected-error{{declared as a pointer to a reference of type}} 93 >::type type; 94 }; 95 96 struct HasApply { 97 template<typename T> 98 struct apply { 99 typedef T type; 100 }; 101 }; 102 103 DependentTemplateSpecializationTypeTester<HasApply, int> DTSTCheck; // expected-note{{in instantiation of template class}} 104 105 template<typename T, typename U> 106 struct DependentTemplateSpecializationTypeTester2 { 107 typedef typename T::template apply<typename add_reference<U>::type 108 * // expected-error{{declared as a pointer to a reference of type}} 109 > type; 110 }; 111 112 DependentTemplateSpecializationTypeTester2<HasApply, int> DTSTCheck2; // expected-note{{in instantiation of template class}} 113 114 template<typename T, typename U> 115 struct DependentTemplateSpecializationTypeTester3 : 116 T::template apply<typename add_reference<U>::type 117 * // expected-error{{declared as a pointer to a reference of type}} 118 > 119 {}; 120 121 DependentTemplateSpecializationTypeTester3<HasApply, int> DTSTCheck3; // expected-note{{in instantiation of template class}} 122 123 template<typename T, typename U> 124 struct DependentTemplateSpecializationTypeTester4 { 125 typedef class T::template apply<typename add_reference<U>::type 126 * // expected-error{{declared as a pointer to a reference of type}} 127 > type; 128 }; 129 130 DependentTemplateSpecializationTypeTester4<HasApply, int> DTSTCheck4; // expected-note{{in instantiation of template class}} 131 132 template<template<class T> class TTP> 133 struct AcceptedTemplateTemplateParameter { 134 }; 135 136 template<typename T, typename U> 137 struct DependentTemplateTemplateArgumentTester { 138 typedef AcceptedTemplateTemplateParameter< 139 T:: 140 template apply< 141 typename add_reference<U>::type 142 * // expected-error{{declared as a pointer to a reference of type}} 143 >:: 144 template X> 145 type; 146 }; 147 148 DependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck; // expected-note{{in instantiation of template class}} 149 150 namespace PR9388 { 151 namespace std { 152 template<typename T> class vector { 153 }; 154 } 155 template<typename T> static void foo(std::vector<T*> &V) { 156 __PRETTY_FUNCTION__; // expected-warning{{expression result unused}} 157 } 158 void bar(std::vector<int*> &Blocks) { 159 foo(Blocks); // expected-note{{in instantiation of}} 160 } 161 162 } 163