Bug 1814798 - pt 1. Add bool to enable/disable PHC at runtime r=glandium
[gecko.git] / build / clang-plugin / tests / TestNonMemMovable.cpp
blobdfbb5a6c654cf013ac0a19fa4fb45696f078f559
1 #define MOZ_NON_MEMMOVABLE __attribute__((annotate("moz_non_memmovable")))
2 #define MOZ_NEEDS_MEMMOVABLE_TYPE __attribute__((annotate("moz_needs_memmovable_type")))
3 #define MOZ_NEEDS_MEMMOVABLE_MEMBERS __attribute__((annotate("moz_needs_memmovable_members")))
5 /*
6 These are a bunch of structs with variable levels of memmovability.
7 They will be used as template parameters to the various NeedyTemplates
8 */
9 struct MOZ_NON_MEMMOVABLE NonMovable {};
10 struct Movable {};
12 // Subclasses
13 struct S_NonMovable : NonMovable {}; // expected-note 51 {{'S_NonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'NonMovable'}}
14 struct S_Movable : Movable {};
16 // Members
17 struct W_NonMovable {
18 NonMovable m; // expected-note 34 {{'W_NonMovable' is a non-memmove()able type because member 'm' is a non-memmove()able type 'NonMovable'}}
20 struct W_Movable {
21 Movable m;
24 // Wrapped Subclasses
25 struct WS_NonMovable {
26 S_NonMovable m; // expected-note 34 {{'WS_NonMovable' is a non-memmove()able type because member 'm' is a non-memmove()able type 'S_NonMovable'}}
28 struct WS_Movable {
29 S_Movable m;
32 // Combinations of the above
33 struct SW_NonMovable : W_NonMovable {}; // expected-note 17 {{'SW_NonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'W_NonMovable'}}
34 struct SW_Movable : W_Movable {};
36 struct SWS_NonMovable : WS_NonMovable {}; // expected-note 17 {{'SWS_NonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'WS_NonMovable'}}
37 struct SWS_Movable : WS_Movable {};
39 // Basic templated wrapper
40 template <class T>
41 struct Template_Inline {
42 T m; // expected-note-re 56 {{'Template_Inline<{{.*}}>' is a non-memmove()able type because member 'm' is a non-memmove()able type '{{.*}}'}}
45 template <class T>
46 struct Template_Ref {
47 T* m;
50 template <class T>
51 struct Template_Unused {};
53 template <class T>
54 struct MOZ_NON_MEMMOVABLE Template_NonMovable {};
57 These tests take the following form:
58 DECLARATIONS => Declarations of the templates which are either marked with MOZ_NEEDS_MEMMOVABLE_TYPE
59 or which instantiate a MOZ_NEEDS_MEMMOVABLE_TYPE through some mechanism.
60 BAD N => Instantiations of the wrapper template with each of the non-memmovable types.
61 The prefix S_ means subclass, W_ means wrapped. Each of these rows should produce an error
62 on the NeedyTemplate in question, and a note at the instantiation location of that template.
63 Unfortunately, on every case more complicated than bad1, the instantiation location is
64 within another template. Thus, the notes are expected on the template in question which
65 actually instantiates the MOZ_NEEDS_MEMMOVABLE_TYPE template.
66 GOOD N => Instantiations of the wrapper template with each of the memmovable types.
67 This is meant as a sanity check to ensure that we don't reject valid instantiations of
68 templates.
71 Note 1: Each set uses it's own types to ensure that they don't re-use each-other's template specializations.
72 If they did, then some of the error messages would not be emitted (as error messages are emitted for template
73 specializations, rather than for variable declarations)
75 Note 2: Every instance of NeedyTemplate contains a member of type T. This is to ensure that T is actually
76 instantiated (if T is a template) by clang. If T isn't instantiated, then we can't actually tell if it is
77 NON_MEMMOVABLE. (This is OK in practice, as you cannot memmove a type which you don't know the size of).
79 Note 3: There are a set of tests for specializations of NeedyTemplate at the bottom. For each set of tests,
80 these tests contribute two expected errors to the templates.
84 // 1 - Unwrapped MOZ_NEEDS_MEMMOVABLE_TYPE
87 template <class T>
88 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate1 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate1<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
90 void bad1() {
91 NeedyTemplate1<NonMovable> a1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
92 NeedyTemplate1<S_NonMovable> a2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
93 NeedyTemplate1<W_NonMovable> a3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
94 NeedyTemplate1<WS_NonMovable> a4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
95 NeedyTemplate1<SW_NonMovable> a5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
96 NeedyTemplate1<SWS_NonMovable> a6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
98 NeedyTemplate1<Template_Inline<NonMovable> > b1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
99 NeedyTemplate1<Template_Inline<S_NonMovable> > b2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
100 NeedyTemplate1<Template_Inline<W_NonMovable> > b3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
101 NeedyTemplate1<Template_Inline<WS_NonMovable> > b4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
102 NeedyTemplate1<Template_Inline<SW_NonMovable> > b5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
103 NeedyTemplate1<Template_Inline<SWS_NonMovable> > b6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
105 NeedyTemplate1<Template_NonMovable<NonMovable> > c1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
106 NeedyTemplate1<Template_NonMovable<S_NonMovable> > c2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
107 NeedyTemplate1<Template_NonMovable<W_NonMovable> > c3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
108 NeedyTemplate1<Template_NonMovable<WS_NonMovable> > c4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
109 NeedyTemplate1<Template_NonMovable<SW_NonMovable> > c5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
110 NeedyTemplate1<Template_NonMovable<SWS_NonMovable> > c6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
111 NeedyTemplate1<Template_NonMovable<Movable> > c7; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
112 NeedyTemplate1<Template_NonMovable<S_Movable> > c8; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
113 NeedyTemplate1<Template_NonMovable<W_Movable> > c9; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
114 NeedyTemplate1<Template_NonMovable<WS_Movable> > c10; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
115 NeedyTemplate1<Template_NonMovable<SW_Movable> > c11; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
116 NeedyTemplate1<Template_NonMovable<SWS_Movable> > c12; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
119 void good1() {
120 NeedyTemplate1<Movable> a1;
121 NeedyTemplate1<S_Movable> a2;
122 NeedyTemplate1<W_Movable> a3;
123 NeedyTemplate1<WS_Movable> a4;
124 NeedyTemplate1<SW_Movable> a5;
125 NeedyTemplate1<SWS_Movable> a6;
127 NeedyTemplate1<Template_Inline<Movable> > b1;
128 NeedyTemplate1<Template_Inline<S_Movable> > b2;
129 NeedyTemplate1<Template_Inline<W_Movable> > b3;
130 NeedyTemplate1<Template_Inline<WS_Movable> > b4;
131 NeedyTemplate1<Template_Inline<SW_Movable> > b5;
132 NeedyTemplate1<Template_Inline<SWS_Movable> > b6;
134 NeedyTemplate1<Template_Unused<Movable> > c1;
135 NeedyTemplate1<Template_Unused<S_Movable> > c2;
136 NeedyTemplate1<Template_Unused<W_Movable> > c3;
137 NeedyTemplate1<Template_Unused<WS_Movable> > c4;
138 NeedyTemplate1<Template_Unused<SW_Movable> > c5;
139 NeedyTemplate1<Template_Unused<SWS_Movable> > c6;
140 NeedyTemplate1<Template_Unused<NonMovable> > c7;
141 NeedyTemplate1<Template_Unused<S_NonMovable> > c8;
142 NeedyTemplate1<Template_Unused<W_NonMovable> > c9;
143 NeedyTemplate1<Template_Unused<WS_NonMovable> > c10;
144 NeedyTemplate1<Template_Unused<SW_NonMovable> > c11;
145 NeedyTemplate1<Template_Unused<SWS_NonMovable> > c12;
147 NeedyTemplate1<Template_Ref<Movable> > d1;
148 NeedyTemplate1<Template_Ref<S_Movable> > d2;
149 NeedyTemplate1<Template_Ref<W_Movable> > d3;
150 NeedyTemplate1<Template_Ref<WS_Movable> > d4;
151 NeedyTemplate1<Template_Ref<SW_Movable> > d5;
152 NeedyTemplate1<Template_Ref<SWS_Movable> > d6;
153 NeedyTemplate1<Template_Ref<NonMovable> > d7;
154 NeedyTemplate1<Template_Ref<S_NonMovable> > d8;
155 NeedyTemplate1<Template_Ref<W_NonMovable> > d9;
156 NeedyTemplate1<Template_Ref<WS_NonMovable> > d10;
157 NeedyTemplate1<Template_Ref<SW_NonMovable> > d11;
158 NeedyTemplate1<Template_Ref<SWS_NonMovable> > d12;
162 // 2 - Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE
165 template <class T>
166 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate2 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate2<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
167 template <class T>
168 struct S_NeedyTemplate2 : NeedyTemplate2<T> {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate2<{{.*}}>' requested here}}
170 void bad2() {
171 S_NeedyTemplate2<NonMovable> a1;
172 S_NeedyTemplate2<S_NonMovable> a2;
173 S_NeedyTemplate2<W_NonMovable> a3;
174 S_NeedyTemplate2<WS_NonMovable> a4;
175 S_NeedyTemplate2<SW_NonMovable> a5;
176 S_NeedyTemplate2<SWS_NonMovable> a6;
178 S_NeedyTemplate2<Template_Inline<NonMovable> > b1;
179 S_NeedyTemplate2<Template_Inline<S_NonMovable> > b2;
180 S_NeedyTemplate2<Template_Inline<W_NonMovable> > b3;
181 S_NeedyTemplate2<Template_Inline<WS_NonMovable> > b4;
182 S_NeedyTemplate2<Template_Inline<SW_NonMovable> > b5;
183 S_NeedyTemplate2<Template_Inline<SWS_NonMovable> > b6;
185 S_NeedyTemplate2<Template_NonMovable<NonMovable> > c1;
186 S_NeedyTemplate2<Template_NonMovable<S_NonMovable> > c2;
187 S_NeedyTemplate2<Template_NonMovable<W_NonMovable> > c3;
188 S_NeedyTemplate2<Template_NonMovable<WS_NonMovable> > c4;
189 S_NeedyTemplate2<Template_NonMovable<SW_NonMovable> > c5;
190 S_NeedyTemplate2<Template_NonMovable<SWS_NonMovable> > c6;
191 S_NeedyTemplate2<Template_NonMovable<Movable> > c7;
192 S_NeedyTemplate2<Template_NonMovable<S_Movable> > c8;
193 S_NeedyTemplate2<Template_NonMovable<W_Movable> > c9;
194 S_NeedyTemplate2<Template_NonMovable<WS_Movable> > c10;
195 S_NeedyTemplate2<Template_NonMovable<SW_Movable> > c11;
196 S_NeedyTemplate2<Template_NonMovable<SWS_Movable> > c12;
199 void good2() {
200 S_NeedyTemplate2<Movable> a1;
201 S_NeedyTemplate2<S_Movable> a2;
202 S_NeedyTemplate2<W_Movable> a3;
203 S_NeedyTemplate2<WS_Movable> a4;
204 S_NeedyTemplate2<SW_Movable> a5;
205 S_NeedyTemplate2<SWS_Movable> a6;
207 S_NeedyTemplate2<Template_Inline<Movable> > b1;
208 S_NeedyTemplate2<Template_Inline<S_Movable> > b2;
209 S_NeedyTemplate2<Template_Inline<W_Movable> > b3;
210 S_NeedyTemplate2<Template_Inline<WS_Movable> > b4;
211 S_NeedyTemplate2<Template_Inline<SW_Movable> > b5;
212 S_NeedyTemplate2<Template_Inline<SWS_Movable> > b6;
214 S_NeedyTemplate2<Template_Unused<Movable> > c1;
215 S_NeedyTemplate2<Template_Unused<S_Movable> > c2;
216 S_NeedyTemplate2<Template_Unused<W_Movable> > c3;
217 S_NeedyTemplate2<Template_Unused<WS_Movable> > c4;
218 S_NeedyTemplate2<Template_Unused<SW_Movable> > c5;
219 S_NeedyTemplate2<Template_Unused<SWS_Movable> > c6;
220 S_NeedyTemplate2<Template_Unused<NonMovable> > c7;
221 S_NeedyTemplate2<Template_Unused<S_NonMovable> > c8;
222 S_NeedyTemplate2<Template_Unused<W_NonMovable> > c9;
223 S_NeedyTemplate2<Template_Unused<WS_NonMovable> > c10;
224 S_NeedyTemplate2<Template_Unused<SW_NonMovable> > c11;
225 S_NeedyTemplate2<Template_Unused<SWS_NonMovable> > c12;
227 S_NeedyTemplate2<Template_Ref<Movable> > d1;
228 S_NeedyTemplate2<Template_Ref<S_Movable> > d2;
229 S_NeedyTemplate2<Template_Ref<W_Movable> > d3;
230 S_NeedyTemplate2<Template_Ref<WS_Movable> > d4;
231 S_NeedyTemplate2<Template_Ref<SW_Movable> > d5;
232 S_NeedyTemplate2<Template_Ref<SWS_Movable> > d6;
233 S_NeedyTemplate2<Template_Ref<NonMovable> > d7;
234 S_NeedyTemplate2<Template_Ref<S_NonMovable> > d8;
235 S_NeedyTemplate2<Template_Ref<W_NonMovable> > d9;
236 S_NeedyTemplate2<Template_Ref<WS_NonMovable> > d10;
237 S_NeedyTemplate2<Template_Ref<SW_NonMovable> > d11;
238 S_NeedyTemplate2<Template_Ref<SWS_NonMovable> > d12;
242 // 3 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE
245 template <class T>
246 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate3 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate3<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
247 template <class T>
248 struct W_NeedyTemplate3 {
249 NeedyTemplate3<T> m; // expected-note-re 26 {{instantiation of 'NeedyTemplate3<{{.*}}>' requested here}}
251 void bad3() {
252 W_NeedyTemplate3<NonMovable> a1;
253 W_NeedyTemplate3<S_NonMovable> a2;
254 W_NeedyTemplate3<W_NonMovable> a3;
255 W_NeedyTemplate3<WS_NonMovable> a4;
256 W_NeedyTemplate3<SW_NonMovable> a5;
257 W_NeedyTemplate3<SWS_NonMovable> a6;
259 W_NeedyTemplate3<Template_Inline<NonMovable> > b1;
260 W_NeedyTemplate3<Template_Inline<S_NonMovable> > b2;
261 W_NeedyTemplate3<Template_Inline<W_NonMovable> > b3;
262 W_NeedyTemplate3<Template_Inline<WS_NonMovable> > b4;
263 W_NeedyTemplate3<Template_Inline<SW_NonMovable> > b5;
264 W_NeedyTemplate3<Template_Inline<SWS_NonMovable> > b6;
266 W_NeedyTemplate3<Template_NonMovable<NonMovable> > c1;
267 W_NeedyTemplate3<Template_NonMovable<S_NonMovable> > c2;
268 W_NeedyTemplate3<Template_NonMovable<W_NonMovable> > c3;
269 W_NeedyTemplate3<Template_NonMovable<WS_NonMovable> > c4;
270 W_NeedyTemplate3<Template_NonMovable<SW_NonMovable> > c5;
271 W_NeedyTemplate3<Template_NonMovable<SWS_NonMovable> > c6;
272 W_NeedyTemplate3<Template_NonMovable<Movable> > c7;
273 W_NeedyTemplate3<Template_NonMovable<S_Movable> > c8;
274 W_NeedyTemplate3<Template_NonMovable<W_Movable> > c9;
275 W_NeedyTemplate3<Template_NonMovable<WS_Movable> > c10;
276 W_NeedyTemplate3<Template_NonMovable<SW_Movable> > c11;
277 W_NeedyTemplate3<Template_NonMovable<SWS_Movable> > c12;
280 void good3() {
281 W_NeedyTemplate3<Movable> a1;
282 W_NeedyTemplate3<S_Movable> a2;
283 W_NeedyTemplate3<W_Movable> a3;
284 W_NeedyTemplate3<WS_Movable> a4;
285 W_NeedyTemplate3<SW_Movable> a5;
286 W_NeedyTemplate3<SWS_Movable> a6;
288 W_NeedyTemplate3<Template_Inline<Movable> > b1;
289 W_NeedyTemplate3<Template_Inline<S_Movable> > b2;
290 W_NeedyTemplate3<Template_Inline<W_Movable> > b3;
291 W_NeedyTemplate3<Template_Inline<WS_Movable> > b4;
292 W_NeedyTemplate3<Template_Inline<SW_Movable> > b5;
293 W_NeedyTemplate3<Template_Inline<SWS_Movable> > b6;
295 W_NeedyTemplate3<Template_Unused<Movable> > c1;
296 W_NeedyTemplate3<Template_Unused<S_Movable> > c2;
297 W_NeedyTemplate3<Template_Unused<W_Movable> > c3;
298 W_NeedyTemplate3<Template_Unused<WS_Movable> > c4;
299 W_NeedyTemplate3<Template_Unused<SW_Movable> > c5;
300 W_NeedyTemplate3<Template_Unused<SWS_Movable> > c6;
301 W_NeedyTemplate3<Template_Unused<NonMovable> > c7;
302 W_NeedyTemplate3<Template_Unused<S_NonMovable> > c8;
303 W_NeedyTemplate3<Template_Unused<W_NonMovable> > c9;
304 W_NeedyTemplate3<Template_Unused<WS_NonMovable> > c10;
305 W_NeedyTemplate3<Template_Unused<SW_NonMovable> > c11;
306 W_NeedyTemplate3<Template_Unused<SWS_NonMovable> > c12;
308 W_NeedyTemplate3<Template_Ref<Movable> > d1;
309 W_NeedyTemplate3<Template_Ref<S_Movable> > d2;
310 W_NeedyTemplate3<Template_Ref<W_Movable> > d3;
311 W_NeedyTemplate3<Template_Ref<WS_Movable> > d4;
312 W_NeedyTemplate3<Template_Ref<SW_Movable> > d5;
313 W_NeedyTemplate3<Template_Ref<SWS_Movable> > d6;
314 W_NeedyTemplate3<Template_Ref<NonMovable> > d7;
315 W_NeedyTemplate3<Template_Ref<S_NonMovable> > d8;
316 W_NeedyTemplate3<Template_Ref<W_NonMovable> > d9;
317 W_NeedyTemplate3<Template_Ref<WS_NonMovable> > d10;
318 W_NeedyTemplate3<Template_Ref<SW_NonMovable> > d11;
319 W_NeedyTemplate3<Template_Ref<SWS_NonMovable> > d12;
323 // 4 - Wrapped Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE
326 template <class T>
327 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate4 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate4<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
328 template <class T>
329 struct S_NeedyTemplate4 : NeedyTemplate4<T> {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate4<{{.*}}>' requested here}}
330 template <class T>
331 struct WS_NeedyTemplate4 {
332 S_NeedyTemplate4<T> m;
334 void bad4() {
335 WS_NeedyTemplate4<NonMovable> a1;
336 WS_NeedyTemplate4<S_NonMovable> a2;
337 WS_NeedyTemplate4<W_NonMovable> a3;
338 WS_NeedyTemplate4<WS_NonMovable> a4;
339 WS_NeedyTemplate4<SW_NonMovable> a5;
340 WS_NeedyTemplate4<SWS_NonMovable> a6;
342 WS_NeedyTemplate4<Template_Inline<NonMovable> > b1;
343 WS_NeedyTemplate4<Template_Inline<S_NonMovable> > b2;
344 WS_NeedyTemplate4<Template_Inline<W_NonMovable> > b3;
345 WS_NeedyTemplate4<Template_Inline<WS_NonMovable> > b4;
346 WS_NeedyTemplate4<Template_Inline<SW_NonMovable> > b5;
347 WS_NeedyTemplate4<Template_Inline<SWS_NonMovable> > b6;
349 WS_NeedyTemplate4<Template_NonMovable<NonMovable> > c1;
350 WS_NeedyTemplate4<Template_NonMovable<S_NonMovable> > c2;
351 WS_NeedyTemplate4<Template_NonMovable<W_NonMovable> > c3;
352 WS_NeedyTemplate4<Template_NonMovable<WS_NonMovable> > c4;
353 WS_NeedyTemplate4<Template_NonMovable<SW_NonMovable> > c5;
354 WS_NeedyTemplate4<Template_NonMovable<SWS_NonMovable> > c6;
355 WS_NeedyTemplate4<Template_NonMovable<Movable> > c7;
356 WS_NeedyTemplate4<Template_NonMovable<S_Movable> > c8;
357 WS_NeedyTemplate4<Template_NonMovable<W_Movable> > c9;
358 WS_NeedyTemplate4<Template_NonMovable<WS_Movable> > c10;
359 WS_NeedyTemplate4<Template_NonMovable<SW_Movable> > c11;
360 WS_NeedyTemplate4<Template_NonMovable<SWS_Movable> > c12;
363 void good4() {
364 WS_NeedyTemplate4<Movable> a1;
365 WS_NeedyTemplate4<S_Movable> a2;
366 WS_NeedyTemplate4<W_Movable> a3;
367 WS_NeedyTemplate4<WS_Movable> a4;
368 WS_NeedyTemplate4<SW_Movable> a5;
369 WS_NeedyTemplate4<SWS_Movable> a6;
371 WS_NeedyTemplate4<Template_Inline<Movable> > b1;
372 WS_NeedyTemplate4<Template_Inline<S_Movable> > b2;
373 WS_NeedyTemplate4<Template_Inline<W_Movable> > b3;
374 WS_NeedyTemplate4<Template_Inline<WS_Movable> > b4;
375 WS_NeedyTemplate4<Template_Inline<SW_Movable> > b5;
376 WS_NeedyTemplate4<Template_Inline<SWS_Movable> > b6;
378 WS_NeedyTemplate4<Template_Unused<Movable> > c1;
379 WS_NeedyTemplate4<Template_Unused<S_Movable> > c2;
380 WS_NeedyTemplate4<Template_Unused<W_Movable> > c3;
381 WS_NeedyTemplate4<Template_Unused<WS_Movable> > c4;
382 WS_NeedyTemplate4<Template_Unused<SW_Movable> > c5;
383 WS_NeedyTemplate4<Template_Unused<SWS_Movable> > c6;
384 WS_NeedyTemplate4<Template_Unused<NonMovable> > c7;
385 WS_NeedyTemplate4<Template_Unused<S_NonMovable> > c8;
386 WS_NeedyTemplate4<Template_Unused<W_NonMovable> > c9;
387 WS_NeedyTemplate4<Template_Unused<WS_NonMovable> > c10;
388 WS_NeedyTemplate4<Template_Unused<SW_NonMovable> > c11;
389 WS_NeedyTemplate4<Template_Unused<SWS_NonMovable> > c12;
391 WS_NeedyTemplate4<Template_Ref<Movable> > d1;
392 WS_NeedyTemplate4<Template_Ref<S_Movable> > d2;
393 WS_NeedyTemplate4<Template_Ref<W_Movable> > d3;
394 WS_NeedyTemplate4<Template_Ref<WS_Movable> > d4;
395 WS_NeedyTemplate4<Template_Ref<SW_Movable> > d5;
396 WS_NeedyTemplate4<Template_Ref<SWS_Movable> > d6;
397 WS_NeedyTemplate4<Template_Ref<NonMovable> > d7;
398 WS_NeedyTemplate4<Template_Ref<S_NonMovable> > d8;
399 WS_NeedyTemplate4<Template_Ref<W_NonMovable> > d9;
400 WS_NeedyTemplate4<Template_Ref<WS_NonMovable> > d10;
401 WS_NeedyTemplate4<Template_Ref<SW_NonMovable> > d11;
402 WS_NeedyTemplate4<Template_Ref<SWS_NonMovable> > d12;
406 // 5 - Subclassed Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE
409 template <class T>
410 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate5 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate5<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
411 template <class T>
412 struct W_NeedyTemplate5 {
413 NeedyTemplate5<T> m; // expected-note-re 26 {{instantiation of 'NeedyTemplate5<{{.*}}>' requested here}}
415 template <class T>
416 struct SW_NeedyTemplate5 : W_NeedyTemplate5<T> {};
417 void bad5() {
418 SW_NeedyTemplate5<NonMovable> a1;
419 SW_NeedyTemplate5<S_NonMovable> a2;
420 SW_NeedyTemplate5<W_NonMovable> a3;
421 SW_NeedyTemplate5<WS_NonMovable> a4;
422 SW_NeedyTemplate5<SW_NonMovable> a5;
423 SW_NeedyTemplate5<SWS_NonMovable> a6;
425 SW_NeedyTemplate5<Template_Inline<NonMovable> > b1;
426 SW_NeedyTemplate5<Template_Inline<S_NonMovable> > b2;
427 SW_NeedyTemplate5<Template_Inline<W_NonMovable> > b3;
428 SW_NeedyTemplate5<Template_Inline<WS_NonMovable> > b4;
429 SW_NeedyTemplate5<Template_Inline<SW_NonMovable> > b5;
430 SW_NeedyTemplate5<Template_Inline<SWS_NonMovable> > b6;
432 SW_NeedyTemplate5<Template_NonMovable<NonMovable> > c1;
433 SW_NeedyTemplate5<Template_NonMovable<S_NonMovable> > c2;
434 SW_NeedyTemplate5<Template_NonMovable<W_NonMovable> > c3;
435 SW_NeedyTemplate5<Template_NonMovable<WS_NonMovable> > c4;
436 SW_NeedyTemplate5<Template_NonMovable<SW_NonMovable> > c5;
437 SW_NeedyTemplate5<Template_NonMovable<SWS_NonMovable> > c6;
438 SW_NeedyTemplate5<Template_NonMovable<Movable> > c7;
439 SW_NeedyTemplate5<Template_NonMovable<S_Movable> > c8;
440 SW_NeedyTemplate5<Template_NonMovable<W_Movable> > c9;
441 SW_NeedyTemplate5<Template_NonMovable<WS_Movable> > c10;
442 SW_NeedyTemplate5<Template_NonMovable<SW_Movable> > c11;
443 SW_NeedyTemplate5<Template_NonMovable<SWS_Movable> > c12;
446 void good5() {
447 SW_NeedyTemplate5<Movable> a1;
448 SW_NeedyTemplate5<S_Movable> a2;
449 SW_NeedyTemplate5<W_Movable> a3;
450 SW_NeedyTemplate5<WS_Movable> a4;
451 SW_NeedyTemplate5<SW_Movable> a5;
452 SW_NeedyTemplate5<SWS_Movable> a6;
454 SW_NeedyTemplate5<Template_Inline<Movable> > b1;
455 SW_NeedyTemplate5<Template_Inline<S_Movable> > b2;
456 SW_NeedyTemplate5<Template_Inline<W_Movable> > b3;
457 SW_NeedyTemplate5<Template_Inline<WS_Movable> > b4;
458 SW_NeedyTemplate5<Template_Inline<SW_Movable> > b5;
459 SW_NeedyTemplate5<Template_Inline<SWS_Movable> > b6;
461 SW_NeedyTemplate5<Template_Unused<Movable> > c1;
462 SW_NeedyTemplate5<Template_Unused<S_Movable> > c2;
463 SW_NeedyTemplate5<Template_Unused<W_Movable> > c3;
464 SW_NeedyTemplate5<Template_Unused<WS_Movable> > c4;
465 SW_NeedyTemplate5<Template_Unused<SW_Movable> > c5;
466 SW_NeedyTemplate5<Template_Unused<SWS_Movable> > c6;
467 SW_NeedyTemplate5<Template_Unused<NonMovable> > c7;
468 SW_NeedyTemplate5<Template_Unused<S_NonMovable> > c8;
469 SW_NeedyTemplate5<Template_Unused<W_NonMovable> > c9;
470 SW_NeedyTemplate5<Template_Unused<WS_NonMovable> > c10;
471 SW_NeedyTemplate5<Template_Unused<SW_NonMovable> > c11;
472 SW_NeedyTemplate5<Template_Unused<SWS_NonMovable> > c12;
474 SW_NeedyTemplate5<Template_Ref<Movable> > d1;
475 SW_NeedyTemplate5<Template_Ref<S_Movable> > d2;
476 SW_NeedyTemplate5<Template_Ref<W_Movable> > d3;
477 SW_NeedyTemplate5<Template_Ref<WS_Movable> > d4;
478 SW_NeedyTemplate5<Template_Ref<SW_Movable> > d5;
479 SW_NeedyTemplate5<Template_Ref<SWS_Movable> > d6;
480 SW_NeedyTemplate5<Template_Ref<NonMovable> > d7;
481 SW_NeedyTemplate5<Template_Ref<S_NonMovable> > d8;
482 SW_NeedyTemplate5<Template_Ref<W_NonMovable> > d9;
483 SW_NeedyTemplate5<Template_Ref<WS_NonMovable> > d10;
484 SW_NeedyTemplate5<Template_Ref<SW_NonMovable> > d11;
485 SW_NeedyTemplate5<Template_Ref<SWS_NonMovable> > d12;
489 // 6 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated with default template argument
491 // Note: This has an extra error, because it also includes a test with the default template argument.
494 template <class T>
495 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate6 {T m;}; // expected-error-re 27 {{Cannot instantiate 'NeedyTemplate6<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
496 template <class T>
497 struct W_NeedyTemplate6 {
498 NeedyTemplate6<T> m; // expected-note-re 27 {{instantiation of 'NeedyTemplate6<{{.*}}>' requested here}}
500 template <class T>
501 struct SW_NeedyTemplate6 : W_NeedyTemplate6<T> {};
502 // We create a different NonMovable type here, as NeedyTemplate6 will already be instantiated with NonMovable
503 struct MOZ_NON_MEMMOVABLE NonMovable2 {};
504 template <class T = NonMovable2>
505 struct Defaulted_SW_NeedyTemplate6 {
506 SW_NeedyTemplate6<T> m;
508 void bad6() {
509 Defaulted_SW_NeedyTemplate6<NonMovable> a1;
510 Defaulted_SW_NeedyTemplate6<S_NonMovable> a2;
511 Defaulted_SW_NeedyTemplate6<W_NonMovable> a3;
512 Defaulted_SW_NeedyTemplate6<WS_NonMovable> a4;
513 Defaulted_SW_NeedyTemplate6<SW_NonMovable> a5;
514 Defaulted_SW_NeedyTemplate6<SWS_NonMovable> a6;
516 Defaulted_SW_NeedyTemplate6<Template_Inline<NonMovable> > b1;
517 Defaulted_SW_NeedyTemplate6<Template_Inline<S_NonMovable> > b2;
518 Defaulted_SW_NeedyTemplate6<Template_Inline<W_NonMovable> > b3;
519 Defaulted_SW_NeedyTemplate6<Template_Inline<WS_NonMovable> > b4;
520 Defaulted_SW_NeedyTemplate6<Template_Inline<SW_NonMovable> > b5;
521 Defaulted_SW_NeedyTemplate6<Template_Inline<SWS_NonMovable> > b6;
523 Defaulted_SW_NeedyTemplate6<Template_NonMovable<NonMovable> > c1;
524 Defaulted_SW_NeedyTemplate6<Template_NonMovable<S_NonMovable> > c2;
525 Defaulted_SW_NeedyTemplate6<Template_NonMovable<W_NonMovable> > c3;
526 Defaulted_SW_NeedyTemplate6<Template_NonMovable<WS_NonMovable> > c4;
527 Defaulted_SW_NeedyTemplate6<Template_NonMovable<SW_NonMovable> > c5;
528 Defaulted_SW_NeedyTemplate6<Template_NonMovable<SWS_NonMovable> > c6;
529 Defaulted_SW_NeedyTemplate6<Template_NonMovable<Movable> > c7;
530 Defaulted_SW_NeedyTemplate6<Template_NonMovable<S_Movable> > c8;
531 Defaulted_SW_NeedyTemplate6<Template_NonMovable<W_Movable> > c9;
532 Defaulted_SW_NeedyTemplate6<Template_NonMovable<WS_Movable> > c10;
533 Defaulted_SW_NeedyTemplate6<Template_NonMovable<SW_Movable> > c11;
534 Defaulted_SW_NeedyTemplate6<Template_NonMovable<SWS_Movable> > c12;
536 Defaulted_SW_NeedyTemplate6<> c13;
539 void good6() {
540 Defaulted_SW_NeedyTemplate6<Movable> a1;
541 Defaulted_SW_NeedyTemplate6<S_Movable> a2;
542 Defaulted_SW_NeedyTemplate6<W_Movable> a3;
543 Defaulted_SW_NeedyTemplate6<WS_Movable> a4;
544 Defaulted_SW_NeedyTemplate6<SW_Movable> a5;
545 Defaulted_SW_NeedyTemplate6<SWS_Movable> a6;
547 Defaulted_SW_NeedyTemplate6<Template_Inline<Movable> > b1;
548 Defaulted_SW_NeedyTemplate6<Template_Inline<S_Movable> > b2;
549 Defaulted_SW_NeedyTemplate6<Template_Inline<W_Movable> > b3;
550 Defaulted_SW_NeedyTemplate6<Template_Inline<WS_Movable> > b4;
551 Defaulted_SW_NeedyTemplate6<Template_Inline<SW_Movable> > b5;
552 Defaulted_SW_NeedyTemplate6<Template_Inline<SWS_Movable> > b6;
554 Defaulted_SW_NeedyTemplate6<Template_Unused<Movable> > c1;
555 Defaulted_SW_NeedyTemplate6<Template_Unused<S_Movable> > c2;
556 Defaulted_SW_NeedyTemplate6<Template_Unused<W_Movable> > c3;
557 Defaulted_SW_NeedyTemplate6<Template_Unused<WS_Movable> > c4;
558 Defaulted_SW_NeedyTemplate6<Template_Unused<SW_Movable> > c5;
559 Defaulted_SW_NeedyTemplate6<Template_Unused<SWS_Movable> > c6;
560 Defaulted_SW_NeedyTemplate6<Template_Unused<NonMovable> > c7;
561 Defaulted_SW_NeedyTemplate6<Template_Unused<S_NonMovable> > c8;
562 Defaulted_SW_NeedyTemplate6<Template_Unused<W_NonMovable> > c9;
563 Defaulted_SW_NeedyTemplate6<Template_Unused<WS_NonMovable> > c10;
564 Defaulted_SW_NeedyTemplate6<Template_Unused<SW_NonMovable> > c11;
565 Defaulted_SW_NeedyTemplate6<Template_Unused<SWS_NonMovable> > c12;
567 Defaulted_SW_NeedyTemplate6<Template_Ref<Movable> > d1;
568 Defaulted_SW_NeedyTemplate6<Template_Ref<S_Movable> > d2;
569 Defaulted_SW_NeedyTemplate6<Template_Ref<W_Movable> > d3;
570 Defaulted_SW_NeedyTemplate6<Template_Ref<WS_Movable> > d4;
571 Defaulted_SW_NeedyTemplate6<Template_Ref<SW_Movable> > d5;
572 Defaulted_SW_NeedyTemplate6<Template_Ref<SWS_Movable> > d6;
573 Defaulted_SW_NeedyTemplate6<Template_Ref<NonMovable> > d7;
574 Defaulted_SW_NeedyTemplate6<Template_Ref<S_NonMovable> > d8;
575 Defaulted_SW_NeedyTemplate6<Template_Ref<W_NonMovable> > d9;
576 Defaulted_SW_NeedyTemplate6<Template_Ref<WS_NonMovable> > d10;
577 Defaulted_SW_NeedyTemplate6<Template_Ref<SW_NonMovable> > d11;
578 Defaulted_SW_NeedyTemplate6<Template_Ref<SWS_NonMovable> > d12;
582 // 7 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument
585 template <class T>
586 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate7 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate7<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
587 template <class T, class Q = NeedyTemplate7<T> >
588 struct Defaulted_Templated_NeedyTemplate7 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate7<{{.*}}>' requested here}}
589 void bad7() {
590 Defaulted_Templated_NeedyTemplate7<NonMovable> a1;
591 Defaulted_Templated_NeedyTemplate7<S_NonMovable> a2;
592 Defaulted_Templated_NeedyTemplate7<W_NonMovable> a3;
593 Defaulted_Templated_NeedyTemplate7<WS_NonMovable> a4;
594 Defaulted_Templated_NeedyTemplate7<SW_NonMovable> a5;
595 Defaulted_Templated_NeedyTemplate7<SWS_NonMovable> a6;
597 Defaulted_Templated_NeedyTemplate7<Template_Inline<NonMovable> > b1;
598 Defaulted_Templated_NeedyTemplate7<Template_Inline<S_NonMovable> > b2;
599 Defaulted_Templated_NeedyTemplate7<Template_Inline<W_NonMovable> > b3;
600 Defaulted_Templated_NeedyTemplate7<Template_Inline<WS_NonMovable> > b4;
601 Defaulted_Templated_NeedyTemplate7<Template_Inline<SW_NonMovable> > b5;
602 Defaulted_Templated_NeedyTemplate7<Template_Inline<SWS_NonMovable> > b6;
604 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<NonMovable> > c1;
605 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<S_NonMovable> > c2;
606 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<W_NonMovable> > c3;
607 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<WS_NonMovable> > c4;
608 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SW_NonMovable> > c5;
609 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SWS_NonMovable> > c6;
610 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<Movable> > c7;
611 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<S_Movable> > c8;
612 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<W_Movable> > c9;
613 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<WS_Movable> > c10;
614 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SW_Movable> > c11;
615 Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SWS_Movable> > c12;
618 void good7() {
619 Defaulted_Templated_NeedyTemplate7<Movable> a1;
620 Defaulted_Templated_NeedyTemplate7<S_Movable> a2;
621 Defaulted_Templated_NeedyTemplate7<W_Movable> a3;
622 Defaulted_Templated_NeedyTemplate7<WS_Movable> a4;
623 Defaulted_Templated_NeedyTemplate7<SW_Movable> a5;
624 Defaulted_Templated_NeedyTemplate7<SWS_Movable> a6;
626 Defaulted_Templated_NeedyTemplate7<Template_Inline<Movable> > b1;
627 Defaulted_Templated_NeedyTemplate7<Template_Inline<S_Movable> > b2;
628 Defaulted_Templated_NeedyTemplate7<Template_Inline<W_Movable> > b3;
629 Defaulted_Templated_NeedyTemplate7<Template_Inline<WS_Movable> > b4;
630 Defaulted_Templated_NeedyTemplate7<Template_Inline<SW_Movable> > b5;
631 Defaulted_Templated_NeedyTemplate7<Template_Inline<SWS_Movable> > b6;
633 Defaulted_Templated_NeedyTemplate7<Template_Unused<Movable> > c1;
634 Defaulted_Templated_NeedyTemplate7<Template_Unused<S_Movable> > c2;
635 Defaulted_Templated_NeedyTemplate7<Template_Unused<W_Movable> > c3;
636 Defaulted_Templated_NeedyTemplate7<Template_Unused<WS_Movable> > c4;
637 Defaulted_Templated_NeedyTemplate7<Template_Unused<SW_Movable> > c5;
638 Defaulted_Templated_NeedyTemplate7<Template_Unused<SWS_Movable> > c6;
639 Defaulted_Templated_NeedyTemplate7<Template_Unused<NonMovable> > c7;
640 Defaulted_Templated_NeedyTemplate7<Template_Unused<S_NonMovable> > c8;
641 Defaulted_Templated_NeedyTemplate7<Template_Unused<W_NonMovable> > c9;
642 Defaulted_Templated_NeedyTemplate7<Template_Unused<WS_NonMovable> > c10;
643 Defaulted_Templated_NeedyTemplate7<Template_Unused<SW_NonMovable> > c11;
644 Defaulted_Templated_NeedyTemplate7<Template_Unused<SWS_NonMovable> > c12;
646 Defaulted_Templated_NeedyTemplate7<Template_Ref<Movable> > d1;
647 Defaulted_Templated_NeedyTemplate7<Template_Ref<S_Movable> > d2;
648 Defaulted_Templated_NeedyTemplate7<Template_Ref<W_Movable> > d3;
649 Defaulted_Templated_NeedyTemplate7<Template_Ref<WS_Movable> > d4;
650 Defaulted_Templated_NeedyTemplate7<Template_Ref<SW_Movable> > d5;
651 Defaulted_Templated_NeedyTemplate7<Template_Ref<SWS_Movable> > d6;
652 Defaulted_Templated_NeedyTemplate7<Template_Ref<NonMovable> > d7;
653 Defaulted_Templated_NeedyTemplate7<Template_Ref<S_NonMovable> > d8;
654 Defaulted_Templated_NeedyTemplate7<Template_Ref<W_NonMovable> > d9;
655 Defaulted_Templated_NeedyTemplate7<Template_Ref<WS_NonMovable> > d10;
656 Defaulted_Templated_NeedyTemplate7<Template_Ref<SW_NonMovable> > d11;
657 Defaulted_Templated_NeedyTemplate7<Template_Ref<SWS_NonMovable> > d12;
661 // 8 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument
664 template <class T>
665 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate8 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate8<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
666 template <class T, class Q = NeedyTemplate8<T> >
667 struct Defaulted_Templated_NeedyTemplate8 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate8<{{.*}}>' requested here}}
668 template <class T>
669 struct W_Defaulted_Templated_NeedyTemplate8 {
670 Defaulted_Templated_NeedyTemplate8<T> m;
672 void bad8() {
673 W_Defaulted_Templated_NeedyTemplate8<NonMovable> a1;
674 W_Defaulted_Templated_NeedyTemplate8<S_NonMovable> a2;
675 W_Defaulted_Templated_NeedyTemplate8<W_NonMovable> a3;
676 W_Defaulted_Templated_NeedyTemplate8<WS_NonMovable> a4;
677 W_Defaulted_Templated_NeedyTemplate8<SW_NonMovable> a5;
678 W_Defaulted_Templated_NeedyTemplate8<SWS_NonMovable> a6;
680 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<NonMovable> > b1;
681 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<S_NonMovable> > b2;
682 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<W_NonMovable> > b3;
683 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<WS_NonMovable> > b4;
684 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SW_NonMovable> > b5;
685 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SWS_NonMovable> > b6;
687 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<NonMovable> > c1;
688 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<S_NonMovable> > c2;
689 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<W_NonMovable> > c3;
690 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<WS_NonMovable> > c4;
691 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SW_NonMovable> > c5;
692 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SWS_NonMovable> > c6;
693 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<Movable> > c7;
694 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<S_Movable> > c8;
695 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<W_Movable> > c9;
696 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<WS_Movable> > c10;
697 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SW_Movable> > c11;
698 W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SWS_Movable> > c12;
701 void good8() {
702 W_Defaulted_Templated_NeedyTemplate8<Movable> a1;
703 W_Defaulted_Templated_NeedyTemplate8<S_Movable> a2;
704 W_Defaulted_Templated_NeedyTemplate8<W_Movable> a3;
705 W_Defaulted_Templated_NeedyTemplate8<WS_Movable> a4;
706 W_Defaulted_Templated_NeedyTemplate8<SW_Movable> a5;
707 W_Defaulted_Templated_NeedyTemplate8<SWS_Movable> a6;
709 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<Movable> > b1;
710 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<S_Movable> > b2;
711 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<W_Movable> > b3;
712 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<WS_Movable> > b4;
713 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SW_Movable> > b5;
714 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SWS_Movable> > b6;
716 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<Movable> > c1;
717 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<S_Movable> > c2;
718 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<W_Movable> > c3;
719 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<WS_Movable> > c4;
720 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SW_Movable> > c5;
721 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SWS_Movable> > c6;
722 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<NonMovable> > c7;
723 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<S_NonMovable> > c8;
724 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<W_NonMovable> > c9;
725 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<WS_NonMovable> > c10;
726 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SW_NonMovable> > c11;
727 W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SWS_NonMovable> > c12;
729 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<Movable> > d1;
730 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<S_Movable> > d2;
731 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<W_Movable> > d3;
732 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<WS_Movable> > d4;
733 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SW_Movable> > d5;
734 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SWS_Movable> > d6;
735 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<NonMovable> > d7;
736 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<S_NonMovable> > d8;
737 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<W_NonMovable> > d9;
738 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<WS_NonMovable> > d10;
739 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SW_NonMovable> > d11;
740 W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SWS_NonMovable> > d12;
744 SpecializedNonMovable is a non-movable class which has an explicit specialization of NeedyTemplate
745 for it. Instantiations of NeedyTemplateN<SpecializedNonMovable> should be legal as the explicit
746 specialization isn't annotated with MOZ_NEEDS_MEMMOVABLE_TYPE.
748 However, as it is MOZ_NON_MEMMOVABLE, derived classes and members shouldn't be able to be used to
749 instantiate NeedyTemplate.
752 struct MOZ_NON_MEMMOVABLE SpecializedNonMovable {};
753 struct S_SpecializedNonMovable : SpecializedNonMovable {}; // expected-note 8 {{'S_SpecializedNonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'SpecializedNonMovable'}}
755 // Specialize all of the NeedyTemplates with SpecializedNonMovable.
756 template <>
757 struct NeedyTemplate1<SpecializedNonMovable> {};
758 template <>
759 struct NeedyTemplate2<SpecializedNonMovable> {};
760 template <>
761 struct NeedyTemplate3<SpecializedNonMovable> {};
762 template <>
763 struct NeedyTemplate4<SpecializedNonMovable> {};
764 template <>
765 struct NeedyTemplate5<SpecializedNonMovable> {};
766 template <>
767 struct NeedyTemplate6<SpecializedNonMovable> {};
768 template <>
769 struct NeedyTemplate7<SpecializedNonMovable> {};
770 template <>
771 struct NeedyTemplate8<SpecializedNonMovable> {};
773 void specialization() {
775 SpecializedNonMovable has a specialization for every variant of NeedyTemplate,
776 so these templates are valid, even though SpecializedNonMovable isn't
777 memmovable
779 NeedyTemplate1<SpecializedNonMovable> a1;
780 S_NeedyTemplate2<SpecializedNonMovable> a2;
781 W_NeedyTemplate3<SpecializedNonMovable> a3;
782 WS_NeedyTemplate4<SpecializedNonMovable> a4;
783 SW_NeedyTemplate5<SpecializedNonMovable> a5;
784 Defaulted_SW_NeedyTemplate6<SpecializedNonMovable> a6;
785 Defaulted_Templated_NeedyTemplate7<SpecializedNonMovable> a7;
786 W_Defaulted_Templated_NeedyTemplate8<SpecializedNonMovable> a8;
789 These entries contain an element which is SpecializedNonMovable, and are non-movable
790 as there is no valid specialization, and their member is non-memmovable
792 NeedyTemplate1<Template_Inline<SpecializedNonMovable> > b1; // expected-note-re {{instantiation of 'NeedyTemplate1<Template_Inline<SpecializedNonMovable>{{ ?}}>' requested here}}
793 S_NeedyTemplate2<Template_Inline<SpecializedNonMovable> > b2;
794 W_NeedyTemplate3<Template_Inline<SpecializedNonMovable> > b3;
795 WS_NeedyTemplate4<Template_Inline<SpecializedNonMovable> > b4;
796 SW_NeedyTemplate5<Template_Inline<SpecializedNonMovable> > b5;
797 Defaulted_SW_NeedyTemplate6<Template_Inline<SpecializedNonMovable> > b6;
798 Defaulted_Templated_NeedyTemplate7<Template_Inline<SpecializedNonMovable> > b7;
799 W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SpecializedNonMovable> > b8;
802 The subclass of SpecializedNonMovable, is also non-memmovable,
803 as there is no valid specialization.
805 NeedyTemplate1<S_SpecializedNonMovable> c1; // expected-note {{instantiation of 'NeedyTemplate1<S_SpecializedNonMovable>' requested here}}
806 S_NeedyTemplate2<S_SpecializedNonMovable> c2;
807 W_NeedyTemplate3<S_SpecializedNonMovable> c3;
808 WS_NeedyTemplate4<S_SpecializedNonMovable> c4;
809 SW_NeedyTemplate5<S_SpecializedNonMovable> c5;
810 Defaulted_SW_NeedyTemplate6<S_SpecializedNonMovable> c6;
811 Defaulted_Templated_NeedyTemplate7<S_SpecializedNonMovable> c7;
812 W_Defaulted_Templated_NeedyTemplate8<S_SpecializedNonMovable> c8;
815 class MOZ_NEEDS_MEMMOVABLE_MEMBERS NeedsMemMovableMembers {
816 Movable m1;
817 NonMovable m2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'm2' of type 'NonMovable'}}
818 S_Movable sm1;
819 S_NonMovable sm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'sm2' of type 'S_NonMovable'}}
820 W_Movable wm1;
821 W_NonMovable wm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'wm2' of type 'W_NonMovable'}}
822 SW_Movable swm1;
823 SW_NonMovable swm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'swm2' of type 'SW_NonMovable'}}
824 WS_Movable wsm1;
825 WS_NonMovable wsm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'wsm2' of type 'WS_NonMovable'}}
826 SWS_Movable swsm1;
827 SWS_NonMovable swsm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'swsm2' of type 'SWS_NonMovable'}}
830 class NeedsMemMovableMembersDerived : public NeedsMemMovableMembers {};