163 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3// Note: the formatting in this test case is intentionally funny, with4// nested-name-specifiers stretched out vertically so that we can5// match up diagnostics per-line and still verify that we're getting6// good source-location information.7 8namespace outer {9 namespace inner {10 template<typename T>11 struct X0 {12 };13 }14}15 16template<typename T>17struct add_reference {18 typedef T& type;19};20 21namespace outer_alias = outer;22 23template<typename T>24struct 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 31UnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}}32 33template<typename T>34struct 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 41UnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}}42 43 44template<typename T, typename U>45struct 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 53struct HasInnerTemplate {54 template<typename T>55 struct Inner;56 57 typedef HasInnerTemplate T;58};59 60void PseudoDestructorExprCheck(61 PseudoDestructorExprTester<HasInnerTemplate, float> tester) {62 tester.f(0); // expected-note{{in instantiation of member function}}63}64 65template<typename T>66struct 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 74void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) {75 t.f(); // expected-note{{in instantiation of member function}}76}77 78 79template<typename T>80struct 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 87TypenameTypeTester<int> TypenameTypeCheck; // expected-note{{in instantiation of template class}}88 89template<typename T, typename U>90struct 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 96struct HasApply {97 template<typename T>98 struct apply {99 typedef T type;100 };101};102 103DependentTemplateSpecializationTypeTester<HasApply, int> DTSTCheck; // expected-note{{in instantiation of template class}}104 105template<typename T, typename U>106struct 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 112DependentTemplateSpecializationTypeTester2<HasApply, int> DTSTCheck2; // expected-note{{in instantiation of template class}}113 114template<typename T, typename U>115struct 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 121DependentTemplateSpecializationTypeTester3<HasApply, int> DTSTCheck3; // expected-note{{in instantiation of template class}}122 123template<typename T, typename U>124struct 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 130DependentTemplateSpecializationTypeTester4<HasApply, int> DTSTCheck4; // expected-note{{in instantiation of template class}}131 132template<template<class T> class TTP>133struct AcceptedTemplateTemplateParameter {134};135 136template<typename T, typename U>137struct DependentTemplateTemplateArgumentTester {138 typedef AcceptedTemplateTemplateParameter<139 T::140 template apply<141 typename add_reference<U>::type142 * // expected-error{{declared as a pointer to a reference of type}}143 >::144 template X>145 type;146};147 148DependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck; // expected-note{{in instantiation of template class}}149 150namespace 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