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
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>::type
142              * // 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