1 // RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s
2 // RUN: not %clang_cc1 -std=gnu++11 -ast-dump %s | FileCheck %s
3
4 namespace attribute_aligned {
5 template<int N>
6 struct X {
7 char c[1] __attribute__((__aligned__((N)))); // expected-error {{alignment is not a power of 2}}
8 };
9
10 template <bool X> struct check {
11 int check_failed[X ? 1 : -1]; // expected-error {{array with a negative size}}
12 };
13
14 template <int N> struct check_alignment {
15 typedef check<N == sizeof(X<N>)> t; // expected-note {{in instantiation}}
16 };
17
18 check_alignment<1>::t c1;
19 check_alignment<2>::t c2;
20 check_alignment<3>::t c3; // expected-note 2 {{in instantiation}}
21 check_alignment<4>::t c4;
22
23 template<unsigned Size, unsigned Align>
24 class my_aligned_storage
25 {
26 __attribute__((aligned(Align))) char storage[Size];
27 };
28
29 template<typename T>
30 class C {
31 public:
C()32 C() {
33 static_assert(sizeof(t) == sizeof(T), "my_aligned_storage size wrong");
34 static_assert(alignof(t) == alignof(T), "my_aligned_storage align wrong"); // expected-warning{{'alignof' applied to an expression is a GNU extension}}
35 }
36
37 private:
38 my_aligned_storage<sizeof(T), alignof(T)> t;
39 };
40
41 C<double> cd;
42 }
43
44 namespace PR9049 {
45 extern const void *CFRetain(const void *ref);
46
47 template<typename T> __attribute__((cf_returns_retained))
WBCFRetain(T aValue)48 inline T WBCFRetain(T aValue) { return aValue ? (T)CFRetain(aValue) : (T)0; }
49
50
51 extern void CFRelease(const void *ref);
52
53 template<typename T>
WBCFRelease(T aValue)54 inline void WBCFRelease(__attribute__((cf_consumed)) T aValue) { if(aValue) CFRelease(aValue); }
55 }
56
57 namespace attribute_annotate {
58 // CHECK: FunctionTemplateDecl {{.*}} HasAnnotations
59 // CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO"
60 // CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR"
61 // CHECK: FunctionDecl {{.*}} HasAnnotations
62 // CHECK: TemplateArgument type 'int'
63 // CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO"
64 // CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR"
65 template<typename T> [[clang::annotate("ANNOTATE_FOO"), clang::annotate("ANNOTATE_BAR")]] void HasAnnotations();
UseAnnotations()66 void UseAnnotations() { HasAnnotations<int>(); }
67
68 // CHECK: FunctionTemplateDecl {{.*}} HasPackAnnotations
69 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
70 // CHECK-NEXT: FunctionDecl {{.*}} HasPackAnnotations 'void ()'
71 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BAZ"
72 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
73 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
74 // CHECK-NEXT: FunctionDecl {{.*}} used HasPackAnnotations 'void ()'
75 // CHECK-NEXT: TemplateArgument{{.*}} pack
76 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
77 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
78 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
79 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BAZ"
80 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
81 // CHECK-NEXT: value: Int 1
82 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
83 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
84 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1
85 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
86 // CHECK-NEXT: value: Int 2
87 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
88 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
89 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2
90 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
91 // CHECK-NEXT: value: Int 3
92 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
93 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
94 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3
95 template <int... Is> [[clang::annotate("ANNOTATE_BAZ", Is...)]] void HasPackAnnotations();
UsePackAnnotations()96 void UsePackAnnotations() { HasPackAnnotations<1, 2, 3>(); }
97
HasOnlyPackAnnotation()98 template <int... Is> [[clang::annotate(Is...)]] void HasOnlyPackAnnotation() {} // expected-error {{'annotate' attribute takes at least 1 argument}} expected-error {{'annotate' attribute requires a string}}
99
UseOnlyPackAnnotations()100 void UseOnlyPackAnnotations() {
101 HasOnlyPackAnnotation<>(); // expected-note {{in instantiation of function template specialization 'attribute_annotate::HasOnlyPackAnnotation<>' requested here}}
102 HasOnlyPackAnnotation<1>(); // expected-note {{in instantiation of function template specialization 'attribute_annotate::HasOnlyPackAnnotation<1>' requested here}}
103 }
104
105 // CHECK: ClassTemplateDecl {{.*}} AnnotatedPackTemplateStruct
106 // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T
107 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is
108 // CHECK-NEXT: CXXRecordDecl {{.*}} struct AnnotatedPackTemplateStruct definition
109 // CHECK-NEXT: DefinitionData
110 // CHECK-NEXT: DefaultConstructor
111 // CHECK-NEXT: CopyConstructor
112 // CHECK-NEXT: MoveConstructor
113 // CHECK-NEXT: CopyAssignment
114 // CHECK-NEXT: MoveAssignment
115 // CHECK-NEXT: Destructor
116 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"
117 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
118 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
119 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
120 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
121 // CHECK-NEXT: DefinitionData
122 // CHECK-NEXT: DefaultConstructor
123 // CHECK-NEXT: CopyConstructor
124 // CHECK-NEXT: MoveConstructor
125 // CHECK-NEXT: CopyAssignment
126 // CHECK-NEXT: MoveAssignment
127 // CHECK-NEXT: Destructor
128 // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
129 // CHECK-NEXT: BuiltinType {{.*}} 'int'
130 // CHECK-NEXT: TemplateArgument{{.*}} pack
131 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
132 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
133 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
134 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOO"
135 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
136 // CHECK-NEXT: value: Int 1
137 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
138 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
139 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1
140 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
141 // CHECK-NEXT: value: Int 2
142 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
143 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
144 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2
145 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
146 // CHECK-NEXT: value: Int 3
147 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
148 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
149 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3
150 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
151 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
152 // CHECK-NEXT: DefinitionData
153 // CHECK-NEXT: DefaultConstructor
154 // CHECK-NEXT: CopyConstructor
155 // CHECK-NEXT: MoveConstructor
156 // CHECK-NEXT: CopyAssignment
157 // CHECK-NEXT: MoveAssignment
158 // CHECK-NEXT: Destructor
159 // CHECK-NEXT: TemplateArgument type 'float'
160 // CHECK-NEXT: BuiltinType {{.*}} 'float'
161 // CHECK-NEXT: TemplateArgument{{.*}} pack
162 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
163 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
164 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
165 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"
166 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
167 // CHECK-NEXT: value: Int 4
168 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
169 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
170 // CHECK-NEXT: value: Int 5
171 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
172 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
173 // CHECK-NEXT: value: Int 6
174 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6
175 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
176 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
177 // CHECK-NEXT: DefinitionData
178 // CHECK-NEXT: DefaultConstructor
179 // CHECK-NEXT: CopyConstructor
180 // CHECK-NEXT: MoveConstructor
181 // CHECK-NEXT: CopyAssignment
182 // CHECK-NEXT: MoveAssignment
183 // CHECK-NEXT: Destructor
184 // CHECK-NEXT: TemplateArgument type 'bool'
185 // CHECK-NEXT: BuiltinType {{.*}} 'bool'
186 // CHECK-NEXT: TemplateArgument{{.*}} pack
187 // CHECK-NEXT: TemplateArgument{{.*}} integral 7
188 // CHECK-NEXT: TemplateArgument{{.*}} integral 8
189 // CHECK-NEXT: TemplateArgument{{.*}} integral 9
190 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"
191 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
192 // CHECK-NEXT: value: Int 7
193 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
194 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is
195 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 7
196 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
197 // CHECK-NEXT: value: Int 8
198 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
199 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is
200 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 8
201 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
202 // CHECK-NEXT: value: Int 9
203 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
204 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is
205 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 9
206 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
207 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
208 // CHECK-NEXT: DefinitionData
209 // CHECK-NEXT: DefaultConstructor
210 // CHECK-NEXT: CopyConstructor
211 // CHECK-NEXT: MoveConstructor
212 // CHECK-NEXT: CopyAssignment
213 // CHECK-NEXT: MoveAssignment
214 // CHECK-NEXT: Destructor
215 // CHECK-NEXT: TemplateArgument type 'char'
216 // CHECK-NEXT: BuiltinType {{.*}} 'char'
217 // CHECK-NEXT: TemplateArgument{{.*}} pack
218 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
219 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
220 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
221 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
222 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
223 // CHECK-NEXT: DefinitionData
224 // CHECK-NEXT: DefaultConstructor
225 // CHECK-NEXT: CopyConstructor
226 // CHECK-NEXT: MoveConstructor
227 // CHECK-NEXT: CopyAssignment
228 // CHECK-NEXT: MoveAssignment
229 // CHECK-NEXT: Destructor
230 // CHECK-NEXT: TemplateArgument{{.*}} type 'char'
231 // CHECK-NEXT: BuiltinType {{.*}} 'char'
232 // CHECK-NEXT: TemplateArgument{{.*}} pack
233 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
234 // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
235 // CHECK-NEXT: DefinitionData
236 // CHECK-NEXT: DefaultConstructor
237 // CHECK-NEXT: CopyConstructor
238 // CHECK-NEXT: MoveConstructor
239 // CHECK-NEXT: CopyAssignment
240 // CHECK-NEXT: MoveAssignment
241 // CHECK-NEXT: Destructor
242 // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
243 // CHECK-NEXT: BuiltinType {{.*}} 'int'
244 // CHECK-NEXT: TemplateArgument{{.*}} pack
245 // CHECK-NEXT: TemplateArgument{{.*}} expr
246 // CHECK-NEXT: PackExpansionExpr {{.*}} 'int'
247 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
248 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
249 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOO"
250 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
251 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
252 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
253 // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
254 // CHECK-NEXT: DefinitionData
255 // CHECK-NEXT: DefaultConstructor
256 // CHECK-NEXT: CopyConstructor
257 // CHECK-NEXT: MoveConstructor
258 // CHECK-NEXT: CopyAssignment
259 // CHECK-NEXT: MoveAssignment
260 // CHECK-NEXT: Destructor
261 // CHECK-NEXT: TemplateArgument{{.*}} type 'float'
262 // CHECK-NEXT: BuiltinType {{.*}} 'float'
263 // CHECK-NEXT: TemplateArgument{{.*}} pack
264 // CHECK-NEXT: TemplateArgument{{.*}} expr
265 // CHECK-NEXT: PackExpansionExpr {{.*}} 'int'
266 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
267 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
268 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"
269 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
270 // CHECK-NEXT: value: Int 4
271 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
272 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
273 // CHECK-NEXT: value: Int 5
274 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
275 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
276 // CHECK-NEXT: value: Int 6
277 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6
278 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
279 // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition
280 // CHECK-NEXT: DefinitionData
281 // CHECK-NEXT: DefaultConstructor
282 // CHECK-NEXT: CopyConstructor
283 // CHECK-NEXT: MoveConstructor
284 // CHECK-NEXT: CopyAssignment
285 // CHECK-NEXT: MoveAssignment
286 // CHECK-NEXT: Destructor
287 // CHECK-NEXT: TemplateArgument{{.*}} type 'char'
288 // CHECK-NEXT: BuiltinType {{.*}} 'char'
289 // CHECK-NEXT: TemplateArgument{{.*}} pack
290 // CHECK-NEXT: TemplateArgument{{.*}} expr
291 // CHECK-NEXT: PackExpansionExpr {{.*}} 'int'
292 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
293 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
294 // CHECK-NEXT: AnnotateAttr {{.*}} ""
295 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
296 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
297 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct
298 template <typename T, int... Is> struct [[clang::annotate("ANNOTATE_FOZ", Is...)]] AnnotatedPackTemplateStruct{};
299 template <int... Is> struct [[clang::annotate("ANNOTATE_BOO", Is...)]] AnnotatedPackTemplateStruct<int, Is...>{};
300 template <int... Is> struct [[clang::annotate("ANNOTATE_FOZ", 4, 5, 6)]] AnnotatedPackTemplateStruct<float, Is...>{};
301 template <int... Is> struct [[clang::annotate(Is...)]] AnnotatedPackTemplateStruct<char, Is...>{}; // expected-error {{'annotate' attribute requires a string}} expected-error {{'annotate' attribute takes at least 1 argument}}
UseAnnotatedPackTemplateStructSpecializations()302 void UseAnnotatedPackTemplateStructSpecializations() {
303 AnnotatedPackTemplateStruct<int, 1, 2, 3> Instance1{};
304 AnnotatedPackTemplateStruct<float, 3, 2, 1> Instance2{};
305 AnnotatedPackTemplateStruct<bool, 7, 8, 9> Instance3{};
306 AnnotatedPackTemplateStruct<char, 1, 2, 3> Instance4{}; // expected-note {{in instantiation of template class 'attribute_annotate::AnnotatedPackTemplateStruct<char, 1, 2, 3>' requested here}}
307 AnnotatedPackTemplateStruct<char> Instance5{}; // expected-note {{in instantiation of template class 'attribute_annotate::AnnotatedPackTemplateStruct<char>' requested here}}
308 }
309
310 // CHECK: ClassTemplateDecl {{.*}} InvalidAnnotatedPackTemplateStruct
311 // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T
312 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is
313 // CHECK-NEXT: CXXRecordDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
314 // CHECK-NEXT: DefinitionData
315 // CHECK-NEXT: DefaultConstructor
316 // CHECK-NEXT: CopyConstructor
317 // CHECK-NEXT: MoveConstructor
318 // CHECK-NEXT: CopyAssignment
319 // CHECK-NEXT: MoveAssignment
320 // CHECK-NEXT: Destructor
321 // CHECK-NEXT: AnnotateAttr {{.*}} ""
322 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
323 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
324 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
325 // CHECK-NEXT: ClassTemplateSpecialization {{.*}} 'InvalidAnnotatedPackTemplateStruct'
326 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
327 // CHECK-NEXT: DefinitionData
328 // CHECK-NEXT: DefaultConstructor
329 // CHECK-NEXT: CopyConstructor
330 // CHECK-NEXT: MoveConstructor
331 // CHECK-NEXT: CopyAssignment
332 // CHECK-NEXT: MoveAssignment
333 // CHECK-NEXT: Destructor
334 // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
335 // CHECK-NEXT: BuiltinType {{.*}} 'int'
336 // CHECK-NEXT: TemplateArgument{{.*}} pack
337 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
338 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
339 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
340 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BIR"
341 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
342 // CHECK-NEXT: value: Int 1
343 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
344 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
345 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1
346 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
347 // CHECK-NEXT: value: Int 2
348 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
349 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
350 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2
351 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
352 // CHECK-NEXT: value: Int 3
353 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
354 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
355 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3
356 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
357 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
358 // CHECK-NEXT: DefinitionData
359 // CHECK-NEXT: DefaultConstructor
360 // CHECK-NEXT: CopyConstructor
361 // CHECK-NEXT: MoveConstructor
362 // CHECK-NEXT: CopyAssignment
363 // CHECK-NEXT: MoveAssignment
364 // CHECK-NEXT: Destructor
365 // CHECK-NEXT: TemplateArgument{{.*}} type 'float'
366 // CHECK-NEXT: BuiltinType {{.*}} 'float'
367 // CHECK-NEXT: TemplateArgument{{.*}} pack
368 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
369 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
370 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
371 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
372 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
373 // CHECK-NEXT: DefinitionData
374 // CHECK-NEXT: DefaultConstructor
375 // CHECK-NEXT: CopyConstructor
376 // CHECK-NEXT: MoveConstructor
377 // CHECK-NEXT: CopyAssignment
378 // CHECK-NEXT: MoveAssignment
379 // CHECK-NEXT: Destructor
380 // CHECK-NEXT: TemplateArgument{{.*}} type 'bool'
381 // CHECK-NEXT: BuiltinType {{.*}} 'bool'
382 // CHECK-NEXT: TemplateArgument{{.*}} pack
383 // CHECK-NEXT: TemplateArgument{{.*}} integral 7
384 // CHECK-NEXT: TemplateArgument{{.*}} integral 8
385 // CHECK-NEXT: TemplateArgument{{.*}} integral 9
386 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
387 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
388 // CHECK-NEXT: DefinitionData
389 // CHECK-NEXT: DefaultConstructor
390 // CHECK-NEXT: CopyConstructor
391 // CHECK-NEXT: MoveConstructor
392 // CHECK-NEXT: CopyAssignment
393 // CHECK-NEXT: MoveAssignment
394 // CHECK-NEXT: Destructor
395 // CHECK-NEXT: TemplateArgument{{.*}} type 'bool'
396 // CHECK-NEXT: BuiltinType {{.*}} 'bool'
397 // CHECK-NEXT: TemplateArgument{{.*}} pack
398 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
399 // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
400 // CHECK-NEXT: DefinitionData
401 // CHECK-NEXT: DefaultConstructor
402 // CHECK-NEXT: CopyConstructor
403 // CHECK-NEXT: MoveConstructor
404 // CHECK-NEXT: CopyAssignment
405 // CHECK-NEXT: MoveAssignment
406 // CHECK-NEXT: Destructor
407 // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
408 // CHECK-NEXT: BuiltinType {{.*}} 'int'
409 // CHECK-NEXT: TemplateArgument{{.*}} pack
410 // CHECK-NEXT: TemplateArgument{{.*}} expr
411 // CHECK-NEXT: PackExpansionExpr {{.*}} 'int'
412 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
413 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
414 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BIR"
415 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
416 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
417 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
418 // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
419 // CHECK-NEXT: DefinitionData
420 // CHECK-NEXT: DefaultConstructor
421 // CHECK-NEXT: CopyConstructor
422 // CHECK-NEXT: MoveConstructor
423 // CHECK-NEXT: CopyAssignment
424 // CHECK-NEXT: MoveAssignment
425 // CHECK-NEXT: Destructor
426 // CHECK-NEXT: TemplateArgument{{.*}} type 'float'
427 // CHECK-NEXT: BuiltinType {{.*}} 'float'
428 // CHECK-NEXT: TemplateArgument{{.*}} pack
429 // CHECK-NEXT: TemplateArgument{{.*}} expr
430 // CHECK-NEXT: PackExpansionExpr {{.*}} 'int'
431 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
432 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
433 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
434 // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition
435 // CHECK-NEXT: DefinitionData
436 // CHECK-NEXT: DefaultConstructor
437 // CHECK-NEXT: CopyConstructor
438 // CHECK-NEXT: MoveConstructor
439 // CHECK-NEXT: CopyAssignment
440 // CHECK-NEXT: MoveAssignment
441 // CHECK-NEXT: Destructor
442 // CHECK-NEXT: TemplateArgument{{.*}} type 'char'
443 // CHECK-NEXT: BuiltinType {{.*}} 'char'
444 // CHECK-NEXT: TemplateArgument{{.*}} pack
445 // CHECK-NEXT: TemplateArgument{{.*}} integral 5
446 // CHECK-NEXT: TemplateArgument{{.*}} integral 6
447 // CHECK-NEXT: TemplateArgument{{.*}} integral 7
448 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct
449 template <typename T, int... Is> struct [[clang::annotate(Is...)]] InvalidAnnotatedPackTemplateStruct{}; // expected-error {{'annotate' attribute requires a string}} expected-error {{'annotate' attribute takes at least 1 argument}}
450 template <int... Is> struct [[clang::annotate("ANNOTATE_BIR", Is...)]] InvalidAnnotatedPackTemplateStruct<int, Is...>{};
451 template <int... Is> struct InvalidAnnotatedPackTemplateStruct<float, Is...> {};
452 template <> struct InvalidAnnotatedPackTemplateStruct<char, 5, 6, 7> {};
UseInvalidAnnotatedPackTemplateStruct()453 void UseInvalidAnnotatedPackTemplateStruct() {
454 InvalidAnnotatedPackTemplateStruct<int, 1, 2, 3> Instance1{};
455 InvalidAnnotatedPackTemplateStruct<float, 3, 2, 1> Instance2{};
456 InvalidAnnotatedPackTemplateStruct<char, 5, 6, 7> Instance3{};
457 InvalidAnnotatedPackTemplateStruct<bool, 7, 8, 9> Instance4{}; // expected-note {{in instantiation of template class 'attribute_annotate::InvalidAnnotatedPackTemplateStruct<bool, 7, 8, 9>' requested here}}
458 InvalidAnnotatedPackTemplateStruct<bool> Instance5{}; // expected-note {{in instantiation of template class 'attribute_annotate::InvalidAnnotatedPackTemplateStruct<bool>' requested here}}
459 }
460
461 // CHECK: FunctionTemplateDecl {{.*}} RedeclaredAnnotatedFunc
462 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
463 // CHECK-NEXT: FunctionDecl {{.*}} RedeclaredAnnotatedFunc 'void ()'
464 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FAR"
465 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
466 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
467 // CHECK-NEXT: FunctionDecl {{.*}} used RedeclaredAnnotatedFunc 'void ()'
468 // CHECK-NEXT: TemplateArgument{{.*}} pack
469 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
470 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
471 // CHECK-NEXT: TemplateArgument{{.*}} integral 3
472 // CHECK-NEXT: CompoundStmt
473 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FAR"
474 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
475 // CHECK-NEXT: value: Int 1
476 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
477 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
478 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1
479 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
480 // CHECK-NEXT: value: Int 2
481 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
482 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
483 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2
484 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
485 // CHECK-NEXT: value: Int 3
486 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'
487 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
488 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3
489 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FIZ"
490 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
491 // CHECK-NEXT: value: Int 4
492 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
493 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
494 // CHECK-NEXT: value: Int 5
495 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
496 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ"
497 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
498 // CHECK-NEXT: value: Int 6
499 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6
500 // CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc
501 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is
502 // CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()'
503 // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR"
504 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
505 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
506 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ"
507 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
508 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
509 // CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()'
510 // CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc
511 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 0 ... Is
512 // CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()'
513 // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR"
514 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
515 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
516 // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_BOZ"
517 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
518 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
519 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FIZ"
520 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
521 // CHECK-NEXT: value: Int 4
522 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
523 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
524 // CHECK-NEXT: value: Int 5
525 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
526 // CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()'
527 // CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc
528 // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 0 ... Is
529 // CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()'
530 // CHECK-NEXT: CompoundStmt
531 // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR"
532 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>'
533 // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'
534 // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FIZ"
535 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
536 // CHECK-NEXT: value: Int 4
537 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
538 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
539 // CHECK-NEXT: value: Int 5
540 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
541 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ"
542 // CHECK-NEXT: ConstantExpr {{.*}} 'int'
543 // CHECK-NEXT: value: Int 6
544 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6
545 // CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()'
546 // CHECK-NEXT: EmptyDecl
547 template <int... Is> [[clang::annotate("ANNOTATE_FAR", Is...)]] void RedeclaredAnnotatedFunc();
548 template <int... Is> [[clang::annotate("ANNOTATE_BOZ", Is...)]] void RedeclaredAnnotatedFunc();
549 template <int... Is> [[clang::annotate("ANNOTATE_FIZ", 4, 5)]] void RedeclaredAnnotatedFunc();
RedeclaredAnnotatedFunc()550 template <int... Is> [[clang::annotate("ANNOTATE_BOZ", 6)]] void RedeclaredAnnotatedFunc(){};
UseRedeclaredAnnotatedFunc()551 void UseRedeclaredAnnotatedFunc() {
552 RedeclaredAnnotatedFunc<1, 2, 3>();
553 }
554
555 } // namespace attribute_annotate
556
557 namespace preferred_name {
558 int x [[clang::preferred_name("frank")]]; // expected-error {{expected a type}}
559 int y [[clang::preferred_name(int)]]; // expected-warning {{'preferred_name' attribute only applies to class templates}}
560 struct [[clang::preferred_name(int)]] A; // expected-warning {{'preferred_name' attribute only applies to class templates}}
561 template<typename T> struct [[clang::preferred_name(int)]] B; // expected-error {{argument 'int' to 'preferred_name' attribute is not a typedef for a specialization of 'B'}}
562 template<typename T> struct C;
563 using X = C<int>; // expected-note {{'X' declared here}}
564 typedef C<float> Y;
565 using Z = const C<double>; // expected-note {{'Z' declared here}}
566 template<typename T> struct [[clang::preferred_name(C<int>)]] C; // expected-error {{argument 'C<int>' to 'preferred_name' attribute is not a typedef for a specialization of 'C'}}
567 template<typename T> struct [[clang::preferred_name(X), clang::preferred_name(Y)]] C;
568 template<typename T> struct [[clang::preferred_name(const X)]] C; // expected-error {{argument 'const preferred_name::X'}}
569 template<typename T> struct [[clang::preferred_name(Z)]] C; // expected-error {{argument 'preferred_name::Z' (aka 'const C<double>')}}
570 template<typename T> struct C {};
571
572 // CHECK: ClassTemplateDecl {{.*}} <line:[[@LINE-10]]:{{.*}} C
573 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct C definition
574 // CHECK: TemplateArgument type 'int'
575 // CHECK-NOT: PreferredNameAttr
576 // CHECK: PreferredNameAttr {{.*}} preferred_name::X
577 // CHECK-NOT: PreferredNameAttr
578 // CHECK: CXXRecordDecl
579 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct C definition
580 // CHECK: TemplateArgument type 'float'
581 // CHECK-NOT: PreferredNameAttr
582 // CHECK: PreferredNameAttr {{.*}} preferred_name::Y
583 // CHECK-NOT: PreferredNameAttr
584 // CHECK: CXXRecordDecl
585 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct C definition
586 // CHECK: TemplateArgument type 'double'
587 // CHECK-NOT: PreferredNameAttr
588 // CHECK: CXXRecordDecl
589
590 // Check this doesn't cause us to instantiate the same attribute multiple times.
591 C<float> *cf1;
592 C<float> *cf2;
593
f(C<int> a,C<float> b,C<double> c)594 void f(C<int> a, C<float> b, C<double> c) {
595 auto p = a;
596 auto q = b;
597 auto r = c;
598 p.f(); // expected-error {{no member named 'f' in 'preferred_name::X'}}
599 q.f(); // expected-error {{no member named 'f' in 'preferred_name::Y'}}
600 r.f(); // expected-error {{no member named 'f' in 'preferred_name::C<double>'}}
601 }
602
603 template<typename T> struct D;
604 using DInt = D<int>;
605 template<typename T> struct __attribute__((__preferred_name__(DInt))) D {};
606 template struct D<int>;
607 int use_dint = D<int>().get(); // expected-error {{no member named 'get' in 'preferred_name::DInt'}}
608
609 template<typename T> struct MemberTemplate {
610 template<typename U> struct Iter;
611 using iterator = Iter<T>;
612 using const_iterator = Iter<const T>;
613 template<typename U>
614 struct [[clang::preferred_name(iterator),
615 clang::preferred_name(const_iterator)]] Iter {};
616 };
617 template<typename T> T desugar(T);
618 auto it = desugar(MemberTemplate<int>::Iter<const int>());
619 int n = it; // expected-error {{no viable conversion from 'preferred_name::MemberTemplate<int>::const_iterator' to 'int'}}
620
621 template<int A, int B, typename ...T> struct Foo;
622 template<typename ...T> using Bar = Foo<1, 2, T...>;
623 template<int A, int B, typename ...T> struct [[clang::preferred_name(::preferred_name::Bar<T...>)]] Foo {};
624 Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar<int, float>'}}
625 }
626 ::preferred_name::Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar<int, float>'}}
627