brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 048d4ba Raw
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