1 | // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s |
2 | |
3 | template <class T> |
4 | class A { |
5 | void foo() { |
6 | undeclared(); |
7 | } |
8 | void foo2(); |
9 | }; |
10 | |
11 | template <class T> |
12 | class B { |
13 | void foo4() { } // expected-note {{previous definition is here}} |
14 | void foo4() { } // expected-error {{class member cannot be redeclared}} |
15 | void foo5() { } // expected-note {{previous definition is here}} |
16 | |
17 | friend void foo3() { |
18 | undeclared(); |
19 | } |
20 | }; |
21 | |
22 | |
23 | template <class T> |
24 | void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}} |
25 | } |
26 | |
27 | template <class T> |
28 | void A<T>::foo2() { |
29 | undeclared(); |
30 | } |
31 | |
32 | |
33 | template <class T> |
34 | void foo3() { |
35 | undeclared(); |
36 | } |
37 | |
38 | template void A<int>::foo2(); |
39 | |
40 | |
41 | void undeclared() |
42 | { |
43 | |
44 | } |
45 | |
46 | template <class T> void foo5() {} //expected-note {{previous definition is here}} |
47 | template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}} |
48 | |
49 | |
50 | |
51 | namespace Inner_Outer_same_template_param_name { |
52 | |
53 | template <class T> |
54 | class Outmost { |
55 | public: |
56 | template <class T> |
57 | class Inner { |
58 | public: |
59 | void f() { |
60 | T* var; |
61 | } |
62 | }; |
63 | }; |
64 | |
65 | } |
66 | |
67 | |
68 | namespace PR11931 { |
69 | |
70 | template <typename RunType> |
71 | struct BindState; |
72 | |
73 | template<> |
74 | struct BindState<void(void*)> { |
75 | static void Run() { } |
76 | }; |
77 | |
78 | class Callback { |
79 | public: |
80 | typedef void RunType(); |
81 | |
82 | template <typename RunType> |
83 | Callback(BindState<RunType> bind_state) { |
84 | BindState<RunType>::Run(); |
85 | } |
86 | }; |
87 | |
88 | |
89 | Callback Bind() { |
90 | return Callback(BindState<void(void*)>()); |
91 | } |
92 | |
93 | } |
94 | |
95 | namespace rdar11700604 { |
96 | template<typename T> void foo() = delete; |
97 | |
98 | struct X { |
99 | X() = default; |
100 | |
101 | template<typename T> void foo() = delete; |
102 | }; |
103 | } |
104 | |
105 | namespace PR17334 { |
106 | |
107 | template <typename = void> struct ArrayRef { |
108 | constexpr ArrayRef() {} |
109 | }; |
110 | template <typename = void> void CreateConstInBoundsGEP2_32() { |
111 | ArrayRef<> IdxList; |
112 | } |
113 | void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); } |
114 | |
115 | } |
116 | |
117 | namespace PR17661 { |
118 | template <typename T> |
119 | constexpr T Fun(T A) { return T(0); } |
120 | |
121 | constexpr int Var = Fun(20); |
122 | } |
123 | |
124 | template <typename T> |
125 | auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}} |
126 | |
127 | namespace PR19613 { |
128 | |
129 | struct HeapTypeConfig { |
130 | static void from_bitset(); |
131 | }; |
132 | |
133 | template <class Config> |
134 | struct TypeImpl { |
135 | struct BitsetType; |
136 | |
137 | static void Any() { |
138 | BitsetType::New(); |
139 | } |
140 | }; |
141 | |
142 | template<class Config> |
143 | struct TypeImpl<Config>::BitsetType { |
144 | static void New() { |
145 | Config::from_bitset(); |
146 | } |
147 | }; |
148 | |
149 | static void f() { |
150 | TypeImpl<HeapTypeConfig>::Any(); |
151 | } |
152 | |
153 | template<typename A> struct S { |
154 | template<typename B> struct T; |
155 | }; |
156 | template<typename A> template<typename B> struct S<A>::T { |
157 | template<typename C, typename D> struct U; |
158 | template<typename C> struct U<C, C> { |
159 | template<typename E> static int f() { |
160 | return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E); |
161 | } |
162 | }; |
163 | }; |
164 | |
165 | static void g() { |
166 | S<int>::T<int>::U<int,int>::f<int>(); |
167 | } |
168 | |
169 | template<typename T> struct SS { |
170 | template<typename U> struct X; |
171 | template<typename U> struct X<U*>; |
172 | }; |
173 | template<typename T> template<typename U> struct SS<T>::X<U*> { |
174 | static int f() { |
175 | return sizeof(T) + sizeof(U); |
176 | } |
177 | }; |
178 | |
179 | static void h() { |
180 | SS<int>::X<int*>::f(); |
181 | } |
182 | |
183 | } |
184 | |
185 | struct PR38460 { |
186 | template <typename> |
187 | struct T { |
188 | static void foo() { |
189 | struct U { |
190 | void dummy() { |
191 | use_delayed_identifier(); |
192 | } |
193 | }; |
194 | } |
195 | }; |
196 | }; |
197 | void use_delayed_identifier(); |
198 | void trigger_PR38460() { |
199 | PR38460::T<int>::foo(); |
200 | } |
201 | |
202 | template <typename> struct PR38460_2 { |
203 | struct p { |
204 | struct G { |
205 | bool operator()(int) {} |
206 | }; |
207 | }; |
208 | static void as() { |
209 | typename p::G g; |
210 | g(0); |
211 | } |
212 | }; |
213 | template struct PR38460_2<int>; |
214 | |