Line data Source code
1 : /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2 : |* *|
3 : |* Attribute classes' definitions *|
4 : |* *|
5 : |* Automatically generated file, do not edit! *|
6 : |* *|
7 : \*===----------------------------------------------------------------------===*/
8 :
9 : #ifndef LLVM_CLANG_ATTR_CLASSES_INC
10 : #define LLVM_CLANG_ATTR_CLASSES_INC
11 :
12 : class AMDGPUNumSGPRAttr : public InheritableAttr {
13 : unsigned numSGPR;
14 :
15 :
16 : public:
17 : static AMDGPUNumSGPRAttr *CreateImplicit(ASTContext &Ctx, unsigned NumSGPR, SourceRange Loc = SourceRange()) {
18 : AMDGPUNumSGPRAttr *A = new (Ctx) AMDGPUNumSGPRAttr(Loc, Ctx, NumSGPR, 0);
19 : A->setImplicit(true);
20 : return A;
21 : }
22 :
23 : AMDGPUNumSGPRAttr(SourceRange R, ASTContext &Ctx
24 : , unsigned NumSGPR
25 : , unsigned SI
26 : )
27 : : InheritableAttr(attr::AMDGPUNumSGPR, R, SI, 0, 0)
28 : , numSGPR(NumSGPR)
29 : {
30 :
31 : }
32 :
33 : AMDGPUNumSGPRAttr *clone(ASTContext &C) const;
34 : void printPretty(raw_ostream &OS,
35 : const PrintingPolicy &Policy) const;
36 : const char *getSpelling() const;
37 : unsigned getNumSGPR() const {
38 : return numSGPR;
39 : }
40 :
41 :
42 :
43 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AMDGPUNumSGPR; }
44 : };
45 :
46 : class AMDGPUNumVGPRAttr : public InheritableAttr {
47 : unsigned numVGPR;
48 :
49 :
50 : public:
51 : static AMDGPUNumVGPRAttr *CreateImplicit(ASTContext &Ctx, unsigned NumVGPR, SourceRange Loc = SourceRange()) {
52 : AMDGPUNumVGPRAttr *A = new (Ctx) AMDGPUNumVGPRAttr(Loc, Ctx, NumVGPR, 0);
53 : A->setImplicit(true);
54 : return A;
55 : }
56 :
57 : AMDGPUNumVGPRAttr(SourceRange R, ASTContext &Ctx
58 : , unsigned NumVGPR
59 : , unsigned SI
60 : )
61 : : InheritableAttr(attr::AMDGPUNumVGPR, R, SI, 0, 0)
62 : , numVGPR(NumVGPR)
63 : {
64 :
65 : }
66 :
67 : AMDGPUNumVGPRAttr *clone(ASTContext &C) const;
68 : void printPretty(raw_ostream &OS,
69 : const PrintingPolicy &Policy) const;
70 : const char *getSpelling() const;
71 : unsigned getNumVGPR() const {
72 : return numVGPR;
73 : }
74 :
75 :
76 :
77 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AMDGPUNumVGPR; }
78 : };
79 :
80 : class ARMInterruptAttr : public InheritableAttr {
81 : public:
82 : enum InterruptType {
83 : IRQ,
84 : FIQ,
85 : SWI,
86 : ABORT,
87 : UNDEF,
88 : Generic
89 : };
90 : private:
91 : InterruptType interrupt;
92 :
93 :
94 : public:
95 : static ARMInterruptAttr *CreateImplicit(ASTContext &Ctx, InterruptType Interrupt, SourceRange Loc = SourceRange()) {
96 : ARMInterruptAttr *A = new (Ctx) ARMInterruptAttr(Loc, Ctx, Interrupt, 0);
97 : A->setImplicit(true);
98 : return A;
99 : }
100 :
101 : ARMInterruptAttr(SourceRange R, ASTContext &Ctx
102 : , InterruptType Interrupt
103 : , unsigned SI
104 : )
105 : : InheritableAttr(attr::ARMInterrupt, R, SI, 0, 0)
106 : , interrupt(Interrupt)
107 : {
108 :
109 : }
110 :
111 : ARMInterruptAttr(SourceRange R, ASTContext &Ctx
112 : , unsigned SI
113 : )
114 : : InheritableAttr(attr::ARMInterrupt, R, SI, 0, 0)
115 : , interrupt(InterruptType(0))
116 : {
117 : }
118 :
119 : ARMInterruptAttr *clone(ASTContext &C) const;
120 : void printPretty(raw_ostream &OS,
121 : const PrintingPolicy &Policy) const;
122 : const char *getSpelling() const;
123 : InterruptType getInterrupt() const {
124 : return interrupt;
125 : }
126 :
127 : static bool ConvertStrToInterruptType(StringRef Val, InterruptType &Out) {
128 : Optional<InterruptType> R = llvm::StringSwitch<Optional<InterruptType>>(Val)
129 : .Case("IRQ", ARMInterruptAttr::IRQ)
130 : .Case("FIQ", ARMInterruptAttr::FIQ)
131 : .Case("SWI", ARMInterruptAttr::SWI)
132 : .Case("ABORT", ARMInterruptAttr::ABORT)
133 : .Case("UNDEF", ARMInterruptAttr::UNDEF)
134 : .Case("", ARMInterruptAttr::Generic)
135 : .Default(Optional<InterruptType>());
136 : if (R) {
137 : Out = *R;
138 : return true;
139 : }
140 : return false;
141 : }
142 :
143 : static const char *ConvertInterruptTypeToStr(InterruptType Val) {
144 : switch(Val) {
145 : case ARMInterruptAttr::IRQ: return "IRQ";
146 : case ARMInterruptAttr::FIQ: return "FIQ";
147 : case ARMInterruptAttr::SWI: return "SWI";
148 : case ARMInterruptAttr::ABORT: return "ABORT";
149 : case ARMInterruptAttr::UNDEF: return "UNDEF";
150 : case ARMInterruptAttr::Generic: return "";
151 : }
152 : llvm_unreachable("No enumerator with that value");
153 : }
154 :
155 :
156 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ARMInterrupt; }
157 : };
158 :
159 : class AcquireCapabilityAttr : public InheritableAttr {
160 : unsigned args_Size;
161 : Expr * *args_;
162 :
163 :
164 : public:
165 : enum Spelling {
166 : GNU_acquire_capability = 0,
167 : CXX11_clang_acquire_capability = 1,
168 : GNU_acquire_shared_capability = 2,
169 : CXX11_clang_acquire_shared_capability = 3,
170 : GNU_exclusive_lock_function = 4,
171 : GNU_shared_lock_function = 5
172 : };
173 :
174 : static AcquireCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
175 : AcquireCapabilityAttr *A = new (Ctx) AcquireCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
176 : A->setImplicit(true);
177 : return A;
178 : }
179 :
180 : AcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
181 : , Expr * *Args, unsigned ArgsSize
182 : , unsigned SI
183 : )
184 : : InheritableAttr(attr::AcquireCapability, R, SI, 1, 1)
185 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
186 : {
187 : std::copy(Args, Args + args_Size, args_);
188 : }
189 :
190 : AcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
191 : , unsigned SI
192 : )
193 : : InheritableAttr(attr::AcquireCapability, R, SI, 1, 1)
194 : , args_Size(0), args_(nullptr)
195 : {
196 : }
197 :
198 : AcquireCapabilityAttr *clone(ASTContext &C) const;
199 : void printPretty(raw_ostream &OS,
200 : const PrintingPolicy &Policy) const;
201 : const char *getSpelling() const;
202 : Spelling getSemanticSpelling() const {
203 : switch (SpellingListIndex) {
204 : default: llvm_unreachable("Unknown spelling list index");
205 : case 0: return GNU_acquire_capability;
206 : case 1: return CXX11_clang_acquire_capability;
207 : case 2: return GNU_acquire_shared_capability;
208 : case 3: return CXX11_clang_acquire_shared_capability;
209 : case 4: return GNU_exclusive_lock_function;
210 : case 5: return GNU_shared_lock_function;
211 : }
212 : }
213 : bool isShared() const { return SpellingListIndex == 2 ||
214 : SpellingListIndex == 3 ||
215 : SpellingListIndex == 5; }
216 : typedef Expr ** args_iterator;
217 0 : args_iterator args_begin() const { return args_; }
218 0 : args_iterator args_end() const { return args_ + args_Size; }
219 : unsigned args_size() const { return args_Size; }
220 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
221 :
222 :
223 :
224 :
225 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AcquireCapability; }
226 : };
227 :
228 : class AcquiredAfterAttr : public InheritableAttr {
229 : unsigned args_Size;
230 : Expr * *args_;
231 :
232 :
233 : public:
234 : static AcquiredAfterAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
235 : AcquiredAfterAttr *A = new (Ctx) AcquiredAfterAttr(Loc, Ctx, Args, ArgsSize, 0);
236 : A->setImplicit(true);
237 : return A;
238 : }
239 :
240 : AcquiredAfterAttr(SourceRange R, ASTContext &Ctx
241 : , Expr * *Args, unsigned ArgsSize
242 : , unsigned SI
243 : )
244 : : InheritableAttr(attr::AcquiredAfter, R, SI, 1, 1)
245 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
246 : {
247 : std::copy(Args, Args + args_Size, args_);
248 : }
249 :
250 : AcquiredAfterAttr(SourceRange R, ASTContext &Ctx
251 : , unsigned SI
252 : )
253 : : InheritableAttr(attr::AcquiredAfter, R, SI, 1, 1)
254 : , args_Size(0), args_(nullptr)
255 : {
256 : }
257 :
258 : AcquiredAfterAttr *clone(ASTContext &C) const;
259 : void printPretty(raw_ostream &OS,
260 : const PrintingPolicy &Policy) const;
261 : const char *getSpelling() const;
262 : typedef Expr ** args_iterator;
263 0 : args_iterator args_begin() const { return args_; }
264 0 : args_iterator args_end() const { return args_ + args_Size; }
265 : unsigned args_size() const { return args_Size; }
266 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
267 :
268 :
269 :
270 :
271 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AcquiredAfter; }
272 : };
273 :
274 : class AcquiredBeforeAttr : public InheritableAttr {
275 : unsigned args_Size;
276 : Expr * *args_;
277 :
278 :
279 : public:
280 : static AcquiredBeforeAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
281 : AcquiredBeforeAttr *A = new (Ctx) AcquiredBeforeAttr(Loc, Ctx, Args, ArgsSize, 0);
282 : A->setImplicit(true);
283 : return A;
284 : }
285 :
286 : AcquiredBeforeAttr(SourceRange R, ASTContext &Ctx
287 : , Expr * *Args, unsigned ArgsSize
288 : , unsigned SI
289 : )
290 : : InheritableAttr(attr::AcquiredBefore, R, SI, 1, 1)
291 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
292 : {
293 : std::copy(Args, Args + args_Size, args_);
294 : }
295 :
296 : AcquiredBeforeAttr(SourceRange R, ASTContext &Ctx
297 : , unsigned SI
298 : )
299 : : InheritableAttr(attr::AcquiredBefore, R, SI, 1, 1)
300 : , args_Size(0), args_(nullptr)
301 : {
302 : }
303 :
304 : AcquiredBeforeAttr *clone(ASTContext &C) const;
305 : void printPretty(raw_ostream &OS,
306 : const PrintingPolicy &Policy) const;
307 : const char *getSpelling() const;
308 : typedef Expr ** args_iterator;
309 0 : args_iterator args_begin() const { return args_; }
310 0 : args_iterator args_end() const { return args_ + args_Size; }
311 : unsigned args_size() const { return args_Size; }
312 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
313 :
314 :
315 :
316 :
317 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AcquiredBefore; }
318 : };
319 :
320 : class AliasAttr : public Attr {
321 : unsigned aliaseeLength;
322 : char *aliasee;
323 :
324 :
325 : public:
326 : static AliasAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Loc = SourceRange()) {
327 : AliasAttr *A = new (Ctx) AliasAttr(Loc, Ctx, Aliasee, 0);
328 : A->setImplicit(true);
329 : return A;
330 : }
331 :
332 : AliasAttr(SourceRange R, ASTContext &Ctx
333 : , llvm::StringRef Aliasee
334 : , unsigned SI
335 : )
336 : : Attr(attr::Alias, R, SI, 0, 0)
337 : , aliaseeLength(Aliasee.size()),aliasee(new (Ctx, 1) char[aliaseeLength])
338 : {
339 : if (!Aliasee.empty())
340 : std::memcpy(aliasee, Aliasee.data(), aliaseeLength);
341 : }
342 :
343 : AliasAttr *clone(ASTContext &C) const;
344 : void printPretty(raw_ostream &OS,
345 : const PrintingPolicy &Policy) const;
346 : const char *getSpelling() const;
347 : llvm::StringRef getAliasee() const {
348 : return llvm::StringRef(aliasee, aliaseeLength);
349 : }
350 : unsigned getAliaseeLength() const {
351 : return aliaseeLength;
352 : }
353 : void setAliasee(ASTContext &C, llvm::StringRef S) {
354 : aliaseeLength = S.size();
355 : this->aliasee = new (C, 1) char [aliaseeLength];
356 : if (!S.empty())
357 : std::memcpy(this->aliasee, S.data(), aliaseeLength);
358 : }
359 :
360 :
361 :
362 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Alias; }
363 : };
364 :
365 : class AlignMac68kAttr : public InheritableAttr {
366 :
367 : public:
368 : static AlignMac68kAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
369 : AlignMac68kAttr *A = new (Ctx) AlignMac68kAttr(Loc, Ctx, 0);
370 : A->setImplicit(true);
371 : return A;
372 : }
373 :
374 : AlignMac68kAttr(SourceRange R, ASTContext &Ctx
375 : , unsigned SI
376 : )
377 : : InheritableAttr(attr::AlignMac68k, R, SI, 0, 0)
378 : {
379 : }
380 :
381 : AlignMac68kAttr *clone(ASTContext &C) const;
382 : void printPretty(raw_ostream &OS,
383 : const PrintingPolicy &Policy) const;
384 : const char *getSpelling() const;
385 :
386 :
387 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AlignMac68k; }
388 : };
389 :
390 : class AlignValueAttr : public Attr {
391 : Expr * alignment;
392 :
393 :
394 : public:
395 : static AlignValueAttr *CreateImplicit(ASTContext &Ctx, Expr * Alignment, SourceRange Loc = SourceRange()) {
396 : AlignValueAttr *A = new (Ctx) AlignValueAttr(Loc, Ctx, Alignment, 0);
397 : A->setImplicit(true);
398 : return A;
399 : }
400 :
401 : AlignValueAttr(SourceRange R, ASTContext &Ctx
402 : , Expr * Alignment
403 : , unsigned SI
404 : )
405 : : Attr(attr::AlignValue, R, SI, 0, 0)
406 : , alignment(Alignment)
407 : {
408 :
409 : }
410 :
411 : AlignValueAttr *clone(ASTContext &C) const;
412 : void printPretty(raw_ostream &OS,
413 : const PrintingPolicy &Policy) const;
414 : const char *getSpelling() const;
415 : Expr * getAlignment() const {
416 0 : return alignment;
417 : }
418 :
419 :
420 :
421 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AlignValue; }
422 : };
423 :
424 : class AlignedAttr : public InheritableAttr {
425 : bool isalignmentExpr;
426 : union {
427 : Expr *alignmentExpr;
428 : TypeSourceInfo *alignmentType;
429 : };
430 :
431 :
432 : public:
433 : enum Spelling {
434 : GNU_aligned = 0,
435 : CXX11_gnu_aligned = 1,
436 : Declspec_align = 2,
437 : Keyword_alignas = 3,
438 : Keyword_Alignas = 4
439 : };
440 :
441 : static AlignedAttr *CreateImplicit(ASTContext &Ctx, Spelling S, bool IsAlignmentExpr, void *Alignment, SourceRange Loc = SourceRange()) {
442 : AlignedAttr *A = new (Ctx) AlignedAttr(Loc, Ctx, IsAlignmentExpr, Alignment, S);
443 : A->setImplicit(true);
444 : return A;
445 : }
446 :
447 : AlignedAttr(SourceRange R, ASTContext &Ctx
448 : , bool IsAlignmentExpr, void *Alignment
449 : , unsigned SI
450 : )
451 : : InheritableAttr(attr::Aligned, R, SI, 0, 0)
452 : , isalignmentExpr(IsAlignmentExpr)
453 : {
454 : if (isalignmentExpr)
455 : alignmentExpr = reinterpret_cast<Expr *>(Alignment);
456 : else
457 : alignmentType = reinterpret_cast<TypeSourceInfo *>(Alignment);
458 : }
459 :
460 : AlignedAttr(SourceRange R, ASTContext &Ctx
461 : , unsigned SI
462 : )
463 : : InheritableAttr(attr::Aligned, R, SI, 0, 0)
464 : , isalignmentExpr(false)
465 : {
466 : }
467 :
468 : AlignedAttr *clone(ASTContext &C) const;
469 : void printPretty(raw_ostream &OS,
470 : const PrintingPolicy &Policy) const;
471 : const char *getSpelling() const;
472 : Spelling getSemanticSpelling() const {
473 : switch (SpellingListIndex) {
474 : default: llvm_unreachable("Unknown spelling list index");
475 : case 0: return GNU_aligned;
476 : case 1: return CXX11_gnu_aligned;
477 : case 2: return Declspec_align;
478 : case 3: return Keyword_alignas;
479 : case 4: return Keyword_Alignas;
480 : }
481 : }
482 : bool isGNU() const { return SpellingListIndex == 0 ||
483 : SpellingListIndex == 1; }
484 : bool isC11() const { return SpellingListIndex == 4; }
485 : bool isAlignas() const { return SpellingListIndex == 3 ||
486 : SpellingListIndex == 4; }
487 : bool isDeclspec() const { return SpellingListIndex == 2; }
488 : bool isAlignmentDependent() const;
489 : unsigned getAlignment(ASTContext &Ctx) const;
490 : bool isAlignmentExpr() const {
491 : return isalignmentExpr;
492 : }
493 : Expr *getAlignmentExpr() const {
494 : assert(isalignmentExpr);
495 : return alignmentExpr;
496 : }
497 : TypeSourceInfo *getAlignmentType() const {
498 : assert(!isalignmentExpr);
499 : return alignmentType;
500 : }
501 :
502 :
503 :
504 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Aligned; }
505 : };
506 :
507 : class AlwaysInlineAttr : public InheritableAttr {
508 :
509 : public:
510 : enum Spelling {
511 : GNU_always_inline = 0,
512 : CXX11_gnu_always_inline = 1,
513 : Keyword_forceinline = 2
514 : };
515 :
516 : static AlwaysInlineAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
517 : AlwaysInlineAttr *A = new (Ctx) AlwaysInlineAttr(Loc, Ctx, S);
518 : A->setImplicit(true);
519 : return A;
520 : }
521 :
522 : AlwaysInlineAttr(SourceRange R, ASTContext &Ctx
523 : , unsigned SI
524 : )
525 : : InheritableAttr(attr::AlwaysInline, R, SI, 0, 0)
526 : {
527 : }
528 :
529 : AlwaysInlineAttr *clone(ASTContext &C) const;
530 : void printPretty(raw_ostream &OS,
531 : const PrintingPolicy &Policy) const;
532 : const char *getSpelling() const;
533 : Spelling getSemanticSpelling() const {
534 : switch (SpellingListIndex) {
535 : default: llvm_unreachable("Unknown spelling list index");
536 : case 0: return GNU_always_inline;
537 : case 1: return CXX11_gnu_always_inline;
538 : case 2: return Keyword_forceinline;
539 : }
540 : }
541 :
542 :
543 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AlwaysInline; }
544 : };
545 :
546 : class AnalyzerNoReturnAttr : public InheritableAttr {
547 :
548 : public:
549 : static AnalyzerNoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
550 : AnalyzerNoReturnAttr *A = new (Ctx) AnalyzerNoReturnAttr(Loc, Ctx, 0);
551 : A->setImplicit(true);
552 : return A;
553 : }
554 :
555 : AnalyzerNoReturnAttr(SourceRange R, ASTContext &Ctx
556 : , unsigned SI
557 : )
558 : : InheritableAttr(attr::AnalyzerNoReturn, R, SI, 0, 0)
559 : {
560 : }
561 :
562 : AnalyzerNoReturnAttr *clone(ASTContext &C) const;
563 : void printPretty(raw_ostream &OS,
564 : const PrintingPolicy &Policy) const;
565 : const char *getSpelling() const;
566 :
567 :
568 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AnalyzerNoReturn; }
569 : };
570 :
571 : class AnnotateAttr : public InheritableParamAttr {
572 : unsigned annotationLength;
573 : char *annotation;
574 :
575 :
576 : public:
577 : static AnnotateAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, SourceRange Loc = SourceRange()) {
578 : AnnotateAttr *A = new (Ctx) AnnotateAttr(Loc, Ctx, Annotation, 0);
579 : A->setImplicit(true);
580 : return A;
581 : }
582 :
583 : AnnotateAttr(SourceRange R, ASTContext &Ctx
584 : , llvm::StringRef Annotation
585 : , unsigned SI
586 : )
587 : : InheritableParamAttr(attr::Annotate, R, SI, 0, 0)
588 : , annotationLength(Annotation.size()),annotation(new (Ctx, 1) char[annotationLength])
589 : {
590 : if (!Annotation.empty())
591 : std::memcpy(annotation, Annotation.data(), annotationLength);
592 : }
593 :
594 : AnnotateAttr *clone(ASTContext &C) const;
595 : void printPretty(raw_ostream &OS,
596 : const PrintingPolicy &Policy) const;
597 : const char *getSpelling() const;
598 : llvm::StringRef getAnnotation() const {
599 : return llvm::StringRef(annotation, annotationLength);
600 : }
601 : unsigned getAnnotationLength() const {
602 : return annotationLength;
603 : }
604 : void setAnnotation(ASTContext &C, llvm::StringRef S) {
605 : annotationLength = S.size();
606 : this->annotation = new (C, 1) char [annotationLength];
607 : if (!S.empty())
608 : std::memcpy(this->annotation, S.data(), annotationLength);
609 : }
610 :
611 :
612 :
613 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Annotate; }
614 : };
615 :
616 : class ArcWeakrefUnavailableAttr : public InheritableAttr {
617 :
618 : public:
619 : static ArcWeakrefUnavailableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
620 : ArcWeakrefUnavailableAttr *A = new (Ctx) ArcWeakrefUnavailableAttr(Loc, Ctx, 0);
621 : A->setImplicit(true);
622 : return A;
623 : }
624 :
625 : ArcWeakrefUnavailableAttr(SourceRange R, ASTContext &Ctx
626 : , unsigned SI
627 : )
628 : : InheritableAttr(attr::ArcWeakrefUnavailable, R, SI, 0, 0)
629 : {
630 : }
631 :
632 : ArcWeakrefUnavailableAttr *clone(ASTContext &C) const;
633 : void printPretty(raw_ostream &OS,
634 : const PrintingPolicy &Policy) const;
635 : const char *getSpelling() const;
636 :
637 :
638 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ArcWeakrefUnavailable; }
639 : };
640 :
641 : class ArgumentWithTypeTagAttr : public InheritableAttr {
642 : IdentifierInfo * argumentKind;
643 :
644 : unsigned argumentIdx;
645 :
646 : unsigned typeTagIdx;
647 :
648 : bool isPointer;
649 :
650 :
651 : public:
652 : enum Spelling {
653 : GNU_argument_with_type_tag = 0,
654 : GNU_pointer_with_type_tag = 1
655 : };
656 :
657 : static ArgumentWithTypeTagAttr *CreateImplicit(ASTContext &Ctx, Spelling S, IdentifierInfo * ArgumentKind, unsigned ArgumentIdx, unsigned TypeTagIdx, bool IsPointer, SourceRange Loc = SourceRange()) {
658 : ArgumentWithTypeTagAttr *A = new (Ctx) ArgumentWithTypeTagAttr(Loc, Ctx, ArgumentKind, ArgumentIdx, TypeTagIdx, IsPointer, S);
659 : A->setImplicit(true);
660 : return A;
661 : }
662 :
663 : ArgumentWithTypeTagAttr(SourceRange R, ASTContext &Ctx
664 : , IdentifierInfo * ArgumentKind
665 : , unsigned ArgumentIdx
666 : , unsigned TypeTagIdx
667 : , bool IsPointer
668 : , unsigned SI
669 : )
670 : : InheritableAttr(attr::ArgumentWithTypeTag, R, SI, 0, 0)
671 : , argumentKind(ArgumentKind)
672 : , argumentIdx(ArgumentIdx)
673 : , typeTagIdx(TypeTagIdx)
674 : , isPointer(IsPointer)
675 : {
676 :
677 :
678 :
679 :
680 : }
681 :
682 : ArgumentWithTypeTagAttr *clone(ASTContext &C) const;
683 : void printPretty(raw_ostream &OS,
684 : const PrintingPolicy &Policy) const;
685 : const char *getSpelling() const;
686 : Spelling getSemanticSpelling() const {
687 : switch (SpellingListIndex) {
688 : default: llvm_unreachable("Unknown spelling list index");
689 : case 0: return GNU_argument_with_type_tag;
690 : case 1: return GNU_pointer_with_type_tag;
691 : }
692 : }
693 : IdentifierInfo * getArgumentKind() const {
694 : return argumentKind;
695 : }
696 :
697 : unsigned getArgumentIdx() const {
698 : return argumentIdx;
699 : }
700 :
701 : unsigned getTypeTagIdx() const {
702 : return typeTagIdx;
703 : }
704 :
705 : bool getIsPointer() const {
706 : return isPointer;
707 : }
708 :
709 :
710 :
711 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ArgumentWithTypeTag; }
712 : };
713 :
714 : class AsmLabelAttr : public InheritableAttr {
715 : unsigned labelLength;
716 : char *label;
717 :
718 :
719 : public:
720 : static AsmLabelAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Label, SourceRange Loc = SourceRange()) {
721 : AsmLabelAttr *A = new (Ctx) AsmLabelAttr(Loc, Ctx, Label, 0);
722 : A->setImplicit(true);
723 : return A;
724 : }
725 :
726 : AsmLabelAttr(SourceRange R, ASTContext &Ctx
727 : , llvm::StringRef Label
728 : , unsigned SI
729 : )
730 : : InheritableAttr(attr::AsmLabel, R, SI, 0, 0)
731 : , labelLength(Label.size()),label(new (Ctx, 1) char[labelLength])
732 : {
733 : if (!Label.empty())
734 : std::memcpy(label, Label.data(), labelLength);
735 : }
736 :
737 : AsmLabelAttr *clone(ASTContext &C) const;
738 : void printPretty(raw_ostream &OS,
739 : const PrintingPolicy &Policy) const;
740 : const char *getSpelling() const;
741 : llvm::StringRef getLabel() const {
742 : return llvm::StringRef(label, labelLength);
743 : }
744 : unsigned getLabelLength() const {
745 : return labelLength;
746 : }
747 : void setLabel(ASTContext &C, llvm::StringRef S) {
748 : labelLength = S.size();
749 : this->label = new (C, 1) char [labelLength];
750 : if (!S.empty())
751 : std::memcpy(this->label, S.data(), labelLength);
752 : }
753 :
754 :
755 :
756 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AsmLabel; }
757 : };
758 :
759 : class AssertCapabilityAttr : public InheritableAttr {
760 : Expr * expr;
761 :
762 :
763 : public:
764 : enum Spelling {
765 : GNU_assert_capability = 0,
766 : CXX11_clang_assert_capability = 1,
767 : GNU_assert_shared_capability = 2,
768 : CXX11_clang_assert_shared_capability = 3
769 : };
770 :
771 : static AssertCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * Expr, SourceRange Loc = SourceRange()) {
772 : AssertCapabilityAttr *A = new (Ctx) AssertCapabilityAttr(Loc, Ctx, Expr, S);
773 : A->setImplicit(true);
774 : return A;
775 : }
776 :
777 : AssertCapabilityAttr(SourceRange R, ASTContext &Ctx
778 : , Expr * Expr
779 : , unsigned SI
780 : )
781 : : InheritableAttr(attr::AssertCapability, R, SI, 1, 1)
782 : , expr(Expr)
783 : {
784 :
785 : }
786 :
787 : AssertCapabilityAttr *clone(ASTContext &C) const;
788 : void printPretty(raw_ostream &OS,
789 : const PrintingPolicy &Policy) const;
790 : const char *getSpelling() const;
791 : Spelling getSemanticSpelling() const {
792 : switch (SpellingListIndex) {
793 : default: llvm_unreachable("Unknown spelling list index");
794 : case 0: return GNU_assert_capability;
795 : case 1: return CXX11_clang_assert_capability;
796 : case 2: return GNU_assert_shared_capability;
797 : case 3: return CXX11_clang_assert_shared_capability;
798 : }
799 : }
800 : bool isShared() const { return SpellingListIndex == 2 ||
801 : SpellingListIndex == 3; }
802 : Expr * getExpr() const {
803 0 : return expr;
804 : }
805 :
806 :
807 :
808 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AssertCapability; }
809 : };
810 :
811 : class AssertExclusiveLockAttr : public InheritableAttr {
812 : unsigned args_Size;
813 : Expr * *args_;
814 :
815 :
816 : public:
817 : static AssertExclusiveLockAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
818 : AssertExclusiveLockAttr *A = new (Ctx) AssertExclusiveLockAttr(Loc, Ctx, Args, ArgsSize, 0);
819 : A->setImplicit(true);
820 : return A;
821 : }
822 :
823 : AssertExclusiveLockAttr(SourceRange R, ASTContext &Ctx
824 : , Expr * *Args, unsigned ArgsSize
825 : , unsigned SI
826 : )
827 : : InheritableAttr(attr::AssertExclusiveLock, R, SI, 1, 1)
828 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
829 : {
830 : std::copy(Args, Args + args_Size, args_);
831 : }
832 :
833 : AssertExclusiveLockAttr(SourceRange R, ASTContext &Ctx
834 : , unsigned SI
835 : )
836 : : InheritableAttr(attr::AssertExclusiveLock, R, SI, 1, 1)
837 : , args_Size(0), args_(nullptr)
838 : {
839 : }
840 :
841 : AssertExclusiveLockAttr *clone(ASTContext &C) const;
842 : void printPretty(raw_ostream &OS,
843 : const PrintingPolicy &Policy) const;
844 : const char *getSpelling() const;
845 : typedef Expr ** args_iterator;
846 0 : args_iterator args_begin() const { return args_; }
847 0 : args_iterator args_end() const { return args_ + args_Size; }
848 : unsigned args_size() const { return args_Size; }
849 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
850 :
851 :
852 :
853 :
854 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AssertExclusiveLock; }
855 : };
856 :
857 : class AssertSharedLockAttr : public InheritableAttr {
858 : unsigned args_Size;
859 : Expr * *args_;
860 :
861 :
862 : public:
863 : static AssertSharedLockAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
864 : AssertSharedLockAttr *A = new (Ctx) AssertSharedLockAttr(Loc, Ctx, Args, ArgsSize, 0);
865 : A->setImplicit(true);
866 : return A;
867 : }
868 :
869 : AssertSharedLockAttr(SourceRange R, ASTContext &Ctx
870 : , Expr * *Args, unsigned ArgsSize
871 : , unsigned SI
872 : )
873 : : InheritableAttr(attr::AssertSharedLock, R, SI, 1, 1)
874 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
875 : {
876 : std::copy(Args, Args + args_Size, args_);
877 : }
878 :
879 : AssertSharedLockAttr(SourceRange R, ASTContext &Ctx
880 : , unsigned SI
881 : )
882 : : InheritableAttr(attr::AssertSharedLock, R, SI, 1, 1)
883 : , args_Size(0), args_(nullptr)
884 : {
885 : }
886 :
887 : AssertSharedLockAttr *clone(ASTContext &C) const;
888 : void printPretty(raw_ostream &OS,
889 : const PrintingPolicy &Policy) const;
890 : const char *getSpelling() const;
891 : typedef Expr ** args_iterator;
892 0 : args_iterator args_begin() const { return args_; }
893 0 : args_iterator args_end() const { return args_ + args_Size; }
894 : unsigned args_size() const { return args_Size; }
895 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
896 :
897 :
898 :
899 :
900 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AssertSharedLock; }
901 : };
902 :
903 : class AssumeAlignedAttr : public InheritableAttr {
904 : Expr * alignment;
905 :
906 : Expr * offset;
907 :
908 :
909 : public:
910 : static AssumeAlignedAttr *CreateImplicit(ASTContext &Ctx, Expr * Alignment, Expr * Offset, SourceRange Loc = SourceRange()) {
911 : AssumeAlignedAttr *A = new (Ctx) AssumeAlignedAttr(Loc, Ctx, Alignment, Offset, 0);
912 : A->setImplicit(true);
913 : return A;
914 : }
915 :
916 : AssumeAlignedAttr(SourceRange R, ASTContext &Ctx
917 : , Expr * Alignment
918 : , Expr * Offset
919 : , unsigned SI
920 : )
921 : : InheritableAttr(attr::AssumeAligned, R, SI, 0, 0)
922 : , alignment(Alignment)
923 : , offset(Offset)
924 : {
925 :
926 :
927 : }
928 :
929 : AssumeAlignedAttr(SourceRange R, ASTContext &Ctx
930 : , Expr * Alignment
931 : , unsigned SI
932 : )
933 : : InheritableAttr(attr::AssumeAligned, R, SI, 0, 0)
934 : , alignment()
935 : , offset()
936 : {
937 :
938 : }
939 :
940 : AssumeAlignedAttr *clone(ASTContext &C) const;
941 : void printPretty(raw_ostream &OS,
942 : const PrintingPolicy &Policy) const;
943 : const char *getSpelling() const;
944 : Expr * getAlignment() const {
945 0 : return alignment;
946 : }
947 :
948 : Expr * getOffset() const {
949 0 : return offset;
950 : }
951 :
952 :
953 :
954 0 : static bool classof(const Attr *A) { return A->getKind() == attr::AssumeAligned; }
955 : };
956 :
957 : class AvailabilityAttr : public InheritableAttr {
958 : IdentifierInfo * platform;
959 :
960 : VersionTuple introduced;
961 :
962 :
963 : VersionTuple deprecated;
964 :
965 :
966 : VersionTuple obsoleted;
967 :
968 :
969 : bool unavailable;
970 :
971 : unsigned messageLength;
972 : char *message;
973 :
974 :
975 : public:
976 : static AvailabilityAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool Unavailable, llvm::StringRef Message, SourceRange Loc = SourceRange()) {
977 : AvailabilityAttr *A = new (Ctx) AvailabilityAttr(Loc, Ctx, Platform, Introduced, Deprecated, Obsoleted, Unavailable, Message, 0);
978 : A->setImplicit(true);
979 : return A;
980 : }
981 :
982 : AvailabilityAttr(SourceRange R, ASTContext &Ctx
983 : , IdentifierInfo * Platform
984 : , VersionTuple Introduced
985 : , VersionTuple Deprecated
986 : , VersionTuple Obsoleted
987 : , bool Unavailable
988 : , llvm::StringRef Message
989 : , unsigned SI
990 : )
991 : : InheritableAttr(attr::Availability, R, SI, 0, 1)
992 : , platform(Platform)
993 : , introduced(Introduced)
994 : , deprecated(Deprecated)
995 : , obsoleted(Obsoleted)
996 : , unavailable(Unavailable)
997 : , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
998 : {
999 :
1000 :
1001 :
1002 :
1003 :
1004 : if (!Message.empty())
1005 : std::memcpy(message, Message.data(), messageLength);
1006 : }
1007 :
1008 : AvailabilityAttr *clone(ASTContext &C) const;
1009 : void printPretty(raw_ostream &OS,
1010 : const PrintingPolicy &Policy) const;
1011 : const char *getSpelling() const;
1012 : IdentifierInfo * getPlatform() const {
1013 : return platform;
1014 : }
1015 :
1016 : VersionTuple getIntroduced() const {
1017 : return introduced;
1018 : }
1019 : void setIntroduced(ASTContext &C, VersionTuple V) {
1020 : introduced = V;
1021 : }
1022 :
1023 : VersionTuple getDeprecated() const {
1024 : return deprecated;
1025 : }
1026 : void setDeprecated(ASTContext &C, VersionTuple V) {
1027 : deprecated = V;
1028 : }
1029 :
1030 : VersionTuple getObsoleted() const {
1031 : return obsoleted;
1032 : }
1033 : void setObsoleted(ASTContext &C, VersionTuple V) {
1034 : obsoleted = V;
1035 : }
1036 :
1037 : bool getUnavailable() const {
1038 : return unavailable;
1039 : }
1040 :
1041 : llvm::StringRef getMessage() const {
1042 : return llvm::StringRef(message, messageLength);
1043 : }
1044 : unsigned getMessageLength() const {
1045 : return messageLength;
1046 : }
1047 : void setMessage(ASTContext &C, llvm::StringRef S) {
1048 : messageLength = S.size();
1049 : this->message = new (C, 1) char [messageLength];
1050 : if (!S.empty())
1051 : std::memcpy(this->message, S.data(), messageLength);
1052 : }
1053 :
1054 : static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
1055 : return llvm::StringSwitch<llvm::StringRef>(Platform)
1056 : .Case("android", "Android")
1057 : .Case("ios", "iOS")
1058 : .Case("macosx", "OS X")
1059 : .Case("ios_app_extension", "iOS (App Extension)")
1060 : .Case("macosx_app_extension", "OS X (App Extension)")
1061 : .Default(llvm::StringRef());
1062 : }
1063 :
1064 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Availability; }
1065 : };
1066 :
1067 : class BlocksAttr : public InheritableAttr {
1068 : public:
1069 : enum BlockType {
1070 : ByRef
1071 : };
1072 : private:
1073 : BlockType type;
1074 :
1075 :
1076 : public:
1077 : static BlocksAttr *CreateImplicit(ASTContext &Ctx, BlockType Type, SourceRange Loc = SourceRange()) {
1078 : BlocksAttr *A = new (Ctx) BlocksAttr(Loc, Ctx, Type, 0);
1079 : A->setImplicit(true);
1080 : return A;
1081 : }
1082 :
1083 : BlocksAttr(SourceRange R, ASTContext &Ctx
1084 : , BlockType Type
1085 : , unsigned SI
1086 : )
1087 : : InheritableAttr(attr::Blocks, R, SI, 0, 0)
1088 : , type(Type)
1089 : {
1090 :
1091 : }
1092 :
1093 : BlocksAttr *clone(ASTContext &C) const;
1094 : void printPretty(raw_ostream &OS,
1095 : const PrintingPolicy &Policy) const;
1096 : const char *getSpelling() const;
1097 : BlockType getType() const {
1098 : return type;
1099 : }
1100 :
1101 : static bool ConvertStrToBlockType(StringRef Val, BlockType &Out) {
1102 : Optional<BlockType> R = llvm::StringSwitch<Optional<BlockType>>(Val)
1103 : .Case("byref", BlocksAttr::ByRef)
1104 : .Default(Optional<BlockType>());
1105 : if (R) {
1106 : Out = *R;
1107 : return true;
1108 : }
1109 : return false;
1110 : }
1111 :
1112 : static const char *ConvertBlockTypeToStr(BlockType Val) {
1113 : switch(Val) {
1114 : case BlocksAttr::ByRef: return "byref";
1115 : }
1116 : llvm_unreachable("No enumerator with that value");
1117 : }
1118 :
1119 :
1120 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Blocks; }
1121 : };
1122 :
1123 : class C11NoReturnAttr : public InheritableAttr {
1124 :
1125 : public:
1126 : static C11NoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1127 : C11NoReturnAttr *A = new (Ctx) C11NoReturnAttr(Loc, Ctx, 0);
1128 : A->setImplicit(true);
1129 : return A;
1130 : }
1131 :
1132 : C11NoReturnAttr(SourceRange R, ASTContext &Ctx
1133 : , unsigned SI
1134 : )
1135 : : InheritableAttr(attr::C11NoReturn, R, SI, 0, 0)
1136 : {
1137 : }
1138 :
1139 : C11NoReturnAttr *clone(ASTContext &C) const;
1140 : void printPretty(raw_ostream &OS,
1141 : const PrintingPolicy &Policy) const;
1142 : const char *getSpelling() const;
1143 :
1144 :
1145 0 : static bool classof(const Attr *A) { return A->getKind() == attr::C11NoReturn; }
1146 : };
1147 :
1148 : class CDeclAttr : public InheritableAttr {
1149 :
1150 : public:
1151 : static CDeclAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1152 : CDeclAttr *A = new (Ctx) CDeclAttr(Loc, Ctx, 0);
1153 : A->setImplicit(true);
1154 : return A;
1155 : }
1156 :
1157 : CDeclAttr(SourceRange R, ASTContext &Ctx
1158 : , unsigned SI
1159 : )
1160 : : InheritableAttr(attr::CDecl, R, SI, 0, 0)
1161 : {
1162 : }
1163 :
1164 : CDeclAttr *clone(ASTContext &C) const;
1165 : void printPretty(raw_ostream &OS,
1166 : const PrintingPolicy &Policy) const;
1167 : const char *getSpelling() const;
1168 :
1169 :
1170 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CDecl; }
1171 : };
1172 :
1173 : class CFAuditedTransferAttr : public InheritableAttr {
1174 :
1175 : public:
1176 : static CFAuditedTransferAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1177 : CFAuditedTransferAttr *A = new (Ctx) CFAuditedTransferAttr(Loc, Ctx, 0);
1178 : A->setImplicit(true);
1179 : return A;
1180 : }
1181 :
1182 : CFAuditedTransferAttr(SourceRange R, ASTContext &Ctx
1183 : , unsigned SI
1184 : )
1185 : : InheritableAttr(attr::CFAuditedTransfer, R, SI, 0, 0)
1186 : {
1187 : }
1188 :
1189 : CFAuditedTransferAttr *clone(ASTContext &C) const;
1190 : void printPretty(raw_ostream &OS,
1191 : const PrintingPolicy &Policy) const;
1192 : const char *getSpelling() const;
1193 :
1194 :
1195 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CFAuditedTransfer; }
1196 : };
1197 :
1198 : class CFConsumedAttr : public InheritableParamAttr {
1199 :
1200 : public:
1201 : static CFConsumedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1202 : CFConsumedAttr *A = new (Ctx) CFConsumedAttr(Loc, Ctx, 0);
1203 : A->setImplicit(true);
1204 : return A;
1205 : }
1206 :
1207 : CFConsumedAttr(SourceRange R, ASTContext &Ctx
1208 : , unsigned SI
1209 : )
1210 : : InheritableParamAttr(attr::CFConsumed, R, SI, 0, 0)
1211 : {
1212 : }
1213 :
1214 : CFConsumedAttr *clone(ASTContext &C) const;
1215 : void printPretty(raw_ostream &OS,
1216 : const PrintingPolicy &Policy) const;
1217 : const char *getSpelling() const;
1218 :
1219 :
1220 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CFConsumed; }
1221 : };
1222 :
1223 : class CFReturnsNotRetainedAttr : public InheritableAttr {
1224 :
1225 : public:
1226 : static CFReturnsNotRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1227 : CFReturnsNotRetainedAttr *A = new (Ctx) CFReturnsNotRetainedAttr(Loc, Ctx, 0);
1228 : A->setImplicit(true);
1229 : return A;
1230 : }
1231 :
1232 : CFReturnsNotRetainedAttr(SourceRange R, ASTContext &Ctx
1233 : , unsigned SI
1234 : )
1235 : : InheritableAttr(attr::CFReturnsNotRetained, R, SI, 0, 0)
1236 : {
1237 : }
1238 :
1239 : CFReturnsNotRetainedAttr *clone(ASTContext &C) const;
1240 : void printPretty(raw_ostream &OS,
1241 : const PrintingPolicy &Policy) const;
1242 : const char *getSpelling() const;
1243 :
1244 :
1245 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CFReturnsNotRetained; }
1246 : };
1247 :
1248 : class CFReturnsRetainedAttr : public InheritableAttr {
1249 :
1250 : public:
1251 : static CFReturnsRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1252 : CFReturnsRetainedAttr *A = new (Ctx) CFReturnsRetainedAttr(Loc, Ctx, 0);
1253 : A->setImplicit(true);
1254 : return A;
1255 : }
1256 :
1257 : CFReturnsRetainedAttr(SourceRange R, ASTContext &Ctx
1258 : , unsigned SI
1259 : )
1260 : : InheritableAttr(attr::CFReturnsRetained, R, SI, 0, 0)
1261 : {
1262 : }
1263 :
1264 : CFReturnsRetainedAttr *clone(ASTContext &C) const;
1265 : void printPretty(raw_ostream &OS,
1266 : const PrintingPolicy &Policy) const;
1267 : const char *getSpelling() const;
1268 :
1269 :
1270 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CFReturnsRetained; }
1271 : };
1272 :
1273 : class CFUnknownTransferAttr : public InheritableAttr {
1274 :
1275 : public:
1276 : static CFUnknownTransferAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1277 : CFUnknownTransferAttr *A = new (Ctx) CFUnknownTransferAttr(Loc, Ctx, 0);
1278 : A->setImplicit(true);
1279 : return A;
1280 : }
1281 :
1282 : CFUnknownTransferAttr(SourceRange R, ASTContext &Ctx
1283 : , unsigned SI
1284 : )
1285 : : InheritableAttr(attr::CFUnknownTransfer, R, SI, 0, 0)
1286 : {
1287 : }
1288 :
1289 : CFUnknownTransferAttr *clone(ASTContext &C) const;
1290 : void printPretty(raw_ostream &OS,
1291 : const PrintingPolicy &Policy) const;
1292 : const char *getSpelling() const;
1293 :
1294 :
1295 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CFUnknownTransfer; }
1296 : };
1297 :
1298 : class CUDAConstantAttr : public InheritableAttr {
1299 :
1300 : public:
1301 : static CUDAConstantAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1302 : CUDAConstantAttr *A = new (Ctx) CUDAConstantAttr(Loc, Ctx, 0);
1303 : A->setImplicit(true);
1304 : return A;
1305 : }
1306 :
1307 : CUDAConstantAttr(SourceRange R, ASTContext &Ctx
1308 : , unsigned SI
1309 : )
1310 : : InheritableAttr(attr::CUDAConstant, R, SI, 0, 0)
1311 : {
1312 : }
1313 :
1314 : CUDAConstantAttr *clone(ASTContext &C) const;
1315 : void printPretty(raw_ostream &OS,
1316 : const PrintingPolicy &Policy) const;
1317 : const char *getSpelling() const;
1318 :
1319 :
1320 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDAConstant; }
1321 : };
1322 :
1323 : class CUDADeviceAttr : public InheritableAttr {
1324 :
1325 : public:
1326 : static CUDADeviceAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1327 : CUDADeviceAttr *A = new (Ctx) CUDADeviceAttr(Loc, Ctx, 0);
1328 : A->setImplicit(true);
1329 : return A;
1330 : }
1331 :
1332 : CUDADeviceAttr(SourceRange R, ASTContext &Ctx
1333 : , unsigned SI
1334 : )
1335 : : InheritableAttr(attr::CUDADevice, R, SI, 0, 0)
1336 : {
1337 : }
1338 :
1339 : CUDADeviceAttr *clone(ASTContext &C) const;
1340 : void printPretty(raw_ostream &OS,
1341 : const PrintingPolicy &Policy) const;
1342 : const char *getSpelling() const;
1343 :
1344 :
1345 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDADevice; }
1346 : };
1347 :
1348 : class CUDAGlobalAttr : public InheritableAttr {
1349 :
1350 : public:
1351 : static CUDAGlobalAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1352 : CUDAGlobalAttr *A = new (Ctx) CUDAGlobalAttr(Loc, Ctx, 0);
1353 : A->setImplicit(true);
1354 : return A;
1355 : }
1356 :
1357 : CUDAGlobalAttr(SourceRange R, ASTContext &Ctx
1358 : , unsigned SI
1359 : )
1360 : : InheritableAttr(attr::CUDAGlobal, R, SI, 0, 0)
1361 : {
1362 : }
1363 :
1364 : CUDAGlobalAttr *clone(ASTContext &C) const;
1365 : void printPretty(raw_ostream &OS,
1366 : const PrintingPolicy &Policy) const;
1367 : const char *getSpelling() const;
1368 :
1369 :
1370 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDAGlobal; }
1371 : };
1372 :
1373 : class CUDAHostAttr : public InheritableAttr {
1374 :
1375 : public:
1376 : static CUDAHostAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1377 : CUDAHostAttr *A = new (Ctx) CUDAHostAttr(Loc, Ctx, 0);
1378 : A->setImplicit(true);
1379 : return A;
1380 : }
1381 :
1382 : CUDAHostAttr(SourceRange R, ASTContext &Ctx
1383 : , unsigned SI
1384 : )
1385 : : InheritableAttr(attr::CUDAHost, R, SI, 0, 0)
1386 : {
1387 : }
1388 :
1389 : CUDAHostAttr *clone(ASTContext &C) const;
1390 : void printPretty(raw_ostream &OS,
1391 : const PrintingPolicy &Policy) const;
1392 : const char *getSpelling() const;
1393 :
1394 :
1395 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDAHost; }
1396 : };
1397 :
1398 : class CUDAInvalidTargetAttr : public InheritableAttr {
1399 :
1400 : public:
1401 : static CUDAInvalidTargetAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1402 : CUDAInvalidTargetAttr *A = new (Ctx) CUDAInvalidTargetAttr(Loc, Ctx, 0);
1403 : A->setImplicit(true);
1404 : return A;
1405 : }
1406 :
1407 : CUDAInvalidTargetAttr(SourceRange R, ASTContext &Ctx
1408 : , unsigned SI
1409 : )
1410 : : InheritableAttr(attr::CUDAInvalidTarget, R, SI, 0, 0)
1411 : {
1412 : }
1413 :
1414 : CUDAInvalidTargetAttr *clone(ASTContext &C) const;
1415 : void printPretty(raw_ostream &OS,
1416 : const PrintingPolicy &Policy) const;
1417 : const char *getSpelling() const;
1418 :
1419 :
1420 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDAInvalidTarget; }
1421 : };
1422 :
1423 : class CUDALaunchBoundsAttr : public InheritableAttr {
1424 : Expr * maxThreads;
1425 :
1426 : Expr * minBlocks;
1427 :
1428 :
1429 : public:
1430 : static CUDALaunchBoundsAttr *CreateImplicit(ASTContext &Ctx, Expr * MaxThreads, Expr * MinBlocks, SourceRange Loc = SourceRange()) {
1431 : CUDALaunchBoundsAttr *A = new (Ctx) CUDALaunchBoundsAttr(Loc, Ctx, MaxThreads, MinBlocks, 0);
1432 : A->setImplicit(true);
1433 : return A;
1434 : }
1435 :
1436 : CUDALaunchBoundsAttr(SourceRange R, ASTContext &Ctx
1437 : , Expr * MaxThreads
1438 : , Expr * MinBlocks
1439 : , unsigned SI
1440 : )
1441 : : InheritableAttr(attr::CUDALaunchBounds, R, SI, 0, 0)
1442 : , maxThreads(MaxThreads)
1443 : , minBlocks(MinBlocks)
1444 : {
1445 :
1446 :
1447 : }
1448 :
1449 : CUDALaunchBoundsAttr(SourceRange R, ASTContext &Ctx
1450 : , Expr * MaxThreads
1451 : , unsigned SI
1452 : )
1453 : : InheritableAttr(attr::CUDALaunchBounds, R, SI, 0, 0)
1454 : , maxThreads()
1455 : , minBlocks()
1456 : {
1457 :
1458 : }
1459 :
1460 : CUDALaunchBoundsAttr *clone(ASTContext &C) const;
1461 : void printPretty(raw_ostream &OS,
1462 : const PrintingPolicy &Policy) const;
1463 : const char *getSpelling() const;
1464 : Expr * getMaxThreads() const {
1465 0 : return maxThreads;
1466 : }
1467 :
1468 : Expr * getMinBlocks() const {
1469 0 : return minBlocks;
1470 : }
1471 :
1472 :
1473 :
1474 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDALaunchBounds; }
1475 : };
1476 :
1477 : class CUDASharedAttr : public InheritableAttr {
1478 :
1479 : public:
1480 : static CUDASharedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1481 : CUDASharedAttr *A = new (Ctx) CUDASharedAttr(Loc, Ctx, 0);
1482 : A->setImplicit(true);
1483 : return A;
1484 : }
1485 :
1486 : CUDASharedAttr(SourceRange R, ASTContext &Ctx
1487 : , unsigned SI
1488 : )
1489 : : InheritableAttr(attr::CUDAShared, R, SI, 0, 0)
1490 : {
1491 : }
1492 :
1493 : CUDASharedAttr *clone(ASTContext &C) const;
1494 : void printPretty(raw_ostream &OS,
1495 : const PrintingPolicy &Policy) const;
1496 : const char *getSpelling() const;
1497 :
1498 :
1499 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CUDAShared; }
1500 : };
1501 :
1502 : class CXX11NoReturnAttr : public InheritableAttr {
1503 :
1504 : public:
1505 : static CXX11NoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1506 : CXX11NoReturnAttr *A = new (Ctx) CXX11NoReturnAttr(Loc, Ctx, 0);
1507 : A->setImplicit(true);
1508 : return A;
1509 : }
1510 :
1511 : CXX11NoReturnAttr(SourceRange R, ASTContext &Ctx
1512 : , unsigned SI
1513 : )
1514 : : InheritableAttr(attr::CXX11NoReturn, R, SI, 0, 0)
1515 : {
1516 : }
1517 :
1518 : CXX11NoReturnAttr *clone(ASTContext &C) const;
1519 : void printPretty(raw_ostream &OS,
1520 : const PrintingPolicy &Policy) const;
1521 : const char *getSpelling() const;
1522 :
1523 :
1524 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CXX11NoReturn; }
1525 : };
1526 :
1527 : class CallableWhenAttr : public InheritableAttr {
1528 : public:
1529 : enum ConsumedState {
1530 : Unknown,
1531 : Consumed,
1532 : Unconsumed
1533 : };
1534 : private:
1535 : unsigned callableStates_Size;
1536 : ConsumedState *callableStates_;
1537 :
1538 :
1539 : public:
1540 : static CallableWhenAttr *CreateImplicit(ASTContext &Ctx, ConsumedState *CallableStates, unsigned CallableStatesSize, SourceRange Loc = SourceRange()) {
1541 : CallableWhenAttr *A = new (Ctx) CallableWhenAttr(Loc, Ctx, CallableStates, CallableStatesSize, 0);
1542 : A->setImplicit(true);
1543 : return A;
1544 : }
1545 :
1546 : CallableWhenAttr(SourceRange R, ASTContext &Ctx
1547 : , ConsumedState *CallableStates, unsigned CallableStatesSize
1548 : , unsigned SI
1549 : )
1550 : : InheritableAttr(attr::CallableWhen, R, SI, 0, 0)
1551 : , callableStates_Size(CallableStatesSize), callableStates_(new (Ctx, 16) ConsumedState[callableStates_Size])
1552 : {
1553 : std::copy(CallableStates, CallableStates + callableStates_Size, callableStates_);
1554 : }
1555 :
1556 : CallableWhenAttr(SourceRange R, ASTContext &Ctx
1557 : , unsigned SI
1558 : )
1559 : : InheritableAttr(attr::CallableWhen, R, SI, 0, 0)
1560 : , callableStates_Size(0), callableStates_(nullptr)
1561 : {
1562 : }
1563 :
1564 : CallableWhenAttr *clone(ASTContext &C) const;
1565 : void printPretty(raw_ostream &OS,
1566 : const PrintingPolicy &Policy) const;
1567 : const char *getSpelling() const;
1568 : typedef ConsumedState* callableStates_iterator;
1569 : callableStates_iterator callableStates_begin() const { return callableStates_; }
1570 : callableStates_iterator callableStates_end() const { return callableStates_ + callableStates_Size; }
1571 : unsigned callableStates_size() const { return callableStates_Size; }
1572 : llvm::iterator_range<callableStates_iterator> callableStates() const { return llvm::make_range(callableStates_begin(), callableStates_end()); }
1573 :
1574 :
1575 : static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
1576 : Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
1577 : .Case("unknown", CallableWhenAttr::Unknown)
1578 : .Case("consumed", CallableWhenAttr::Consumed)
1579 : .Case("unconsumed", CallableWhenAttr::Unconsumed)
1580 : .Default(Optional<ConsumedState>());
1581 : if (R) {
1582 : Out = *R;
1583 : return true;
1584 : }
1585 : return false;
1586 : }
1587 :
1588 : static const char *ConvertConsumedStateToStr(ConsumedState Val) {
1589 : switch(Val) {
1590 : case CallableWhenAttr::Unknown: return "unknown";
1591 : case CallableWhenAttr::Consumed: return "consumed";
1592 : case CallableWhenAttr::Unconsumed: return "unconsumed";
1593 : }
1594 : llvm_unreachable("No enumerator with that value");
1595 : }
1596 :
1597 :
1598 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CallableWhen; }
1599 : };
1600 :
1601 : class CapabilityAttr : public InheritableAttr {
1602 : unsigned nameLength;
1603 : char *name;
1604 :
1605 :
1606 : public:
1607 : enum Spelling {
1608 : GNU_capability = 0,
1609 : CXX11_clang_capability = 1,
1610 : GNU_shared_capability = 2,
1611 : CXX11_clang_shared_capability = 3
1612 : };
1613 :
1614 : static CapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
1615 : CapabilityAttr *A = new (Ctx) CapabilityAttr(Loc, Ctx, Name, S);
1616 : A->setImplicit(true);
1617 : return A;
1618 : }
1619 :
1620 : CapabilityAttr(SourceRange R, ASTContext &Ctx
1621 : , llvm::StringRef Name
1622 : , unsigned SI
1623 : )
1624 : : InheritableAttr(attr::Capability, R, SI, 0, 0)
1625 : , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
1626 : {
1627 : if (!Name.empty())
1628 : std::memcpy(name, Name.data(), nameLength);
1629 : }
1630 :
1631 : CapabilityAttr *clone(ASTContext &C) const;
1632 : void printPretty(raw_ostream &OS,
1633 : const PrintingPolicy &Policy) const;
1634 : const char *getSpelling() const;
1635 : Spelling getSemanticSpelling() const {
1636 : switch (SpellingListIndex) {
1637 : default: llvm_unreachable("Unknown spelling list index");
1638 : case 0: return GNU_capability;
1639 : case 1: return CXX11_clang_capability;
1640 : case 2: return GNU_shared_capability;
1641 : case 3: return CXX11_clang_shared_capability;
1642 : }
1643 : }
1644 : bool isShared() const { return SpellingListIndex == 2 ||
1645 : SpellingListIndex == 3; }
1646 : llvm::StringRef getName() const {
1647 : return llvm::StringRef(name, nameLength);
1648 : }
1649 : unsigned getNameLength() const {
1650 : return nameLength;
1651 : }
1652 : void setName(ASTContext &C, llvm::StringRef S) {
1653 : nameLength = S.size();
1654 : this->name = new (C, 1) char [nameLength];
1655 : if (!S.empty())
1656 : std::memcpy(this->name, S.data(), nameLength);
1657 : }
1658 :
1659 :
1660 : bool isMutex() const { return getName().equals_lower("mutex"); }
1661 : bool isRole() const { return getName().equals_lower("role"); }
1662 :
1663 :
1664 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Capability; }
1665 : };
1666 :
1667 : class CapturedRecordAttr : public InheritableAttr {
1668 :
1669 : public:
1670 : static CapturedRecordAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1671 : CapturedRecordAttr *A = new (Ctx) CapturedRecordAttr(Loc, Ctx, 0);
1672 : A->setImplicit(true);
1673 : return A;
1674 : }
1675 :
1676 : CapturedRecordAttr(SourceRange R, ASTContext &Ctx
1677 : , unsigned SI
1678 : )
1679 : : InheritableAttr(attr::CapturedRecord, R, SI, 0, 0)
1680 : {
1681 : }
1682 :
1683 : CapturedRecordAttr *clone(ASTContext &C) const;
1684 : void printPretty(raw_ostream &OS,
1685 : const PrintingPolicy &Policy) const;
1686 : const char *getSpelling() const;
1687 :
1688 :
1689 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CapturedRecord; }
1690 : };
1691 :
1692 : class CarriesDependencyAttr : public InheritableParamAttr {
1693 :
1694 : public:
1695 : static CarriesDependencyAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1696 : CarriesDependencyAttr *A = new (Ctx) CarriesDependencyAttr(Loc, Ctx, 0);
1697 : A->setImplicit(true);
1698 : return A;
1699 : }
1700 :
1701 : CarriesDependencyAttr(SourceRange R, ASTContext &Ctx
1702 : , unsigned SI
1703 : )
1704 : : InheritableParamAttr(attr::CarriesDependency, R, SI, 0, 0)
1705 : {
1706 : }
1707 :
1708 : CarriesDependencyAttr *clone(ASTContext &C) const;
1709 : void printPretty(raw_ostream &OS,
1710 : const PrintingPolicy &Policy) const;
1711 : const char *getSpelling() const;
1712 :
1713 :
1714 0 : static bool classof(const Attr *A) { return A->getKind() == attr::CarriesDependency; }
1715 : };
1716 :
1717 : class CleanupAttr : public InheritableAttr {
1718 : FunctionDecl * functionDecl;
1719 :
1720 :
1721 : public:
1722 : static CleanupAttr *CreateImplicit(ASTContext &Ctx, FunctionDecl * FunctionDecl, SourceRange Loc = SourceRange()) {
1723 : CleanupAttr *A = new (Ctx) CleanupAttr(Loc, Ctx, FunctionDecl, 0);
1724 : A->setImplicit(true);
1725 : return A;
1726 : }
1727 :
1728 : CleanupAttr(SourceRange R, ASTContext &Ctx
1729 : , FunctionDecl * FunctionDecl
1730 : , unsigned SI
1731 : )
1732 : : InheritableAttr(attr::Cleanup, R, SI, 0, 0)
1733 : , functionDecl(FunctionDecl)
1734 : {
1735 :
1736 : }
1737 :
1738 : CleanupAttr *clone(ASTContext &C) const;
1739 : void printPretty(raw_ostream &OS,
1740 : const PrintingPolicy &Policy) const;
1741 : const char *getSpelling() const;
1742 : FunctionDecl * getFunctionDecl() const {
1743 : return functionDecl;
1744 : }
1745 :
1746 :
1747 :
1748 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Cleanup; }
1749 : };
1750 :
1751 : class ColdAttr : public InheritableAttr {
1752 :
1753 : public:
1754 : static ColdAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1755 : ColdAttr *A = new (Ctx) ColdAttr(Loc, Ctx, 0);
1756 : A->setImplicit(true);
1757 : return A;
1758 : }
1759 :
1760 : ColdAttr(SourceRange R, ASTContext &Ctx
1761 : , unsigned SI
1762 : )
1763 : : InheritableAttr(attr::Cold, R, SI, 0, 0)
1764 : {
1765 : }
1766 :
1767 : ColdAttr *clone(ASTContext &C) const;
1768 : void printPretty(raw_ostream &OS,
1769 : const PrintingPolicy &Policy) const;
1770 : const char *getSpelling() const;
1771 :
1772 :
1773 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Cold; }
1774 : };
1775 :
1776 : class CommonAttr : public InheritableAttr {
1777 :
1778 : public:
1779 : static CommonAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1780 : CommonAttr *A = new (Ctx) CommonAttr(Loc, Ctx, 0);
1781 : A->setImplicit(true);
1782 : return A;
1783 : }
1784 :
1785 : CommonAttr(SourceRange R, ASTContext &Ctx
1786 : , unsigned SI
1787 : )
1788 : : InheritableAttr(attr::Common, R, SI, 0, 0)
1789 : {
1790 : }
1791 :
1792 : CommonAttr *clone(ASTContext &C) const;
1793 : void printPretty(raw_ostream &OS,
1794 : const PrintingPolicy &Policy) const;
1795 : const char *getSpelling() const;
1796 :
1797 :
1798 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Common; }
1799 : };
1800 :
1801 : class ConstAttr : public InheritableAttr {
1802 :
1803 : public:
1804 : static ConstAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1805 : ConstAttr *A = new (Ctx) ConstAttr(Loc, Ctx, 0);
1806 : A->setImplicit(true);
1807 : return A;
1808 : }
1809 :
1810 : ConstAttr(SourceRange R, ASTContext &Ctx
1811 : , unsigned SI
1812 : )
1813 : : InheritableAttr(attr::Const, R, SI, 0, 0)
1814 : {
1815 : }
1816 :
1817 : ConstAttr *clone(ASTContext &C) const;
1818 : void printPretty(raw_ostream &OS,
1819 : const PrintingPolicy &Policy) const;
1820 : const char *getSpelling() const;
1821 :
1822 :
1823 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Const; }
1824 : };
1825 :
1826 : class ConstructorAttr : public InheritableAttr {
1827 : int priority;
1828 :
1829 :
1830 : public:
1831 : static ConstructorAttr *CreateImplicit(ASTContext &Ctx, int Priority, SourceRange Loc = SourceRange()) {
1832 : ConstructorAttr *A = new (Ctx) ConstructorAttr(Loc, Ctx, Priority, 0);
1833 : A->setImplicit(true);
1834 : return A;
1835 : }
1836 :
1837 : ConstructorAttr(SourceRange R, ASTContext &Ctx
1838 : , int Priority
1839 : , unsigned SI
1840 : )
1841 : : InheritableAttr(attr::Constructor, R, SI, 0, 0)
1842 : , priority(Priority)
1843 : {
1844 :
1845 : }
1846 :
1847 : ConstructorAttr(SourceRange R, ASTContext &Ctx
1848 : , unsigned SI
1849 : )
1850 : : InheritableAttr(attr::Constructor, R, SI, 0, 0)
1851 : , priority()
1852 : {
1853 : }
1854 :
1855 : ConstructorAttr *clone(ASTContext &C) const;
1856 : void printPretty(raw_ostream &OS,
1857 : const PrintingPolicy &Policy) const;
1858 : const char *getSpelling() const;
1859 : int getPriority() const {
1860 : return priority;
1861 : }
1862 :
1863 : static const int DefaultPriority = 65535;
1864 :
1865 :
1866 :
1867 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Constructor; }
1868 : };
1869 :
1870 : class ConsumableAttr : public InheritableAttr {
1871 : public:
1872 : enum ConsumedState {
1873 : Unknown,
1874 : Consumed,
1875 : Unconsumed
1876 : };
1877 : private:
1878 : ConsumedState defaultState;
1879 :
1880 :
1881 : public:
1882 : static ConsumableAttr *CreateImplicit(ASTContext &Ctx, ConsumedState DefaultState, SourceRange Loc = SourceRange()) {
1883 : ConsumableAttr *A = new (Ctx) ConsumableAttr(Loc, Ctx, DefaultState, 0);
1884 : A->setImplicit(true);
1885 : return A;
1886 : }
1887 :
1888 : ConsumableAttr(SourceRange R, ASTContext &Ctx
1889 : , ConsumedState DefaultState
1890 : , unsigned SI
1891 : )
1892 : : InheritableAttr(attr::Consumable, R, SI, 0, 0)
1893 : , defaultState(DefaultState)
1894 : {
1895 :
1896 : }
1897 :
1898 : ConsumableAttr *clone(ASTContext &C) const;
1899 : void printPretty(raw_ostream &OS,
1900 : const PrintingPolicy &Policy) const;
1901 : const char *getSpelling() const;
1902 : ConsumedState getDefaultState() const {
1903 : return defaultState;
1904 : }
1905 :
1906 : static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
1907 : Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
1908 : .Case("unknown", ConsumableAttr::Unknown)
1909 : .Case("consumed", ConsumableAttr::Consumed)
1910 : .Case("unconsumed", ConsumableAttr::Unconsumed)
1911 : .Default(Optional<ConsumedState>());
1912 : if (R) {
1913 : Out = *R;
1914 : return true;
1915 : }
1916 : return false;
1917 : }
1918 :
1919 : static const char *ConvertConsumedStateToStr(ConsumedState Val) {
1920 : switch(Val) {
1921 : case ConsumableAttr::Unknown: return "unknown";
1922 : case ConsumableAttr::Consumed: return "consumed";
1923 : case ConsumableAttr::Unconsumed: return "unconsumed";
1924 : }
1925 : llvm_unreachable("No enumerator with that value");
1926 : }
1927 :
1928 :
1929 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Consumable; }
1930 : };
1931 :
1932 : class ConsumableAutoCastAttr : public InheritableAttr {
1933 :
1934 : public:
1935 : static ConsumableAutoCastAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1936 : ConsumableAutoCastAttr *A = new (Ctx) ConsumableAutoCastAttr(Loc, Ctx, 0);
1937 : A->setImplicit(true);
1938 : return A;
1939 : }
1940 :
1941 : ConsumableAutoCastAttr(SourceRange R, ASTContext &Ctx
1942 : , unsigned SI
1943 : )
1944 : : InheritableAttr(attr::ConsumableAutoCast, R, SI, 0, 0)
1945 : {
1946 : }
1947 :
1948 : ConsumableAutoCastAttr *clone(ASTContext &C) const;
1949 : void printPretty(raw_ostream &OS,
1950 : const PrintingPolicy &Policy) const;
1951 : const char *getSpelling() const;
1952 :
1953 :
1954 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ConsumableAutoCast; }
1955 : };
1956 :
1957 : class ConsumableSetOnReadAttr : public InheritableAttr {
1958 :
1959 : public:
1960 : static ConsumableSetOnReadAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1961 : ConsumableSetOnReadAttr *A = new (Ctx) ConsumableSetOnReadAttr(Loc, Ctx, 0);
1962 : A->setImplicit(true);
1963 : return A;
1964 : }
1965 :
1966 : ConsumableSetOnReadAttr(SourceRange R, ASTContext &Ctx
1967 : , unsigned SI
1968 : )
1969 : : InheritableAttr(attr::ConsumableSetOnRead, R, SI, 0, 0)
1970 : {
1971 : }
1972 :
1973 : ConsumableSetOnReadAttr *clone(ASTContext &C) const;
1974 : void printPretty(raw_ostream &OS,
1975 : const PrintingPolicy &Policy) const;
1976 : const char *getSpelling() const;
1977 :
1978 :
1979 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ConsumableSetOnRead; }
1980 : };
1981 :
1982 : class DLLExportAttr : public InheritableAttr {
1983 :
1984 : public:
1985 : static DLLExportAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1986 : DLLExportAttr *A = new (Ctx) DLLExportAttr(Loc, Ctx, 0);
1987 : A->setImplicit(true);
1988 : return A;
1989 : }
1990 :
1991 : DLLExportAttr(SourceRange R, ASTContext &Ctx
1992 : , unsigned SI
1993 : )
1994 : : InheritableAttr(attr::DLLExport, R, SI, 0, 0)
1995 : {
1996 : }
1997 :
1998 : DLLExportAttr *clone(ASTContext &C) const;
1999 : void printPretty(raw_ostream &OS,
2000 : const PrintingPolicy &Policy) const;
2001 : const char *getSpelling() const;
2002 :
2003 :
2004 0 : static bool classof(const Attr *A) { return A->getKind() == attr::DLLExport; }
2005 : };
2006 :
2007 : class DLLImportAttr : public InheritableAttr {
2008 :
2009 : public:
2010 : static DLLImportAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2011 : DLLImportAttr *A = new (Ctx) DLLImportAttr(Loc, Ctx, 0);
2012 : A->setImplicit(true);
2013 : return A;
2014 : }
2015 :
2016 : DLLImportAttr(SourceRange R, ASTContext &Ctx
2017 : , unsigned SI
2018 : )
2019 : : InheritableAttr(attr::DLLImport, R, SI, 0, 0)
2020 : {
2021 : }
2022 :
2023 : DLLImportAttr *clone(ASTContext &C) const;
2024 : void printPretty(raw_ostream &OS,
2025 : const PrintingPolicy &Policy) const;
2026 : const char *getSpelling() const;
2027 :
2028 :
2029 0 : static bool classof(const Attr *A) { return A->getKind() == attr::DLLImport; }
2030 : };
2031 :
2032 : class DeprecatedAttr : public InheritableAttr {
2033 : unsigned messageLength;
2034 : char *message;
2035 :
2036 :
2037 : public:
2038 : static DeprecatedAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, SourceRange Loc = SourceRange()) {
2039 : DeprecatedAttr *A = new (Ctx) DeprecatedAttr(Loc, Ctx, Message, 0);
2040 : A->setImplicit(true);
2041 : return A;
2042 : }
2043 :
2044 : DeprecatedAttr(SourceRange R, ASTContext &Ctx
2045 : , llvm::StringRef Message
2046 : , unsigned SI
2047 : )
2048 : : InheritableAttr(attr::Deprecated, R, SI, 0, 0)
2049 : , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
2050 : {
2051 : if (!Message.empty())
2052 : std::memcpy(message, Message.data(), messageLength);
2053 : }
2054 :
2055 : DeprecatedAttr(SourceRange R, ASTContext &Ctx
2056 : , unsigned SI
2057 : )
2058 : : InheritableAttr(attr::Deprecated, R, SI, 0, 0)
2059 : , messageLength(0),message(0)
2060 : {
2061 : }
2062 :
2063 : DeprecatedAttr *clone(ASTContext &C) const;
2064 : void printPretty(raw_ostream &OS,
2065 : const PrintingPolicy &Policy) const;
2066 : const char *getSpelling() const;
2067 : llvm::StringRef getMessage() const {
2068 : return llvm::StringRef(message, messageLength);
2069 : }
2070 : unsigned getMessageLength() const {
2071 : return messageLength;
2072 : }
2073 : void setMessage(ASTContext &C, llvm::StringRef S) {
2074 : messageLength = S.size();
2075 : this->message = new (C, 1) char [messageLength];
2076 : if (!S.empty())
2077 : std::memcpy(this->message, S.data(), messageLength);
2078 : }
2079 :
2080 :
2081 :
2082 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Deprecated; }
2083 : };
2084 :
2085 : class DestructorAttr : public InheritableAttr {
2086 : int priority;
2087 :
2088 :
2089 : public:
2090 : static DestructorAttr *CreateImplicit(ASTContext &Ctx, int Priority, SourceRange Loc = SourceRange()) {
2091 : DestructorAttr *A = new (Ctx) DestructorAttr(Loc, Ctx, Priority, 0);
2092 : A->setImplicit(true);
2093 : return A;
2094 : }
2095 :
2096 : DestructorAttr(SourceRange R, ASTContext &Ctx
2097 : , int Priority
2098 : , unsigned SI
2099 : )
2100 : : InheritableAttr(attr::Destructor, R, SI, 0, 0)
2101 : , priority(Priority)
2102 : {
2103 :
2104 : }
2105 :
2106 : DestructorAttr(SourceRange R, ASTContext &Ctx
2107 : , unsigned SI
2108 : )
2109 : : InheritableAttr(attr::Destructor, R, SI, 0, 0)
2110 : , priority()
2111 : {
2112 : }
2113 :
2114 : DestructorAttr *clone(ASTContext &C) const;
2115 : void printPretty(raw_ostream &OS,
2116 : const PrintingPolicy &Policy) const;
2117 : const char *getSpelling() const;
2118 : int getPriority() const {
2119 : return priority;
2120 : }
2121 :
2122 : static const int DefaultPriority = 65535;
2123 :
2124 :
2125 :
2126 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Destructor; }
2127 : };
2128 :
2129 : class EnableIfAttr : public InheritableAttr {
2130 : Expr * cond;
2131 :
2132 : unsigned messageLength;
2133 : char *message;
2134 :
2135 :
2136 : public:
2137 : static EnableIfAttr *CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, SourceRange Loc = SourceRange()) {
2138 : EnableIfAttr *A = new (Ctx) EnableIfAttr(Loc, Ctx, Cond, Message, 0);
2139 : A->setImplicit(true);
2140 : return A;
2141 : }
2142 :
2143 : EnableIfAttr(SourceRange R, ASTContext &Ctx
2144 : , Expr * Cond
2145 : , llvm::StringRef Message
2146 : , unsigned SI
2147 : )
2148 : : InheritableAttr(attr::EnableIf, R, SI, 0, 0)
2149 : , cond(Cond)
2150 : , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
2151 : {
2152 :
2153 : if (!Message.empty())
2154 : std::memcpy(message, Message.data(), messageLength);
2155 : }
2156 :
2157 : EnableIfAttr *clone(ASTContext &C) const;
2158 : void printPretty(raw_ostream &OS,
2159 : const PrintingPolicy &Policy) const;
2160 : const char *getSpelling() const;
2161 : Expr * getCond() const {
2162 0 : return cond;
2163 : }
2164 :
2165 : llvm::StringRef getMessage() const {
2166 : return llvm::StringRef(message, messageLength);
2167 : }
2168 : unsigned getMessageLength() const {
2169 : return messageLength;
2170 : }
2171 : void setMessage(ASTContext &C, llvm::StringRef S) {
2172 : messageLength = S.size();
2173 : this->message = new (C, 1) char [messageLength];
2174 : if (!S.empty())
2175 : std::memcpy(this->message, S.data(), messageLength);
2176 : }
2177 :
2178 :
2179 :
2180 0 : static bool classof(const Attr *A) { return A->getKind() == attr::EnableIf; }
2181 : };
2182 :
2183 : class ExclusiveTrylockFunctionAttr : public InheritableAttr {
2184 : Expr * successValue;
2185 :
2186 : unsigned args_Size;
2187 : Expr * *args_;
2188 :
2189 :
2190 : public:
2191 : static ExclusiveTrylockFunctionAttr *CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
2192 : ExclusiveTrylockFunctionAttr *A = new (Ctx) ExclusiveTrylockFunctionAttr(Loc, Ctx, SuccessValue, Args, ArgsSize, 0);
2193 : A->setImplicit(true);
2194 : return A;
2195 : }
2196 :
2197 : ExclusiveTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
2198 : , Expr * SuccessValue
2199 : , Expr * *Args, unsigned ArgsSize
2200 : , unsigned SI
2201 : )
2202 : : InheritableAttr(attr::ExclusiveTrylockFunction, R, SI, 1, 1)
2203 : , successValue(SuccessValue)
2204 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
2205 : {
2206 :
2207 : std::copy(Args, Args + args_Size, args_);
2208 : }
2209 :
2210 : ExclusiveTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
2211 : , Expr * SuccessValue
2212 : , unsigned SI
2213 : )
2214 : : InheritableAttr(attr::ExclusiveTrylockFunction, R, SI, 1, 1)
2215 : , successValue()
2216 : , args_Size(0), args_(nullptr)
2217 : {
2218 :
2219 : }
2220 :
2221 : ExclusiveTrylockFunctionAttr *clone(ASTContext &C) const;
2222 : void printPretty(raw_ostream &OS,
2223 : const PrintingPolicy &Policy) const;
2224 : const char *getSpelling() const;
2225 : Expr * getSuccessValue() const {
2226 0 : return successValue;
2227 : }
2228 :
2229 : typedef Expr ** args_iterator;
2230 0 : args_iterator args_begin() const { return args_; }
2231 0 : args_iterator args_end() const { return args_ + args_Size; }
2232 : unsigned args_size() const { return args_Size; }
2233 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
2234 :
2235 :
2236 :
2237 :
2238 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ExclusiveTrylockFunction; }
2239 : };
2240 :
2241 : class FallThroughAttr : public Attr {
2242 :
2243 : public:
2244 : static FallThroughAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2245 : FallThroughAttr *A = new (Ctx) FallThroughAttr(Loc, Ctx, 0);
2246 : A->setImplicit(true);
2247 : return A;
2248 : }
2249 :
2250 : FallThroughAttr(SourceRange R, ASTContext &Ctx
2251 : , unsigned SI
2252 : )
2253 : : Attr(attr::FallThrough, R, SI, 0, 0)
2254 : {
2255 : }
2256 :
2257 : FallThroughAttr *clone(ASTContext &C) const;
2258 : void printPretty(raw_ostream &OS,
2259 : const PrintingPolicy &Policy) const;
2260 : const char *getSpelling() const;
2261 :
2262 :
2263 0 : static bool classof(const Attr *A) { return A->getKind() == attr::FallThrough; }
2264 : };
2265 :
2266 : class FastCallAttr : public InheritableAttr {
2267 :
2268 : public:
2269 : static FastCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2270 : FastCallAttr *A = new (Ctx) FastCallAttr(Loc, Ctx, 0);
2271 : A->setImplicit(true);
2272 : return A;
2273 : }
2274 :
2275 : FastCallAttr(SourceRange R, ASTContext &Ctx
2276 : , unsigned SI
2277 : )
2278 : : InheritableAttr(attr::FastCall, R, SI, 0, 0)
2279 : {
2280 : }
2281 :
2282 : FastCallAttr *clone(ASTContext &C) const;
2283 : void printPretty(raw_ostream &OS,
2284 : const PrintingPolicy &Policy) const;
2285 : const char *getSpelling() const;
2286 :
2287 :
2288 0 : static bool classof(const Attr *A) { return A->getKind() == attr::FastCall; }
2289 : };
2290 :
2291 : class FinalAttr : public InheritableAttr {
2292 :
2293 : public:
2294 : enum Spelling {
2295 : Keyword_final = 0,
2296 : Keyword_sealed = 1
2297 : };
2298 :
2299 : static FinalAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
2300 : FinalAttr *A = new (Ctx) FinalAttr(Loc, Ctx, S);
2301 : A->setImplicit(true);
2302 : return A;
2303 : }
2304 :
2305 : FinalAttr(SourceRange R, ASTContext &Ctx
2306 : , unsigned SI
2307 : )
2308 : : InheritableAttr(attr::Final, R, SI, 0, 0)
2309 : {
2310 : }
2311 :
2312 : FinalAttr *clone(ASTContext &C) const;
2313 : void printPretty(raw_ostream &OS,
2314 : const PrintingPolicy &Policy) const;
2315 : const char *getSpelling() const;
2316 : Spelling getSemanticSpelling() const {
2317 : switch (SpellingListIndex) {
2318 : default: llvm_unreachable("Unknown spelling list index");
2319 : case 0: return Keyword_final;
2320 : case 1: return Keyword_sealed;
2321 : }
2322 : }
2323 : bool isSpelledAsSealed() const { return SpellingListIndex == 1; }
2324 :
2325 :
2326 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Final; }
2327 : };
2328 :
2329 : class FlagEnumAttr : public InheritableAttr {
2330 :
2331 : public:
2332 : static FlagEnumAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2333 : FlagEnumAttr *A = new (Ctx) FlagEnumAttr(Loc, Ctx, 0);
2334 : A->setImplicit(true);
2335 : return A;
2336 : }
2337 :
2338 : FlagEnumAttr(SourceRange R, ASTContext &Ctx
2339 : , unsigned SI
2340 : )
2341 : : InheritableAttr(attr::FlagEnum, R, SI, 0, 0)
2342 : {
2343 : }
2344 :
2345 : FlagEnumAttr *clone(ASTContext &C) const;
2346 : void printPretty(raw_ostream &OS,
2347 : const PrintingPolicy &Policy) const;
2348 : const char *getSpelling() const;
2349 :
2350 : private:
2351 : llvm::APInt FlagBits;
2352 : public:
2353 : llvm::APInt &getFlagBits() {
2354 : return FlagBits;
2355 : }
2356 :
2357 : const llvm::APInt &getFlagBits() const {
2358 : return FlagBits;
2359 : }
2360 :
2361 :
2362 0 : static bool classof(const Attr *A) { return A->getKind() == attr::FlagEnum; }
2363 : };
2364 :
2365 : class FlattenAttr : public InheritableAttr {
2366 :
2367 : public:
2368 : static FlattenAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2369 : FlattenAttr *A = new (Ctx) FlattenAttr(Loc, Ctx, 0);
2370 : A->setImplicit(true);
2371 : return A;
2372 : }
2373 :
2374 : FlattenAttr(SourceRange R, ASTContext &Ctx
2375 : , unsigned SI
2376 : )
2377 : : InheritableAttr(attr::Flatten, R, SI, 0, 0)
2378 : {
2379 : }
2380 :
2381 : FlattenAttr *clone(ASTContext &C) const;
2382 : void printPretty(raw_ostream &OS,
2383 : const PrintingPolicy &Policy) const;
2384 : const char *getSpelling() const;
2385 :
2386 :
2387 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Flatten; }
2388 : };
2389 :
2390 : class FormatAttr : public InheritableAttr {
2391 : IdentifierInfo * type;
2392 :
2393 : int formatIdx;
2394 :
2395 : int firstArg;
2396 :
2397 :
2398 : public:
2399 : static FormatAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * Type, int FormatIdx, int FirstArg, SourceRange Loc = SourceRange()) {
2400 : FormatAttr *A = new (Ctx) FormatAttr(Loc, Ctx, Type, FormatIdx, FirstArg, 0);
2401 : A->setImplicit(true);
2402 : return A;
2403 : }
2404 :
2405 : FormatAttr(SourceRange R, ASTContext &Ctx
2406 : , IdentifierInfo * Type
2407 : , int FormatIdx
2408 : , int FirstArg
2409 : , unsigned SI
2410 : )
2411 : : InheritableAttr(attr::Format, R, SI, 0, 0)
2412 : , type(Type)
2413 : , formatIdx(FormatIdx)
2414 : , firstArg(FirstArg)
2415 : {
2416 :
2417 :
2418 :
2419 : }
2420 :
2421 : FormatAttr *clone(ASTContext &C) const;
2422 : void printPretty(raw_ostream &OS,
2423 : const PrintingPolicy &Policy) const;
2424 : const char *getSpelling() const;
2425 : IdentifierInfo * getType() const {
2426 : return type;
2427 : }
2428 :
2429 : int getFormatIdx() const {
2430 : return formatIdx;
2431 : }
2432 :
2433 : int getFirstArg() const {
2434 : return firstArg;
2435 : }
2436 :
2437 :
2438 :
2439 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Format; }
2440 : };
2441 :
2442 : class FormatArgAttr : public InheritableAttr {
2443 : int formatIdx;
2444 :
2445 :
2446 : public:
2447 : static FormatArgAttr *CreateImplicit(ASTContext &Ctx, int FormatIdx, SourceRange Loc = SourceRange()) {
2448 : FormatArgAttr *A = new (Ctx) FormatArgAttr(Loc, Ctx, FormatIdx, 0);
2449 : A->setImplicit(true);
2450 : return A;
2451 : }
2452 :
2453 : FormatArgAttr(SourceRange R, ASTContext &Ctx
2454 : , int FormatIdx
2455 : , unsigned SI
2456 : )
2457 : : InheritableAttr(attr::FormatArg, R, SI, 0, 0)
2458 : , formatIdx(FormatIdx)
2459 : {
2460 :
2461 : }
2462 :
2463 : FormatArgAttr *clone(ASTContext &C) const;
2464 : void printPretty(raw_ostream &OS,
2465 : const PrintingPolicy &Policy) const;
2466 : const char *getSpelling() const;
2467 : int getFormatIdx() const {
2468 : return formatIdx;
2469 : }
2470 :
2471 :
2472 :
2473 0 : static bool classof(const Attr *A) { return A->getKind() == attr::FormatArg; }
2474 : };
2475 :
2476 : class GNUInlineAttr : public InheritableAttr {
2477 :
2478 : public:
2479 : static GNUInlineAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2480 : GNUInlineAttr *A = new (Ctx) GNUInlineAttr(Loc, Ctx, 0);
2481 : A->setImplicit(true);
2482 : return A;
2483 : }
2484 :
2485 : GNUInlineAttr(SourceRange R, ASTContext &Ctx
2486 : , unsigned SI
2487 : )
2488 : : InheritableAttr(attr::GNUInline, R, SI, 0, 0)
2489 : {
2490 : }
2491 :
2492 : GNUInlineAttr *clone(ASTContext &C) const;
2493 : void printPretty(raw_ostream &OS,
2494 : const PrintingPolicy &Policy) const;
2495 : const char *getSpelling() const;
2496 :
2497 :
2498 0 : static bool classof(const Attr *A) { return A->getKind() == attr::GNUInline; }
2499 : };
2500 :
2501 : class GuardedByAttr : public InheritableAttr {
2502 : Expr * arg;
2503 :
2504 :
2505 : public:
2506 : static GuardedByAttr *CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Loc = SourceRange()) {
2507 : GuardedByAttr *A = new (Ctx) GuardedByAttr(Loc, Ctx, Arg, 0);
2508 : A->setImplicit(true);
2509 : return A;
2510 : }
2511 :
2512 : GuardedByAttr(SourceRange R, ASTContext &Ctx
2513 : , Expr * Arg
2514 : , unsigned SI
2515 : )
2516 : : InheritableAttr(attr::GuardedBy, R, SI, 1, 1)
2517 : , arg(Arg)
2518 : {
2519 :
2520 : }
2521 :
2522 : GuardedByAttr *clone(ASTContext &C) const;
2523 : void printPretty(raw_ostream &OS,
2524 : const PrintingPolicy &Policy) const;
2525 : const char *getSpelling() const;
2526 : Expr * getArg() const {
2527 0 : return arg;
2528 : }
2529 :
2530 :
2531 :
2532 0 : static bool classof(const Attr *A) { return A->getKind() == attr::GuardedBy; }
2533 : };
2534 :
2535 : class GuardedVarAttr : public InheritableAttr {
2536 :
2537 : public:
2538 : static GuardedVarAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2539 : GuardedVarAttr *A = new (Ctx) GuardedVarAttr(Loc, Ctx, 0);
2540 : A->setImplicit(true);
2541 : return A;
2542 : }
2543 :
2544 : GuardedVarAttr(SourceRange R, ASTContext &Ctx
2545 : , unsigned SI
2546 : )
2547 : : InheritableAttr(attr::GuardedVar, R, SI, 0, 0)
2548 : {
2549 : }
2550 :
2551 : GuardedVarAttr *clone(ASTContext &C) const;
2552 : void printPretty(raw_ostream &OS,
2553 : const PrintingPolicy &Policy) const;
2554 : const char *getSpelling() const;
2555 :
2556 :
2557 0 : static bool classof(const Attr *A) { return A->getKind() == attr::GuardedVar; }
2558 : };
2559 :
2560 : class HotAttr : public InheritableAttr {
2561 :
2562 : public:
2563 : static HotAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2564 : HotAttr *A = new (Ctx) HotAttr(Loc, Ctx, 0);
2565 : A->setImplicit(true);
2566 : return A;
2567 : }
2568 :
2569 : HotAttr(SourceRange R, ASTContext &Ctx
2570 : , unsigned SI
2571 : )
2572 : : InheritableAttr(attr::Hot, R, SI, 0, 0)
2573 : {
2574 : }
2575 :
2576 : HotAttr *clone(ASTContext &C) const;
2577 : void printPretty(raw_ostream &OS,
2578 : const PrintingPolicy &Policy) const;
2579 : const char *getSpelling() const;
2580 :
2581 :
2582 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Hot; }
2583 : };
2584 :
2585 : class IBActionAttr : public InheritableAttr {
2586 :
2587 : public:
2588 : static IBActionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2589 : IBActionAttr *A = new (Ctx) IBActionAttr(Loc, Ctx, 0);
2590 : A->setImplicit(true);
2591 : return A;
2592 : }
2593 :
2594 : IBActionAttr(SourceRange R, ASTContext &Ctx
2595 : , unsigned SI
2596 : )
2597 : : InheritableAttr(attr::IBAction, R, SI, 0, 0)
2598 : {
2599 : }
2600 :
2601 : IBActionAttr *clone(ASTContext &C) const;
2602 : void printPretty(raw_ostream &OS,
2603 : const PrintingPolicy &Policy) const;
2604 : const char *getSpelling() const;
2605 :
2606 :
2607 0 : static bool classof(const Attr *A) { return A->getKind() == attr::IBAction; }
2608 : };
2609 :
2610 : class IBOutletAttr : public InheritableAttr {
2611 :
2612 : public:
2613 : static IBOutletAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2614 : IBOutletAttr *A = new (Ctx) IBOutletAttr(Loc, Ctx, 0);
2615 : A->setImplicit(true);
2616 : return A;
2617 : }
2618 :
2619 : IBOutletAttr(SourceRange R, ASTContext &Ctx
2620 : , unsigned SI
2621 : )
2622 : : InheritableAttr(attr::IBOutlet, R, SI, 0, 0)
2623 : {
2624 : }
2625 :
2626 : IBOutletAttr *clone(ASTContext &C) const;
2627 : void printPretty(raw_ostream &OS,
2628 : const PrintingPolicy &Policy) const;
2629 : const char *getSpelling() const;
2630 :
2631 :
2632 0 : static bool classof(const Attr *A) { return A->getKind() == attr::IBOutlet; }
2633 : };
2634 :
2635 : class IBOutletCollectionAttr : public InheritableAttr {
2636 : TypeSourceInfo * interface;
2637 :
2638 :
2639 : public:
2640 : static IBOutletCollectionAttr *CreateImplicit(ASTContext &Ctx, TypeSourceInfo * Interface, SourceRange Loc = SourceRange()) {
2641 : IBOutletCollectionAttr *A = new (Ctx) IBOutletCollectionAttr(Loc, Ctx, Interface, 0);
2642 : A->setImplicit(true);
2643 : return A;
2644 : }
2645 :
2646 : IBOutletCollectionAttr(SourceRange R, ASTContext &Ctx
2647 : , TypeSourceInfo * Interface
2648 : , unsigned SI
2649 : )
2650 : : InheritableAttr(attr::IBOutletCollection, R, SI, 0, 0)
2651 : , interface(Interface)
2652 : {
2653 :
2654 : }
2655 :
2656 : IBOutletCollectionAttr(SourceRange R, ASTContext &Ctx
2657 : , unsigned SI
2658 : )
2659 : : InheritableAttr(attr::IBOutletCollection, R, SI, 0, 0)
2660 : , interface()
2661 : {
2662 : }
2663 :
2664 : IBOutletCollectionAttr *clone(ASTContext &C) const;
2665 : void printPretty(raw_ostream &OS,
2666 : const PrintingPolicy &Policy) const;
2667 : const char *getSpelling() const;
2668 : QualType getInterface() const {
2669 : return interface->getType();
2670 : } TypeSourceInfo * getInterfaceLoc() const {
2671 : return interface;
2672 : }
2673 :
2674 :
2675 :
2676 0 : static bool classof(const Attr *A) { return A->getKind() == attr::IBOutletCollection; }
2677 : };
2678 :
2679 : class InitPriorityAttr : public InheritableAttr {
2680 : unsigned priority;
2681 :
2682 :
2683 : public:
2684 : static InitPriorityAttr *CreateImplicit(ASTContext &Ctx, unsigned Priority, SourceRange Loc = SourceRange()) {
2685 : InitPriorityAttr *A = new (Ctx) InitPriorityAttr(Loc, Ctx, Priority, 0);
2686 : A->setImplicit(true);
2687 : return A;
2688 : }
2689 :
2690 : InitPriorityAttr(SourceRange R, ASTContext &Ctx
2691 : , unsigned Priority
2692 : , unsigned SI
2693 : )
2694 : : InheritableAttr(attr::InitPriority, R, SI, 0, 0)
2695 : , priority(Priority)
2696 : {
2697 :
2698 : }
2699 :
2700 : InitPriorityAttr *clone(ASTContext &C) const;
2701 : void printPretty(raw_ostream &OS,
2702 : const PrintingPolicy &Policy) const;
2703 : const char *getSpelling() const;
2704 : unsigned getPriority() const {
2705 : return priority;
2706 : }
2707 :
2708 :
2709 :
2710 0 : static bool classof(const Attr *A) { return A->getKind() == attr::InitPriority; }
2711 : };
2712 :
2713 : class InitSegAttr : public Attr {
2714 : unsigned sectionLength;
2715 : char *section;
2716 :
2717 :
2718 : public:
2719 : static InitSegAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Section, SourceRange Loc = SourceRange()) {
2720 : InitSegAttr *A = new (Ctx) InitSegAttr(Loc, Ctx, Section, 0);
2721 : A->setImplicit(true);
2722 : return A;
2723 : }
2724 :
2725 : InitSegAttr(SourceRange R, ASTContext &Ctx
2726 : , llvm::StringRef Section
2727 : , unsigned SI
2728 : )
2729 : : Attr(attr::InitSeg, R, SI, 0, 0)
2730 : , sectionLength(Section.size()),section(new (Ctx, 1) char[sectionLength])
2731 : {
2732 : if (!Section.empty())
2733 : std::memcpy(section, Section.data(), sectionLength);
2734 : }
2735 :
2736 : InitSegAttr *clone(ASTContext &C) const;
2737 : void printPretty(raw_ostream &OS,
2738 : const PrintingPolicy &Policy) const;
2739 : const char *getSpelling() const;
2740 : llvm::StringRef getSection() const {
2741 : return llvm::StringRef(section, sectionLength);
2742 : }
2743 : unsigned getSectionLength() const {
2744 : return sectionLength;
2745 : }
2746 : void setSection(ASTContext &C, llvm::StringRef S) {
2747 : sectionLength = S.size();
2748 : this->section = new (C, 1) char [sectionLength];
2749 : if (!S.empty())
2750 : std::memcpy(this->section, S.data(), sectionLength);
2751 : }
2752 :
2753 :
2754 : void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
2755 : OS << '(' << getSection() << ')';
2756 : }
2757 :
2758 :
2759 0 : static bool classof(const Attr *A) { return A->getKind() == attr::InitSeg; }
2760 : };
2761 :
2762 : class IntelOclBiccAttr : public InheritableAttr {
2763 :
2764 : public:
2765 : static IntelOclBiccAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2766 : IntelOclBiccAttr *A = new (Ctx) IntelOclBiccAttr(Loc, Ctx, 0);
2767 : A->setImplicit(true);
2768 : return A;
2769 : }
2770 :
2771 : IntelOclBiccAttr(SourceRange R, ASTContext &Ctx
2772 : , unsigned SI
2773 : )
2774 : : InheritableAttr(attr::IntelOclBicc, R, SI, 0, 0)
2775 : {
2776 : }
2777 :
2778 : IntelOclBiccAttr *clone(ASTContext &C) const;
2779 : void printPretty(raw_ostream &OS,
2780 : const PrintingPolicy &Policy) const;
2781 : const char *getSpelling() const;
2782 :
2783 :
2784 0 : static bool classof(const Attr *A) { return A->getKind() == attr::IntelOclBicc; }
2785 : };
2786 :
2787 : class LockReturnedAttr : public InheritableAttr {
2788 : Expr * arg;
2789 :
2790 :
2791 : public:
2792 : static LockReturnedAttr *CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Loc = SourceRange()) {
2793 : LockReturnedAttr *A = new (Ctx) LockReturnedAttr(Loc, Ctx, Arg, 0);
2794 : A->setImplicit(true);
2795 : return A;
2796 : }
2797 :
2798 : LockReturnedAttr(SourceRange R, ASTContext &Ctx
2799 : , Expr * Arg
2800 : , unsigned SI
2801 : )
2802 : : InheritableAttr(attr::LockReturned, R, SI, 1, 0)
2803 : , arg(Arg)
2804 : {
2805 :
2806 : }
2807 :
2808 : LockReturnedAttr *clone(ASTContext &C) const;
2809 : void printPretty(raw_ostream &OS,
2810 : const PrintingPolicy &Policy) const;
2811 : const char *getSpelling() const;
2812 : Expr * getArg() const {
2813 0 : return arg;
2814 : }
2815 :
2816 :
2817 :
2818 0 : static bool classof(const Attr *A) { return A->getKind() == attr::LockReturned; }
2819 : };
2820 :
2821 : class LocksExcludedAttr : public InheritableAttr {
2822 : unsigned args_Size;
2823 : Expr * *args_;
2824 :
2825 :
2826 : public:
2827 : static LocksExcludedAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
2828 : LocksExcludedAttr *A = new (Ctx) LocksExcludedAttr(Loc, Ctx, Args, ArgsSize, 0);
2829 : A->setImplicit(true);
2830 : return A;
2831 : }
2832 :
2833 : LocksExcludedAttr(SourceRange R, ASTContext &Ctx
2834 : , Expr * *Args, unsigned ArgsSize
2835 : , unsigned SI
2836 : )
2837 : : InheritableAttr(attr::LocksExcluded, R, SI, 1, 1)
2838 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
2839 : {
2840 : std::copy(Args, Args + args_Size, args_);
2841 : }
2842 :
2843 : LocksExcludedAttr(SourceRange R, ASTContext &Ctx
2844 : , unsigned SI
2845 : )
2846 : : InheritableAttr(attr::LocksExcluded, R, SI, 1, 1)
2847 : , args_Size(0), args_(nullptr)
2848 : {
2849 : }
2850 :
2851 : LocksExcludedAttr *clone(ASTContext &C) const;
2852 : void printPretty(raw_ostream &OS,
2853 : const PrintingPolicy &Policy) const;
2854 : const char *getSpelling() const;
2855 : typedef Expr ** args_iterator;
2856 0 : args_iterator args_begin() const { return args_; }
2857 0 : args_iterator args_end() const { return args_ + args_Size; }
2858 : unsigned args_size() const { return args_Size; }
2859 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
2860 :
2861 :
2862 :
2863 :
2864 0 : static bool classof(const Attr *A) { return A->getKind() == attr::LocksExcluded; }
2865 : };
2866 :
2867 : class LoopHintAttr : public Attr {
2868 : public:
2869 : enum OptionType {
2870 : Vectorize,
2871 : VectorizeWidth,
2872 : Interleave,
2873 : InterleaveCount,
2874 : Unroll,
2875 : UnrollCount
2876 : };
2877 : private:
2878 : OptionType option;
2879 :
2880 : public:
2881 : enum LoopHintState {
2882 : Default,
2883 : Enable,
2884 : Disable,
2885 : AssumeSafety
2886 : };
2887 : private:
2888 : LoopHintState state;
2889 :
2890 : Expr * value;
2891 :
2892 :
2893 : public:
2894 : enum Spelling {
2895 : Pragma_clang_loop = 0,
2896 : Pragma_unroll = 1,
2897 : Pragma_nounroll = 2
2898 : };
2899 :
2900 : static LoopHintAttr *CreateImplicit(ASTContext &Ctx, Spelling S, OptionType Option, LoopHintState State, Expr * Value, SourceRange Loc = SourceRange()) {
2901 : LoopHintAttr *A = new (Ctx) LoopHintAttr(Loc, Ctx, Option, State, Value, S);
2902 : A->setImplicit(true);
2903 : return A;
2904 : }
2905 :
2906 : LoopHintAttr(SourceRange R, ASTContext &Ctx
2907 : , OptionType Option
2908 : , LoopHintState State
2909 : , Expr * Value
2910 : , unsigned SI
2911 : )
2912 : : Attr(attr::LoopHint, R, SI, 0, 0)
2913 : , option(Option)
2914 : , state(State)
2915 : , value(Value)
2916 : {
2917 :
2918 :
2919 :
2920 : }
2921 :
2922 : LoopHintAttr *clone(ASTContext &C) const;
2923 : void printPretty(raw_ostream &OS,
2924 : const PrintingPolicy &Policy) const;
2925 : const char *getSpelling() const;
2926 : Spelling getSemanticSpelling() const {
2927 : switch (SpellingListIndex) {
2928 : default: llvm_unreachable("Unknown spelling list index");
2929 : case 0: return Pragma_clang_loop;
2930 : case 1: return Pragma_unroll;
2931 : case 2: return Pragma_nounroll;
2932 : }
2933 : }
2934 : OptionType getOption() const {
2935 : return option;
2936 : }
2937 :
2938 : static bool ConvertStrToOptionType(StringRef Val, OptionType &Out) {
2939 : Optional<OptionType> R = llvm::StringSwitch<Optional<OptionType>>(Val)
2940 : .Case("vectorize", LoopHintAttr::Vectorize)
2941 : .Case("vectorize_width", LoopHintAttr::VectorizeWidth)
2942 : .Case("interleave", LoopHintAttr::Interleave)
2943 : .Case("interleave_count", LoopHintAttr::InterleaveCount)
2944 : .Case("unroll", LoopHintAttr::Unroll)
2945 : .Case("unroll_count", LoopHintAttr::UnrollCount)
2946 : .Default(Optional<OptionType>());
2947 : if (R) {
2948 : Out = *R;
2949 : return true;
2950 : }
2951 : return false;
2952 : }
2953 :
2954 : static const char *ConvertOptionTypeToStr(OptionType Val) {
2955 : switch(Val) {
2956 : case LoopHintAttr::Vectorize: return "vectorize";
2957 : case LoopHintAttr::VectorizeWidth: return "vectorize_width";
2958 : case LoopHintAttr::Interleave: return "interleave";
2959 : case LoopHintAttr::InterleaveCount: return "interleave_count";
2960 : case LoopHintAttr::Unroll: return "unroll";
2961 : case LoopHintAttr::UnrollCount: return "unroll_count";
2962 : }
2963 : llvm_unreachable("No enumerator with that value");
2964 : }
2965 : LoopHintState getState() const {
2966 : return state;
2967 : }
2968 :
2969 : static bool ConvertStrToLoopHintState(StringRef Val, LoopHintState &Out) {
2970 : Optional<LoopHintState> R = llvm::StringSwitch<Optional<LoopHintState>>(Val)
2971 : .Case("default", LoopHintAttr::Default)
2972 : .Case("enable", LoopHintAttr::Enable)
2973 : .Case("disable", LoopHintAttr::Disable)
2974 : .Case("assume_safety", LoopHintAttr::AssumeSafety)
2975 : .Default(Optional<LoopHintState>());
2976 : if (R) {
2977 : Out = *R;
2978 : return true;
2979 : }
2980 : return false;
2981 : }
2982 :
2983 : static const char *ConvertLoopHintStateToStr(LoopHintState Val) {
2984 : switch(Val) {
2985 : case LoopHintAttr::Default: return "default";
2986 : case LoopHintAttr::Enable: return "enable";
2987 : case LoopHintAttr::Disable: return "disable";
2988 : case LoopHintAttr::AssumeSafety: return "assume_safety";
2989 : }
2990 : llvm_unreachable("No enumerator with that value");
2991 : }
2992 : Expr * getValue() const {
2993 0 : return value;
2994 : }
2995 :
2996 :
2997 : static const char *getOptionName(int Option) {
2998 : switch(Option) {
2999 : case Vectorize: return "vectorize";
3000 : case VectorizeWidth: return "vectorize_width";
3001 : case Interleave: return "interleave";
3002 : case InterleaveCount: return "interleave_count";
3003 : case Unroll: return "unroll";
3004 : case UnrollCount: return "unroll_count";
3005 : }
3006 : llvm_unreachable("Unhandled LoopHint option.");
3007 : }
3008 :
3009 : void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
3010 : unsigned SpellingIndex = getSpellingListIndex();
3011 : // For "#pragma unroll" and "#pragma nounroll" the string "unroll" or
3012 : // "nounroll" is already emitted as the pragma name.
3013 : if (SpellingIndex == Pragma_nounroll) {
3014 : OS << "\n";
3015 : return;
3016 : }
3017 : else if (SpellingIndex == Pragma_unroll) {
3018 : OS << getValueString(Policy) << "\n";
3019 : return;
3020 : }
3021 :
3022 : assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
3023 : OS << getOptionName(option) << getValueString(Policy) << "\n";
3024 : }
3025 :
3026 : // Return a string containing the loop hint argument including the
3027 : // enclosing parentheses.
3028 : std::string getValueString(const PrintingPolicy &Policy) const {
3029 : std::string ValueName;
3030 : llvm::raw_string_ostream OS(ValueName);
3031 : OS << "(";
3032 : if (option == VectorizeWidth || option == InterleaveCount ||
3033 : option == UnrollCount)
3034 : value->printPretty(OS, nullptr, Policy);
3035 : else if (state == Default)
3036 : return "";
3037 : else if (state == Enable)
3038 : OS << (option == Unroll ? "full" : "enable");
3039 : else if (state == AssumeSafety)
3040 : OS << "assume_safety";
3041 : else
3042 : OS << "disable";
3043 : OS << ")";
3044 : return OS.str();
3045 : }
3046 :
3047 : // Return a string suitable for identifying this attribute in diagnostics.
3048 : std::string getDiagnosticName(const PrintingPolicy &Policy) const {
3049 : unsigned SpellingIndex = getSpellingListIndex();
3050 : if (SpellingIndex == Pragma_nounroll)
3051 : return "#pragma nounroll";
3052 : else if (SpellingIndex == Pragma_unroll)
3053 : return "#pragma unroll" + getValueString(Policy);
3054 :
3055 : assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
3056 : return getOptionName(option) + getValueString(Policy);
3057 : }
3058 :
3059 :
3060 0 : static bool classof(const Attr *A) { return A->getKind() == attr::LoopHint; }
3061 : };
3062 :
3063 : class MSABIAttr : public InheritableAttr {
3064 :
3065 : public:
3066 : static MSABIAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3067 : MSABIAttr *A = new (Ctx) MSABIAttr(Loc, Ctx, 0);
3068 : A->setImplicit(true);
3069 : return A;
3070 : }
3071 :
3072 : MSABIAttr(SourceRange R, ASTContext &Ctx
3073 : , unsigned SI
3074 : )
3075 : : InheritableAttr(attr::MSABI, R, SI, 0, 0)
3076 : {
3077 : }
3078 :
3079 : MSABIAttr *clone(ASTContext &C) const;
3080 : void printPretty(raw_ostream &OS,
3081 : const PrintingPolicy &Policy) const;
3082 : const char *getSpelling() const;
3083 :
3084 :
3085 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MSABI; }
3086 : };
3087 :
3088 : class MSInheritanceAttr : public InheritableAttr {
3089 : bool bestCase;
3090 :
3091 :
3092 : public:
3093 : enum Spelling {
3094 : Keyword_single_inheritance = 0,
3095 : Keyword_multiple_inheritance = 1,
3096 : Keyword_virtual_inheritance = 2,
3097 : Keyword_unspecified_inheritance = 3
3098 : };
3099 :
3100 : static MSInheritanceAttr *CreateImplicit(ASTContext &Ctx, Spelling S, bool BestCase, SourceRange Loc = SourceRange()) {
3101 : MSInheritanceAttr *A = new (Ctx) MSInheritanceAttr(Loc, Ctx, BestCase, S);
3102 : A->setImplicit(true);
3103 : return A;
3104 : }
3105 :
3106 : MSInheritanceAttr(SourceRange R, ASTContext &Ctx
3107 : , bool BestCase
3108 : , unsigned SI
3109 : )
3110 : : InheritableAttr(attr::MSInheritance, R, SI, 0, 0)
3111 : , bestCase(BestCase)
3112 : {
3113 :
3114 : }
3115 :
3116 : MSInheritanceAttr(SourceRange R, ASTContext &Ctx
3117 : , unsigned SI
3118 : )
3119 : : InheritableAttr(attr::MSInheritance, R, SI, 0, 0)
3120 : , bestCase()
3121 : {
3122 : }
3123 :
3124 : MSInheritanceAttr *clone(ASTContext &C) const;
3125 : void printPretty(raw_ostream &OS,
3126 : const PrintingPolicy &Policy) const;
3127 : const char *getSpelling() const;
3128 : Spelling getSemanticSpelling() const {
3129 : switch (SpellingListIndex) {
3130 : default: llvm_unreachable("Unknown spelling list index");
3131 : case 0: return Keyword_single_inheritance;
3132 : case 1: return Keyword_multiple_inheritance;
3133 : case 2: return Keyword_virtual_inheritance;
3134 : case 3: return Keyword_unspecified_inheritance;
3135 : }
3136 : }
3137 : bool getBestCase() const {
3138 : return bestCase;
3139 : }
3140 :
3141 : static const bool DefaultBestCase = 1;
3142 :
3143 :
3144 : static bool hasVBPtrOffsetField(Spelling Inheritance) {
3145 : return Inheritance == Keyword_unspecified_inheritance;
3146 : }
3147 :
3148 : // Only member pointers to functions need a this adjustment, since it can be
3149 : // combined with the field offset for data pointers.
3150 : static bool hasNVOffsetField(bool IsMemberFunction, Spelling Inheritance) {
3151 : return IsMemberFunction && Inheritance >= Keyword_multiple_inheritance;
3152 : }
3153 :
3154 : static bool hasVBTableOffsetField(Spelling Inheritance) {
3155 : return Inheritance >= Keyword_virtual_inheritance;
3156 : }
3157 :
3158 : static bool hasOnlyOneField(bool IsMemberFunction,
3159 : Spelling Inheritance) {
3160 : if (IsMemberFunction)
3161 : return Inheritance <= Keyword_single_inheritance;
3162 : return Inheritance <= Keyword_multiple_inheritance;
3163 : }
3164 :
3165 :
3166 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MSInheritance; }
3167 : };
3168 :
3169 : class MSNoVTableAttr : public InheritableAttr {
3170 :
3171 : public:
3172 : static MSNoVTableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3173 : MSNoVTableAttr *A = new (Ctx) MSNoVTableAttr(Loc, Ctx, 0);
3174 : A->setImplicit(true);
3175 : return A;
3176 : }
3177 :
3178 : MSNoVTableAttr(SourceRange R, ASTContext &Ctx
3179 : , unsigned SI
3180 : )
3181 : : InheritableAttr(attr::MSNoVTable, R, SI, 0, 0)
3182 : {
3183 : }
3184 :
3185 : MSNoVTableAttr *clone(ASTContext &C) const;
3186 : void printPretty(raw_ostream &OS,
3187 : const PrintingPolicy &Policy) const;
3188 : const char *getSpelling() const;
3189 :
3190 :
3191 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MSNoVTable; }
3192 : };
3193 :
3194 : class MSP430InterruptAttr : public InheritableAttr {
3195 : unsigned number;
3196 :
3197 :
3198 : public:
3199 : static MSP430InterruptAttr *CreateImplicit(ASTContext &Ctx, unsigned Number, SourceRange Loc = SourceRange()) {
3200 : MSP430InterruptAttr *A = new (Ctx) MSP430InterruptAttr(Loc, Ctx, Number, 0);
3201 : A->setImplicit(true);
3202 : return A;
3203 : }
3204 :
3205 : MSP430InterruptAttr(SourceRange R, ASTContext &Ctx
3206 : , unsigned Number
3207 : , unsigned SI
3208 : )
3209 : : InheritableAttr(attr::MSP430Interrupt, R, SI, 0, 0)
3210 : , number(Number)
3211 : {
3212 :
3213 : }
3214 :
3215 : MSP430InterruptAttr *clone(ASTContext &C) const;
3216 : void printPretty(raw_ostream &OS,
3217 : const PrintingPolicy &Policy) const;
3218 : const char *getSpelling() const;
3219 : unsigned getNumber() const {
3220 : return number;
3221 : }
3222 :
3223 :
3224 :
3225 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MSP430Interrupt; }
3226 : };
3227 :
3228 : class MSStructAttr : public InheritableAttr {
3229 :
3230 : public:
3231 : static MSStructAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3232 : MSStructAttr *A = new (Ctx) MSStructAttr(Loc, Ctx, 0);
3233 : A->setImplicit(true);
3234 : return A;
3235 : }
3236 :
3237 : MSStructAttr(SourceRange R, ASTContext &Ctx
3238 : , unsigned SI
3239 : )
3240 : : InheritableAttr(attr::MSStruct, R, SI, 0, 0)
3241 : {
3242 : }
3243 :
3244 : MSStructAttr *clone(ASTContext &C) const;
3245 : void printPretty(raw_ostream &OS,
3246 : const PrintingPolicy &Policy) const;
3247 : const char *getSpelling() const;
3248 :
3249 :
3250 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MSStruct; }
3251 : };
3252 :
3253 : class MSVtorDispAttr : public InheritableAttr {
3254 : unsigned vdm;
3255 :
3256 :
3257 : public:
3258 : static MSVtorDispAttr *CreateImplicit(ASTContext &Ctx, unsigned Vdm, SourceRange Loc = SourceRange()) {
3259 : MSVtorDispAttr *A = new (Ctx) MSVtorDispAttr(Loc, Ctx, Vdm, 0);
3260 : A->setImplicit(true);
3261 : return A;
3262 : }
3263 :
3264 : MSVtorDispAttr(SourceRange R, ASTContext &Ctx
3265 : , unsigned Vdm
3266 : , unsigned SI
3267 : )
3268 : : InheritableAttr(attr::MSVtorDisp, R, SI, 0, 0)
3269 : , vdm(Vdm)
3270 : {
3271 :
3272 : }
3273 :
3274 : MSVtorDispAttr *clone(ASTContext &C) const;
3275 : void printPretty(raw_ostream &OS,
3276 : const PrintingPolicy &Policy) const;
3277 : const char *getSpelling() const;
3278 : unsigned getVdm() const {
3279 : return vdm;
3280 : }
3281 :
3282 :
3283 : enum Mode {
3284 : Never,
3285 : ForVBaseOverride,
3286 : ForVFTable
3287 : };
3288 :
3289 : Mode getVtorDispMode() const { return Mode(vdm); }
3290 :
3291 :
3292 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MSVtorDisp; }
3293 : };
3294 :
3295 : class MaxFieldAlignmentAttr : public InheritableAttr {
3296 : unsigned alignment;
3297 :
3298 :
3299 : public:
3300 : static MaxFieldAlignmentAttr *CreateImplicit(ASTContext &Ctx, unsigned Alignment, SourceRange Loc = SourceRange()) {
3301 : MaxFieldAlignmentAttr *A = new (Ctx) MaxFieldAlignmentAttr(Loc, Ctx, Alignment, 0);
3302 : A->setImplicit(true);
3303 : return A;
3304 : }
3305 :
3306 : MaxFieldAlignmentAttr(SourceRange R, ASTContext &Ctx
3307 : , unsigned Alignment
3308 : , unsigned SI
3309 : )
3310 : : InheritableAttr(attr::MaxFieldAlignment, R, SI, 0, 0)
3311 : , alignment(Alignment)
3312 : {
3313 :
3314 : }
3315 :
3316 : MaxFieldAlignmentAttr *clone(ASTContext &C) const;
3317 : void printPretty(raw_ostream &OS,
3318 : const PrintingPolicy &Policy) const;
3319 : const char *getSpelling() const;
3320 : unsigned getAlignment() const {
3321 : return alignment;
3322 : }
3323 :
3324 :
3325 :
3326 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MaxFieldAlignment; }
3327 : };
3328 :
3329 : class MayAliasAttr : public InheritableAttr {
3330 :
3331 : public:
3332 : static MayAliasAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3333 : MayAliasAttr *A = new (Ctx) MayAliasAttr(Loc, Ctx, 0);
3334 : A->setImplicit(true);
3335 : return A;
3336 : }
3337 :
3338 : MayAliasAttr(SourceRange R, ASTContext &Ctx
3339 : , unsigned SI
3340 : )
3341 : : InheritableAttr(attr::MayAlias, R, SI, 0, 0)
3342 : {
3343 : }
3344 :
3345 : MayAliasAttr *clone(ASTContext &C) const;
3346 : void printPretty(raw_ostream &OS,
3347 : const PrintingPolicy &Policy) const;
3348 : const char *getSpelling() const;
3349 :
3350 :
3351 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MayAlias; }
3352 : };
3353 :
3354 : class MinSizeAttr : public InheritableAttr {
3355 :
3356 : public:
3357 : static MinSizeAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3358 : MinSizeAttr *A = new (Ctx) MinSizeAttr(Loc, Ctx, 0);
3359 : A->setImplicit(true);
3360 : return A;
3361 : }
3362 :
3363 : MinSizeAttr(SourceRange R, ASTContext &Ctx
3364 : , unsigned SI
3365 : )
3366 : : InheritableAttr(attr::MinSize, R, SI, 0, 0)
3367 : {
3368 : }
3369 :
3370 : MinSizeAttr *clone(ASTContext &C) const;
3371 : void printPretty(raw_ostream &OS,
3372 : const PrintingPolicy &Policy) const;
3373 : const char *getSpelling() const;
3374 :
3375 :
3376 0 : static bool classof(const Attr *A) { return A->getKind() == attr::MinSize; }
3377 : };
3378 :
3379 : class Mips16Attr : public InheritableAttr {
3380 :
3381 : public:
3382 : static Mips16Attr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3383 : Mips16Attr *A = new (Ctx) Mips16Attr(Loc, Ctx, 0);
3384 : A->setImplicit(true);
3385 : return A;
3386 : }
3387 :
3388 : Mips16Attr(SourceRange R, ASTContext &Ctx
3389 : , unsigned SI
3390 : )
3391 : : InheritableAttr(attr::Mips16, R, SI, 0, 0)
3392 : {
3393 : }
3394 :
3395 : Mips16Attr *clone(ASTContext &C) const;
3396 : void printPretty(raw_ostream &OS,
3397 : const PrintingPolicy &Policy) const;
3398 : const char *getSpelling() const;
3399 :
3400 :
3401 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Mips16; }
3402 : };
3403 :
3404 : class ModeAttr : public Attr {
3405 : IdentifierInfo * mode;
3406 :
3407 :
3408 : public:
3409 : static ModeAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * Mode, SourceRange Loc = SourceRange()) {
3410 : ModeAttr *A = new (Ctx) ModeAttr(Loc, Ctx, Mode, 0);
3411 : A->setImplicit(true);
3412 : return A;
3413 : }
3414 :
3415 : ModeAttr(SourceRange R, ASTContext &Ctx
3416 : , IdentifierInfo * Mode
3417 : , unsigned SI
3418 : )
3419 : : Attr(attr::Mode, R, SI, 0, 0)
3420 : , mode(Mode)
3421 : {
3422 :
3423 : }
3424 :
3425 : ModeAttr *clone(ASTContext &C) const;
3426 : void printPretty(raw_ostream &OS,
3427 : const PrintingPolicy &Policy) const;
3428 : const char *getSpelling() const;
3429 : IdentifierInfo * getMode() const {
3430 : return mode;
3431 : }
3432 :
3433 :
3434 :
3435 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Mode; }
3436 : };
3437 :
3438 : class NSConsumedAttr : public InheritableParamAttr {
3439 :
3440 : public:
3441 : static NSConsumedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3442 : NSConsumedAttr *A = new (Ctx) NSConsumedAttr(Loc, Ctx, 0);
3443 : A->setImplicit(true);
3444 : return A;
3445 : }
3446 :
3447 : NSConsumedAttr(SourceRange R, ASTContext &Ctx
3448 : , unsigned SI
3449 : )
3450 : : InheritableParamAttr(attr::NSConsumed, R, SI, 0, 0)
3451 : {
3452 : }
3453 :
3454 : NSConsumedAttr *clone(ASTContext &C) const;
3455 : void printPretty(raw_ostream &OS,
3456 : const PrintingPolicy &Policy) const;
3457 : const char *getSpelling() const;
3458 :
3459 :
3460 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NSConsumed; }
3461 : };
3462 :
3463 : class NSConsumesSelfAttr : public InheritableAttr {
3464 :
3465 : public:
3466 : static NSConsumesSelfAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3467 : NSConsumesSelfAttr *A = new (Ctx) NSConsumesSelfAttr(Loc, Ctx, 0);
3468 : A->setImplicit(true);
3469 : return A;
3470 : }
3471 :
3472 : NSConsumesSelfAttr(SourceRange R, ASTContext &Ctx
3473 : , unsigned SI
3474 : )
3475 : : InheritableAttr(attr::NSConsumesSelf, R, SI, 0, 0)
3476 : {
3477 : }
3478 :
3479 : NSConsumesSelfAttr *clone(ASTContext &C) const;
3480 : void printPretty(raw_ostream &OS,
3481 : const PrintingPolicy &Policy) const;
3482 : const char *getSpelling() const;
3483 :
3484 :
3485 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NSConsumesSelf; }
3486 : };
3487 :
3488 : class NSReturnsAutoreleasedAttr : public InheritableAttr {
3489 :
3490 : public:
3491 : static NSReturnsAutoreleasedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3492 : NSReturnsAutoreleasedAttr *A = new (Ctx) NSReturnsAutoreleasedAttr(Loc, Ctx, 0);
3493 : A->setImplicit(true);
3494 : return A;
3495 : }
3496 :
3497 : NSReturnsAutoreleasedAttr(SourceRange R, ASTContext &Ctx
3498 : , unsigned SI
3499 : )
3500 : : InheritableAttr(attr::NSReturnsAutoreleased, R, SI, 0, 0)
3501 : {
3502 : }
3503 :
3504 : NSReturnsAutoreleasedAttr *clone(ASTContext &C) const;
3505 : void printPretty(raw_ostream &OS,
3506 : const PrintingPolicy &Policy) const;
3507 : const char *getSpelling() const;
3508 :
3509 :
3510 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NSReturnsAutoreleased; }
3511 : };
3512 :
3513 : class NSReturnsNotRetainedAttr : public InheritableAttr {
3514 :
3515 : public:
3516 : static NSReturnsNotRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3517 : NSReturnsNotRetainedAttr *A = new (Ctx) NSReturnsNotRetainedAttr(Loc, Ctx, 0);
3518 : A->setImplicit(true);
3519 : return A;
3520 : }
3521 :
3522 : NSReturnsNotRetainedAttr(SourceRange R, ASTContext &Ctx
3523 : , unsigned SI
3524 : )
3525 : : InheritableAttr(attr::NSReturnsNotRetained, R, SI, 0, 0)
3526 : {
3527 : }
3528 :
3529 : NSReturnsNotRetainedAttr *clone(ASTContext &C) const;
3530 : void printPretty(raw_ostream &OS,
3531 : const PrintingPolicy &Policy) const;
3532 : const char *getSpelling() const;
3533 :
3534 :
3535 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NSReturnsNotRetained; }
3536 : };
3537 :
3538 : class NSReturnsRetainedAttr : public InheritableAttr {
3539 :
3540 : public:
3541 : static NSReturnsRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3542 : NSReturnsRetainedAttr *A = new (Ctx) NSReturnsRetainedAttr(Loc, Ctx, 0);
3543 : A->setImplicit(true);
3544 : return A;
3545 : }
3546 :
3547 : NSReturnsRetainedAttr(SourceRange R, ASTContext &Ctx
3548 : , unsigned SI
3549 : )
3550 : : InheritableAttr(attr::NSReturnsRetained, R, SI, 0, 0)
3551 : {
3552 : }
3553 :
3554 : NSReturnsRetainedAttr *clone(ASTContext &C) const;
3555 : void printPretty(raw_ostream &OS,
3556 : const PrintingPolicy &Policy) const;
3557 : const char *getSpelling() const;
3558 :
3559 :
3560 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NSReturnsRetained; }
3561 : };
3562 :
3563 : class NakedAttr : public InheritableAttr {
3564 :
3565 : public:
3566 : static NakedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3567 : NakedAttr *A = new (Ctx) NakedAttr(Loc, Ctx, 0);
3568 : A->setImplicit(true);
3569 : return A;
3570 : }
3571 :
3572 : NakedAttr(SourceRange R, ASTContext &Ctx
3573 : , unsigned SI
3574 : )
3575 : : InheritableAttr(attr::Naked, R, SI, 0, 0)
3576 : {
3577 : }
3578 :
3579 : NakedAttr *clone(ASTContext &C) const;
3580 : void printPretty(raw_ostream &OS,
3581 : const PrintingPolicy &Policy) const;
3582 : const char *getSpelling() const;
3583 :
3584 :
3585 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Naked; }
3586 : };
3587 :
3588 : class NoCommonAttr : public InheritableAttr {
3589 :
3590 : public:
3591 : static NoCommonAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3592 : NoCommonAttr *A = new (Ctx) NoCommonAttr(Loc, Ctx, 0);
3593 : A->setImplicit(true);
3594 : return A;
3595 : }
3596 :
3597 : NoCommonAttr(SourceRange R, ASTContext &Ctx
3598 : , unsigned SI
3599 : )
3600 : : InheritableAttr(attr::NoCommon, R, SI, 0, 0)
3601 : {
3602 : }
3603 :
3604 : NoCommonAttr *clone(ASTContext &C) const;
3605 : void printPretty(raw_ostream &OS,
3606 : const PrintingPolicy &Policy) const;
3607 : const char *getSpelling() const;
3608 :
3609 :
3610 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoCommon; }
3611 : };
3612 :
3613 : class NoDebugAttr : public InheritableAttr {
3614 :
3615 : public:
3616 : static NoDebugAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3617 : NoDebugAttr *A = new (Ctx) NoDebugAttr(Loc, Ctx, 0);
3618 : A->setImplicit(true);
3619 : return A;
3620 : }
3621 :
3622 : NoDebugAttr(SourceRange R, ASTContext &Ctx
3623 : , unsigned SI
3624 : )
3625 : : InheritableAttr(attr::NoDebug, R, SI, 0, 0)
3626 : {
3627 : }
3628 :
3629 : NoDebugAttr *clone(ASTContext &C) const;
3630 : void printPretty(raw_ostream &OS,
3631 : const PrintingPolicy &Policy) const;
3632 : const char *getSpelling() const;
3633 :
3634 :
3635 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoDebug; }
3636 : };
3637 :
3638 : class NoDuplicateAttr : public InheritableAttr {
3639 :
3640 : public:
3641 : static NoDuplicateAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3642 : NoDuplicateAttr *A = new (Ctx) NoDuplicateAttr(Loc, Ctx, 0);
3643 : A->setImplicit(true);
3644 : return A;
3645 : }
3646 :
3647 : NoDuplicateAttr(SourceRange R, ASTContext &Ctx
3648 : , unsigned SI
3649 : )
3650 : : InheritableAttr(attr::NoDuplicate, R, SI, 0, 0)
3651 : {
3652 : }
3653 :
3654 : NoDuplicateAttr *clone(ASTContext &C) const;
3655 : void printPretty(raw_ostream &OS,
3656 : const PrintingPolicy &Policy) const;
3657 : const char *getSpelling() const;
3658 :
3659 :
3660 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoDuplicate; }
3661 : };
3662 :
3663 : class NoInlineAttr : public InheritableAttr {
3664 :
3665 : public:
3666 : static NoInlineAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3667 : NoInlineAttr *A = new (Ctx) NoInlineAttr(Loc, Ctx, 0);
3668 : A->setImplicit(true);
3669 : return A;
3670 : }
3671 :
3672 : NoInlineAttr(SourceRange R, ASTContext &Ctx
3673 : , unsigned SI
3674 : )
3675 : : InheritableAttr(attr::NoInline, R, SI, 0, 0)
3676 : {
3677 : }
3678 :
3679 : NoInlineAttr *clone(ASTContext &C) const;
3680 : void printPretty(raw_ostream &OS,
3681 : const PrintingPolicy &Policy) const;
3682 : const char *getSpelling() const;
3683 :
3684 :
3685 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoInline; }
3686 : };
3687 :
3688 : class NoInstrumentFunctionAttr : public InheritableAttr {
3689 :
3690 : public:
3691 : static NoInstrumentFunctionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3692 : NoInstrumentFunctionAttr *A = new (Ctx) NoInstrumentFunctionAttr(Loc, Ctx, 0);
3693 : A->setImplicit(true);
3694 : return A;
3695 : }
3696 :
3697 : NoInstrumentFunctionAttr(SourceRange R, ASTContext &Ctx
3698 : , unsigned SI
3699 : )
3700 : : InheritableAttr(attr::NoInstrumentFunction, R, SI, 0, 0)
3701 : {
3702 : }
3703 :
3704 : NoInstrumentFunctionAttr *clone(ASTContext &C) const;
3705 : void printPretty(raw_ostream &OS,
3706 : const PrintingPolicy &Policy) const;
3707 : const char *getSpelling() const;
3708 :
3709 :
3710 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoInstrumentFunction; }
3711 : };
3712 :
3713 : class NoMips16Attr : public InheritableAttr {
3714 :
3715 : public:
3716 : static NoMips16Attr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3717 : NoMips16Attr *A = new (Ctx) NoMips16Attr(Loc, Ctx, 0);
3718 : A->setImplicit(true);
3719 : return A;
3720 : }
3721 :
3722 : NoMips16Attr(SourceRange R, ASTContext &Ctx
3723 : , unsigned SI
3724 : )
3725 : : InheritableAttr(attr::NoMips16, R, SI, 0, 0)
3726 : {
3727 : }
3728 :
3729 : NoMips16Attr *clone(ASTContext &C) const;
3730 : void printPretty(raw_ostream &OS,
3731 : const PrintingPolicy &Policy) const;
3732 : const char *getSpelling() const;
3733 :
3734 :
3735 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoMips16; }
3736 : };
3737 :
3738 : class NoReturnAttr : public InheritableAttr {
3739 :
3740 : public:
3741 : static NoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3742 : NoReturnAttr *A = new (Ctx) NoReturnAttr(Loc, Ctx, 0);
3743 : A->setImplicit(true);
3744 : return A;
3745 : }
3746 :
3747 : NoReturnAttr(SourceRange R, ASTContext &Ctx
3748 : , unsigned SI
3749 : )
3750 : : InheritableAttr(attr::NoReturn, R, SI, 0, 0)
3751 : {
3752 : }
3753 :
3754 : NoReturnAttr *clone(ASTContext &C) const;
3755 : void printPretty(raw_ostream &OS,
3756 : const PrintingPolicy &Policy) const;
3757 : const char *getSpelling() const;
3758 :
3759 :
3760 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoReturn; }
3761 : };
3762 :
3763 : class NoSanitizeAttr : public InheritableAttr {
3764 : unsigned sanitizers_Size;
3765 : std::string *sanitizers_;
3766 :
3767 :
3768 : public:
3769 : static NoSanitizeAttr *CreateImplicit(ASTContext &Ctx, std::string *Sanitizers, unsigned SanitizersSize, SourceRange Loc = SourceRange()) {
3770 : NoSanitizeAttr *A = new (Ctx) NoSanitizeAttr(Loc, Ctx, Sanitizers, SanitizersSize, 0);
3771 : A->setImplicit(true);
3772 : return A;
3773 : }
3774 :
3775 : NoSanitizeAttr(SourceRange R, ASTContext &Ctx
3776 : , std::string *Sanitizers, unsigned SanitizersSize
3777 : , unsigned SI
3778 : )
3779 : : InheritableAttr(attr::NoSanitize, R, SI, 0, 0)
3780 : , sanitizers_Size(SanitizersSize), sanitizers_(new (Ctx, 16) std::string[sanitizers_Size])
3781 : {
3782 : std::copy(Sanitizers, Sanitizers + sanitizers_Size, sanitizers_);
3783 : }
3784 :
3785 : NoSanitizeAttr(SourceRange R, ASTContext &Ctx
3786 : , unsigned SI
3787 : )
3788 : : InheritableAttr(attr::NoSanitize, R, SI, 0, 0)
3789 : , sanitizers_Size(0), sanitizers_(nullptr)
3790 : {
3791 : }
3792 :
3793 : NoSanitizeAttr *clone(ASTContext &C) const;
3794 : void printPretty(raw_ostream &OS,
3795 : const PrintingPolicy &Policy) const;
3796 : const char *getSpelling() const;
3797 : typedef std::string* sanitizers_iterator;
3798 : sanitizers_iterator sanitizers_begin() const { return sanitizers_; }
3799 : sanitizers_iterator sanitizers_end() const { return sanitizers_ + sanitizers_Size; }
3800 : unsigned sanitizers_size() const { return sanitizers_Size; }
3801 : llvm::iterator_range<sanitizers_iterator> sanitizers() const { return llvm::make_range(sanitizers_begin(), sanitizers_end()); }
3802 :
3803 :
3804 :
3805 : SanitizerMask getMask() const {
3806 : SanitizerMask Mask = 0;
3807 : for (auto SanitizerName : sanitizers()) {
3808 : SanitizerMask ParsedMask =
3809 : parseSanitizerValue(SanitizerName, /*AllowGroups=*/true);
3810 : Mask |= expandSanitizerGroups(ParsedMask);
3811 : }
3812 : return Mask;
3813 : }
3814 :
3815 :
3816 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoSanitize; }
3817 : };
3818 :
3819 : class NoSplitStackAttr : public InheritableAttr {
3820 :
3821 : public:
3822 : static NoSplitStackAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3823 : NoSplitStackAttr *A = new (Ctx) NoSplitStackAttr(Loc, Ctx, 0);
3824 : A->setImplicit(true);
3825 : return A;
3826 : }
3827 :
3828 : NoSplitStackAttr(SourceRange R, ASTContext &Ctx
3829 : , unsigned SI
3830 : )
3831 : : InheritableAttr(attr::NoSplitStack, R, SI, 0, 0)
3832 : {
3833 : }
3834 :
3835 : NoSplitStackAttr *clone(ASTContext &C) const;
3836 : void printPretty(raw_ostream &OS,
3837 : const PrintingPolicy &Policy) const;
3838 : const char *getSpelling() const;
3839 :
3840 :
3841 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoSplitStack; }
3842 : };
3843 :
3844 : class NoThreadSafetyAnalysisAttr : public InheritableAttr {
3845 :
3846 : public:
3847 : static NoThreadSafetyAnalysisAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3848 : NoThreadSafetyAnalysisAttr *A = new (Ctx) NoThreadSafetyAnalysisAttr(Loc, Ctx, 0);
3849 : A->setImplicit(true);
3850 : return A;
3851 : }
3852 :
3853 : NoThreadSafetyAnalysisAttr(SourceRange R, ASTContext &Ctx
3854 : , unsigned SI
3855 : )
3856 : : InheritableAttr(attr::NoThreadSafetyAnalysis, R, SI, 0, 0)
3857 : {
3858 : }
3859 :
3860 : NoThreadSafetyAnalysisAttr *clone(ASTContext &C) const;
3861 : void printPretty(raw_ostream &OS,
3862 : const PrintingPolicy &Policy) const;
3863 : const char *getSpelling() const;
3864 :
3865 :
3866 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoThreadSafetyAnalysis; }
3867 : };
3868 :
3869 : class NoThrowAttr : public InheritableAttr {
3870 :
3871 : public:
3872 : static NoThrowAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3873 : NoThrowAttr *A = new (Ctx) NoThrowAttr(Loc, Ctx, 0);
3874 : A->setImplicit(true);
3875 : return A;
3876 : }
3877 :
3878 : NoThrowAttr(SourceRange R, ASTContext &Ctx
3879 : , unsigned SI
3880 : )
3881 : : InheritableAttr(attr::NoThrow, R, SI, 0, 0)
3882 : {
3883 : }
3884 :
3885 : NoThrowAttr *clone(ASTContext &C) const;
3886 : void printPretty(raw_ostream &OS,
3887 : const PrintingPolicy &Policy) const;
3888 : const char *getSpelling() const;
3889 :
3890 :
3891 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NoThrow; }
3892 : };
3893 :
3894 : class NonNullAttr : public InheritableAttr {
3895 : unsigned args_Size;
3896 : unsigned *args_;
3897 :
3898 :
3899 : public:
3900 : static NonNullAttr *CreateImplicit(ASTContext &Ctx, unsigned *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
3901 : NonNullAttr *A = new (Ctx) NonNullAttr(Loc, Ctx, Args, ArgsSize, 0);
3902 : A->setImplicit(true);
3903 : return A;
3904 : }
3905 :
3906 : NonNullAttr(SourceRange R, ASTContext &Ctx
3907 : , unsigned *Args, unsigned ArgsSize
3908 : , unsigned SI
3909 : )
3910 : : InheritableAttr(attr::NonNull, R, SI, 0, 1)
3911 : , args_Size(ArgsSize), args_(new (Ctx, 16) unsigned[args_Size])
3912 : {
3913 : std::copy(Args, Args + args_Size, args_);
3914 : }
3915 :
3916 : NonNullAttr(SourceRange R, ASTContext &Ctx
3917 : , unsigned SI
3918 : )
3919 : : InheritableAttr(attr::NonNull, R, SI, 0, 1)
3920 : , args_Size(0), args_(nullptr)
3921 : {
3922 : }
3923 :
3924 : NonNullAttr *clone(ASTContext &C) const;
3925 : void printPretty(raw_ostream &OS,
3926 : const PrintingPolicy &Policy) const;
3927 : const char *getSpelling() const;
3928 : typedef unsigned* args_iterator;
3929 : args_iterator args_begin() const { return args_; }
3930 : args_iterator args_end() const { return args_ + args_Size; }
3931 : unsigned args_size() const { return args_Size; }
3932 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
3933 :
3934 :
3935 : bool isNonNull(unsigned idx) const {
3936 : if (!args_size())
3937 : return true;
3938 : for (const auto &V : args())
3939 : if (V == idx)
3940 : return true;
3941 : return false;
3942 : }
3943 :
3944 0 : static bool classof(const Attr *A) { return A->getKind() == attr::NonNull; }
3945 : };
3946 :
3947 : class OMPThreadPrivateDeclAttr : public InheritableAttr {
3948 :
3949 : public:
3950 : static OMPThreadPrivateDeclAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3951 : OMPThreadPrivateDeclAttr *A = new (Ctx) OMPThreadPrivateDeclAttr(Loc, Ctx, 0);
3952 : A->setImplicit(true);
3953 : return A;
3954 : }
3955 :
3956 : OMPThreadPrivateDeclAttr(SourceRange R, ASTContext &Ctx
3957 : , unsigned SI
3958 : )
3959 : : InheritableAttr(attr::OMPThreadPrivateDecl, R, SI, 0, 0)
3960 : {
3961 : }
3962 :
3963 : OMPThreadPrivateDeclAttr *clone(ASTContext &C) const;
3964 : void printPretty(raw_ostream &OS,
3965 : const PrintingPolicy &Policy) const;
3966 : const char *getSpelling() const;
3967 :
3968 :
3969 0 : static bool classof(const Attr *A) { return A->getKind() == attr::OMPThreadPrivateDecl; }
3970 : };
3971 :
3972 : class ObjCBoxableAttr : public Attr {
3973 :
3974 : public:
3975 : static ObjCBoxableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3976 : ObjCBoxableAttr *A = new (Ctx) ObjCBoxableAttr(Loc, Ctx, 0);
3977 : A->setImplicit(true);
3978 : return A;
3979 : }
3980 :
3981 : ObjCBoxableAttr(SourceRange R, ASTContext &Ctx
3982 : , unsigned SI
3983 : )
3984 : : Attr(attr::ObjCBoxable, R, SI, 0, 0)
3985 : {
3986 : }
3987 :
3988 : ObjCBoxableAttr *clone(ASTContext &C) const;
3989 : void printPretty(raw_ostream &OS,
3990 : const PrintingPolicy &Policy) const;
3991 : const char *getSpelling() const;
3992 :
3993 :
3994 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBoxable; }
3995 : };
3996 :
3997 : class ObjCBridgeAttr : public InheritableAttr {
3998 : IdentifierInfo * bridgedType;
3999 :
4000 :
4001 : public:
4002 : static ObjCBridgeAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Loc = SourceRange()) {
4003 : ObjCBridgeAttr *A = new (Ctx) ObjCBridgeAttr(Loc, Ctx, BridgedType, 0);
4004 : A->setImplicit(true);
4005 : return A;
4006 : }
4007 :
4008 : ObjCBridgeAttr(SourceRange R, ASTContext &Ctx
4009 : , IdentifierInfo * BridgedType
4010 : , unsigned SI
4011 : )
4012 : : InheritableAttr(attr::ObjCBridge, R, SI, 0, 0)
4013 : , bridgedType(BridgedType)
4014 : {
4015 :
4016 : }
4017 :
4018 : ObjCBridgeAttr *clone(ASTContext &C) const;
4019 : void printPretty(raw_ostream &OS,
4020 : const PrintingPolicy &Policy) const;
4021 : const char *getSpelling() const;
4022 : IdentifierInfo * getBridgedType() const {
4023 : return bridgedType;
4024 : }
4025 :
4026 :
4027 :
4028 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBridge; }
4029 : };
4030 :
4031 : class ObjCBridgeMutableAttr : public InheritableAttr {
4032 : IdentifierInfo * bridgedType;
4033 :
4034 :
4035 : public:
4036 : static ObjCBridgeMutableAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Loc = SourceRange()) {
4037 : ObjCBridgeMutableAttr *A = new (Ctx) ObjCBridgeMutableAttr(Loc, Ctx, BridgedType, 0);
4038 : A->setImplicit(true);
4039 : return A;
4040 : }
4041 :
4042 : ObjCBridgeMutableAttr(SourceRange R, ASTContext &Ctx
4043 : , IdentifierInfo * BridgedType
4044 : , unsigned SI
4045 : )
4046 : : InheritableAttr(attr::ObjCBridgeMutable, R, SI, 0, 0)
4047 : , bridgedType(BridgedType)
4048 : {
4049 :
4050 : }
4051 :
4052 : ObjCBridgeMutableAttr *clone(ASTContext &C) const;
4053 : void printPretty(raw_ostream &OS,
4054 : const PrintingPolicy &Policy) const;
4055 : const char *getSpelling() const;
4056 : IdentifierInfo * getBridgedType() const {
4057 : return bridgedType;
4058 : }
4059 :
4060 :
4061 :
4062 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBridgeMutable; }
4063 : };
4064 :
4065 : class ObjCBridgeRelatedAttr : public InheritableAttr {
4066 : IdentifierInfo * relatedClass;
4067 :
4068 : IdentifierInfo * classMethod;
4069 :
4070 : IdentifierInfo * instanceMethod;
4071 :
4072 :
4073 : public:
4074 : static ObjCBridgeRelatedAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * RelatedClass, IdentifierInfo * ClassMethod, IdentifierInfo * InstanceMethod, SourceRange Loc = SourceRange()) {
4075 : ObjCBridgeRelatedAttr *A = new (Ctx) ObjCBridgeRelatedAttr(Loc, Ctx, RelatedClass, ClassMethod, InstanceMethod, 0);
4076 : A->setImplicit(true);
4077 : return A;
4078 : }
4079 :
4080 : ObjCBridgeRelatedAttr(SourceRange R, ASTContext &Ctx
4081 : , IdentifierInfo * RelatedClass
4082 : , IdentifierInfo * ClassMethod
4083 : , IdentifierInfo * InstanceMethod
4084 : , unsigned SI
4085 : )
4086 : : InheritableAttr(attr::ObjCBridgeRelated, R, SI, 0, 0)
4087 : , relatedClass(RelatedClass)
4088 : , classMethod(ClassMethod)
4089 : , instanceMethod(InstanceMethod)
4090 : {
4091 :
4092 :
4093 :
4094 : }
4095 :
4096 : ObjCBridgeRelatedAttr *clone(ASTContext &C) const;
4097 : void printPretty(raw_ostream &OS,
4098 : const PrintingPolicy &Policy) const;
4099 : const char *getSpelling() const;
4100 : IdentifierInfo * getRelatedClass() const {
4101 : return relatedClass;
4102 : }
4103 :
4104 : IdentifierInfo * getClassMethod() const {
4105 : return classMethod;
4106 : }
4107 :
4108 : IdentifierInfo * getInstanceMethod() const {
4109 : return instanceMethod;
4110 : }
4111 :
4112 :
4113 :
4114 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBridgeRelated; }
4115 : };
4116 :
4117 : class ObjCDesignatedInitializerAttr : public Attr {
4118 :
4119 : public:
4120 : static ObjCDesignatedInitializerAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4121 : ObjCDesignatedInitializerAttr *A = new (Ctx) ObjCDesignatedInitializerAttr(Loc, Ctx, 0);
4122 : A->setImplicit(true);
4123 : return A;
4124 : }
4125 :
4126 : ObjCDesignatedInitializerAttr(SourceRange R, ASTContext &Ctx
4127 : , unsigned SI
4128 : )
4129 : : Attr(attr::ObjCDesignatedInitializer, R, SI, 0, 0)
4130 : {
4131 : }
4132 :
4133 : ObjCDesignatedInitializerAttr *clone(ASTContext &C) const;
4134 : void printPretty(raw_ostream &OS,
4135 : const PrintingPolicy &Policy) const;
4136 : const char *getSpelling() const;
4137 :
4138 :
4139 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCDesignatedInitializer; }
4140 : };
4141 :
4142 : class ObjCExceptionAttr : public InheritableAttr {
4143 :
4144 : public:
4145 : static ObjCExceptionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4146 : ObjCExceptionAttr *A = new (Ctx) ObjCExceptionAttr(Loc, Ctx, 0);
4147 : A->setImplicit(true);
4148 : return A;
4149 : }
4150 :
4151 : ObjCExceptionAttr(SourceRange R, ASTContext &Ctx
4152 : , unsigned SI
4153 : )
4154 : : InheritableAttr(attr::ObjCException, R, SI, 0, 0)
4155 : {
4156 : }
4157 :
4158 : ObjCExceptionAttr *clone(ASTContext &C) const;
4159 : void printPretty(raw_ostream &OS,
4160 : const PrintingPolicy &Policy) const;
4161 : const char *getSpelling() const;
4162 :
4163 :
4164 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCException; }
4165 : };
4166 :
4167 : class ObjCExplicitProtocolImplAttr : public InheritableAttr {
4168 :
4169 : public:
4170 : static ObjCExplicitProtocolImplAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4171 : ObjCExplicitProtocolImplAttr *A = new (Ctx) ObjCExplicitProtocolImplAttr(Loc, Ctx, 0);
4172 : A->setImplicit(true);
4173 : return A;
4174 : }
4175 :
4176 : ObjCExplicitProtocolImplAttr(SourceRange R, ASTContext &Ctx
4177 : , unsigned SI
4178 : )
4179 : : InheritableAttr(attr::ObjCExplicitProtocolImpl, R, SI, 0, 0)
4180 : {
4181 : }
4182 :
4183 : ObjCExplicitProtocolImplAttr *clone(ASTContext &C) const;
4184 : void printPretty(raw_ostream &OS,
4185 : const PrintingPolicy &Policy) const;
4186 : const char *getSpelling() const;
4187 :
4188 :
4189 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCExplicitProtocolImpl; }
4190 : };
4191 :
4192 : class ObjCIndependentClassAttr : public InheritableAttr {
4193 :
4194 : public:
4195 : static ObjCIndependentClassAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4196 : ObjCIndependentClassAttr *A = new (Ctx) ObjCIndependentClassAttr(Loc, Ctx, 0);
4197 : A->setImplicit(true);
4198 : return A;
4199 : }
4200 :
4201 : ObjCIndependentClassAttr(SourceRange R, ASTContext &Ctx
4202 : , unsigned SI
4203 : )
4204 : : InheritableAttr(attr::ObjCIndependentClass, R, SI, 0, 0)
4205 : {
4206 : }
4207 :
4208 : ObjCIndependentClassAttr *clone(ASTContext &C) const;
4209 : void printPretty(raw_ostream &OS,
4210 : const PrintingPolicy &Policy) const;
4211 : const char *getSpelling() const;
4212 :
4213 :
4214 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCIndependentClass; }
4215 : };
4216 :
4217 : class ObjCMethodFamilyAttr : public InheritableAttr {
4218 : public:
4219 : enum FamilyKind {
4220 : OMF_None,
4221 : OMF_alloc,
4222 : OMF_copy,
4223 : OMF_init,
4224 : OMF_mutableCopy,
4225 : OMF_new
4226 : };
4227 : private:
4228 : FamilyKind family;
4229 :
4230 :
4231 : public:
4232 : static ObjCMethodFamilyAttr *CreateImplicit(ASTContext &Ctx, FamilyKind Family, SourceRange Loc = SourceRange()) {
4233 : ObjCMethodFamilyAttr *A = new (Ctx) ObjCMethodFamilyAttr(Loc, Ctx, Family, 0);
4234 : A->setImplicit(true);
4235 : return A;
4236 : }
4237 :
4238 : ObjCMethodFamilyAttr(SourceRange R, ASTContext &Ctx
4239 : , FamilyKind Family
4240 : , unsigned SI
4241 : )
4242 : : InheritableAttr(attr::ObjCMethodFamily, R, SI, 0, 0)
4243 : , family(Family)
4244 : {
4245 :
4246 : }
4247 :
4248 : ObjCMethodFamilyAttr *clone(ASTContext &C) const;
4249 : void printPretty(raw_ostream &OS,
4250 : const PrintingPolicy &Policy) const;
4251 : const char *getSpelling() const;
4252 : FamilyKind getFamily() const {
4253 : return family;
4254 : }
4255 :
4256 : static bool ConvertStrToFamilyKind(StringRef Val, FamilyKind &Out) {
4257 : Optional<FamilyKind> R = llvm::StringSwitch<Optional<FamilyKind>>(Val)
4258 : .Case("none", ObjCMethodFamilyAttr::OMF_None)
4259 : .Case("alloc", ObjCMethodFamilyAttr::OMF_alloc)
4260 : .Case("copy", ObjCMethodFamilyAttr::OMF_copy)
4261 : .Case("init", ObjCMethodFamilyAttr::OMF_init)
4262 : .Case("mutableCopy", ObjCMethodFamilyAttr::OMF_mutableCopy)
4263 : .Case("new", ObjCMethodFamilyAttr::OMF_new)
4264 : .Default(Optional<FamilyKind>());
4265 : if (R) {
4266 : Out = *R;
4267 : return true;
4268 : }
4269 : return false;
4270 : }
4271 :
4272 : static const char *ConvertFamilyKindToStr(FamilyKind Val) {
4273 : switch(Val) {
4274 : case ObjCMethodFamilyAttr::OMF_None: return "none";
4275 : case ObjCMethodFamilyAttr::OMF_alloc: return "alloc";
4276 : case ObjCMethodFamilyAttr::OMF_copy: return "copy";
4277 : case ObjCMethodFamilyAttr::OMF_init: return "init";
4278 : case ObjCMethodFamilyAttr::OMF_mutableCopy: return "mutableCopy";
4279 : case ObjCMethodFamilyAttr::OMF_new: return "new";
4280 : }
4281 : llvm_unreachable("No enumerator with that value");
4282 : }
4283 :
4284 :
4285 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCMethodFamily; }
4286 : };
4287 :
4288 : class ObjCNSObjectAttr : public InheritableAttr {
4289 :
4290 : public:
4291 : static ObjCNSObjectAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4292 : ObjCNSObjectAttr *A = new (Ctx) ObjCNSObjectAttr(Loc, Ctx, 0);
4293 : A->setImplicit(true);
4294 : return A;
4295 : }
4296 :
4297 : ObjCNSObjectAttr(SourceRange R, ASTContext &Ctx
4298 : , unsigned SI
4299 : )
4300 : : InheritableAttr(attr::ObjCNSObject, R, SI, 0, 0)
4301 : {
4302 : }
4303 :
4304 : ObjCNSObjectAttr *clone(ASTContext &C) const;
4305 : void printPretty(raw_ostream &OS,
4306 : const PrintingPolicy &Policy) const;
4307 : const char *getSpelling() const;
4308 :
4309 :
4310 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCNSObject; }
4311 : };
4312 :
4313 : class ObjCPreciseLifetimeAttr : public InheritableAttr {
4314 :
4315 : public:
4316 : static ObjCPreciseLifetimeAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4317 : ObjCPreciseLifetimeAttr *A = new (Ctx) ObjCPreciseLifetimeAttr(Loc, Ctx, 0);
4318 : A->setImplicit(true);
4319 : return A;
4320 : }
4321 :
4322 : ObjCPreciseLifetimeAttr(SourceRange R, ASTContext &Ctx
4323 : , unsigned SI
4324 : )
4325 : : InheritableAttr(attr::ObjCPreciseLifetime, R, SI, 0, 0)
4326 : {
4327 : }
4328 :
4329 : ObjCPreciseLifetimeAttr *clone(ASTContext &C) const;
4330 : void printPretty(raw_ostream &OS,
4331 : const PrintingPolicy &Policy) const;
4332 : const char *getSpelling() const;
4333 :
4334 :
4335 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCPreciseLifetime; }
4336 : };
4337 :
4338 : class ObjCRequiresPropertyDefsAttr : public InheritableAttr {
4339 :
4340 : public:
4341 : static ObjCRequiresPropertyDefsAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4342 : ObjCRequiresPropertyDefsAttr *A = new (Ctx) ObjCRequiresPropertyDefsAttr(Loc, Ctx, 0);
4343 : A->setImplicit(true);
4344 : return A;
4345 : }
4346 :
4347 : ObjCRequiresPropertyDefsAttr(SourceRange R, ASTContext &Ctx
4348 : , unsigned SI
4349 : )
4350 : : InheritableAttr(attr::ObjCRequiresPropertyDefs, R, SI, 0, 0)
4351 : {
4352 : }
4353 :
4354 : ObjCRequiresPropertyDefsAttr *clone(ASTContext &C) const;
4355 : void printPretty(raw_ostream &OS,
4356 : const PrintingPolicy &Policy) const;
4357 : const char *getSpelling() const;
4358 :
4359 :
4360 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRequiresPropertyDefs; }
4361 : };
4362 :
4363 : class ObjCRequiresSuperAttr : public InheritableAttr {
4364 :
4365 : public:
4366 : static ObjCRequiresSuperAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4367 : ObjCRequiresSuperAttr *A = new (Ctx) ObjCRequiresSuperAttr(Loc, Ctx, 0);
4368 : A->setImplicit(true);
4369 : return A;
4370 : }
4371 :
4372 : ObjCRequiresSuperAttr(SourceRange R, ASTContext &Ctx
4373 : , unsigned SI
4374 : )
4375 : : InheritableAttr(attr::ObjCRequiresSuper, R, SI, 0, 0)
4376 : {
4377 : }
4378 :
4379 : ObjCRequiresSuperAttr *clone(ASTContext &C) const;
4380 : void printPretty(raw_ostream &OS,
4381 : const PrintingPolicy &Policy) const;
4382 : const char *getSpelling() const;
4383 :
4384 :
4385 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRequiresSuper; }
4386 : };
4387 :
4388 : class ObjCReturnsInnerPointerAttr : public InheritableAttr {
4389 :
4390 : public:
4391 : static ObjCReturnsInnerPointerAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4392 : ObjCReturnsInnerPointerAttr *A = new (Ctx) ObjCReturnsInnerPointerAttr(Loc, Ctx, 0);
4393 : A->setImplicit(true);
4394 : return A;
4395 : }
4396 :
4397 : ObjCReturnsInnerPointerAttr(SourceRange R, ASTContext &Ctx
4398 : , unsigned SI
4399 : )
4400 : : InheritableAttr(attr::ObjCReturnsInnerPointer, R, SI, 0, 0)
4401 : {
4402 : }
4403 :
4404 : ObjCReturnsInnerPointerAttr *clone(ASTContext &C) const;
4405 : void printPretty(raw_ostream &OS,
4406 : const PrintingPolicy &Policy) const;
4407 : const char *getSpelling() const;
4408 :
4409 :
4410 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCReturnsInnerPointer; }
4411 : };
4412 :
4413 : class ObjCRootClassAttr : public InheritableAttr {
4414 :
4415 : public:
4416 : static ObjCRootClassAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4417 : ObjCRootClassAttr *A = new (Ctx) ObjCRootClassAttr(Loc, Ctx, 0);
4418 : A->setImplicit(true);
4419 : return A;
4420 : }
4421 :
4422 : ObjCRootClassAttr(SourceRange R, ASTContext &Ctx
4423 : , unsigned SI
4424 : )
4425 : : InheritableAttr(attr::ObjCRootClass, R, SI, 0, 0)
4426 : {
4427 : }
4428 :
4429 : ObjCRootClassAttr *clone(ASTContext &C) const;
4430 : void printPretty(raw_ostream &OS,
4431 : const PrintingPolicy &Policy) const;
4432 : const char *getSpelling() const;
4433 :
4434 :
4435 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRootClass; }
4436 : };
4437 :
4438 : class ObjCRuntimeNameAttr : public Attr {
4439 : unsigned metadataNameLength;
4440 : char *metadataName;
4441 :
4442 :
4443 : public:
4444 : static ObjCRuntimeNameAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef MetadataName, SourceRange Loc = SourceRange()) {
4445 : ObjCRuntimeNameAttr *A = new (Ctx) ObjCRuntimeNameAttr(Loc, Ctx, MetadataName, 0);
4446 : A->setImplicit(true);
4447 : return A;
4448 : }
4449 :
4450 : ObjCRuntimeNameAttr(SourceRange R, ASTContext &Ctx
4451 : , llvm::StringRef MetadataName
4452 : , unsigned SI
4453 : )
4454 : : Attr(attr::ObjCRuntimeName, R, SI, 0, 0)
4455 : , metadataNameLength(MetadataName.size()),metadataName(new (Ctx, 1) char[metadataNameLength])
4456 : {
4457 : if (!MetadataName.empty())
4458 : std::memcpy(metadataName, MetadataName.data(), metadataNameLength);
4459 : }
4460 :
4461 : ObjCRuntimeNameAttr *clone(ASTContext &C) const;
4462 : void printPretty(raw_ostream &OS,
4463 : const PrintingPolicy &Policy) const;
4464 : const char *getSpelling() const;
4465 : llvm::StringRef getMetadataName() const {
4466 : return llvm::StringRef(metadataName, metadataNameLength);
4467 : }
4468 : unsigned getMetadataNameLength() const {
4469 : return metadataNameLength;
4470 : }
4471 : void setMetadataName(ASTContext &C, llvm::StringRef S) {
4472 : metadataNameLength = S.size();
4473 : this->metadataName = new (C, 1) char [metadataNameLength];
4474 : if (!S.empty())
4475 : std::memcpy(this->metadataName, S.data(), metadataNameLength);
4476 : }
4477 :
4478 :
4479 :
4480 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRuntimeName; }
4481 : };
4482 :
4483 : class OpenCLImageAccessAttr : public Attr {
4484 :
4485 : public:
4486 : enum Spelling {
4487 : Keyword_read_only = 0,
4488 : Keyword_write_only = 2,
4489 : Keyword_read_write = 4
4490 : };
4491 :
4492 : static OpenCLImageAccessAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
4493 : OpenCLImageAccessAttr *A = new (Ctx) OpenCLImageAccessAttr(Loc, Ctx, S);
4494 : A->setImplicit(true);
4495 : return A;
4496 : }
4497 :
4498 : OpenCLImageAccessAttr(SourceRange R, ASTContext &Ctx
4499 : , unsigned SI
4500 : )
4501 : : Attr(attr::OpenCLImageAccess, R, SI, 0, 0)
4502 : {
4503 : }
4504 :
4505 : OpenCLImageAccessAttr *clone(ASTContext &C) const;
4506 : void printPretty(raw_ostream &OS,
4507 : const PrintingPolicy &Policy) const;
4508 : const char *getSpelling() const;
4509 : Spelling getSemanticSpelling() const {
4510 : switch (SpellingListIndex) {
4511 : default: llvm_unreachable("Unknown spelling list index");
4512 : case 0: return Keyword_read_only;
4513 : case 1: return Keyword_read_only;
4514 : case 2: return Keyword_write_only;
4515 : case 3: return Keyword_write_only;
4516 : case 4: return Keyword_read_write;
4517 : case 5: return Keyword_read_write;
4518 : }
4519 : }
4520 : bool isReadOnly() const { return SpellingListIndex == 0 ||
4521 : SpellingListIndex == 1; }
4522 : bool isReadWrite() const { return SpellingListIndex == 4 ||
4523 : SpellingListIndex == 5; }
4524 : bool isWriteOnly() const { return SpellingListIndex == 2 ||
4525 : SpellingListIndex == 3; }
4526 :
4527 :
4528 0 : static bool classof(const Attr *A) { return A->getKind() == attr::OpenCLImageAccess; }
4529 : };
4530 :
4531 : class OpenCLKernelAttr : public InheritableAttr {
4532 :
4533 : public:
4534 : static OpenCLKernelAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4535 : OpenCLKernelAttr *A = new (Ctx) OpenCLKernelAttr(Loc, Ctx, 0);
4536 : A->setImplicit(true);
4537 : return A;
4538 : }
4539 :
4540 : OpenCLKernelAttr(SourceRange R, ASTContext &Ctx
4541 : , unsigned SI
4542 : )
4543 : : InheritableAttr(attr::OpenCLKernel, R, SI, 0, 0)
4544 : {
4545 : }
4546 :
4547 : OpenCLKernelAttr *clone(ASTContext &C) const;
4548 : void printPretty(raw_ostream &OS,
4549 : const PrintingPolicy &Policy) const;
4550 : const char *getSpelling() const;
4551 :
4552 :
4553 0 : static bool classof(const Attr *A) { return A->getKind() == attr::OpenCLKernel; }
4554 : };
4555 :
4556 : class OptimizeNoneAttr : public InheritableAttr {
4557 :
4558 : public:
4559 : static OptimizeNoneAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4560 : OptimizeNoneAttr *A = new (Ctx) OptimizeNoneAttr(Loc, Ctx, 0);
4561 : A->setImplicit(true);
4562 : return A;
4563 : }
4564 :
4565 : OptimizeNoneAttr(SourceRange R, ASTContext &Ctx
4566 : , unsigned SI
4567 : )
4568 : : InheritableAttr(attr::OptimizeNone, R, SI, 0, 0)
4569 : {
4570 : }
4571 :
4572 : OptimizeNoneAttr *clone(ASTContext &C) const;
4573 : void printPretty(raw_ostream &OS,
4574 : const PrintingPolicy &Policy) const;
4575 : const char *getSpelling() const;
4576 :
4577 :
4578 0 : static bool classof(const Attr *A) { return A->getKind() == attr::OptimizeNone; }
4579 : };
4580 :
4581 : class OverloadableAttr : public Attr {
4582 :
4583 : public:
4584 : static OverloadableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4585 : OverloadableAttr *A = new (Ctx) OverloadableAttr(Loc, Ctx, 0);
4586 : A->setImplicit(true);
4587 : return A;
4588 : }
4589 :
4590 : OverloadableAttr(SourceRange R, ASTContext &Ctx
4591 : , unsigned SI
4592 : )
4593 : : Attr(attr::Overloadable, R, SI, 0, 0)
4594 : {
4595 : }
4596 :
4597 : OverloadableAttr *clone(ASTContext &C) const;
4598 : void printPretty(raw_ostream &OS,
4599 : const PrintingPolicy &Policy) const;
4600 : const char *getSpelling() const;
4601 :
4602 :
4603 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Overloadable; }
4604 : };
4605 :
4606 : class OverrideAttr : public InheritableAttr {
4607 :
4608 : public:
4609 : static OverrideAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4610 : OverrideAttr *A = new (Ctx) OverrideAttr(Loc, Ctx, 0);
4611 : A->setImplicit(true);
4612 : return A;
4613 : }
4614 :
4615 : OverrideAttr(SourceRange R, ASTContext &Ctx
4616 : , unsigned SI
4617 : )
4618 : : InheritableAttr(attr::Override, R, SI, 0, 0)
4619 : {
4620 : }
4621 :
4622 : OverrideAttr *clone(ASTContext &C) const;
4623 : void printPretty(raw_ostream &OS,
4624 : const PrintingPolicy &Policy) const;
4625 : const char *getSpelling() const;
4626 :
4627 :
4628 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Override; }
4629 : };
4630 :
4631 : class OwnershipAttr : public InheritableAttr {
4632 : IdentifierInfo * module;
4633 :
4634 : unsigned args_Size;
4635 : unsigned *args_;
4636 :
4637 :
4638 : public:
4639 : enum Spelling {
4640 : GNU_ownership_holds = 0,
4641 : GNU_ownership_returns = 1,
4642 : GNU_ownership_takes = 2
4643 : };
4644 :
4645 : static OwnershipAttr *CreateImplicit(ASTContext &Ctx, Spelling S, IdentifierInfo * Module, unsigned *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
4646 : OwnershipAttr *A = new (Ctx) OwnershipAttr(Loc, Ctx, Module, Args, ArgsSize, S);
4647 : A->setImplicit(true);
4648 : return A;
4649 : }
4650 :
4651 : OwnershipAttr(SourceRange R, ASTContext &Ctx
4652 : , IdentifierInfo * Module
4653 : , unsigned *Args, unsigned ArgsSize
4654 : , unsigned SI
4655 : )
4656 : : InheritableAttr(attr::Ownership, R, SI, 0, 0)
4657 : , module(Module)
4658 : , args_Size(ArgsSize), args_(new (Ctx, 16) unsigned[args_Size])
4659 : {
4660 :
4661 : std::copy(Args, Args + args_Size, args_);
4662 : }
4663 :
4664 : OwnershipAttr(SourceRange R, ASTContext &Ctx
4665 : , IdentifierInfo * Module
4666 : , unsigned SI
4667 : )
4668 : : InheritableAttr(attr::Ownership, R, SI, 0, 0)
4669 : , module()
4670 : , args_Size(0), args_(nullptr)
4671 : {
4672 :
4673 : }
4674 :
4675 : OwnershipAttr *clone(ASTContext &C) const;
4676 : void printPretty(raw_ostream &OS,
4677 : const PrintingPolicy &Policy) const;
4678 : const char *getSpelling() const;
4679 : Spelling getSemanticSpelling() const {
4680 : switch (SpellingListIndex) {
4681 : default: llvm_unreachable("Unknown spelling list index");
4682 : case 0: return GNU_ownership_holds;
4683 : case 1: return GNU_ownership_returns;
4684 : case 2: return GNU_ownership_takes;
4685 : }
4686 : }
4687 : bool isHolds() const { return SpellingListIndex == 0; }
4688 : bool isReturns() const { return SpellingListIndex == 1; }
4689 : bool isTakes() const { return SpellingListIndex == 2; }
4690 : IdentifierInfo * getModule() const {
4691 : return module;
4692 : }
4693 :
4694 : typedef unsigned* args_iterator;
4695 : args_iterator args_begin() const { return args_; }
4696 : args_iterator args_end() const { return args_ + args_Size; }
4697 : unsigned args_size() const { return args_Size; }
4698 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
4699 :
4700 :
4701 :
4702 : enum OwnershipKind { Holds, Returns, Takes };
4703 : OwnershipKind getOwnKind() const {
4704 : return isHolds() ? Holds :
4705 : isTakes() ? Takes :
4706 : Returns;
4707 : }
4708 :
4709 :
4710 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Ownership; }
4711 : };
4712 :
4713 : class PackedAttr : public InheritableAttr {
4714 :
4715 : public:
4716 : static PackedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4717 : PackedAttr *A = new (Ctx) PackedAttr(Loc, Ctx, 0);
4718 : A->setImplicit(true);
4719 : return A;
4720 : }
4721 :
4722 : PackedAttr(SourceRange R, ASTContext &Ctx
4723 : , unsigned SI
4724 : )
4725 : : InheritableAttr(attr::Packed, R, SI, 0, 0)
4726 : {
4727 : }
4728 :
4729 : PackedAttr *clone(ASTContext &C) const;
4730 : void printPretty(raw_ostream &OS,
4731 : const PrintingPolicy &Policy) const;
4732 : const char *getSpelling() const;
4733 :
4734 :
4735 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Packed; }
4736 : };
4737 :
4738 : class ParamTypestateAttr : public InheritableAttr {
4739 : public:
4740 : enum ConsumedState {
4741 : Unknown,
4742 : Consumed,
4743 : Unconsumed
4744 : };
4745 : private:
4746 : ConsumedState paramState;
4747 :
4748 :
4749 : public:
4750 : static ParamTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState ParamState, SourceRange Loc = SourceRange()) {
4751 : ParamTypestateAttr *A = new (Ctx) ParamTypestateAttr(Loc, Ctx, ParamState, 0);
4752 : A->setImplicit(true);
4753 : return A;
4754 : }
4755 :
4756 : ParamTypestateAttr(SourceRange R, ASTContext &Ctx
4757 : , ConsumedState ParamState
4758 : , unsigned SI
4759 : )
4760 : : InheritableAttr(attr::ParamTypestate, R, SI, 0, 0)
4761 : , paramState(ParamState)
4762 : {
4763 :
4764 : }
4765 :
4766 : ParamTypestateAttr *clone(ASTContext &C) const;
4767 : void printPretty(raw_ostream &OS,
4768 : const PrintingPolicy &Policy) const;
4769 : const char *getSpelling() const;
4770 : ConsumedState getParamState() const {
4771 : return paramState;
4772 : }
4773 :
4774 : static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
4775 : Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
4776 : .Case("unknown", ParamTypestateAttr::Unknown)
4777 : .Case("consumed", ParamTypestateAttr::Consumed)
4778 : .Case("unconsumed", ParamTypestateAttr::Unconsumed)
4779 : .Default(Optional<ConsumedState>());
4780 : if (R) {
4781 : Out = *R;
4782 : return true;
4783 : }
4784 : return false;
4785 : }
4786 :
4787 : static const char *ConvertConsumedStateToStr(ConsumedState Val) {
4788 : switch(Val) {
4789 : case ParamTypestateAttr::Unknown: return "unknown";
4790 : case ParamTypestateAttr::Consumed: return "consumed";
4791 : case ParamTypestateAttr::Unconsumed: return "unconsumed";
4792 : }
4793 : llvm_unreachable("No enumerator with that value");
4794 : }
4795 :
4796 :
4797 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ParamTypestate; }
4798 : };
4799 :
4800 : class PascalAttr : public InheritableAttr {
4801 :
4802 : public:
4803 : static PascalAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4804 : PascalAttr *A = new (Ctx) PascalAttr(Loc, Ctx, 0);
4805 : A->setImplicit(true);
4806 : return A;
4807 : }
4808 :
4809 : PascalAttr(SourceRange R, ASTContext &Ctx
4810 : , unsigned SI
4811 : )
4812 : : InheritableAttr(attr::Pascal, R, SI, 0, 0)
4813 : {
4814 : }
4815 :
4816 : PascalAttr *clone(ASTContext &C) const;
4817 : void printPretty(raw_ostream &OS,
4818 : const PrintingPolicy &Policy) const;
4819 : const char *getSpelling() const;
4820 :
4821 :
4822 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Pascal; }
4823 : };
4824 :
4825 : class PcsAttr : public InheritableAttr {
4826 : public:
4827 : enum PCSType {
4828 : AAPCS,
4829 : AAPCS_VFP
4830 : };
4831 : private:
4832 : PCSType pCS;
4833 :
4834 :
4835 : public:
4836 : static PcsAttr *CreateImplicit(ASTContext &Ctx, PCSType PCS, SourceRange Loc = SourceRange()) {
4837 : PcsAttr *A = new (Ctx) PcsAttr(Loc, Ctx, PCS, 0);
4838 : A->setImplicit(true);
4839 : return A;
4840 : }
4841 :
4842 : PcsAttr(SourceRange R, ASTContext &Ctx
4843 : , PCSType PCS
4844 : , unsigned SI
4845 : )
4846 : : InheritableAttr(attr::Pcs, R, SI, 0, 0)
4847 : , pCS(PCS)
4848 : {
4849 :
4850 : }
4851 :
4852 : PcsAttr *clone(ASTContext &C) const;
4853 : void printPretty(raw_ostream &OS,
4854 : const PrintingPolicy &Policy) const;
4855 : const char *getSpelling() const;
4856 : PCSType getPCS() const {
4857 : return pCS;
4858 : }
4859 :
4860 : static bool ConvertStrToPCSType(StringRef Val, PCSType &Out) {
4861 : Optional<PCSType> R = llvm::StringSwitch<Optional<PCSType>>(Val)
4862 : .Case("aapcs", PcsAttr::AAPCS)
4863 : .Case("aapcs-vfp", PcsAttr::AAPCS_VFP)
4864 : .Default(Optional<PCSType>());
4865 : if (R) {
4866 : Out = *R;
4867 : return true;
4868 : }
4869 : return false;
4870 : }
4871 :
4872 : static const char *ConvertPCSTypeToStr(PCSType Val) {
4873 : switch(Val) {
4874 : case PcsAttr::AAPCS: return "aapcs";
4875 : case PcsAttr::AAPCS_VFP: return "aapcs-vfp";
4876 : }
4877 : llvm_unreachable("No enumerator with that value");
4878 : }
4879 :
4880 :
4881 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Pcs; }
4882 : };
4883 :
4884 : class PtGuardedByAttr : public InheritableAttr {
4885 : Expr * arg;
4886 :
4887 :
4888 : public:
4889 : static PtGuardedByAttr *CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Loc = SourceRange()) {
4890 : PtGuardedByAttr *A = new (Ctx) PtGuardedByAttr(Loc, Ctx, Arg, 0);
4891 : A->setImplicit(true);
4892 : return A;
4893 : }
4894 :
4895 : PtGuardedByAttr(SourceRange R, ASTContext &Ctx
4896 : , Expr * Arg
4897 : , unsigned SI
4898 : )
4899 : : InheritableAttr(attr::PtGuardedBy, R, SI, 1, 1)
4900 : , arg(Arg)
4901 : {
4902 :
4903 : }
4904 :
4905 : PtGuardedByAttr *clone(ASTContext &C) const;
4906 : void printPretty(raw_ostream &OS,
4907 : const PrintingPolicy &Policy) const;
4908 : const char *getSpelling() const;
4909 : Expr * getArg() const {
4910 0 : return arg;
4911 : }
4912 :
4913 :
4914 :
4915 0 : static bool classof(const Attr *A) { return A->getKind() == attr::PtGuardedBy; }
4916 : };
4917 :
4918 : class PtGuardedVarAttr : public InheritableAttr {
4919 :
4920 : public:
4921 : static PtGuardedVarAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4922 : PtGuardedVarAttr *A = new (Ctx) PtGuardedVarAttr(Loc, Ctx, 0);
4923 : A->setImplicit(true);
4924 : return A;
4925 : }
4926 :
4927 : PtGuardedVarAttr(SourceRange R, ASTContext &Ctx
4928 : , unsigned SI
4929 : )
4930 : : InheritableAttr(attr::PtGuardedVar, R, SI, 0, 0)
4931 : {
4932 : }
4933 :
4934 : PtGuardedVarAttr *clone(ASTContext &C) const;
4935 : void printPretty(raw_ostream &OS,
4936 : const PrintingPolicy &Policy) const;
4937 : const char *getSpelling() const;
4938 :
4939 :
4940 0 : static bool classof(const Attr *A) { return A->getKind() == attr::PtGuardedVar; }
4941 : };
4942 :
4943 : class PureAttr : public InheritableAttr {
4944 :
4945 : public:
4946 : static PureAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4947 : PureAttr *A = new (Ctx) PureAttr(Loc, Ctx, 0);
4948 : A->setImplicit(true);
4949 : return A;
4950 : }
4951 :
4952 : PureAttr(SourceRange R, ASTContext &Ctx
4953 : , unsigned SI
4954 : )
4955 : : InheritableAttr(attr::Pure, R, SI, 0, 0)
4956 : {
4957 : }
4958 :
4959 : PureAttr *clone(ASTContext &C) const;
4960 : void printPretty(raw_ostream &OS,
4961 : const PrintingPolicy &Policy) const;
4962 : const char *getSpelling() const;
4963 :
4964 :
4965 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Pure; }
4966 : };
4967 :
4968 : class ReleaseCapabilityAttr : public InheritableAttr {
4969 : unsigned args_Size;
4970 : Expr * *args_;
4971 :
4972 :
4973 : public:
4974 : enum Spelling {
4975 : GNU_release_capability = 0,
4976 : CXX11_clang_release_capability = 1,
4977 : GNU_release_shared_capability = 2,
4978 : CXX11_clang_release_shared_capability = 3,
4979 : GNU_release_generic_capability = 4,
4980 : CXX11_clang_release_generic_capability = 5,
4981 : GNU_unlock_function = 6
4982 : };
4983 :
4984 : static ReleaseCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
4985 : ReleaseCapabilityAttr *A = new (Ctx) ReleaseCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
4986 : A->setImplicit(true);
4987 : return A;
4988 : }
4989 :
4990 : ReleaseCapabilityAttr(SourceRange R, ASTContext &Ctx
4991 : , Expr * *Args, unsigned ArgsSize
4992 : , unsigned SI
4993 : )
4994 : : InheritableAttr(attr::ReleaseCapability, R, SI, 1, 1)
4995 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
4996 : {
4997 : std::copy(Args, Args + args_Size, args_);
4998 : }
4999 :
5000 : ReleaseCapabilityAttr(SourceRange R, ASTContext &Ctx
5001 : , unsigned SI
5002 : )
5003 : : InheritableAttr(attr::ReleaseCapability, R, SI, 1, 1)
5004 : , args_Size(0), args_(nullptr)
5005 : {
5006 : }
5007 :
5008 : ReleaseCapabilityAttr *clone(ASTContext &C) const;
5009 : void printPretty(raw_ostream &OS,
5010 : const PrintingPolicy &Policy) const;
5011 : const char *getSpelling() const;
5012 : Spelling getSemanticSpelling() const {
5013 : switch (SpellingListIndex) {
5014 : default: llvm_unreachable("Unknown spelling list index");
5015 : case 0: return GNU_release_capability;
5016 : case 1: return CXX11_clang_release_capability;
5017 : case 2: return GNU_release_shared_capability;
5018 : case 3: return CXX11_clang_release_shared_capability;
5019 : case 4: return GNU_release_generic_capability;
5020 : case 5: return CXX11_clang_release_generic_capability;
5021 : case 6: return GNU_unlock_function;
5022 : }
5023 : }
5024 : bool isShared() const { return SpellingListIndex == 2 ||
5025 : SpellingListIndex == 3; }
5026 : bool isGeneric() const { return SpellingListIndex == 4 ||
5027 : SpellingListIndex == 5 ||
5028 : SpellingListIndex == 6; }
5029 : typedef Expr ** args_iterator;
5030 0 : args_iterator args_begin() const { return args_; }
5031 0 : args_iterator args_end() const { return args_ + args_Size; }
5032 : unsigned args_size() const { return args_Size; }
5033 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
5034 :
5035 :
5036 :
5037 :
5038 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ReleaseCapability; }
5039 : };
5040 :
5041 : class ReqdWorkGroupSizeAttr : public InheritableAttr {
5042 : unsigned xDim;
5043 :
5044 : unsigned yDim;
5045 :
5046 : unsigned zDim;
5047 :
5048 :
5049 : public:
5050 : static ReqdWorkGroupSizeAttr *CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Loc = SourceRange()) {
5051 : ReqdWorkGroupSizeAttr *A = new (Ctx) ReqdWorkGroupSizeAttr(Loc, Ctx, XDim, YDim, ZDim, 0);
5052 : A->setImplicit(true);
5053 : return A;
5054 : }
5055 :
5056 : ReqdWorkGroupSizeAttr(SourceRange R, ASTContext &Ctx
5057 : , unsigned XDim
5058 : , unsigned YDim
5059 : , unsigned ZDim
5060 : , unsigned SI
5061 : )
5062 : : InheritableAttr(attr::ReqdWorkGroupSize, R, SI, 0, 0)
5063 : , xDim(XDim)
5064 : , yDim(YDim)
5065 : , zDim(ZDim)
5066 : {
5067 :
5068 :
5069 :
5070 : }
5071 :
5072 : ReqdWorkGroupSizeAttr *clone(ASTContext &C) const;
5073 : void printPretty(raw_ostream &OS,
5074 : const PrintingPolicy &Policy) const;
5075 : const char *getSpelling() const;
5076 : unsigned getXDim() const {
5077 : return xDim;
5078 : }
5079 :
5080 : unsigned getYDim() const {
5081 : return yDim;
5082 : }
5083 :
5084 : unsigned getZDim() const {
5085 : return zDim;
5086 : }
5087 :
5088 :
5089 :
5090 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ReqdWorkGroupSize; }
5091 : };
5092 :
5093 : class RequiresCapabilityAttr : public InheritableAttr {
5094 : unsigned args_Size;
5095 : Expr * *args_;
5096 :
5097 :
5098 : public:
5099 : enum Spelling {
5100 : GNU_requires_capability = 0,
5101 : CXX11_clang_requires_capability = 1,
5102 : GNU_exclusive_locks_required = 2,
5103 : GNU_requires_shared_capability = 3,
5104 : CXX11_clang_requires_shared_capability = 4,
5105 : GNU_shared_locks_required = 5
5106 : };
5107 :
5108 : static RequiresCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
5109 : RequiresCapabilityAttr *A = new (Ctx) RequiresCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
5110 : A->setImplicit(true);
5111 : return A;
5112 : }
5113 :
5114 : RequiresCapabilityAttr(SourceRange R, ASTContext &Ctx
5115 : , Expr * *Args, unsigned ArgsSize
5116 : , unsigned SI
5117 : )
5118 : : InheritableAttr(attr::RequiresCapability, R, SI, 1, 1)
5119 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
5120 : {
5121 : std::copy(Args, Args + args_Size, args_);
5122 : }
5123 :
5124 : RequiresCapabilityAttr(SourceRange R, ASTContext &Ctx
5125 : , unsigned SI
5126 : )
5127 : : InheritableAttr(attr::RequiresCapability, R, SI, 1, 1)
5128 : , args_Size(0), args_(nullptr)
5129 : {
5130 : }
5131 :
5132 : RequiresCapabilityAttr *clone(ASTContext &C) const;
5133 : void printPretty(raw_ostream &OS,
5134 : const PrintingPolicy &Policy) const;
5135 : const char *getSpelling() const;
5136 : Spelling getSemanticSpelling() const {
5137 : switch (SpellingListIndex) {
5138 : default: llvm_unreachable("Unknown spelling list index");
5139 : case 0: return GNU_requires_capability;
5140 : case 1: return CXX11_clang_requires_capability;
5141 : case 2: return GNU_exclusive_locks_required;
5142 : case 3: return GNU_requires_shared_capability;
5143 : case 4: return CXX11_clang_requires_shared_capability;
5144 : case 5: return GNU_shared_locks_required;
5145 : }
5146 : }
5147 : bool isShared() const { return SpellingListIndex == 3 ||
5148 : SpellingListIndex == 5 ||
5149 : SpellingListIndex == 4; }
5150 : typedef Expr ** args_iterator;
5151 0 : args_iterator args_begin() const { return args_; }
5152 0 : args_iterator args_end() const { return args_ + args_Size; }
5153 : unsigned args_size() const { return args_Size; }
5154 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
5155 :
5156 :
5157 :
5158 :
5159 0 : static bool classof(const Attr *A) { return A->getKind() == attr::RequiresCapability; }
5160 : };
5161 :
5162 : class RestrictAttr : public InheritableAttr {
5163 :
5164 : public:
5165 : enum Spelling {
5166 : Declspec_restrict = 0,
5167 : GNU_malloc = 1,
5168 : CXX11_gnu_malloc = 2
5169 : };
5170 :
5171 : static RestrictAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
5172 : RestrictAttr *A = new (Ctx) RestrictAttr(Loc, Ctx, S);
5173 : A->setImplicit(true);
5174 : return A;
5175 : }
5176 :
5177 : RestrictAttr(SourceRange R, ASTContext &Ctx
5178 : , unsigned SI
5179 : )
5180 : : InheritableAttr(attr::Restrict, R, SI, 0, 0)
5181 : {
5182 : }
5183 :
5184 : RestrictAttr *clone(ASTContext &C) const;
5185 : void printPretty(raw_ostream &OS,
5186 : const PrintingPolicy &Policy) const;
5187 : const char *getSpelling() const;
5188 : Spelling getSemanticSpelling() const {
5189 : switch (SpellingListIndex) {
5190 : default: llvm_unreachable("Unknown spelling list index");
5191 : case 0: return Declspec_restrict;
5192 : case 1: return GNU_malloc;
5193 : case 2: return CXX11_gnu_malloc;
5194 : }
5195 : }
5196 :
5197 :
5198 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Restrict; }
5199 : };
5200 :
5201 : class ReturnTypestateAttr : public InheritableAttr {
5202 : public:
5203 : enum ConsumedState {
5204 : Unknown,
5205 : Consumed,
5206 : Unconsumed
5207 : };
5208 : private:
5209 : ConsumedState state;
5210 :
5211 :
5212 : public:
5213 : static ReturnTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState State, SourceRange Loc = SourceRange()) {
5214 : ReturnTypestateAttr *A = new (Ctx) ReturnTypestateAttr(Loc, Ctx, State, 0);
5215 : A->setImplicit(true);
5216 : return A;
5217 : }
5218 :
5219 : ReturnTypestateAttr(SourceRange R, ASTContext &Ctx
5220 : , ConsumedState State
5221 : , unsigned SI
5222 : )
5223 : : InheritableAttr(attr::ReturnTypestate, R, SI, 0, 0)
5224 : , state(State)
5225 : {
5226 :
5227 : }
5228 :
5229 : ReturnTypestateAttr *clone(ASTContext &C) const;
5230 : void printPretty(raw_ostream &OS,
5231 : const PrintingPolicy &Policy) const;
5232 : const char *getSpelling() const;
5233 : ConsumedState getState() const {
5234 : return state;
5235 : }
5236 :
5237 : static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
5238 : Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
5239 : .Case("unknown", ReturnTypestateAttr::Unknown)
5240 : .Case("consumed", ReturnTypestateAttr::Consumed)
5241 : .Case("unconsumed", ReturnTypestateAttr::Unconsumed)
5242 : .Default(Optional<ConsumedState>());
5243 : if (R) {
5244 : Out = *R;
5245 : return true;
5246 : }
5247 : return false;
5248 : }
5249 :
5250 : static const char *ConvertConsumedStateToStr(ConsumedState Val) {
5251 : switch(Val) {
5252 : case ReturnTypestateAttr::Unknown: return "unknown";
5253 : case ReturnTypestateAttr::Consumed: return "consumed";
5254 : case ReturnTypestateAttr::Unconsumed: return "unconsumed";
5255 : }
5256 : llvm_unreachable("No enumerator with that value");
5257 : }
5258 :
5259 :
5260 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ReturnTypestate; }
5261 : };
5262 :
5263 : class ReturnsNonNullAttr : public InheritableAttr {
5264 :
5265 : public:
5266 : static ReturnsNonNullAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5267 : ReturnsNonNullAttr *A = new (Ctx) ReturnsNonNullAttr(Loc, Ctx, 0);
5268 : A->setImplicit(true);
5269 : return A;
5270 : }
5271 :
5272 : ReturnsNonNullAttr(SourceRange R, ASTContext &Ctx
5273 : , unsigned SI
5274 : )
5275 : : InheritableAttr(attr::ReturnsNonNull, R, SI, 0, 0)
5276 : {
5277 : }
5278 :
5279 : ReturnsNonNullAttr *clone(ASTContext &C) const;
5280 : void printPretty(raw_ostream &OS,
5281 : const PrintingPolicy &Policy) const;
5282 : const char *getSpelling() const;
5283 :
5284 :
5285 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ReturnsNonNull; }
5286 : };
5287 :
5288 : class ReturnsTwiceAttr : public InheritableAttr {
5289 :
5290 : public:
5291 : static ReturnsTwiceAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5292 : ReturnsTwiceAttr *A = new (Ctx) ReturnsTwiceAttr(Loc, Ctx, 0);
5293 : A->setImplicit(true);
5294 : return A;
5295 : }
5296 :
5297 : ReturnsTwiceAttr(SourceRange R, ASTContext &Ctx
5298 : , unsigned SI
5299 : )
5300 : : InheritableAttr(attr::ReturnsTwice, R, SI, 0, 0)
5301 : {
5302 : }
5303 :
5304 : ReturnsTwiceAttr *clone(ASTContext &C) const;
5305 : void printPretty(raw_ostream &OS,
5306 : const PrintingPolicy &Policy) const;
5307 : const char *getSpelling() const;
5308 :
5309 :
5310 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ReturnsTwice; }
5311 : };
5312 :
5313 : class ScopedLockableAttr : public InheritableAttr {
5314 :
5315 : public:
5316 : static ScopedLockableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5317 : ScopedLockableAttr *A = new (Ctx) ScopedLockableAttr(Loc, Ctx, 0);
5318 : A->setImplicit(true);
5319 : return A;
5320 : }
5321 :
5322 : ScopedLockableAttr(SourceRange R, ASTContext &Ctx
5323 : , unsigned SI
5324 : )
5325 : : InheritableAttr(attr::ScopedLockable, R, SI, 0, 0)
5326 : {
5327 : }
5328 :
5329 : ScopedLockableAttr *clone(ASTContext &C) const;
5330 : void printPretty(raw_ostream &OS,
5331 : const PrintingPolicy &Policy) const;
5332 : const char *getSpelling() const;
5333 :
5334 :
5335 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ScopedLockable; }
5336 : };
5337 :
5338 : class SectionAttr : public InheritableAttr {
5339 : unsigned nameLength;
5340 : char *name;
5341 :
5342 :
5343 : public:
5344 : enum Spelling {
5345 : GNU_section = 0,
5346 : CXX11_gnu_section = 1,
5347 : Declspec_allocate = 2
5348 : };
5349 :
5350 : static SectionAttr *CreateImplicit(ASTContext &Ctx, Spelling S, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
5351 : SectionAttr *A = new (Ctx) SectionAttr(Loc, Ctx, Name, S);
5352 : A->setImplicit(true);
5353 : return A;
5354 : }
5355 :
5356 : SectionAttr(SourceRange R, ASTContext &Ctx
5357 : , llvm::StringRef Name
5358 : , unsigned SI
5359 : )
5360 : : InheritableAttr(attr::Section, R, SI, 0, 0)
5361 : , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
5362 : {
5363 : if (!Name.empty())
5364 : std::memcpy(name, Name.data(), nameLength);
5365 : }
5366 :
5367 : SectionAttr *clone(ASTContext &C) const;
5368 : void printPretty(raw_ostream &OS,
5369 : const PrintingPolicy &Policy) const;
5370 : const char *getSpelling() const;
5371 : Spelling getSemanticSpelling() const {
5372 : switch (SpellingListIndex) {
5373 : default: llvm_unreachable("Unknown spelling list index");
5374 : case 0: return GNU_section;
5375 : case 1: return CXX11_gnu_section;
5376 : case 2: return Declspec_allocate;
5377 : }
5378 : }
5379 : llvm::StringRef getName() const {
5380 : return llvm::StringRef(name, nameLength);
5381 : }
5382 : unsigned getNameLength() const {
5383 : return nameLength;
5384 : }
5385 : void setName(ASTContext &C, llvm::StringRef S) {
5386 : nameLength = S.size();
5387 : this->name = new (C, 1) char [nameLength];
5388 : if (!S.empty())
5389 : std::memcpy(this->name, S.data(), nameLength);
5390 : }
5391 :
5392 :
5393 :
5394 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Section; }
5395 : };
5396 :
5397 : class SelectAnyAttr : public InheritableAttr {
5398 :
5399 : public:
5400 : static SelectAnyAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5401 : SelectAnyAttr *A = new (Ctx) SelectAnyAttr(Loc, Ctx, 0);
5402 : A->setImplicit(true);
5403 : return A;
5404 : }
5405 :
5406 : SelectAnyAttr(SourceRange R, ASTContext &Ctx
5407 : , unsigned SI
5408 : )
5409 : : InheritableAttr(attr::SelectAny, R, SI, 0, 0)
5410 : {
5411 : }
5412 :
5413 : SelectAnyAttr *clone(ASTContext &C) const;
5414 : void printPretty(raw_ostream &OS,
5415 : const PrintingPolicy &Policy) const;
5416 : const char *getSpelling() const;
5417 :
5418 :
5419 0 : static bool classof(const Attr *A) { return A->getKind() == attr::SelectAny; }
5420 : };
5421 :
5422 : class SentinelAttr : public InheritableAttr {
5423 : int sentinel;
5424 :
5425 : int nullPos;
5426 :
5427 :
5428 : public:
5429 : static SentinelAttr *CreateImplicit(ASTContext &Ctx, int Sentinel, int NullPos, SourceRange Loc = SourceRange()) {
5430 : SentinelAttr *A = new (Ctx) SentinelAttr(Loc, Ctx, Sentinel, NullPos, 0);
5431 : A->setImplicit(true);
5432 : return A;
5433 : }
5434 :
5435 : SentinelAttr(SourceRange R, ASTContext &Ctx
5436 : , int Sentinel
5437 : , int NullPos
5438 : , unsigned SI
5439 : )
5440 : : InheritableAttr(attr::Sentinel, R, SI, 0, 0)
5441 : , sentinel(Sentinel)
5442 : , nullPos(NullPos)
5443 : {
5444 :
5445 :
5446 : }
5447 :
5448 : SentinelAttr(SourceRange R, ASTContext &Ctx
5449 : , unsigned SI
5450 : )
5451 : : InheritableAttr(attr::Sentinel, R, SI, 0, 0)
5452 : , sentinel()
5453 : , nullPos()
5454 : {
5455 : }
5456 :
5457 : SentinelAttr *clone(ASTContext &C) const;
5458 : void printPretty(raw_ostream &OS,
5459 : const PrintingPolicy &Policy) const;
5460 : const char *getSpelling() const;
5461 : int getSentinel() const {
5462 : return sentinel;
5463 : }
5464 :
5465 : static const int DefaultSentinel = 0;
5466 :
5467 : int getNullPos() const {
5468 : return nullPos;
5469 : }
5470 :
5471 : static const int DefaultNullPos = 0;
5472 :
5473 :
5474 :
5475 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Sentinel; }
5476 : };
5477 :
5478 : class SetTypestateAttr : public InheritableAttr {
5479 : public:
5480 : enum ConsumedState {
5481 : Unknown,
5482 : Consumed,
5483 : Unconsumed
5484 : };
5485 : private:
5486 : ConsumedState newState;
5487 :
5488 :
5489 : public:
5490 : static SetTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState NewState, SourceRange Loc = SourceRange()) {
5491 : SetTypestateAttr *A = new (Ctx) SetTypestateAttr(Loc, Ctx, NewState, 0);
5492 : A->setImplicit(true);
5493 : return A;
5494 : }
5495 :
5496 : SetTypestateAttr(SourceRange R, ASTContext &Ctx
5497 : , ConsumedState NewState
5498 : , unsigned SI
5499 : )
5500 : : InheritableAttr(attr::SetTypestate, R, SI, 0, 0)
5501 : , newState(NewState)
5502 : {
5503 :
5504 : }
5505 :
5506 : SetTypestateAttr *clone(ASTContext &C) const;
5507 : void printPretty(raw_ostream &OS,
5508 : const PrintingPolicy &Policy) const;
5509 : const char *getSpelling() const;
5510 : ConsumedState getNewState() const {
5511 : return newState;
5512 : }
5513 :
5514 : static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
5515 : Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
5516 : .Case("unknown", SetTypestateAttr::Unknown)
5517 : .Case("consumed", SetTypestateAttr::Consumed)
5518 : .Case("unconsumed", SetTypestateAttr::Unconsumed)
5519 : .Default(Optional<ConsumedState>());
5520 : if (R) {
5521 : Out = *R;
5522 : return true;
5523 : }
5524 : return false;
5525 : }
5526 :
5527 : static const char *ConvertConsumedStateToStr(ConsumedState Val) {
5528 : switch(Val) {
5529 : case SetTypestateAttr::Unknown: return "unknown";
5530 : case SetTypestateAttr::Consumed: return "consumed";
5531 : case SetTypestateAttr::Unconsumed: return "unconsumed";
5532 : }
5533 : llvm_unreachable("No enumerator with that value");
5534 : }
5535 :
5536 :
5537 0 : static bool classof(const Attr *A) { return A->getKind() == attr::SetTypestate; }
5538 : };
5539 :
5540 : class SharedTrylockFunctionAttr : public InheritableAttr {
5541 : Expr * successValue;
5542 :
5543 : unsigned args_Size;
5544 : Expr * *args_;
5545 :
5546 :
5547 : public:
5548 : static SharedTrylockFunctionAttr *CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
5549 : SharedTrylockFunctionAttr *A = new (Ctx) SharedTrylockFunctionAttr(Loc, Ctx, SuccessValue, Args, ArgsSize, 0);
5550 : A->setImplicit(true);
5551 : return A;
5552 : }
5553 :
5554 : SharedTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
5555 : , Expr * SuccessValue
5556 : , Expr * *Args, unsigned ArgsSize
5557 : , unsigned SI
5558 : )
5559 : : InheritableAttr(attr::SharedTrylockFunction, R, SI, 1, 1)
5560 : , successValue(SuccessValue)
5561 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
5562 : {
5563 :
5564 : std::copy(Args, Args + args_Size, args_);
5565 : }
5566 :
5567 : SharedTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
5568 : , Expr * SuccessValue
5569 : , unsigned SI
5570 : )
5571 : : InheritableAttr(attr::SharedTrylockFunction, R, SI, 1, 1)
5572 : , successValue()
5573 : , args_Size(0), args_(nullptr)
5574 : {
5575 :
5576 : }
5577 :
5578 : SharedTrylockFunctionAttr *clone(ASTContext &C) const;
5579 : void printPretty(raw_ostream &OS,
5580 : const PrintingPolicy &Policy) const;
5581 : const char *getSpelling() const;
5582 : Expr * getSuccessValue() const {
5583 0 : return successValue;
5584 : }
5585 :
5586 : typedef Expr ** args_iterator;
5587 0 : args_iterator args_begin() const { return args_; }
5588 0 : args_iterator args_end() const { return args_ + args_Size; }
5589 : unsigned args_size() const { return args_Size; }
5590 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
5591 :
5592 :
5593 :
5594 :
5595 0 : static bool classof(const Attr *A) { return A->getKind() == attr::SharedTrylockFunction; }
5596 : };
5597 :
5598 : class StdCallAttr : public InheritableAttr {
5599 :
5600 : public:
5601 : static StdCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5602 : StdCallAttr *A = new (Ctx) StdCallAttr(Loc, Ctx, 0);
5603 : A->setImplicit(true);
5604 : return A;
5605 : }
5606 :
5607 : StdCallAttr(SourceRange R, ASTContext &Ctx
5608 : , unsigned SI
5609 : )
5610 : : InheritableAttr(attr::StdCall, R, SI, 0, 0)
5611 : {
5612 : }
5613 :
5614 : StdCallAttr *clone(ASTContext &C) const;
5615 : void printPretty(raw_ostream &OS,
5616 : const PrintingPolicy &Policy) const;
5617 : const char *getSpelling() const;
5618 :
5619 :
5620 0 : static bool classof(const Attr *A) { return A->getKind() == attr::StdCall; }
5621 : };
5622 :
5623 : class SysVABIAttr : public InheritableAttr {
5624 :
5625 : public:
5626 : static SysVABIAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5627 : SysVABIAttr *A = new (Ctx) SysVABIAttr(Loc, Ctx, 0);
5628 : A->setImplicit(true);
5629 : return A;
5630 : }
5631 :
5632 : SysVABIAttr(SourceRange R, ASTContext &Ctx
5633 : , unsigned SI
5634 : )
5635 : : InheritableAttr(attr::SysVABI, R, SI, 0, 0)
5636 : {
5637 : }
5638 :
5639 : SysVABIAttr *clone(ASTContext &C) const;
5640 : void printPretty(raw_ostream &OS,
5641 : const PrintingPolicy &Policy) const;
5642 : const char *getSpelling() const;
5643 :
5644 :
5645 0 : static bool classof(const Attr *A) { return A->getKind() == attr::SysVABI; }
5646 : };
5647 :
5648 : class TLSModelAttr : public InheritableAttr {
5649 : unsigned modelLength;
5650 : char *model;
5651 :
5652 :
5653 : public:
5654 : static TLSModelAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Model, SourceRange Loc = SourceRange()) {
5655 : TLSModelAttr *A = new (Ctx) TLSModelAttr(Loc, Ctx, Model, 0);
5656 : A->setImplicit(true);
5657 : return A;
5658 : }
5659 :
5660 : TLSModelAttr(SourceRange R, ASTContext &Ctx
5661 : , llvm::StringRef Model
5662 : , unsigned SI
5663 : )
5664 : : InheritableAttr(attr::TLSModel, R, SI, 0, 0)
5665 : , modelLength(Model.size()),model(new (Ctx, 1) char[modelLength])
5666 : {
5667 : if (!Model.empty())
5668 : std::memcpy(model, Model.data(), modelLength);
5669 : }
5670 :
5671 : TLSModelAttr *clone(ASTContext &C) const;
5672 : void printPretty(raw_ostream &OS,
5673 : const PrintingPolicy &Policy) const;
5674 : const char *getSpelling() const;
5675 : llvm::StringRef getModel() const {
5676 : return llvm::StringRef(model, modelLength);
5677 : }
5678 : unsigned getModelLength() const {
5679 : return modelLength;
5680 : }
5681 : void setModel(ASTContext &C, llvm::StringRef S) {
5682 : modelLength = S.size();
5683 : this->model = new (C, 1) char [modelLength];
5684 : if (!S.empty())
5685 : std::memcpy(this->model, S.data(), modelLength);
5686 : }
5687 :
5688 :
5689 :
5690 0 : static bool classof(const Attr *A) { return A->getKind() == attr::TLSModel; }
5691 : };
5692 :
5693 : class TargetAttr : public InheritableAttr {
5694 : unsigned featuresLength;
5695 : char *features;
5696 :
5697 :
5698 : public:
5699 : static TargetAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Features, SourceRange Loc = SourceRange()) {
5700 : TargetAttr *A = new (Ctx) TargetAttr(Loc, Ctx, Features, 0);
5701 : A->setImplicit(true);
5702 : return A;
5703 : }
5704 :
5705 : TargetAttr(SourceRange R, ASTContext &Ctx
5706 : , llvm::StringRef Features
5707 : , unsigned SI
5708 : )
5709 : : InheritableAttr(attr::Target, R, SI, 0, 0)
5710 : , featuresLength(Features.size()),features(new (Ctx, 1) char[featuresLength])
5711 : {
5712 : if (!Features.empty())
5713 : std::memcpy(features, Features.data(), featuresLength);
5714 : }
5715 :
5716 : TargetAttr *clone(ASTContext &C) const;
5717 : void printPretty(raw_ostream &OS,
5718 : const PrintingPolicy &Policy) const;
5719 : const char *getSpelling() const;
5720 : llvm::StringRef getFeatures() const {
5721 : return llvm::StringRef(features, featuresLength);
5722 : }
5723 : unsigned getFeaturesLength() const {
5724 : return featuresLength;
5725 : }
5726 : void setFeatures(ASTContext &C, llvm::StringRef S) {
5727 : featuresLength = S.size();
5728 : this->features = new (C, 1) char [featuresLength];
5729 : if (!S.empty())
5730 : std::memcpy(this->features, S.data(), featuresLength);
5731 : }
5732 :
5733 :
5734 :
5735 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Target; }
5736 : };
5737 :
5738 : class TestTypestateAttr : public InheritableAttr {
5739 : public:
5740 : enum ConsumedState {
5741 : Consumed,
5742 : Unconsumed
5743 : };
5744 : private:
5745 : ConsumedState testState;
5746 :
5747 :
5748 : public:
5749 : static TestTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState TestState, SourceRange Loc = SourceRange()) {
5750 : TestTypestateAttr *A = new (Ctx) TestTypestateAttr(Loc, Ctx, TestState, 0);
5751 : A->setImplicit(true);
5752 : return A;
5753 : }
5754 :
5755 : TestTypestateAttr(SourceRange R, ASTContext &Ctx
5756 : , ConsumedState TestState
5757 : , unsigned SI
5758 : )
5759 : : InheritableAttr(attr::TestTypestate, R, SI, 0, 0)
5760 : , testState(TestState)
5761 : {
5762 :
5763 : }
5764 :
5765 : TestTypestateAttr *clone(ASTContext &C) const;
5766 : void printPretty(raw_ostream &OS,
5767 : const PrintingPolicy &Policy) const;
5768 : const char *getSpelling() const;
5769 : ConsumedState getTestState() const {
5770 : return testState;
5771 : }
5772 :
5773 : static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
5774 : Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
5775 : .Case("consumed", TestTypestateAttr::Consumed)
5776 : .Case("unconsumed", TestTypestateAttr::Unconsumed)
5777 : .Default(Optional<ConsumedState>());
5778 : if (R) {
5779 : Out = *R;
5780 : return true;
5781 : }
5782 : return false;
5783 : }
5784 :
5785 : static const char *ConvertConsumedStateToStr(ConsumedState Val) {
5786 : switch(Val) {
5787 : case TestTypestateAttr::Consumed: return "consumed";
5788 : case TestTypestateAttr::Unconsumed: return "unconsumed";
5789 : }
5790 : llvm_unreachable("No enumerator with that value");
5791 : }
5792 :
5793 :
5794 0 : static bool classof(const Attr *A) { return A->getKind() == attr::TestTypestate; }
5795 : };
5796 :
5797 : class ThisCallAttr : public InheritableAttr {
5798 :
5799 : public:
5800 : static ThisCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5801 : ThisCallAttr *A = new (Ctx) ThisCallAttr(Loc, Ctx, 0);
5802 : A->setImplicit(true);
5803 : return A;
5804 : }
5805 :
5806 : ThisCallAttr(SourceRange R, ASTContext &Ctx
5807 : , unsigned SI
5808 : )
5809 : : InheritableAttr(attr::ThisCall, R, SI, 0, 0)
5810 : {
5811 : }
5812 :
5813 : ThisCallAttr *clone(ASTContext &C) const;
5814 : void printPretty(raw_ostream &OS,
5815 : const PrintingPolicy &Policy) const;
5816 : const char *getSpelling() const;
5817 :
5818 :
5819 0 : static bool classof(const Attr *A) { return A->getKind() == attr::ThisCall; }
5820 : };
5821 :
5822 : class ThreadAttr : public Attr {
5823 :
5824 : public:
5825 : static ThreadAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5826 : ThreadAttr *A = new (Ctx) ThreadAttr(Loc, Ctx, 0);
5827 : A->setImplicit(true);
5828 : return A;
5829 : }
5830 :
5831 : ThreadAttr(SourceRange R, ASTContext &Ctx
5832 : , unsigned SI
5833 : )
5834 : : Attr(attr::Thread, R, SI, 0, 0)
5835 : {
5836 : }
5837 :
5838 : ThreadAttr *clone(ASTContext &C) const;
5839 : void printPretty(raw_ostream &OS,
5840 : const PrintingPolicy &Policy) const;
5841 : const char *getSpelling() const;
5842 :
5843 :
5844 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Thread; }
5845 : };
5846 :
5847 : class TransparentUnionAttr : public InheritableAttr {
5848 :
5849 : public:
5850 : static TransparentUnionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5851 : TransparentUnionAttr *A = new (Ctx) TransparentUnionAttr(Loc, Ctx, 0);
5852 : A->setImplicit(true);
5853 : return A;
5854 : }
5855 :
5856 : TransparentUnionAttr(SourceRange R, ASTContext &Ctx
5857 : , unsigned SI
5858 : )
5859 : : InheritableAttr(attr::TransparentUnion, R, SI, 0, 0)
5860 : {
5861 : }
5862 :
5863 : TransparentUnionAttr *clone(ASTContext &C) const;
5864 : void printPretty(raw_ostream &OS,
5865 : const PrintingPolicy &Policy) const;
5866 : const char *getSpelling() const;
5867 :
5868 :
5869 0 : static bool classof(const Attr *A) { return A->getKind() == attr::TransparentUnion; }
5870 : };
5871 :
5872 : class TryAcquireCapabilityAttr : public InheritableAttr {
5873 : Expr * successValue;
5874 :
5875 : unsigned args_Size;
5876 : Expr * *args_;
5877 :
5878 :
5879 : public:
5880 : enum Spelling {
5881 : GNU_try_acquire_capability = 0,
5882 : CXX11_clang_try_acquire_capability = 1,
5883 : GNU_try_acquire_shared_capability = 2,
5884 : CXX11_clang_try_acquire_shared_capability = 3
5885 : };
5886 :
5887 : static TryAcquireCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
5888 : TryAcquireCapabilityAttr *A = new (Ctx) TryAcquireCapabilityAttr(Loc, Ctx, SuccessValue, Args, ArgsSize, S);
5889 : A->setImplicit(true);
5890 : return A;
5891 : }
5892 :
5893 : TryAcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
5894 : , Expr * SuccessValue
5895 : , Expr * *Args, unsigned ArgsSize
5896 : , unsigned SI
5897 : )
5898 : : InheritableAttr(attr::TryAcquireCapability, R, SI, 1, 1)
5899 : , successValue(SuccessValue)
5900 : , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
5901 : {
5902 :
5903 : std::copy(Args, Args + args_Size, args_);
5904 : }
5905 :
5906 : TryAcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
5907 : , Expr * SuccessValue
5908 : , unsigned SI
5909 : )
5910 : : InheritableAttr(attr::TryAcquireCapability, R, SI, 1, 1)
5911 : , successValue()
5912 : , args_Size(0), args_(nullptr)
5913 : {
5914 :
5915 : }
5916 :
5917 : TryAcquireCapabilityAttr *clone(ASTContext &C) const;
5918 : void printPretty(raw_ostream &OS,
5919 : const PrintingPolicy &Policy) const;
5920 : const char *getSpelling() const;
5921 : Spelling getSemanticSpelling() const {
5922 : switch (SpellingListIndex) {
5923 : default: llvm_unreachable("Unknown spelling list index");
5924 : case 0: return GNU_try_acquire_capability;
5925 : case 1: return CXX11_clang_try_acquire_capability;
5926 : case 2: return GNU_try_acquire_shared_capability;
5927 : case 3: return CXX11_clang_try_acquire_shared_capability;
5928 : }
5929 : }
5930 : bool isShared() const { return SpellingListIndex == 2 ||
5931 : SpellingListIndex == 3; }
5932 : Expr * getSuccessValue() const {
5933 0 : return successValue;
5934 : }
5935 :
5936 : typedef Expr ** args_iterator;
5937 0 : args_iterator args_begin() const { return args_; }
5938 0 : args_iterator args_end() const { return args_ + args_Size; }
5939 : unsigned args_size() const { return args_Size; }
5940 : llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
5941 :
5942 :
5943 :
5944 :
5945 0 : static bool classof(const Attr *A) { return A->getKind() == attr::TryAcquireCapability; }
5946 : };
5947 :
5948 : class TypeTagForDatatypeAttr : public InheritableAttr {
5949 : IdentifierInfo * argumentKind;
5950 :
5951 : TypeSourceInfo * matchingCType;
5952 :
5953 : bool layoutCompatible;
5954 :
5955 : bool mustBeNull;
5956 :
5957 :
5958 : public:
5959 : static TypeTagForDatatypeAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, TypeSourceInfo * MatchingCType, bool LayoutCompatible, bool MustBeNull, SourceRange Loc = SourceRange()) {
5960 : TypeTagForDatatypeAttr *A = new (Ctx) TypeTagForDatatypeAttr(Loc, Ctx, ArgumentKind, MatchingCType, LayoutCompatible, MustBeNull, 0);
5961 : A->setImplicit(true);
5962 : return A;
5963 : }
5964 :
5965 : TypeTagForDatatypeAttr(SourceRange R, ASTContext &Ctx
5966 : , IdentifierInfo * ArgumentKind
5967 : , TypeSourceInfo * MatchingCType
5968 : , bool LayoutCompatible
5969 : , bool MustBeNull
5970 : , unsigned SI
5971 : )
5972 : : InheritableAttr(attr::TypeTagForDatatype, R, SI, 0, 0)
5973 : , argumentKind(ArgumentKind)
5974 : , matchingCType(MatchingCType)
5975 : , layoutCompatible(LayoutCompatible)
5976 : , mustBeNull(MustBeNull)
5977 : {
5978 :
5979 :
5980 :
5981 :
5982 : }
5983 :
5984 : TypeTagForDatatypeAttr *clone(ASTContext &C) const;
5985 : void printPretty(raw_ostream &OS,
5986 : const PrintingPolicy &Policy) const;
5987 : const char *getSpelling() const;
5988 : IdentifierInfo * getArgumentKind() const {
5989 : return argumentKind;
5990 : }
5991 :
5992 : QualType getMatchingCType() const {
5993 : return matchingCType->getType();
5994 : } TypeSourceInfo * getMatchingCTypeLoc() const {
5995 : return matchingCType;
5996 : }
5997 :
5998 : bool getLayoutCompatible() const {
5999 : return layoutCompatible;
6000 : }
6001 :
6002 : bool getMustBeNull() const {
6003 : return mustBeNull;
6004 : }
6005 :
6006 :
6007 :
6008 0 : static bool classof(const Attr *A) { return A->getKind() == attr::TypeTagForDatatype; }
6009 : };
6010 :
6011 : class TypeVisibilityAttr : public InheritableAttr {
6012 : public:
6013 : enum VisibilityType {
6014 : Default,
6015 : Hidden,
6016 : Protected
6017 : };
6018 : private:
6019 : VisibilityType visibility;
6020 :
6021 :
6022 : public:
6023 : static TypeVisibilityAttr *CreateImplicit(ASTContext &Ctx, VisibilityType Visibility, SourceRange Loc = SourceRange()) {
6024 : TypeVisibilityAttr *A = new (Ctx) TypeVisibilityAttr(Loc, Ctx, Visibility, 0);
6025 : A->setImplicit(true);
6026 : return A;
6027 : }
6028 :
6029 : TypeVisibilityAttr(SourceRange R, ASTContext &Ctx
6030 : , VisibilityType Visibility
6031 : , unsigned SI
6032 : )
6033 : : InheritableAttr(attr::TypeVisibility, R, SI, 0, 0)
6034 : , visibility(Visibility)
6035 : {
6036 :
6037 : }
6038 :
6039 : TypeVisibilityAttr *clone(ASTContext &C) const;
6040 : void printPretty(raw_ostream &OS,
6041 : const PrintingPolicy &Policy) const;
6042 : const char *getSpelling() const;
6043 : VisibilityType getVisibility() const {
6044 : return visibility;
6045 : }
6046 :
6047 : static bool ConvertStrToVisibilityType(StringRef Val, VisibilityType &Out) {
6048 : Optional<VisibilityType> R = llvm::StringSwitch<Optional<VisibilityType>>(Val)
6049 : .Case("default", TypeVisibilityAttr::Default)
6050 : .Case("hidden", TypeVisibilityAttr::Hidden)
6051 : .Case("internal", TypeVisibilityAttr::Hidden)
6052 : .Case("protected", TypeVisibilityAttr::Protected)
6053 : .Default(Optional<VisibilityType>());
6054 : if (R) {
6055 : Out = *R;
6056 : return true;
6057 : }
6058 : return false;
6059 : }
6060 :
6061 : static const char *ConvertVisibilityTypeToStr(VisibilityType Val) {
6062 : switch(Val) {
6063 : case TypeVisibilityAttr::Default: return "default";
6064 : case TypeVisibilityAttr::Hidden: return "hidden";
6065 : case TypeVisibilityAttr::Protected: return "protected";
6066 : }
6067 : llvm_unreachable("No enumerator with that value");
6068 : }
6069 :
6070 :
6071 0 : static bool classof(const Attr *A) { return A->getKind() == attr::TypeVisibility; }
6072 : };
6073 :
6074 : class UnavailableAttr : public InheritableAttr {
6075 : unsigned messageLength;
6076 : char *message;
6077 :
6078 :
6079 : public:
6080 : static UnavailableAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, SourceRange Loc = SourceRange()) {
6081 : UnavailableAttr *A = new (Ctx) UnavailableAttr(Loc, Ctx, Message, 0);
6082 : A->setImplicit(true);
6083 : return A;
6084 : }
6085 :
6086 : UnavailableAttr(SourceRange R, ASTContext &Ctx
6087 : , llvm::StringRef Message
6088 : , unsigned SI
6089 : )
6090 : : InheritableAttr(attr::Unavailable, R, SI, 0, 0)
6091 : , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
6092 : {
6093 : if (!Message.empty())
6094 : std::memcpy(message, Message.data(), messageLength);
6095 : }
6096 :
6097 : UnavailableAttr(SourceRange R, ASTContext &Ctx
6098 : , unsigned SI
6099 : )
6100 : : InheritableAttr(attr::Unavailable, R, SI, 0, 0)
6101 : , messageLength(0),message(0)
6102 : {
6103 : }
6104 :
6105 : UnavailableAttr *clone(ASTContext &C) const;
6106 : void printPretty(raw_ostream &OS,
6107 : const PrintingPolicy &Policy) const;
6108 : const char *getSpelling() const;
6109 : llvm::StringRef getMessage() const {
6110 : return llvm::StringRef(message, messageLength);
6111 : }
6112 : unsigned getMessageLength() const {
6113 : return messageLength;
6114 : }
6115 : void setMessage(ASTContext &C, llvm::StringRef S) {
6116 : messageLength = S.size();
6117 : this->message = new (C, 1) char [messageLength];
6118 : if (!S.empty())
6119 : std::memcpy(this->message, S.data(), messageLength);
6120 : }
6121 :
6122 :
6123 :
6124 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Unavailable; }
6125 : };
6126 :
6127 : class UnusedAttr : public InheritableAttr {
6128 :
6129 : public:
6130 : static UnusedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6131 : UnusedAttr *A = new (Ctx) UnusedAttr(Loc, Ctx, 0);
6132 : A->setImplicit(true);
6133 : return A;
6134 : }
6135 :
6136 : UnusedAttr(SourceRange R, ASTContext &Ctx
6137 : , unsigned SI
6138 : )
6139 : : InheritableAttr(attr::Unused, R, SI, 0, 0)
6140 : {
6141 : }
6142 :
6143 : UnusedAttr *clone(ASTContext &C) const;
6144 : void printPretty(raw_ostream &OS,
6145 : const PrintingPolicy &Policy) const;
6146 : const char *getSpelling() const;
6147 :
6148 :
6149 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Unused; }
6150 : };
6151 :
6152 : class UsedAttr : public InheritableAttr {
6153 :
6154 : public:
6155 : static UsedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6156 : UsedAttr *A = new (Ctx) UsedAttr(Loc, Ctx, 0);
6157 : A->setImplicit(true);
6158 : return A;
6159 : }
6160 :
6161 : UsedAttr(SourceRange R, ASTContext &Ctx
6162 : , unsigned SI
6163 : )
6164 : : InheritableAttr(attr::Used, R, SI, 0, 0)
6165 : {
6166 : }
6167 :
6168 : UsedAttr *clone(ASTContext &C) const;
6169 : void printPretty(raw_ostream &OS,
6170 : const PrintingPolicy &Policy) const;
6171 : const char *getSpelling() const;
6172 :
6173 :
6174 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Used; }
6175 : };
6176 :
6177 : class UuidAttr : public InheritableAttr {
6178 : unsigned guidLength;
6179 : char *guid;
6180 :
6181 :
6182 : public:
6183 : static UuidAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Guid, SourceRange Loc = SourceRange()) {
6184 : UuidAttr *A = new (Ctx) UuidAttr(Loc, Ctx, Guid, 0);
6185 : A->setImplicit(true);
6186 : return A;
6187 : }
6188 :
6189 : UuidAttr(SourceRange R, ASTContext &Ctx
6190 : , llvm::StringRef Guid
6191 : , unsigned SI
6192 : )
6193 : : InheritableAttr(attr::Uuid, R, SI, 0, 0)
6194 : , guidLength(Guid.size()),guid(new (Ctx, 1) char[guidLength])
6195 : {
6196 : if (!Guid.empty())
6197 : std::memcpy(guid, Guid.data(), guidLength);
6198 : }
6199 :
6200 : UuidAttr *clone(ASTContext &C) const;
6201 : void printPretty(raw_ostream &OS,
6202 : const PrintingPolicy &Policy) const;
6203 : const char *getSpelling() const;
6204 : llvm::StringRef getGuid() const {
6205 : return llvm::StringRef(guid, guidLength);
6206 : }
6207 : unsigned getGuidLength() const {
6208 : return guidLength;
6209 : }
6210 : void setGuid(ASTContext &C, llvm::StringRef S) {
6211 : guidLength = S.size();
6212 : this->guid = new (C, 1) char [guidLength];
6213 : if (!S.empty())
6214 : std::memcpy(this->guid, S.data(), guidLength);
6215 : }
6216 :
6217 :
6218 :
6219 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Uuid; }
6220 : };
6221 :
6222 : class VecReturnAttr : public InheritableAttr {
6223 :
6224 : public:
6225 : static VecReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6226 : VecReturnAttr *A = new (Ctx) VecReturnAttr(Loc, Ctx, 0);
6227 : A->setImplicit(true);
6228 : return A;
6229 : }
6230 :
6231 : VecReturnAttr(SourceRange R, ASTContext &Ctx
6232 : , unsigned SI
6233 : )
6234 : : InheritableAttr(attr::VecReturn, R, SI, 0, 0)
6235 : {
6236 : }
6237 :
6238 : VecReturnAttr *clone(ASTContext &C) const;
6239 : void printPretty(raw_ostream &OS,
6240 : const PrintingPolicy &Policy) const;
6241 : const char *getSpelling() const;
6242 :
6243 :
6244 0 : static bool classof(const Attr *A) { return A->getKind() == attr::VecReturn; }
6245 : };
6246 :
6247 : class VecTypeHintAttr : public InheritableAttr {
6248 : TypeSourceInfo * typeHint;
6249 :
6250 :
6251 : public:
6252 : static VecTypeHintAttr *CreateImplicit(ASTContext &Ctx, TypeSourceInfo * TypeHint, SourceRange Loc = SourceRange()) {
6253 : VecTypeHintAttr *A = new (Ctx) VecTypeHintAttr(Loc, Ctx, TypeHint, 0);
6254 : A->setImplicit(true);
6255 : return A;
6256 : }
6257 :
6258 : VecTypeHintAttr(SourceRange R, ASTContext &Ctx
6259 : , TypeSourceInfo * TypeHint
6260 : , unsigned SI
6261 : )
6262 : : InheritableAttr(attr::VecTypeHint, R, SI, 0, 0)
6263 : , typeHint(TypeHint)
6264 : {
6265 :
6266 : }
6267 :
6268 : VecTypeHintAttr *clone(ASTContext &C) const;
6269 : void printPretty(raw_ostream &OS,
6270 : const PrintingPolicy &Policy) const;
6271 : const char *getSpelling() const;
6272 : QualType getTypeHint() const {
6273 : return typeHint->getType();
6274 : } TypeSourceInfo * getTypeHintLoc() const {
6275 : return typeHint;
6276 : }
6277 :
6278 :
6279 :
6280 0 : static bool classof(const Attr *A) { return A->getKind() == attr::VecTypeHint; }
6281 : };
6282 :
6283 : class VectorCallAttr : public InheritableAttr {
6284 :
6285 : public:
6286 : static VectorCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6287 : VectorCallAttr *A = new (Ctx) VectorCallAttr(Loc, Ctx, 0);
6288 : A->setImplicit(true);
6289 : return A;
6290 : }
6291 :
6292 : VectorCallAttr(SourceRange R, ASTContext &Ctx
6293 : , unsigned SI
6294 : )
6295 : : InheritableAttr(attr::VectorCall, R, SI, 0, 0)
6296 : {
6297 : }
6298 :
6299 : VectorCallAttr *clone(ASTContext &C) const;
6300 : void printPretty(raw_ostream &OS,
6301 : const PrintingPolicy &Policy) const;
6302 : const char *getSpelling() const;
6303 :
6304 :
6305 0 : static bool classof(const Attr *A) { return A->getKind() == attr::VectorCall; }
6306 : };
6307 :
6308 : class VisibilityAttr : public InheritableAttr {
6309 : public:
6310 : enum VisibilityType {
6311 : Default,
6312 : Hidden,
6313 : Protected
6314 : };
6315 : private:
6316 : VisibilityType visibility;
6317 :
6318 :
6319 : public:
6320 : static VisibilityAttr *CreateImplicit(ASTContext &Ctx, VisibilityType Visibility, SourceRange Loc = SourceRange()) {
6321 : VisibilityAttr *A = new (Ctx) VisibilityAttr(Loc, Ctx, Visibility, 0);
6322 : A->setImplicit(true);
6323 : return A;
6324 : }
6325 :
6326 : VisibilityAttr(SourceRange R, ASTContext &Ctx
6327 : , VisibilityType Visibility
6328 : , unsigned SI
6329 : )
6330 : : InheritableAttr(attr::Visibility, R, SI, 0, 0)
6331 : , visibility(Visibility)
6332 : {
6333 :
6334 : }
6335 :
6336 : VisibilityAttr *clone(ASTContext &C) const;
6337 : void printPretty(raw_ostream &OS,
6338 : const PrintingPolicy &Policy) const;
6339 : const char *getSpelling() const;
6340 : VisibilityType getVisibility() const {
6341 : return visibility;
6342 : }
6343 :
6344 : static bool ConvertStrToVisibilityType(StringRef Val, VisibilityType &Out) {
6345 : Optional<VisibilityType> R = llvm::StringSwitch<Optional<VisibilityType>>(Val)
6346 : .Case("default", VisibilityAttr::Default)
6347 : .Case("hidden", VisibilityAttr::Hidden)
6348 : .Case("internal", VisibilityAttr::Hidden)
6349 : .Case("protected", VisibilityAttr::Protected)
6350 : .Default(Optional<VisibilityType>());
6351 : if (R) {
6352 : Out = *R;
6353 : return true;
6354 : }
6355 : return false;
6356 : }
6357 :
6358 : static const char *ConvertVisibilityTypeToStr(VisibilityType Val) {
6359 : switch(Val) {
6360 : case VisibilityAttr::Default: return "default";
6361 : case VisibilityAttr::Hidden: return "hidden";
6362 : case VisibilityAttr::Protected: return "protected";
6363 : }
6364 : llvm_unreachable("No enumerator with that value");
6365 : }
6366 :
6367 :
6368 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Visibility; }
6369 : };
6370 :
6371 : class WarnUnusedAttr : public InheritableAttr {
6372 :
6373 : public:
6374 : static WarnUnusedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6375 : WarnUnusedAttr *A = new (Ctx) WarnUnusedAttr(Loc, Ctx, 0);
6376 : A->setImplicit(true);
6377 : return A;
6378 : }
6379 :
6380 : WarnUnusedAttr(SourceRange R, ASTContext &Ctx
6381 : , unsigned SI
6382 : )
6383 : : InheritableAttr(attr::WarnUnused, R, SI, 0, 0)
6384 : {
6385 : }
6386 :
6387 : WarnUnusedAttr *clone(ASTContext &C) const;
6388 : void printPretty(raw_ostream &OS,
6389 : const PrintingPolicy &Policy) const;
6390 : const char *getSpelling() const;
6391 :
6392 :
6393 0 : static bool classof(const Attr *A) { return A->getKind() == attr::WarnUnused; }
6394 : };
6395 :
6396 : class WarnUnusedResultAttr : public InheritableAttr {
6397 :
6398 : public:
6399 : static WarnUnusedResultAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6400 : WarnUnusedResultAttr *A = new (Ctx) WarnUnusedResultAttr(Loc, Ctx, 0);
6401 : A->setImplicit(true);
6402 : return A;
6403 : }
6404 :
6405 : WarnUnusedResultAttr(SourceRange R, ASTContext &Ctx
6406 : , unsigned SI
6407 : )
6408 : : InheritableAttr(attr::WarnUnusedResult, R, SI, 0, 0)
6409 : {
6410 : }
6411 :
6412 : WarnUnusedResultAttr *clone(ASTContext &C) const;
6413 : void printPretty(raw_ostream &OS,
6414 : const PrintingPolicy &Policy) const;
6415 : const char *getSpelling() const;
6416 :
6417 :
6418 0 : static bool classof(const Attr *A) { return A->getKind() == attr::WarnUnusedResult; }
6419 : };
6420 :
6421 : class WeakAttr : public InheritableAttr {
6422 :
6423 : public:
6424 : static WeakAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6425 : WeakAttr *A = new (Ctx) WeakAttr(Loc, Ctx, 0);
6426 : A->setImplicit(true);
6427 : return A;
6428 : }
6429 :
6430 : WeakAttr(SourceRange R, ASTContext &Ctx
6431 : , unsigned SI
6432 : )
6433 : : InheritableAttr(attr::Weak, R, SI, 0, 0)
6434 : {
6435 : }
6436 :
6437 : WeakAttr *clone(ASTContext &C) const;
6438 : void printPretty(raw_ostream &OS,
6439 : const PrintingPolicy &Policy) const;
6440 : const char *getSpelling() const;
6441 :
6442 :
6443 0 : static bool classof(const Attr *A) { return A->getKind() == attr::Weak; }
6444 : };
6445 :
6446 : class WeakImportAttr : public InheritableAttr {
6447 :
6448 : public:
6449 : static WeakImportAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6450 : WeakImportAttr *A = new (Ctx) WeakImportAttr(Loc, Ctx, 0);
6451 : A->setImplicit(true);
6452 : return A;
6453 : }
6454 :
6455 : WeakImportAttr(SourceRange R, ASTContext &Ctx
6456 : , unsigned SI
6457 : )
6458 : : InheritableAttr(attr::WeakImport, R, SI, 0, 0)
6459 : {
6460 : }
6461 :
6462 : WeakImportAttr *clone(ASTContext &C) const;
6463 : void printPretty(raw_ostream &OS,
6464 : const PrintingPolicy &Policy) const;
6465 : const char *getSpelling() const;
6466 :
6467 :
6468 0 : static bool classof(const Attr *A) { return A->getKind() == attr::WeakImport; }
6469 : };
6470 :
6471 : class WeakRefAttr : public InheritableAttr {
6472 : unsigned aliaseeLength;
6473 : char *aliasee;
6474 :
6475 :
6476 : public:
6477 : static WeakRefAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Loc = SourceRange()) {
6478 : WeakRefAttr *A = new (Ctx) WeakRefAttr(Loc, Ctx, Aliasee, 0);
6479 : A->setImplicit(true);
6480 : return A;
6481 : }
6482 :
6483 : WeakRefAttr(SourceRange R, ASTContext &Ctx
6484 : , llvm::StringRef Aliasee
6485 : , unsigned SI
6486 : )
6487 : : InheritableAttr(attr::WeakRef, R, SI, 0, 0)
6488 : , aliaseeLength(Aliasee.size()),aliasee(new (Ctx, 1) char[aliaseeLength])
6489 : {
6490 : if (!Aliasee.empty())
6491 : std::memcpy(aliasee, Aliasee.data(), aliaseeLength);
6492 : }
6493 :
6494 : WeakRefAttr(SourceRange R, ASTContext &Ctx
6495 : , unsigned SI
6496 : )
6497 : : InheritableAttr(attr::WeakRef, R, SI, 0, 0)
6498 : , aliaseeLength(0),aliasee(0)
6499 : {
6500 : }
6501 :
6502 : WeakRefAttr *clone(ASTContext &C) const;
6503 : void printPretty(raw_ostream &OS,
6504 : const PrintingPolicy &Policy) const;
6505 : const char *getSpelling() const;
6506 : llvm::StringRef getAliasee() const {
6507 : return llvm::StringRef(aliasee, aliaseeLength);
6508 : }
6509 : unsigned getAliaseeLength() const {
6510 : return aliaseeLength;
6511 : }
6512 : void setAliasee(ASTContext &C, llvm::StringRef S) {
6513 : aliaseeLength = S.size();
6514 : this->aliasee = new (C, 1) char [aliaseeLength];
6515 : if (!S.empty())
6516 : std::memcpy(this->aliasee, S.data(), aliaseeLength);
6517 : }
6518 :
6519 :
6520 :
6521 0 : static bool classof(const Attr *A) { return A->getKind() == attr::WeakRef; }
6522 : };
6523 :
6524 : class WorkGroupSizeHintAttr : public InheritableAttr {
6525 : unsigned xDim;
6526 :
6527 : unsigned yDim;
6528 :
6529 : unsigned zDim;
6530 :
6531 :
6532 : public:
6533 : static WorkGroupSizeHintAttr *CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Loc = SourceRange()) {
6534 : WorkGroupSizeHintAttr *A = new (Ctx) WorkGroupSizeHintAttr(Loc, Ctx, XDim, YDim, ZDim, 0);
6535 : A->setImplicit(true);
6536 : return A;
6537 : }
6538 :
6539 : WorkGroupSizeHintAttr(SourceRange R, ASTContext &Ctx
6540 : , unsigned XDim
6541 : , unsigned YDim
6542 : , unsigned ZDim
6543 : , unsigned SI
6544 : )
6545 : : InheritableAttr(attr::WorkGroupSizeHint, R, SI, 0, 0)
6546 : , xDim(XDim)
6547 : , yDim(YDim)
6548 : , zDim(ZDim)
6549 : {
6550 :
6551 :
6552 :
6553 : }
6554 :
6555 : WorkGroupSizeHintAttr *clone(ASTContext &C) const;
6556 : void printPretty(raw_ostream &OS,
6557 : const PrintingPolicy &Policy) const;
6558 : const char *getSpelling() const;
6559 : unsigned getXDim() const {
6560 : return xDim;
6561 : }
6562 :
6563 : unsigned getYDim() const {
6564 : return yDim;
6565 : }
6566 :
6567 : unsigned getZDim() const {
6568 : return zDim;
6569 : }
6570 :
6571 :
6572 :
6573 0 : static bool classof(const Attr *A) { return A->getKind() == attr::WorkGroupSizeHint; }
6574 : };
6575 :
6576 : class X86ForceAlignArgPointerAttr : public InheritableAttr {
6577 :
6578 : public:
6579 : static X86ForceAlignArgPointerAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6580 : X86ForceAlignArgPointerAttr *A = new (Ctx) X86ForceAlignArgPointerAttr(Loc, Ctx, 0);
6581 : A->setImplicit(true);
6582 : return A;
6583 : }
6584 :
6585 : X86ForceAlignArgPointerAttr(SourceRange R, ASTContext &Ctx
6586 : , unsigned SI
6587 : )
6588 : : InheritableAttr(attr::X86ForceAlignArgPointer, R, SI, 0, 0)
6589 : {
6590 : }
6591 :
6592 : X86ForceAlignArgPointerAttr *clone(ASTContext &C) const;
6593 : void printPretty(raw_ostream &OS,
6594 : const PrintingPolicy &Policy) const;
6595 : const char *getSpelling() const;
6596 :
6597 :
6598 0 : static bool classof(const Attr *A) { return A->getKind() == attr::X86ForceAlignArgPointer; }
6599 : };
6600 :
6601 : #endif
|