Line data Source code
1 : /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2 : |* *|
3 : |* Parsed attribute helpers *|
4 : |* *|
5 : |* Automatically generated file, do not edit! *|
6 : |* *|
7 : \*===----------------------------------------------------------------------===*/
8 :
9 13582318 : static bool defaultAppertainsTo(Sema &, const ParsedAttr &,const Decl *) {
10 13582318 : return true;
11 : }
12 :
13 27732092 : static bool defaultDiagnoseLangOpts(Sema &, const ParsedAttr &) {
14 27732092 : return true;
15 : }
16 :
17 55452175 : static bool defaultTargetRequirements(const TargetInfo &) {
18 55452175 : return true;
19 : }
20 :
21 0 : static unsigned defaultSpellingIndexToSemanticSpelling(const ParsedAttr &Attr) {
22 0 : return UINT_MAX;
23 : }
24 :
25 95 : static bool checkAMDGPUFlatWorkGroupSizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
26 95 : if (!D || (!isa<FunctionDecl>(D))) {
27 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
28 : << Attr << "kernel functions";
29 1 : return false;
30 : }
31 : return true;
32 : }
33 :
34 0 : static void matchRulesForAMDGPUFlatWorkGroupSize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
35 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
36 0 : }
37 :
38 72 : static bool checkAMDGPUNumSGPRAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
39 72 : if (!D || (!isa<FunctionDecl>(D))) {
40 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
41 : << Attr << "kernel functions";
42 1 : return false;
43 : }
44 : return true;
45 : }
46 :
47 0 : static void matchRulesForAMDGPUNumSGPR(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
48 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
49 0 : }
50 :
51 72 : static bool checkAMDGPUNumVGPRAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
52 72 : if (!D || (!isa<FunctionDecl>(D))) {
53 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
54 : << Attr << "kernel functions";
55 1 : return false;
56 : }
57 : return true;
58 : }
59 :
60 0 : static void matchRulesForAMDGPUNumVGPR(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
61 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
62 0 : }
63 :
64 118 : static bool checkAMDGPUWavesPerEUAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
65 118 : if (!D || (!isa<FunctionDecl>(D))) {
66 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
67 : << Attr << "kernel functions";
68 2 : return false;
69 : }
70 : return true;
71 : }
72 :
73 0 : static void matchRulesForAMDGPUWavesPerEU(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
74 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
75 0 : }
76 :
77 310 : static bool isTargetarmthumbarmebthumbebavrx86x86_64msp430mipsmipselriscv32riscv64(const TargetInfo &Target) {
78 : const llvm::Triple &T = Target.getTriple();
79 310 : return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb || T.getArch() == llvm::Triple::avr || T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64 || T.getArch() == llvm::Triple::msp430 || T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel || T.getArch() == llvm::Triple::riscv32 || T.getArch() == llvm::Triple::riscv64);
80 : }
81 :
82 4 : static bool checkAVRSignalAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
83 4 : if (!D || (!isa<FunctionDecl>(D))) {
84 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
85 : << Attr << "functions";
86 1 : return false;
87 : }
88 : return true;
89 : }
90 :
91 6 : static bool isTargetavr(const TargetInfo &Target) {
92 : const llvm::Triple &T = Target.getTriple();
93 6 : return true && (T.getArch() == llvm::Triple::avr);
94 : }
95 :
96 0 : static void matchRulesForAVRSignal(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
97 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
98 0 : }
99 :
100 : static bool isStruct(const Decl *D) {
101 : if (const auto *S = dyn_cast<RecordDecl>(D))
102 17 : return !S->isUnion();
103 : return false;
104 : }
105 :
106 1689 : static bool checkAbiTagAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
107 3378 : if (!D || (!isStruct(D) && !isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<NamespaceDecl>(D))) {
108 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
109 : << Attr << "structs, variables, functions, and namespaces";
110 0 : return false;
111 : }
112 : return true;
113 : }
114 :
115 60 : static void matchRulesForAbiTag(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
116 60 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true));
117 60 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
118 60 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
119 120 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus));
120 60 : }
121 :
122 516 : static bool checkAcquireCapabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
123 516 : if (!D || (!isa<FunctionDecl>(D))) {
124 31 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
125 : << Attr << "functions";
126 31 : return false;
127 : }
128 : return true;
129 : }
130 :
131 0 : static unsigned AcquireCapabilityAttrSpellingMap(const ParsedAttr &Attr) {
132 : enum Spelling {
133 : GNU_acquire_capability = 0,
134 : CXX11_clang_acquire_capability = 1,
135 : GNU_acquire_shared_capability = 2,
136 : CXX11_clang_acquire_shared_capability = 3,
137 : GNU_exclusive_lock_function = 4,
138 : GNU_shared_lock_function = 5
139 : };
140 :
141 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
142 : switch (Idx) {
143 0 : default: llvm_unreachable("Unknown spelling list index");
144 : case 0: return GNU_acquire_capability;
145 : case 1: return CXX11_clang_acquire_capability;
146 : case 2: return GNU_acquire_shared_capability;
147 : case 3: return CXX11_clang_acquire_shared_capability;
148 : case 4: return GNU_exclusive_lock_function;
149 : case 5: return GNU_shared_lock_function;
150 : }
151 : }
152 :
153 422 : static bool isSharedVar(const Decl *D) {
154 : if (const auto *S = dyn_cast<VarDecl>(D))
155 376 : return S->hasGlobalStorage() && !S->getTLSKind();
156 : return false;
157 : }
158 :
159 154 : static bool checkAcquiredAfterAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
160 154 : if (!D || (!isa<FieldDecl>(D) && !isSharedVar(D))) {
161 12 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
162 : << Attr << "non-static data members and global variables";
163 12 : return false;
164 : }
165 : return true;
166 : }
167 :
168 115 : static bool checkAcquiredBeforeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
169 115 : if (!D || (!isa<FieldDecl>(D) && !isSharedVar(D))) {
170 12 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
171 : << Attr << "non-static data members and global variables";
172 12 : return false;
173 : }
174 : return true;
175 : }
176 :
177 : static bool isGlobalVar(const Decl *D) {
178 : if (const auto *S = dyn_cast<VarDecl>(D))
179 : return S->hasGlobalStorage();
180 : return false;
181 : }
182 :
183 97 : static bool checkAliasAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
184 120 : if (!D || (!isa<FunctionDecl>(D) && !isGlobalVar(D))) {
185 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
186 : << Attr << "functions and global variables";
187 0 : return false;
188 : }
189 : return true;
190 : }
191 :
192 0 : static void matchRulesForAlias(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
193 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
194 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
195 0 : }
196 :
197 157 : static bool checkAlignValueAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
198 157 : if (!D || (!isa<VarDecl>(D) && !isa<TypedefNameDecl>(D))) {
199 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
200 : << Attr << "variables and typedefs";
201 3 : return false;
202 : }
203 : return true;
204 : }
205 :
206 0 : static void matchRulesForAlignValue(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
207 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
208 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
209 0 : }
210 :
211 0 : static unsigned AlignedAttrSpellingMap(const ParsedAttr &Attr) {
212 : enum Spelling {
213 : GNU_aligned = 0,
214 : CXX11_gnu_aligned = 1,
215 : Declspec_align = 2,
216 : Keyword_alignas = 3,
217 : Keyword_Alignas = 4
218 : };
219 :
220 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
221 : switch (Idx) {
222 0 : default: llvm_unreachable("Unknown spelling list index");
223 : case 0: return GNU_aligned;
224 : case 1: return CXX11_gnu_aligned;
225 : case 2: return Declspec_align;
226 : case 3: return Keyword_alignas;
227 : case 4: return Keyword_Alignas;
228 : }
229 : }
230 :
231 1065955 : static bool isHasFunctionProto(const Decl *D) {
232 1065955 : if (const auto *S = dyn_cast<Decl>(D))
233 2131874 : return (S->getFunctionType(true) != nullptr &&
234 1065957 : isa<FunctionProtoType>(S->getFunctionType())) ||
235 1065993 : isa<ObjCMethodDecl>(S) ||
236 : isa<BlockDecl>(S);
237 : return false;
238 : }
239 :
240 24 : static bool checkAllocAlignAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
241 24 : if (!D || (!isHasFunctionProto(D))) {
242 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
243 : << Attr << "non-K&R-style functions";
244 1 : return false;
245 : }
246 : return true;
247 : }
248 :
249 39 : static bool checkAllocSizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
250 39 : if (!D || (!isa<FunctionDecl>(D))) {
251 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
252 : << Attr << "functions";
253 2 : return false;
254 : }
255 : return true;
256 : }
257 :
258 0 : static void matchRulesForAllocSize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
259 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
260 0 : }
261 :
262 22 : static bool checkAlwaysDestroyAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
263 22 : if (!D || (!isa<VarDecl>(D))) {
264 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
265 : << Attr << "variables";
266 2 : return false;
267 : }
268 : return true;
269 : }
270 :
271 0 : static void matchRulesForAlwaysDestroy(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
272 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
273 0 : }
274 :
275 10439057 : static bool checkAlwaysInlineAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
276 10439057 : if (!D || (!isa<FunctionDecl>(D))) {
277 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
278 : << Attr << "functions";
279 0 : return false;
280 : }
281 : return true;
282 : }
283 :
284 0 : static unsigned AlwaysInlineAttrSpellingMap(const ParsedAttr &Attr) {
285 : enum Spelling {
286 : GNU_always_inline = 0,
287 : CXX11_gnu_always_inline = 1,
288 : Keyword_forceinline = 2
289 : };
290 :
291 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
292 : switch (Idx) {
293 0 : default: llvm_unreachable("Unknown spelling list index");
294 : case 0: return GNU_always_inline;
295 : case 1: return CXX11_gnu_always_inline;
296 : case 2: return Keyword_forceinline;
297 : }
298 : }
299 :
300 0 : static void matchRulesForAlwaysInline(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
301 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
302 0 : }
303 :
304 79 : static void matchRulesForAnnotate(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
305 79 : }
306 :
307 133 : static bool isTargetx86x86_64(const TargetInfo &Target) {
308 : const llvm::Triple &T = Target.getTriple();
309 133 : return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64);
310 : }
311 :
312 : static bool isFunctionLike(const Decl *D) {
313 43 : if (const auto *S = dyn_cast<Decl>(D))
314 843453 : return S->getFunctionType(false) != nullptr;
315 : return false;
316 : }
317 :
318 13 : static bool checkAnyX86NoCfCheckAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
319 26 : if (!D || (!isFunctionLike(D))) {
320 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
321 : << Attr << "functions and function pointers";
322 3 : return false;
323 : }
324 : return true;
325 : }
326 :
327 0 : static void matchRulesForAnyX86NoCfCheck(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
328 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
329 0 : }
330 :
331 37 : static bool checkArcWeakrefUnavailableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
332 37 : if (!D || (!isa<ObjCInterfaceDecl>(D))) {
333 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
334 : << Attr << "Objective-C interfaces";
335 2 : return false;
336 : }
337 : return true;
338 : }
339 :
340 0 : static void matchRulesForArcWeakrefUnavailable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
341 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
342 0 : }
343 :
344 107 : static bool checkArgumentWithTypeTagAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
345 107 : if (!D || (!isHasFunctionProto(D))) {
346 3 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
347 : << Attr << "non-K&R-style functions";
348 3 : return false;
349 : }
350 : return true;
351 : }
352 :
353 0 : static unsigned ArgumentWithTypeTagAttrSpellingMap(const ParsedAttr &Attr) {
354 : enum Spelling {
355 : GNU_argument_with_type_tag = 0,
356 : CXX11_clang_argument_with_type_tag = 1,
357 : C2x_clang_argument_with_type_tag = 2,
358 : GNU_pointer_with_type_tag = 3,
359 : CXX11_clang_pointer_with_type_tag = 4,
360 : C2x_clang_pointer_with_type_tag = 5
361 : };
362 :
363 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
364 : switch (Idx) {
365 0 : default: llvm_unreachable("Unknown spelling list index");
366 : case 0: return GNU_argument_with_type_tag;
367 : case 1: return CXX11_clang_argument_with_type_tag;
368 : case 2: return C2x_clang_argument_with_type_tag;
369 : case 3: return GNU_pointer_with_type_tag;
370 : case 4: return CXX11_clang_pointer_with_type_tag;
371 : case 5: return C2x_clang_pointer_with_type_tag;
372 : }
373 : }
374 :
375 : static bool isInlineFunction(const Decl *D) {
376 : if (const auto *S = dyn_cast<FunctionDecl>(D))
377 37 : return S->isInlineSpecified();
378 : return false;
379 : }
380 :
381 37 : static bool checkArtificialAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
382 74 : if (!D || (!isInlineFunction(D))) {
383 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
384 : << Attr << "inline functions";
385 1 : return false;
386 : }
387 : return true;
388 : }
389 :
390 30 : static bool checkAssertCapabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
391 30 : if (!D || (!isa<FunctionDecl>(D))) {
392 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
393 : << Attr << "functions";
394 0 : return false;
395 : }
396 : return true;
397 : }
398 :
399 0 : static unsigned AssertCapabilityAttrSpellingMap(const ParsedAttr &Attr) {
400 : enum Spelling {
401 : GNU_assert_capability = 0,
402 : CXX11_clang_assert_capability = 1,
403 : GNU_assert_shared_capability = 2,
404 : CXX11_clang_assert_shared_capability = 3
405 : };
406 :
407 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
408 : switch (Idx) {
409 0 : default: llvm_unreachable("Unknown spelling list index");
410 : case 0: return GNU_assert_capability;
411 : case 1: return CXX11_clang_assert_capability;
412 : case 2: return GNU_assert_shared_capability;
413 : case 3: return CXX11_clang_assert_shared_capability;
414 : }
415 : }
416 :
417 15 : static bool checkAssertExclusiveLockAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
418 15 : if (!D || (!isa<FunctionDecl>(D))) {
419 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
420 : << Attr << "functions";
421 0 : return false;
422 : }
423 : return true;
424 : }
425 :
426 13 : static bool checkAssertSharedLockAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
427 13 : if (!D || (!isa<FunctionDecl>(D))) {
428 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
429 : << Attr << "functions";
430 0 : return false;
431 : }
432 : return true;
433 : }
434 :
435 22 : static bool checkAssumeAlignedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
436 22 : if (!D || (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D))) {
437 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
438 : << Attr << "Objective-C methods and functions";
439 2 : return false;
440 : }
441 : return true;
442 : }
443 :
444 0 : static void matchRulesForAssumeAligned(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
445 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
446 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
447 0 : }
448 :
449 851 : static bool checkAvailabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
450 851 : if (!D || (!isa<NamedDecl>(D))) {
451 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
452 : << Attr << "named declarations";
453 2 : return false;
454 : }
455 : return true;
456 : }
457 :
458 0 : static void matchRulesForAvailability(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
459 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
460 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
461 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum_constant, /*IsSupported=*/true));
462 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true));
463 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
464 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus));
465 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC1));
466 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
467 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
468 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC1));
469 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC1));
470 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
471 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
472 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
473 0 : }
474 :
475 0 : static bool checkCFAuditedTransferAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
476 0 : if (!D || (!isa<FunctionDecl>(D))) {
477 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
478 : << Attr << "functions";
479 0 : return false;
480 : }
481 : return true;
482 : }
483 :
484 0 : static void matchRulesForCFAuditedTransfer(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
485 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
486 0 : }
487 :
488 298 : static bool checkCFConsumedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
489 298 : if (!D || (!isa<ParmVarDecl>(D))) {
490 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
491 : << Attr << "parameters";
492 0 : return false;
493 : }
494 : return true;
495 : }
496 :
497 0 : static void matchRulesForCFConsumed(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
498 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
499 0 : }
500 :
501 1 : static bool checkCFUnknownTransferAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
502 1 : if (!D || (!isa<FunctionDecl>(D))) {
503 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
504 : << Attr << "functions";
505 0 : return false;
506 : }
507 : return true;
508 : }
509 :
510 0 : static void matchRulesForCFUnknownTransfer(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
511 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
512 0 : }
513 :
514 20 : static bool checkCPUDispatchAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
515 20 : if (!D || (!isa<FunctionDecl>(D))) {
516 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
517 : << Attr << "functions";
518 0 : return false;
519 : }
520 : return true;
521 : }
522 :
523 0 : static void matchRulesForCPUDispatch(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
524 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
525 0 : }
526 :
527 57 : static bool checkCPUSpecificAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
528 57 : if (!D || (!isa<FunctionDecl>(D))) {
529 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
530 : << Attr << "functions";
531 0 : return false;
532 : }
533 : return true;
534 : }
535 :
536 0 : static void matchRulesForCPUSpecific(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
537 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
538 0 : }
539 :
540 121 : static bool checkCUDAConstantAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
541 121 : if (!D || (!isa<VarDecl>(D))) {
542 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
543 : << Attr << "variables";
544 2 : return false;
545 : }
546 : return true;
547 : }
548 :
549 2441 : static bool checkCUDALangOpts(Sema &S, const ParsedAttr &Attr) {
550 2441 : if (S.LangOpts.CUDA)
551 : return true;
552 :
553 10 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
554 10 : return false;
555 : }
556 :
557 0 : static void matchRulesForCUDAConstant(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
558 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
559 0 : }
560 :
561 1313 : static bool checkCUDADeviceAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
562 1313 : if (!D || (!isa<FunctionDecl>(D) && !isa<VarDecl>(D))) {
563 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
564 : << Attr << "functions and variables";
565 0 : return false;
566 : }
567 : return true;
568 : }
569 :
570 0 : static void matchRulesForCUDADevice(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
571 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
572 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
573 0 : }
574 :
575 158 : static bool checkCUDAGlobalAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
576 158 : if (!D || (!isa<FunctionDecl>(D))) {
577 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
578 : << Attr << "functions";
579 2 : return false;
580 : }
581 : return true;
582 : }
583 :
584 0 : static void matchRulesForCUDAGlobal(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
585 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
586 0 : }
587 :
588 601 : static bool checkCUDAHostAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
589 601 : if (!D || (!isa<FunctionDecl>(D))) {
590 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
591 : << Attr << "functions";
592 2 : return false;
593 : }
594 : return true;
595 : }
596 :
597 0 : static void matchRulesForCUDAHost(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
598 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
599 0 : }
600 :
601 0 : static bool checkCUDAInvalidTargetAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
602 0 : if (!D || (!isa<FunctionDecl>(D))) {
603 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
604 : << Attr << "functions";
605 0 : return false;
606 : }
607 : return true;
608 : }
609 :
610 30 : static bool checkCUDALaunchBoundsAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
611 60 : if (!D || (!isa<ObjCMethodDecl>(D) && !isFunctionLike(D))) {
612 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
613 : << Attr << "Objective-C methods, functions, and function pointers";
614 1 : return false;
615 : }
616 : return true;
617 : }
618 :
619 0 : static void matchRulesForCUDALaunchBounds(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
620 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
621 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
622 0 : }
623 :
624 208 : static bool checkCUDASharedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
625 208 : if (!D || (!isa<VarDecl>(D))) {
626 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
627 : << Attr << "variables";
628 2 : return false;
629 : }
630 : return true;
631 : }
632 :
633 0 : static void matchRulesForCUDAShared(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
634 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
635 0 : }
636 :
637 120696 : static bool checkCXX11NoReturnAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
638 120696 : if (!D || (!isa<FunctionDecl>(D))) {
639 6 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
640 : << Attr << "functions";
641 6 : return false;
642 : }
643 : return true;
644 : }
645 :
646 5 : static void matchRulesForCXX11NoReturn(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
647 5 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
648 5 : }
649 :
650 18 : static bool checkCallableWhenAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
651 18 : if (!D || (!isa<CXXMethodDecl>(D))) {
652 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
653 : << Attr << "functions";
654 2 : return false;
655 : }
656 : return true;
657 : }
658 :
659 0 : static void matchRulesForCallableWhen(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
660 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus));
661 0 : }
662 :
663 40 : static bool checkCapabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
664 40 : if (!D || (!isa<RecordDecl>(D) && !isa<TypedefNameDecl>(D))) {
665 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
666 : << Attr << "structs, unions, classes, and typedefs";
667 2 : return false;
668 : }
669 : return true;
670 : }
671 :
672 0 : static unsigned CapabilityAttrSpellingMap(const ParsedAttr &Attr) {
673 : enum Spelling {
674 : GNU_capability = 0,
675 : CXX11_clang_capability = 1,
676 : GNU_shared_capability = 2,
677 : CXX11_clang_shared_capability = 3
678 : };
679 :
680 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
681 : switch (Idx) {
682 0 : default: llvm_unreachable("Unknown spelling list index");
683 : case 0: return GNU_capability;
684 : case 1: return CXX11_clang_capability;
685 : case 2: return GNU_shared_capability;
686 : case 3: return CXX11_clang_shared_capability;
687 : }
688 : }
689 :
690 0 : static void matchRulesForCapability(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
691 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
692 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
693 0 : }
694 :
695 30 : static bool checkCarriesDependencyAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
696 30 : if (!D || (!isa<ParmVarDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D))) {
697 4 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
698 : << Attr << "parameters, Objective-C methods, and functions";
699 4 : return false;
700 : }
701 : return true;
702 : }
703 :
704 0 : static void matchRulesForCarriesDependency(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
705 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
706 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
707 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
708 0 : }
709 :
710 39 : static bool isLocalVar(const Decl *D) {
711 : if (const auto *S = dyn_cast<VarDecl>(D))
712 39 : return S->hasLocalStorage() && !isa<ParmVarDecl>(S);
713 : return false;
714 : }
715 :
716 39 : static bool checkCleanupAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
717 39 : if (!D || (!isLocalVar(D))) {
718 5 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
719 : << Attr << "local variables";
720 5 : return false;
721 : }
722 : return true;
723 : }
724 :
725 81 : static bool checkCodeSegAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
726 81 : if (!D || (!isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D))) {
727 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
728 : << Attr << "functions and classes";
729 0 : return false;
730 : }
731 : return true;
732 : }
733 :
734 27 : static bool checkColdAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
735 27 : if (!D || (!isa<FunctionDecl>(D))) {
736 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
737 : << Attr << "functions";
738 1 : return false;
739 : }
740 : return true;
741 : }
742 :
743 0 : static void matchRulesForCold(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
744 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
745 0 : }
746 :
747 9 : static bool checkCommonAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
748 9 : if (!D || (!isa<VarDecl>(D))) {
749 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
750 : << Attr << "variables";
751 0 : return false;
752 : }
753 : return true;
754 : }
755 :
756 0 : static void matchRulesForCommon(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
757 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
758 0 : }
759 :
760 25 : static bool checkConstructorAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
761 25 : if (!D || (!isa<FunctionDecl>(D))) {
762 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
763 : << Attr << "functions";
764 1 : return false;
765 : }
766 : return true;
767 : }
768 :
769 0 : static void matchRulesForConstructor(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
770 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
771 0 : }
772 :
773 9 : static bool checkConsumableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
774 9 : if (!D || (!isa<CXXRecordDecl>(D))) {
775 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
776 : << Attr << "classes";
777 2 : return false;
778 : }
779 : return true;
780 : }
781 :
782 0 : static void matchRulesForConsumable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
783 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
784 0 : }
785 :
786 2 : static bool checkConsumableAutoCastAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
787 2 : if (!D || (!isa<CXXRecordDecl>(D))) {
788 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
789 : << Attr << "classes";
790 0 : return false;
791 : }
792 : return true;
793 : }
794 :
795 0 : static void matchRulesForConsumableAutoCast(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
796 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
797 0 : }
798 :
799 2 : static bool checkConsumableSetOnReadAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
800 2 : if (!D || (!isa<CXXRecordDecl>(D))) {
801 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
802 : << Attr << "classes";
803 0 : return false;
804 : }
805 : return true;
806 : }
807 :
808 0 : static void matchRulesForConsumableSetOnRead(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
809 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
810 0 : }
811 :
812 3197 : static bool checkConvergentAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
813 3197 : if (!D || (!isa<FunctionDecl>(D))) {
814 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
815 : << Attr << "functions";
816 2 : return false;
817 : }
818 : return true;
819 : }
820 :
821 0 : static void matchRulesForConvergent(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
822 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
823 0 : }
824 :
825 3455 : static bool checkDLLExportAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
826 3455 : if (!D || (!isa<FunctionDecl>(D) && !isa<VarDecl>(D) && !isa<CXXRecordDecl>(D) && !isa<ObjCInterfaceDecl>(D))) {
827 68 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
828 : << Attr << "functions, variables, classes, and Objective-C interfaces";
829 68 : return false;
830 : }
831 : return true;
832 : }
833 :
834 15081 : static bool isTargetx86x86_64armthumbaarch64Win32(const TargetInfo &Target) {
835 : const llvm::Triple &T = Target.getTriple();
836 15081 : return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64 || T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::aarch64) && (T.getOS() == llvm::Triple::Win32);
837 : }
838 :
839 1 : static void matchRulesForDLLExport(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
840 1 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
841 1 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
842 1 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
843 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
844 1 : }
845 :
846 4139 : static bool checkDLLImportAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
847 4139 : if (!D || (!isa<FunctionDecl>(D) && !isa<VarDecl>(D) && !isa<CXXRecordDecl>(D) && !isa<ObjCInterfaceDecl>(D))) {
848 74 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
849 : << Attr << "functions, variables, classes, and Objective-C interfaces";
850 74 : return false;
851 : }
852 : return true;
853 : }
854 :
855 0 : static void matchRulesForDLLImport(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
856 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
857 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
858 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
859 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
860 0 : }
861 :
862 25 : static bool checkDestructorAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
863 25 : if (!D || (!isa<FunctionDecl>(D))) {
864 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
865 : << Attr << "functions";
866 1 : return false;
867 : }
868 : return true;
869 : }
870 :
871 0 : static void matchRulesForDestructor(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
872 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
873 0 : }
874 :
875 77860 : static bool checkDiagnoseIfAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
876 77860 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D))) {
877 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
878 : << Attr << "functions, Objective-C methods, and Objective-C properties";
879 0 : return false;
880 : }
881 : return true;
882 : }
883 :
884 15 : static bool checkDisableTailCallsAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
885 15 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D))) {
886 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
887 : << Attr << "functions and Objective-C methods";
888 1 : return false;
889 : }
890 : return true;
891 : }
892 :
893 1 : static void matchRulesForDisableTailCalls(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
894 1 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
895 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
896 1 : }
897 :
898 14 : static bool checkEmptyBasesAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
899 14 : if (!D || (!isa<CXXRecordDecl>(D))) {
900 4 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
901 : << Attr << "classes";
902 4 : return false;
903 : }
904 : return true;
905 : }
906 :
907 52 : static bool isTargetx86x86_64armthumbaarch64Microsoft(const TargetInfo &Target) {
908 : const llvm::Triple &T = Target.getTriple();
909 52 : return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64 || T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::aarch64) && (Target.getCXXABI().getKind() == TargetCXXABI::Microsoft);
910 : }
911 :
912 52388 : static bool checkEnableIfAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
913 52388 : if (!D || (!isa<FunctionDecl>(D))) {
914 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
915 : << Attr << "functions";
916 1 : return false;
917 : }
918 : return true;
919 : }
920 :
921 0 : static void matchRulesForEnableIf(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
922 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
923 0 : }
924 :
925 14 : static bool checkEnumExtensibilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
926 14 : if (!D || (!isa<EnumDecl>(D))) {
927 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
928 : << Attr << "enums";
929 1 : return false;
930 : }
931 : return true;
932 : }
933 :
934 0 : static void matchRulesForEnumExtensibility(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
935 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
936 0 : }
937 :
938 29 : static bool checkExcludeFromExplicitInstantiationAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
939 29 : if (!D || (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D))) {
940 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
941 : << Attr << "variables, functions, and classes";
942 0 : return false;
943 : }
944 : return true;
945 : }
946 :
947 0 : static void matchRulesForExcludeFromExplicitInstantiation(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
948 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
949 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
950 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
951 0 : }
952 :
953 96 : static bool checkExclusiveTrylockFunctionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
954 96 : if (!D || (!isa<FunctionDecl>(D))) {
955 15 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
956 : << Attr << "functions";
957 15 : return false;
958 : }
959 : return true;
960 : }
961 :
962 1761 : static bool checkExtVectorTypeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
963 1761 : if (!D || (!isa<TypedefNameDecl>(D))) {
964 4 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
965 : << Attr << "typedefs";
966 4 : return false;
967 : }
968 : return true;
969 : }
970 :
971 64 : static bool checkExternalSourceSymbolAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
972 64 : if (!D || (!isa<NamedDecl>(D))) {
973 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
974 : << Attr << "named declarations";
975 1 : return false;
976 : }
977 : return true;
978 : }
979 :
980 2 : static void matchRulesForExternalSourceSymbol(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
981 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
982 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
983 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum_constant, /*IsSupported=*/true));
984 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true));
985 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
986 4 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus));
987 4 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC1));
988 4 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
989 4 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
990 4 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC1));
991 4 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC1));
992 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
993 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
994 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
995 2 : }
996 :
997 14 : static bool checkFlagEnumAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
998 14 : if (!D || (!isa<EnumDecl>(D))) {
999 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1000 : << Attr << "enums";
1001 0 : return false;
1002 : }
1003 : return true;
1004 : }
1005 :
1006 0 : static void matchRulesForFlagEnum(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1007 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
1008 0 : }
1009 :
1010 18 : static bool checkFlattenAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1011 18 : if (!D || (!isa<FunctionDecl>(D))) {
1012 6 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1013 : << Attr << "functions";
1014 6 : return false;
1015 : }
1016 : return true;
1017 : }
1018 :
1019 0 : static void matchRulesForFlatten(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1020 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1021 0 : }
1022 :
1023 36387 : static bool checkFormatAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1024 36387 : if (!D || (!isa<ObjCMethodDecl>(D) && !isa<BlockDecl>(D) && !isHasFunctionProto(D))) {
1025 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1026 : << Attr << "Objective-C methods, blocks, and non-K&R-style functions";
1027 0 : return false;
1028 : }
1029 : return true;
1030 : }
1031 :
1032 686 : static bool checkFormatArgAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1033 686 : if (!D || (!isa<ObjCMethodDecl>(D) && !isHasFunctionProto(D))) {
1034 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1035 : << Attr << "Objective-C methods and non-K&R-style functions";
1036 3 : return false;
1037 : }
1038 : return true;
1039 : }
1040 :
1041 7117 : static bool checkGNUInlineAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1042 7117 : if (!D || (!isa<FunctionDecl>(D))) {
1043 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1044 : << Attr << "functions";
1045 0 : return false;
1046 : }
1047 : return true;
1048 : }
1049 :
1050 0 : static void matchRulesForGNUInline(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1051 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1052 0 : }
1053 :
1054 571 : static bool checkGuardedByAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1055 571 : if (!D || (!isa<FieldDecl>(D) && !isSharedVar(D))) {
1056 14 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1057 : << Attr << "non-static data members and global variables";
1058 14 : return false;
1059 : }
1060 : return true;
1061 : }
1062 :
1063 31 : static bool checkGuardedVarAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1064 31 : if (!D || (!isa<FieldDecl>(D) && !isSharedVar(D))) {
1065 12 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1066 : << Attr << "non-static data members and global variables";
1067 12 : return false;
1068 : }
1069 : return true;
1070 : }
1071 :
1072 4 : static bool checkHotAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1073 4 : if (!D || (!isa<FunctionDecl>(D))) {
1074 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1075 : << Attr << "functions";
1076 1 : return false;
1077 : }
1078 : return true;
1079 : }
1080 :
1081 0 : static void matchRulesForHot(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1082 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1083 0 : }
1084 :
1085 : static bool isObjCInstanceMethod(const Decl *D) {
1086 : if (const auto *S = dyn_cast<ObjCMethodDecl>(D))
1087 4 : return S->isInstanceMethod();
1088 : return false;
1089 : }
1090 :
1091 57 : static bool checkIBActionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1092 114 : if (!D || (!isObjCInstanceMethod(D))) {
1093 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1094 : << Attr << "Objective-C instance methods";
1095 2 : return false;
1096 : }
1097 : return true;
1098 : }
1099 :
1100 0 : static void matchRulesForIBAction(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1101 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method_is_instance, /*IsSupported=*/LangOpts.ObjC1));
1102 0 : }
1103 :
1104 11 : static bool checkIFuncAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1105 11 : if (!D || (!isa<FunctionDecl>(D))) {
1106 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1107 : << Attr << "functions";
1108 0 : return false;
1109 : }
1110 : return true;
1111 : }
1112 :
1113 23 : static bool isTargetELF(const TargetInfo &Target) {
1114 : const llvm::Triple &T = Target.getTriple();
1115 23 : return true && (T.getObjectFormat() == llvm::Triple::ELF);
1116 : }
1117 :
1118 0 : static void matchRulesForIFunc(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1119 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1120 0 : }
1121 :
1122 605 : static bool checkInitPriorityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1123 605 : if (!D || (!isa<VarDecl>(D))) {
1124 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1125 : << Attr << "variables";
1126 1 : return false;
1127 : }
1128 : return true;
1129 : }
1130 :
1131 0 : static void matchRulesForInitPriority(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1132 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1133 0 : }
1134 :
1135 42 : static bool checkInternalLinkageAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1136 42 : if (!D || (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D))) {
1137 5 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1138 : << Attr << "variables, functions, and classes";
1139 5 : return false;
1140 : }
1141 : return true;
1142 : }
1143 :
1144 0 : static void matchRulesForInternalLinkage(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1145 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1146 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1147 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1148 0 : }
1149 :
1150 11 : static bool checkLTOVisibilityPublicAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1151 11 : if (!D || (!isa<RecordDecl>(D))) {
1152 5 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1153 : << Attr << "structs, unions, and classes";
1154 5 : return false;
1155 : }
1156 : return true;
1157 : }
1158 :
1159 0 : static void matchRulesForLTOVisibilityPublic(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1160 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1161 0 : }
1162 :
1163 8 : static bool checkLayoutVersionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1164 8 : if (!D || (!isa<CXXRecordDecl>(D))) {
1165 4 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1166 : << Attr << "classes";
1167 4 : return false;
1168 : }
1169 : return true;
1170 : }
1171 :
1172 0 : static bool isImplicitObjectParameter(const Decl *D) {
1173 : if (const auto *S = dyn_cast<FunctionDecl>(D))
1174 : return static_cast<void>(S), false;
1175 : return false;
1176 : }
1177 :
1178 13 : static bool checkLifetimeBoundAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1179 13 : if (!D || (!isa<ParmVarDecl>(D) && !isImplicitObjectParameter(D))) {
1180 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1181 : << Attr << "parameters and implicit object parameters";
1182 1 : return false;
1183 : }
1184 : return true;
1185 : }
1186 :
1187 231 : static bool checkCPlusPlusLangOpts(Sema &S, const ParsedAttr &Attr) {
1188 231 : if (S.LangOpts.CPlusPlus)
1189 : return true;
1190 :
1191 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
1192 1 : return false;
1193 : }
1194 :
1195 101 : static bool checkLockReturnedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1196 101 : if (!D || (!isa<FunctionDecl>(D))) {
1197 15 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1198 : << Attr << "functions";
1199 15 : return false;
1200 : }
1201 : return true;
1202 : }
1203 :
1204 61 : static bool checkLockableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1205 61 : if (!D || (!isa<RecordDecl>(D))) {
1206 18 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1207 : << Attr << "structs, unions, and classes";
1208 18 : return false;
1209 : }
1210 : return true;
1211 : }
1212 :
1213 0 : static void matchRulesForLockable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1214 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1215 0 : }
1216 :
1217 149 : static bool checkLocksExcludedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1218 149 : if (!D || (!isa<FunctionDecl>(D))) {
1219 15 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1220 : << Attr << "functions";
1221 15 : return false;
1222 : }
1223 : return true;
1224 : }
1225 :
1226 0 : static unsigned LoopHintAttrSpellingMap(const ParsedAttr &Attr) {
1227 : enum Spelling {
1228 : Pragma_clang_loop = 0,
1229 : Pragma_unroll = 1,
1230 : Pragma_nounroll = 2,
1231 : Pragma_unroll_and_jam = 3,
1232 : Pragma_nounroll_and_jam = 4
1233 : };
1234 :
1235 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
1236 : switch (Idx) {
1237 0 : default: llvm_unreachable("Unknown spelling list index");
1238 : case 0: return Pragma_clang_loop;
1239 : case 1: return Pragma_unroll;
1240 : case 2: return Pragma_nounroll;
1241 : case 3: return Pragma_unroll_and_jam;
1242 : case 4: return Pragma_nounroll_and_jam;
1243 : }
1244 : }
1245 :
1246 113 : static bool checkMicrosoftExtLangOpts(Sema &S, const ParsedAttr &Attr) {
1247 113 : if (S.LangOpts.MicrosoftExt)
1248 : return true;
1249 :
1250 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
1251 0 : return false;
1252 : }
1253 :
1254 58 : static unsigned MSInheritanceAttrSpellingMap(const ParsedAttr &Attr) {
1255 : enum Spelling {
1256 : Keyword_single_inheritance = 0,
1257 : Keyword_multiple_inheritance = 1,
1258 : Keyword_virtual_inheritance = 2,
1259 : Keyword_unspecified_inheritance = 3
1260 : };
1261 :
1262 58 : unsigned Idx = Attr.getAttributeSpellingListIndex();
1263 : switch (Idx) {
1264 0 : default: llvm_unreachable("Unknown spelling list index");
1265 : case 0: return Keyword_single_inheritance;
1266 : case 1: return Keyword_multiple_inheritance;
1267 : case 2: return Keyword_virtual_inheritance;
1268 : case 3: return Keyword_unspecified_inheritance;
1269 : }
1270 : }
1271 :
1272 10 : static bool checkMSNoVTableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1273 10 : if (!D || (!isa<CXXRecordDecl>(D))) {
1274 4 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1275 : << Attr << "classes";
1276 4 : return false;
1277 : }
1278 : return true;
1279 : }
1280 :
1281 75 : static bool checkMSStructAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1282 75 : if (!D || (!isa<RecordDecl>(D))) {
1283 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1284 : << Attr << "structs, unions, and classes";
1285 2 : return false;
1286 : }
1287 : return true;
1288 : }
1289 :
1290 0 : static void matchRulesForMSStruct(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1291 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1292 0 : }
1293 :
1294 7 : static bool checkMicroMipsAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1295 7 : if (!D || (!isa<FunctionDecl>(D))) {
1296 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1297 : << Attr << "functions";
1298 1 : return false;
1299 : }
1300 : return true;
1301 : }
1302 :
1303 56 : static bool isTargetmipsmipsel(const TargetInfo &Target) {
1304 : const llvm::Triple &T = Target.getTriple();
1305 56 : return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel);
1306 : }
1307 :
1308 0 : static void matchRulesForMicroMips(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1309 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1310 0 : }
1311 :
1312 25 : static bool checkMinSizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1313 25 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D))) {
1314 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1315 : << Attr << "functions and Objective-C methods";
1316 1 : return false;
1317 : }
1318 : return true;
1319 : }
1320 :
1321 0 : static void matchRulesForMinSize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1322 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1323 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1324 0 : }
1325 :
1326 492746 : static bool checkMinVectorWidthAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1327 492746 : if (!D || (!isa<FunctionDecl>(D))) {
1328 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1329 : << Attr << "functions";
1330 1 : return false;
1331 : }
1332 : return true;
1333 : }
1334 :
1335 0 : static void matchRulesForMinVectorWidth(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1336 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1337 0 : }
1338 :
1339 14 : static bool checkMips16AppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1340 14 : if (!D || (!isa<FunctionDecl>(D))) {
1341 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1342 : << Attr << "functions";
1343 1 : return false;
1344 : }
1345 : return true;
1346 : }
1347 :
1348 0 : static void matchRulesForMips16(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1349 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1350 0 : }
1351 :
1352 24 : static bool checkMipsLongCallAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1353 24 : if (!D || (!isa<FunctionDecl>(D))) {
1354 4 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1355 : << Attr << "functions";
1356 4 : return false;
1357 : }
1358 : return true;
1359 : }
1360 :
1361 80 : static bool isTargetmipsmipselmips64mips64el(const TargetInfo &Target) {
1362 : const llvm::Triple &T = Target.getTriple();
1363 80 : return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel || T.getArch() == llvm::Triple::mips64 || T.getArch() == llvm::Triple::mips64el);
1364 : }
1365 :
1366 0 : static unsigned MipsLongCallAttrSpellingMap(const ParsedAttr &Attr) {
1367 : enum Spelling {
1368 : GNU_long_call = 0,
1369 : CXX11_gnu_long_call = 1,
1370 : GNU_far = 2,
1371 : CXX11_gnu_far = 3
1372 : };
1373 :
1374 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
1375 : switch (Idx) {
1376 0 : default: llvm_unreachable("Unknown spelling list index");
1377 : case 0: return GNU_long_call;
1378 : case 1: return CXX11_gnu_long_call;
1379 : case 2: return GNU_far;
1380 : case 3: return CXX11_gnu_far;
1381 : }
1382 : }
1383 :
1384 0 : static void matchRulesForMipsLongCall(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1385 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1386 0 : }
1387 :
1388 24 : static bool checkMipsShortCallAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1389 24 : if (!D || (!isa<FunctionDecl>(D))) {
1390 4 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1391 : << Attr << "functions";
1392 4 : return false;
1393 : }
1394 : return true;
1395 : }
1396 :
1397 0 : static unsigned MipsShortCallAttrSpellingMap(const ParsedAttr &Attr) {
1398 : enum Spelling {
1399 : GNU_short_call = 0,
1400 : CXX11_gnu_short_call = 1,
1401 : GNU_near = 2,
1402 : CXX11_gnu_near = 3
1403 : };
1404 :
1405 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
1406 : switch (Idx) {
1407 0 : default: llvm_unreachable("Unknown spelling list index");
1408 : case 0: return GNU_short_call;
1409 : case 1: return CXX11_gnu_short_call;
1410 : case 2: return GNU_near;
1411 : case 3: return CXX11_gnu_near;
1412 : }
1413 : }
1414 :
1415 0 : static void matchRulesForMipsShortCall(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1416 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1417 0 : }
1418 :
1419 26392 : static bool checkModeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1420 26392 : if (!D || (!isa<VarDecl>(D) && !isa<EnumDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<FieldDecl>(D))) {
1421 9 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1422 : << Attr << "variables, enums, typedefs, and non-static data members";
1423 9 : return false;
1424 : }
1425 : return true;
1426 : }
1427 :
1428 112 : static bool checkNSConsumedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1429 112 : if (!D || (!isa<ParmVarDecl>(D))) {
1430 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1431 : << Attr << "parameters";
1432 0 : return false;
1433 : }
1434 : return true;
1435 : }
1436 :
1437 0 : static void matchRulesForNSConsumed(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1438 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
1439 0 : }
1440 :
1441 20 : static bool checkNSConsumesSelfAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1442 20 : if (!D || (!isa<ObjCMethodDecl>(D))) {
1443 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1444 : << Attr << "Objective-C methods";
1445 0 : return false;
1446 : }
1447 : return true;
1448 : }
1449 :
1450 0 : static void matchRulesForNSConsumesSelf(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1451 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1452 0 : }
1453 :
1454 34 : static bool checkNakedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1455 34 : if (!D || (!isa<FunctionDecl>(D))) {
1456 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1457 : << Attr << "functions";
1458 1 : return false;
1459 : }
1460 : return true;
1461 : }
1462 :
1463 0 : static void matchRulesForNaked(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1464 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1465 0 : }
1466 :
1467 2 : static bool checkNoAliasAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1468 2 : if (!D || (!isa<FunctionDecl>(D))) {
1469 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1470 : << Attr << "functions";
1471 0 : return false;
1472 : }
1473 : return true;
1474 : }
1475 :
1476 4 : static bool checkNoCommonAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1477 4 : if (!D || (!isa<VarDecl>(D))) {
1478 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1479 : << Attr << "variables";
1480 0 : return false;
1481 : }
1482 : return true;
1483 : }
1484 :
1485 0 : static void matchRulesForNoCommon(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1486 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1487 0 : }
1488 :
1489 : static bool isNonParmVar(const Decl *D) {
1490 : if (const auto *S = dyn_cast<VarDecl>(D))
1491 7 : return S->getKind() != Decl::ParmVar;
1492 : return false;
1493 : }
1494 :
1495 725186 : static bool checkNoDebugAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1496 1450383 : if (!D || (!isFunctionLike(D) && !isa<ObjCMethodDecl>(D) && !isNonParmVar(D))) {
1497 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1498 : << Attr << "functions, function pointers, Objective-C methods, and variables";
1499 1 : return false;
1500 : }
1501 : return true;
1502 : }
1503 :
1504 0 : static void matchRulesForNoDebug(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1505 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
1506 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1507 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_not_is_parameter, /*IsSupported=*/true));
1508 0 : }
1509 :
1510 19 : static bool checkNoDestroyAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1511 19 : if (!D || (!isa<VarDecl>(D))) {
1512 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1513 : << Attr << "variables";
1514 2 : return false;
1515 : }
1516 : return true;
1517 : }
1518 :
1519 0 : static void matchRulesForNoDestroy(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1520 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1521 0 : }
1522 :
1523 7 : static bool checkNoDuplicateAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1524 7 : if (!D || (!isa<FunctionDecl>(D))) {
1525 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1526 : << Attr << "functions";
1527 1 : return false;
1528 : }
1529 : return true;
1530 : }
1531 :
1532 0 : static void matchRulesForNoDuplicate(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1533 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1534 0 : }
1535 :
1536 94 : static bool checkNoEscapeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1537 94 : if (!D || (!isa<ParmVarDecl>(D))) {
1538 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1539 : << Attr << "parameters";
1540 2 : return false;
1541 : }
1542 : return true;
1543 : }
1544 :
1545 0 : static void matchRulesForNoEscape(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1546 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
1547 0 : }
1548 :
1549 387 : static bool checkNoInlineAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1550 387 : if (!D || (!isa<FunctionDecl>(D))) {
1551 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1552 : << Attr << "functions";
1553 1 : return false;
1554 : }
1555 : return true;
1556 : }
1557 :
1558 0 : static void matchRulesForNoInline(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1559 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1560 0 : }
1561 :
1562 27 : static bool checkNoInstrumentFunctionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1563 27 : if (!D || (!isa<FunctionDecl>(D))) {
1564 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1565 : << Attr << "functions";
1566 0 : return false;
1567 : }
1568 : return true;
1569 : }
1570 :
1571 0 : static void matchRulesForNoInstrumentFunction(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1572 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1573 0 : }
1574 :
1575 4 : static bool checkNoMicroMipsAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1576 4 : if (!D || (!isa<FunctionDecl>(D))) {
1577 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1578 : << Attr << "functions";
1579 1 : return false;
1580 : }
1581 : return true;
1582 : }
1583 :
1584 0 : static void matchRulesForNoMicroMips(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1585 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1586 0 : }
1587 :
1588 7 : static bool checkNoMips16AppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1589 7 : if (!D || (!isa<FunctionDecl>(D))) {
1590 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1591 : << Attr << "functions";
1592 1 : return false;
1593 : }
1594 : return true;
1595 : }
1596 :
1597 0 : static void matchRulesForNoMips16(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1598 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1599 0 : }
1600 :
1601 68943 : static bool checkNoSanitizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1602 68945 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isGlobalVar(D))) {
1603 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1604 : << Attr << "functions, Objective-C methods, and global variables";
1605 0 : return false;
1606 : }
1607 : return true;
1608 : }
1609 :
1610 0 : static void matchRulesForNoSanitize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1611 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1612 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1613 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
1614 0 : }
1615 :
1616 73 : static bool checkNoSanitizeSpecificAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1617 81 : if (!D || (!isa<FunctionDecl>(D) && !isGlobalVar(D))) {
1618 12 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1619 : << Attr << "functions and global variables";
1620 12 : return false;
1621 : }
1622 : return true;
1623 : }
1624 :
1625 0 : static void matchRulesForNoSanitizeSpecific(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1626 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1627 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
1628 0 : }
1629 :
1630 22 : static bool checkNoSplitStackAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1631 22 : if (!D || (!isa<FunctionDecl>(D))) {
1632 6 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1633 : << Attr << "functions";
1634 6 : return false;
1635 : }
1636 : return true;
1637 : }
1638 :
1639 0 : static void matchRulesForNoSplitStack(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1640 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1641 0 : }
1642 :
1643 12 : static bool checkNoStackProtectorAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1644 12 : if (!D || (!isa<FunctionDecl>(D))) {
1645 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1646 : << Attr << "functions";
1647 1 : return false;
1648 : }
1649 : return true;
1650 : }
1651 :
1652 0 : static void matchRulesForNoStackProtector(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1653 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1654 0 : }
1655 :
1656 64 : static bool checkNoThreadSafetyAnalysisAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1657 64 : if (!D || (!isa<FunctionDecl>(D))) {
1658 18 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1659 : << Attr << "functions";
1660 18 : return false;
1661 : }
1662 : return true;
1663 : }
1664 :
1665 0 : static void matchRulesForNoThreadSafetyAnalysis(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1666 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1667 0 : }
1668 :
1669 52164 : static bool checkNoThrowAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1670 52164 : if (!D || (!isa<FunctionDecl>(D))) {
1671 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1672 : << Attr << "functions";
1673 0 : return false;
1674 : }
1675 : return true;
1676 : }
1677 :
1678 0 : static void matchRulesForNoThrow(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1679 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1680 0 : }
1681 :
1682 1028754 : static bool checkNonNullAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1683 1028754 : if (!D || (!isa<ObjCMethodDecl>(D) && !isHasFunctionProto(D) && !isa<ParmVarDecl>(D))) {
1684 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1685 : << Attr << "functions, methods, and parameters";
1686 2 : return false;
1687 : }
1688 : return true;
1689 : }
1690 :
1691 12 : static bool checkNotTailCalledAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1692 12 : if (!D || (!isa<FunctionDecl>(D))) {
1693 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1694 : << Attr << "functions";
1695 1 : return false;
1696 : }
1697 : return true;
1698 : }
1699 :
1700 0 : static void matchRulesForNotTailCalled(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1701 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1702 0 : }
1703 :
1704 57 : static bool checkObjCBoxableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1705 57 : if (!D || (!isa<RecordDecl>(D))) {
1706 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1707 : << Attr << "structs, unions, and classes";
1708 0 : return false;
1709 : }
1710 : return true;
1711 : }
1712 :
1713 0 : static void matchRulesForObjCBoxable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1714 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1715 0 : }
1716 :
1717 71 : static bool checkObjCBridgeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1718 71 : if (!D || (!isa<RecordDecl>(D) && !isa<TypedefNameDecl>(D))) {
1719 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1720 : << Attr << "structs, unions, classes, and typedefs";
1721 2 : return false;
1722 : }
1723 : return true;
1724 : }
1725 :
1726 0 : static void matchRulesForObjCBridge(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1727 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1728 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
1729 0 : }
1730 :
1731 7 : static bool checkObjCBridgeMutableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1732 7 : if (!D || (!isa<RecordDecl>(D))) {
1733 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1734 : << Attr << "structs, unions, and classes";
1735 0 : return false;
1736 : }
1737 : return true;
1738 : }
1739 :
1740 0 : static void matchRulesForObjCBridgeMutable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1741 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1742 0 : }
1743 :
1744 26 : static bool checkObjCBridgeRelatedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1745 26 : if (!D || (!isa<RecordDecl>(D))) {
1746 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1747 : << Attr << "structs, unions, and classes";
1748 0 : return false;
1749 : }
1750 : return true;
1751 : }
1752 :
1753 1 : static void matchRulesForObjCBridgeRelated(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1754 1 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
1755 1 : }
1756 :
1757 36 : static bool isObjCInterfaceDeclInitMethod(const Decl *D) {
1758 : if (const auto *S = dyn_cast<ObjCMethodDecl>(D))
1759 68 : return S->getMethodFamily() == OMF_init &&
1760 9 : (isa<ObjCInterfaceDecl>(S->getDeclContext()) ||
1761 6 : (isa<ObjCCategoryDecl>(S->getDeclContext()) &&
1762 : cast<ObjCCategoryDecl>(S->getDeclContext())->IsClassExtension()));
1763 : return false;
1764 : }
1765 :
1766 36 : static bool checkObjCDesignatedInitializerAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1767 36 : if (!D || (!isObjCInterfaceDeclInitMethod(D))) {
1768 8 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1769 : << Attr << "init methods of interface or class extension declarations";
1770 8 : return false;
1771 : }
1772 : return true;
1773 : }
1774 :
1775 31 : static bool checkObjCExceptionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1776 31 : if (!D || (!isa<ObjCInterfaceDecl>(D))) {
1777 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1778 : << Attr << "Objective-C interfaces";
1779 2 : return false;
1780 : }
1781 : return true;
1782 : }
1783 :
1784 0 : static void matchRulesForObjCException(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1785 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
1786 0 : }
1787 :
1788 14 : static bool checkObjCExplicitProtocolImplAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1789 14 : if (!D || (!isa<ObjCProtocolDecl>(D))) {
1790 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1791 : << Attr << "Objective-C protocols";
1792 2 : return false;
1793 : }
1794 : return true;
1795 : }
1796 :
1797 0 : static void matchRulesForObjCExplicitProtocolImpl(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1798 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC1));
1799 0 : }
1800 :
1801 13 : static bool checkObjCMethodFamilyAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1802 13 : if (!D || (!isa<ObjCMethodDecl>(D))) {
1803 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1804 : << Attr << "Objective-C methods";
1805 0 : return false;
1806 : }
1807 : return true;
1808 : }
1809 :
1810 0 : static void matchRulesForObjCMethodFamily(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1811 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1812 0 : }
1813 :
1814 10 : static bool checkObjCPreciseLifetimeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1815 10 : if (!D || (!isa<VarDecl>(D))) {
1816 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1817 : << Attr << "variables";
1818 0 : return false;
1819 : }
1820 : return true;
1821 : }
1822 :
1823 0 : static void matchRulesForObjCPreciseLifetime(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1824 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1825 0 : }
1826 :
1827 10 : static bool checkObjCRequiresPropertyDefsAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1828 10 : if (!D || (!isa<ObjCInterfaceDecl>(D))) {
1829 4 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1830 : << Attr << "Objective-C interfaces";
1831 4 : return false;
1832 : }
1833 : return true;
1834 : }
1835 :
1836 0 : static void matchRulesForObjCRequiresPropertyDefs(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1837 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
1838 0 : }
1839 :
1840 53 : static bool checkObjCRequiresSuperAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1841 53 : if (!D || (!isa<ObjCMethodDecl>(D))) {
1842 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1843 : << Attr << "Objective-C methods";
1844 0 : return false;
1845 : }
1846 : return true;
1847 : }
1848 :
1849 0 : static void matchRulesForObjCRequiresSuper(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1850 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1851 0 : }
1852 :
1853 28 : static bool checkObjCReturnsInnerPointerAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1854 28 : if (!D || (!isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D))) {
1855 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1856 : << Attr << "Objective-C methods and Objective-C properties";
1857 1 : return false;
1858 : }
1859 : return true;
1860 : }
1861 :
1862 0 : static void matchRulesForObjCReturnsInnerPointer(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1863 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
1864 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC1));
1865 0 : }
1866 :
1867 165 : static bool checkObjCRootClassAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1868 165 : if (!D || (!isa<ObjCInterfaceDecl>(D))) {
1869 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1870 : << Attr << "Objective-C interfaces";
1871 1 : return false;
1872 : }
1873 : return true;
1874 : }
1875 :
1876 0 : static void matchRulesForObjCRootClass(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1877 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
1878 0 : }
1879 :
1880 36 : static bool checkObjCRuntimeNameAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1881 36 : if (!D || (!isa<ObjCInterfaceDecl>(D) && !isa<ObjCProtocolDecl>(D))) {
1882 6 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1883 : << Attr << "Objective-C interfaces and Objective-C protocols";
1884 6 : return false;
1885 : }
1886 : return true;
1887 : }
1888 :
1889 0 : static void matchRulesForObjCRuntimeName(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1890 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
1891 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC1));
1892 0 : }
1893 :
1894 4 : static bool checkObjCRuntimeVisibleAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1895 4 : if (!D || (!isa<ObjCInterfaceDecl>(D))) {
1896 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1897 : << Attr << "Objective-C interfaces";
1898 0 : return false;
1899 : }
1900 : return true;
1901 : }
1902 :
1903 0 : static void matchRulesForObjCRuntimeVisible(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1904 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
1905 0 : }
1906 :
1907 15 : static bool checkObjCSubclassingRestrictedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1908 15 : if (!D || (!isa<ObjCInterfaceDecl>(D))) {
1909 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1910 : << Attr << "Objective-C interfaces";
1911 0 : return false;
1912 : }
1913 : return true;
1914 : }
1915 :
1916 8 : static void matchRulesForObjCSubclassingRestricted(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1917 16 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC1));
1918 8 : }
1919 :
1920 6893 : static bool checkOpenCLAccessAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1921 6893 : if (!D || (!isa<ParmVarDecl>(D) && !isa<TypedefNameDecl>(D))) {
1922 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1923 : << Attr << "parameters and typedefs";
1924 0 : return false;
1925 : }
1926 : return true;
1927 : }
1928 :
1929 6884 : static unsigned OpenCLAccessAttrSpellingMap(const ParsedAttr &Attr) {
1930 : enum Spelling {
1931 : Keyword_read_only = 0,
1932 : Keyword_write_only = 2,
1933 : Keyword_read_write = 4
1934 : };
1935 :
1936 6884 : unsigned Idx = Attr.getAttributeSpellingListIndex();
1937 : switch (Idx) {
1938 0 : default: llvm_unreachable("Unknown spelling list index");
1939 : case 0: return Keyword_read_only;
1940 : case 1: return Keyword_read_only;
1941 : case 2: return Keyword_write_only;
1942 : case 3: return Keyword_write_only;
1943 : case 4: return Keyword_read_write;
1944 : case 5: return Keyword_read_write;
1945 : }
1946 : }
1947 :
1948 6 : static bool checkOpenCLIntelReqdSubGroupSizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1949 6 : if (!D || (!isa<FunctionDecl>(D))) {
1950 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1951 : << Attr << "functions";
1952 0 : return false;
1953 : }
1954 : return true;
1955 : }
1956 :
1957 0 : static void matchRulesForOpenCLIntelReqdSubGroupSize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1958 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1959 0 : }
1960 :
1961 594 : static bool checkOpenCLKernelAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1962 594 : if (!D || (!isa<FunctionDecl>(D))) {
1963 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1964 : << Attr << "functions";
1965 2 : return false;
1966 : }
1967 : return true;
1968 : }
1969 :
1970 4 : static bool checkOpenCLNoSVMAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1971 4 : if (!D || (!isa<VarDecl>(D))) {
1972 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1973 : << Attr << "variables";
1974 2 : return false;
1975 : }
1976 : return true;
1977 : }
1978 :
1979 5 : static bool checkOpenCLLangOpts(Sema &S, const ParsedAttr &Attr) {
1980 5 : if (S.LangOpts.OpenCL)
1981 : return true;
1982 :
1983 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
1984 1 : return false;
1985 : }
1986 :
1987 0 : static void matchRulesForOpenCLNoSVM(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
1988 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1989 0 : }
1990 :
1991 79 : static bool checkOptimizeNoneAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
1992 79 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D))) {
1993 6 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1994 : << Attr << "functions and Objective-C methods";
1995 6 : return false;
1996 : }
1997 : return true;
1998 : }
1999 :
2000 1 : static void matchRulesForOptimizeNone(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2001 1 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2002 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
2003 1 : }
2004 :
2005 290326 : static bool checkOverloadableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2006 290326 : if (!D || (!isa<FunctionDecl>(D))) {
2007 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2008 : << Attr << "functions";
2009 1 : return false;
2010 : }
2011 : return true;
2012 : }
2013 :
2014 0 : static void matchRulesForOverloadable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2015 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2016 0 : }
2017 :
2018 52 : static bool checkOwnershipAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2019 52 : if (!D || (!isHasFunctionProto(D))) {
2020 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2021 : << Attr << "non-K&R-style functions";
2022 3 : return false;
2023 : }
2024 : return true;
2025 : }
2026 :
2027 0 : static unsigned OwnershipAttrSpellingMap(const ParsedAttr &Attr) {
2028 : enum Spelling {
2029 : GNU_ownership_holds = 0,
2030 : CXX11_clang_ownership_holds = 1,
2031 : C2x_clang_ownership_holds = 2,
2032 : GNU_ownership_returns = 3,
2033 : CXX11_clang_ownership_returns = 4,
2034 : C2x_clang_ownership_returns = 5,
2035 : GNU_ownership_takes = 6,
2036 : CXX11_clang_ownership_takes = 7,
2037 : C2x_clang_ownership_takes = 8
2038 : };
2039 :
2040 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2041 : switch (Idx) {
2042 0 : default: llvm_unreachable("Unknown spelling list index");
2043 : case 0: return GNU_ownership_holds;
2044 : case 1: return CXX11_clang_ownership_holds;
2045 : case 2: return C2x_clang_ownership_holds;
2046 : case 3: return GNU_ownership_returns;
2047 : case 4: return CXX11_clang_ownership_returns;
2048 : case 5: return C2x_clang_ownership_returns;
2049 : case 6: return GNU_ownership_takes;
2050 : case 7: return CXX11_clang_ownership_takes;
2051 : case 8: return C2x_clang_ownership_takes;
2052 : }
2053 : }
2054 :
2055 7 : static bool checkParamTypestateAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2056 7 : if (!D || (!isa<ParmVarDecl>(D))) {
2057 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2058 : << Attr << "parameters";
2059 0 : return false;
2060 : }
2061 : return true;
2062 : }
2063 :
2064 0 : static void matchRulesForParamTypestate(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2065 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2066 0 : }
2067 :
2068 114 : static bool checkPassObjectSizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2069 114 : if (!D || (!isa<ParmVarDecl>(D))) {
2070 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2071 : << Attr << "parameters";
2072 0 : return false;
2073 : }
2074 : return true;
2075 : }
2076 :
2077 0 : static void matchRulesForPassObjectSize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2078 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2079 0 : }
2080 :
2081 0 : static bool checkPragmaClangBSSSectionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2082 0 : if (!D || (!isGlobalVar(D))) {
2083 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2084 : << Attr << "global variables";
2085 0 : return false;
2086 : }
2087 : return true;
2088 : }
2089 :
2090 0 : static bool checkPragmaClangDataSectionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2091 0 : if (!D || (!isGlobalVar(D))) {
2092 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2093 : << Attr << "global variables";
2094 0 : return false;
2095 : }
2096 : return true;
2097 : }
2098 :
2099 0 : static bool checkPragmaClangRodataSectionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2100 0 : if (!D || (!isGlobalVar(D))) {
2101 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2102 : << Attr << "global variables";
2103 0 : return false;
2104 : }
2105 : return true;
2106 : }
2107 :
2108 0 : static bool checkPragmaClangTextSectionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2109 0 : if (!D || (!isa<FunctionDecl>(D))) {
2110 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2111 : << Attr << "functions";
2112 0 : return false;
2113 : }
2114 : return true;
2115 : }
2116 :
2117 161 : static bool checkPtGuardedByAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2118 161 : if (!D || (!isa<FieldDecl>(D) && !isSharedVar(D))) {
2119 20 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2120 : << Attr << "non-static data members and global variables";
2121 20 : return false;
2122 : }
2123 : return true;
2124 : }
2125 :
2126 47 : static bool checkPtGuardedVarAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2127 47 : if (!D || (!isa<FieldDecl>(D) && !isSharedVar(D))) {
2128 20 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2129 : << Attr << "non-static data members and global variables";
2130 20 : return false;
2131 : }
2132 : return true;
2133 : }
2134 :
2135 11 : static bool isNonStaticNonConstCXXMethod(const Decl *D) {
2136 : if (const auto *S = dyn_cast<CXXMethodDecl>(D))
2137 8 : return !S->isStatic() && !S->isConst();
2138 : return false;
2139 : }
2140 :
2141 11 : static bool checkReinitializesAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2142 11 : if (!D || (!isNonStaticNonConstCXXMethod(D))) {
2143 5 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2144 : << Attr << "non-static non-const member functions";
2145 5 : return false;
2146 : }
2147 : return true;
2148 : }
2149 :
2150 415 : static bool checkReleaseCapabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2151 415 : if (!D || (!isa<FunctionDecl>(D))) {
2152 13 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2153 : << Attr << "functions";
2154 13 : return false;
2155 : }
2156 : return true;
2157 : }
2158 :
2159 0 : static unsigned ReleaseCapabilityAttrSpellingMap(const ParsedAttr &Attr) {
2160 : enum Spelling {
2161 : GNU_release_capability = 0,
2162 : CXX11_clang_release_capability = 1,
2163 : GNU_release_shared_capability = 2,
2164 : CXX11_clang_release_shared_capability = 3,
2165 : GNU_release_generic_capability = 4,
2166 : CXX11_clang_release_generic_capability = 5,
2167 : GNU_unlock_function = 6,
2168 : CXX11_clang_unlock_function = 7
2169 : };
2170 :
2171 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2172 : switch (Idx) {
2173 0 : default: llvm_unreachable("Unknown spelling list index");
2174 : case 0: return GNU_release_capability;
2175 : case 1: return CXX11_clang_release_capability;
2176 : case 2: return GNU_release_shared_capability;
2177 : case 3: return CXX11_clang_release_shared_capability;
2178 : case 4: return GNU_release_generic_capability;
2179 : case 5: return CXX11_clang_release_generic_capability;
2180 : case 6: return GNU_unlock_function;
2181 : case 7: return CXX11_clang_unlock_function;
2182 : }
2183 : }
2184 :
2185 2 : static bool checkRenderScriptKernelAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2186 2 : if (!D || (!isa<FunctionDecl>(D))) {
2187 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2188 : << Attr << "functions";
2189 1 : return false;
2190 : }
2191 : return true;
2192 : }
2193 :
2194 4 : static bool checkRenderScriptLangOpts(Sema &S, const ParsedAttr &Attr) {
2195 4 : if (S.LangOpts.RenderScript)
2196 : return true;
2197 :
2198 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
2199 2 : return false;
2200 : }
2201 :
2202 0 : static void matchRulesForRenderScriptKernel(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2203 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2204 0 : }
2205 :
2206 15 : static bool checkReqdWorkGroupSizeAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2207 15 : if (!D || (!isa<FunctionDecl>(D))) {
2208 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2209 : << Attr << "functions";
2210 1 : return false;
2211 : }
2212 : return true;
2213 : }
2214 :
2215 0 : static void matchRulesForReqdWorkGroupSize(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2216 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2217 0 : }
2218 :
2219 184 : static bool checkRequireConstantInitAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2220 362 : if (!D || (!isGlobalVar(D))) {
2221 12 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2222 : << Attr << "global variables";
2223 12 : return false;
2224 : }
2225 : return true;
2226 : }
2227 :
2228 2 : static void matchRulesForRequireConstantInit(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2229 2 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
2230 2 : }
2231 :
2232 727 : static bool checkRequiresCapabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2233 727 : if (!D || (!isa<FunctionDecl>(D))) {
2234 30 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2235 : << Attr << "functions";
2236 30 : return false;
2237 : }
2238 : return true;
2239 : }
2240 :
2241 0 : static unsigned RequiresCapabilityAttrSpellingMap(const ParsedAttr &Attr) {
2242 : enum Spelling {
2243 : GNU_requires_capability = 0,
2244 : CXX11_clang_requires_capability = 1,
2245 : GNU_exclusive_locks_required = 2,
2246 : CXX11_clang_exclusive_locks_required = 3,
2247 : GNU_requires_shared_capability = 4,
2248 : CXX11_clang_requires_shared_capability = 5,
2249 : GNU_shared_locks_required = 6,
2250 : CXX11_clang_shared_locks_required = 7
2251 : };
2252 :
2253 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2254 : switch (Idx) {
2255 0 : default: llvm_unreachable("Unknown spelling list index");
2256 : case 0: return GNU_requires_capability;
2257 : case 1: return CXX11_clang_requires_capability;
2258 : case 2: return GNU_exclusive_locks_required;
2259 : case 3: return CXX11_clang_exclusive_locks_required;
2260 : case 4: return GNU_requires_shared_capability;
2261 : case 5: return CXX11_clang_requires_shared_capability;
2262 : case 6: return GNU_shared_locks_required;
2263 : case 7: return CXX11_clang_shared_locks_required;
2264 : }
2265 : }
2266 :
2267 58498 : static bool checkRestrictAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2268 58498 : if (!D || (!isa<FunctionDecl>(D))) {
2269 11 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2270 : << Attr << "functions";
2271 11 : return false;
2272 : }
2273 : return true;
2274 : }
2275 :
2276 0 : static unsigned RestrictAttrSpellingMap(const ParsedAttr &Attr) {
2277 : enum Spelling {
2278 : Declspec_restrict = 0,
2279 : GNU_malloc = 1,
2280 : CXX11_gnu_malloc = 2
2281 : };
2282 :
2283 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2284 : switch (Idx) {
2285 0 : default: llvm_unreachable("Unknown spelling list index");
2286 : case 0: return Declspec_restrict;
2287 : case 1: return GNU_malloc;
2288 : case 2: return CXX11_gnu_malloc;
2289 : }
2290 : }
2291 :
2292 0 : static void matchRulesForRestrict(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2293 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2294 0 : }
2295 :
2296 13 : static bool checkReturnTypestateAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2297 13 : if (!D || (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D))) {
2298 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2299 : << Attr << "functions and parameters";
2300 1 : return false;
2301 : }
2302 : return true;
2303 : }
2304 :
2305 0 : static void matchRulesForReturnTypestate(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2306 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2307 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2308 0 : }
2309 :
2310 28 : static bool checkReturnsNonNullAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2311 28 : if (!D || (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D))) {
2312 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2313 : << Attr << "Objective-C methods and functions";
2314 2 : return false;
2315 : }
2316 : return true;
2317 : }
2318 :
2319 0 : static void matchRulesForReturnsNonNull(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2320 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
2321 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2322 0 : }
2323 :
2324 12 : static bool checkReturnsTwiceAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2325 12 : if (!D || (!isa<FunctionDecl>(D))) {
2326 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2327 : << Attr << "functions";
2328 2 : return false;
2329 : }
2330 : return true;
2331 : }
2332 :
2333 0 : static void matchRulesForReturnsTwice(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2334 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2335 0 : }
2336 :
2337 82 : static bool checkScopedLockableAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2338 82 : if (!D || (!isa<RecordDecl>(D))) {
2339 18 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2340 : << Attr << "structs, unions, and classes";
2341 18 : return false;
2342 : }
2343 : return true;
2344 : }
2345 :
2346 0 : static void matchRulesForScopedLockable(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2347 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2348 0 : }
2349 :
2350 79 : static bool checkSectionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2351 137 : if (!D || (!isa<FunctionDecl>(D) && !isGlobalVar(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D))) {
2352 4 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2353 : << Attr << "functions, global variables, Objective-C methods, and Objective-C properties";
2354 4 : return false;
2355 : }
2356 : return true;
2357 : }
2358 :
2359 0 : static unsigned SectionAttrSpellingMap(const ParsedAttr &Attr) {
2360 : enum Spelling {
2361 : GNU_section = 0,
2362 : CXX11_gnu_section = 1,
2363 : Declspec_allocate = 2
2364 : };
2365 :
2366 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2367 : switch (Idx) {
2368 0 : default: llvm_unreachable("Unknown spelling list index");
2369 : case 0: return GNU_section;
2370 : case 1: return CXX11_gnu_section;
2371 : case 2: return Declspec_allocate;
2372 : }
2373 : }
2374 :
2375 0 : static void matchRulesForSection(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2376 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2377 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
2378 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
2379 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC1));
2380 0 : }
2381 :
2382 13 : static bool checkSetTypestateAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2383 13 : if (!D || (!isa<CXXMethodDecl>(D))) {
2384 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2385 : << Attr << "functions";
2386 2 : return false;
2387 : }
2388 : return true;
2389 : }
2390 :
2391 0 : static void matchRulesForSetTypestate(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2392 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus));
2393 0 : }
2394 :
2395 88 : static bool checkSharedTrylockFunctionAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2396 88 : if (!D || (!isa<FunctionDecl>(D))) {
2397 15 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2398 : << Attr << "functions";
2399 15 : return false;
2400 : }
2401 : return true;
2402 : }
2403 :
2404 58 : static bool checkSwiftContextAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2405 58 : if (!D || (!isa<ParmVarDecl>(D))) {
2406 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2407 : << Attr << "parameters";
2408 0 : return false;
2409 : }
2410 : return true;
2411 : }
2412 :
2413 0 : static void matchRulesForSwiftContext(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2414 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2415 0 : }
2416 :
2417 34 : static bool checkSwiftErrorResultAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2418 34 : if (!D || (!isa<ParmVarDecl>(D))) {
2419 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2420 : << Attr << "parameters";
2421 0 : return false;
2422 : }
2423 : return true;
2424 : }
2425 :
2426 0 : static void matchRulesForSwiftErrorResult(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2427 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2428 0 : }
2429 :
2430 68 : static bool checkSwiftIndirectResultAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2431 68 : if (!D || (!isa<ParmVarDecl>(D))) {
2432 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2433 : << Attr << "parameters";
2434 0 : return false;
2435 : }
2436 : return true;
2437 : }
2438 :
2439 0 : static void matchRulesForSwiftIndirectResult(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2440 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2441 0 : }
2442 :
2443 : static bool isTLSVar(const Decl *D) {
2444 : if (const auto *S = dyn_cast<VarDecl>(D))
2445 20 : return S->getTLSKind() != 0;
2446 : return false;
2447 : }
2448 :
2449 19 : static bool checkTLSModelAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2450 37 : if (!D || (!isTLSVar(D))) {
2451 2 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2452 : << Attr << "thread-local variables";
2453 2 : return false;
2454 : }
2455 : return true;
2456 : }
2457 :
2458 0 : static void matchRulesForTLSModel(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2459 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_thread_local, /*IsSupported=*/true));
2460 0 : }
2461 :
2462 518720 : static bool checkTargetAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2463 518720 : if (!D || (!isa<FunctionDecl>(D))) {
2464 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2465 : << Attr << "functions";
2466 0 : return false;
2467 : }
2468 : return true;
2469 : }
2470 :
2471 0 : static void matchRulesForTarget(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2472 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2473 0 : }
2474 :
2475 9 : static bool checkTestTypestateAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2476 9 : if (!D || (!isa<CXXMethodDecl>(D))) {
2477 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2478 : << Attr << "functions";
2479 2 : return false;
2480 : }
2481 : return true;
2482 : }
2483 :
2484 0 : static void matchRulesForTestTypestate(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2485 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus));
2486 0 : }
2487 :
2488 55 : static bool checkThreadAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2489 55 : if (!D || (!isa<VarDecl>(D))) {
2490 4 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2491 : << Attr << "variables";
2492 4 : return false;
2493 : }
2494 : return true;
2495 : }
2496 :
2497 54 : static bool checkNotCPlusPlusLangOpts(Sema &S, const ParsedAttr &Attr) {
2498 54 : if (!S.LangOpts.CPlusPlus)
2499 : return true;
2500 :
2501 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
2502 3 : return false;
2503 : }
2504 :
2505 33 : static bool checkTrivialABIAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2506 33 : if (!D || (!isa<CXXRecordDecl>(D))) {
2507 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2508 : << Attr << "classes";
2509 1 : return false;
2510 : }
2511 : return true;
2512 : }
2513 :
2514 0 : static void matchRulesForTrivialABI(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2515 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2516 0 : }
2517 :
2518 35 : static bool checkTryAcquireCapabilityAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2519 35 : if (!D || (!isa<FunctionDecl>(D))) {
2520 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2521 : << Attr << "functions";
2522 1 : return false;
2523 : }
2524 : return true;
2525 : }
2526 :
2527 0 : static unsigned TryAcquireCapabilityAttrSpellingMap(const ParsedAttr &Attr) {
2528 : enum Spelling {
2529 : GNU_try_acquire_capability = 0,
2530 : CXX11_clang_try_acquire_capability = 1,
2531 : GNU_try_acquire_shared_capability = 2,
2532 : CXX11_clang_try_acquire_shared_capability = 3
2533 : };
2534 :
2535 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2536 : switch (Idx) {
2537 0 : default: llvm_unreachable("Unknown spelling list index");
2538 : case 0: return GNU_try_acquire_capability;
2539 : case 1: return CXX11_clang_try_acquire_capability;
2540 : case 2: return GNU_try_acquire_shared_capability;
2541 : case 3: return CXX11_clang_try_acquire_shared_capability;
2542 : }
2543 : }
2544 :
2545 1367 : static bool checkUnusedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2546 1589 : if (!D || (!isa<VarDecl>(D) && !isa<ObjCIvarDecl>(D) && !isa<TypeDecl>(D) && !isa<EnumDecl>(D) && !isa<EnumConstantDecl>(D) && !isa<LabelDecl>(D) && !isa<FieldDecl>(D) && !isa<ObjCMethodDecl>(D) && !isFunctionLike(D))) {
2547 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2548 : << Attr << "variables, non-static data members, types, enums, enumerators, labels, non-static data members, Objective-C methods, functions, and function pointers";
2549 1 : return false;
2550 : }
2551 : return true;
2552 : }
2553 :
2554 0 : static unsigned UnusedAttrSpellingMap(const ParsedAttr &Attr) {
2555 : enum Spelling {
2556 : CXX11_maybe_unused = 0,
2557 : GNU_unused = 1,
2558 : CXX11_gnu_unused = 2,
2559 : C2x_maybe_unused = 3
2560 : };
2561 :
2562 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2563 : switch (Idx) {
2564 0 : default: llvm_unreachable("Unknown spelling list index");
2565 : case 0: return CXX11_maybe_unused;
2566 : case 1: return GNU_unused;
2567 : case 2: return CXX11_gnu_unused;
2568 : case 3: return C2x_maybe_unused;
2569 : }
2570 : }
2571 :
2572 : static bool isNonLocalVar(const Decl *D) {
2573 : if (const auto *S = dyn_cast<VarDecl>(D))
2574 45 : return !S->hasLocalStorage();
2575 : return false;
2576 : }
2577 :
2578 107 : static bool checkUsedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2579 214 : if (!D || (!isNonLocalVar(D) && !isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D))) {
2580 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2581 : << Attr << "variables with non-local storage, functions, and Objective-C methods";
2582 2 : return false;
2583 : }
2584 : return true;
2585 : }
2586 :
2587 136 : static bool checkUuidAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2588 136 : if (!D || (!isa<RecordDecl>(D) && !isa<EnumDecl>(D))) {
2589 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2590 : << Attr << "structs, unions, classes, and enums";
2591 3 : return false;
2592 : }
2593 : return true;
2594 : }
2595 :
2596 136 : static bool checkMicrosoftExtBorlandLangOpts(Sema &S, const ParsedAttr &Attr) {
2597 136 : if (S.LangOpts.MicrosoftExt || S.LangOpts.Borland)
2598 : return true;
2599 :
2600 0 : S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
2601 0 : return false;
2602 : }
2603 :
2604 11 : static bool checkVecReturnAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2605 11 : if (!D || (!isa<CXXRecordDecl>(D))) {
2606 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2607 : << Attr << "classes";
2608 0 : return false;
2609 : }
2610 : return true;
2611 : }
2612 :
2613 0 : static void matchRulesForVecReturn(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2614 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2615 0 : }
2616 :
2617 10 : static bool checkVecTypeHintAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2618 10 : if (!D || (!isa<FunctionDecl>(D))) {
2619 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2620 : << Attr << "functions";
2621 1 : return false;
2622 : }
2623 : return true;
2624 : }
2625 :
2626 0 : static void matchRulesForVecTypeHint(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2627 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2628 0 : }
2629 :
2630 7 : static bool checkWarnUnusedAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2631 7 : if (!D || (!isa<RecordDecl>(D))) {
2632 1 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2633 : << Attr << "structs, unions, and classes";
2634 1 : return false;
2635 : }
2636 : return true;
2637 : }
2638 :
2639 0 : static void matchRulesForWarnUnused(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2640 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2641 0 : }
2642 :
2643 117985 : static bool checkWarnUnusedResultAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2644 235944 : if (!D || (!isa<ObjCMethodDecl>(D) && !isa<EnumDecl>(D) && !isa<RecordDecl>(D) && !isFunctionLike(D))) {
2645 3 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2646 : << Attr << "Objective-C methods, enums, structs, unions, classes, functions, and function pointers";
2647 3 : return false;
2648 : }
2649 : return true;
2650 : }
2651 :
2652 0 : static unsigned WarnUnusedResultAttrSpellingMap(const ParsedAttr &Attr) {
2653 : enum Spelling {
2654 : CXX11_nodiscard = 0,
2655 : C2x_nodiscard = 1,
2656 : CXX11_clang_warn_unused_result = 2,
2657 : GNU_warn_unused_result = 3,
2658 : CXX11_gnu_warn_unused_result = 4
2659 : };
2660 :
2661 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2662 : switch (Idx) {
2663 0 : default: llvm_unreachable("Unknown spelling list index");
2664 : case 0: return CXX11_nodiscard;
2665 : case 1: return C2x_nodiscard;
2666 : case 2: return CXX11_clang_warn_unused_result;
2667 : case 3: return GNU_warn_unused_result;
2668 : case 4: return CXX11_gnu_warn_unused_result;
2669 : }
2670 : }
2671 :
2672 0 : static void matchRulesForWarnUnusedResult(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2673 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
2674 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
2675 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2676 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
2677 0 : }
2678 :
2679 1209 : static bool checkWeakAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2680 1209 : if (!D || (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D))) {
2681 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2682 : << Attr << "variables, functions, and classes";
2683 2 : return false;
2684 : }
2685 : return true;
2686 : }
2687 :
2688 0 : static void matchRulesForWeak(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2689 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
2690 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2691 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2692 0 : }
2693 :
2694 2392 : static bool checkWeakRefAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2695 2392 : if (!D || (!isa<VarDecl>(D) && !isa<FunctionDecl>(D))) {
2696 0 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2697 : << Attr << "variables and functions";
2698 0 : return false;
2699 : }
2700 : return true;
2701 : }
2702 :
2703 0 : static void matchRulesForWeakRef(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2704 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
2705 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2706 0 : }
2707 :
2708 8 : static bool checkWorkGroupSizeHintAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2709 8 : if (!D || (!isa<FunctionDecl>(D))) {
2710 1 : S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2711 : << Attr << "functions";
2712 1 : return false;
2713 : }
2714 : return true;
2715 : }
2716 :
2717 0 : static void matchRulesForWorkGroupSizeHint(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2718 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2719 0 : }
2720 :
2721 85 : static bool checkXRayInstrumentAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2722 85 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D))) {
2723 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2724 : << Attr << "functions and Objective-C methods";
2725 2 : return false;
2726 : }
2727 : return true;
2728 : }
2729 :
2730 0 : static unsigned XRayInstrumentAttrSpellingMap(const ParsedAttr &Attr) {
2731 : enum Spelling {
2732 : GNU_xray_always_instrument = 0,
2733 : CXX11_clang_xray_always_instrument = 1,
2734 : C2x_clang_xray_always_instrument = 2,
2735 : GNU_xray_never_instrument = 3,
2736 : CXX11_clang_xray_never_instrument = 4,
2737 : C2x_clang_xray_never_instrument = 5
2738 : };
2739 :
2740 0 : unsigned Idx = Attr.getAttributeSpellingListIndex();
2741 : switch (Idx) {
2742 0 : default: llvm_unreachable("Unknown spelling list index");
2743 : case 0: return GNU_xray_always_instrument;
2744 : case 1: return CXX11_clang_xray_always_instrument;
2745 : case 2: return C2x_clang_xray_always_instrument;
2746 : case 3: return GNU_xray_never_instrument;
2747 : case 4: return CXX11_clang_xray_never_instrument;
2748 : case 5: return C2x_clang_xray_never_instrument;
2749 : }
2750 : }
2751 :
2752 0 : static void matchRulesForXRayInstrument(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2753 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2754 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
2755 0 : }
2756 :
2757 19 : static bool checkXRayLogArgsAppertainsTo(Sema &S, const ParsedAttr &Attr, const Decl *D) {
2758 19 : if (!D || (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D))) {
2759 2 : S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2760 : << Attr << "functions and Objective-C methods";
2761 2 : return false;
2762 : }
2763 : return true;
2764 : }
2765 :
2766 0 : static void matchRulesForXRayLogArgs(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) {
2767 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2768 0 : MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC1));
2769 0 : }
2770 :
2771 : static const ParsedAttrInfo AttrInfoMap[ParsedAttr::UnknownAttribute + 1] = {
2772 : { 2, 0, 0, 0, 0, 0, 0, 1, checkAMDGPUFlatWorkGroupSizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAMDGPUFlatWorkGroupSize }, // AT_AMDGPUFlatWorkGroupSize
2773 : { 1, 0, 0, 0, 0, 0, 0, 1, checkAMDGPUNumSGPRAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAMDGPUNumSGPR }, // AT_AMDGPUNumSGPR
2774 : { 1, 0, 0, 0, 0, 0, 0, 1, checkAMDGPUNumVGPRAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAMDGPUNumVGPR }, // AT_AMDGPUNumVGPR
2775 : { 1, 1, 0, 0, 0, 0, 0, 1, checkAMDGPUWavesPerEUAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAMDGPUWavesPerEU }, // AT_AMDGPUWavesPerEU
2776 : { 0, 1, 1, 1, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, isTargetarmthumbarmebthumbebavrx86x86_64msp430mipsmipselriscv32riscv64, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Interrupt
2777 : { 0, 0, 0, 1, 0, 0, 1, 1, checkAVRSignalAppertainsTo, defaultDiagnoseLangOpts, isTargetavr, defaultSpellingIndexToSemanticSpelling, matchRulesForAVRSignal }, // AT_AVRSignal
2778 : { 0, 15, 0, 0, 0, 0, 1, 1, checkAbiTagAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAbiTag }, // AT_AbiTag
2779 : { 0, 15, 0, 0, 0, 0, 0, 0, checkAcquireCapabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, AcquireCapabilityAttrSpellingMap, nullptr }, // AT_AcquireCapability
2780 : { 0, 15, 0, 0, 0, 0, 0, 0, checkAcquiredAfterAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AcquiredAfter
2781 : { 0, 15, 0, 0, 0, 0, 0, 0, checkAcquiredBeforeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AcquiredBefore
2782 : { 1, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AddressSpace
2783 : { 1, 0, 0, 0, 0, 0, 1, 1, checkAliasAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAlias }, // AT_Alias
2784 : { 1, 0, 0, 0, 0, 0, 0, 1, checkAlignValueAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAlignValue }, // AT_AlignValue
2785 : { 0, 1, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, AlignedAttrSpellingMap, nullptr }, // AT_Aligned
2786 : { 1, 0, 0, 0, 0, 0, 1, 0, checkAllocAlignAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AllocAlign
2787 : { 1, 1, 0, 0, 0, 0, 1, 1, checkAllocSizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAllocSize }, // AT_AllocSize
2788 : { 0, 0, 0, 0, 0, 0, 0, 1, checkAlwaysDestroyAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAlwaysDestroy }, // AT_AlwaysDestroy
2789 : { 0, 0, 0, 0, 0, 0, 1, 1, checkAlwaysInlineAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, AlwaysInlineAttrSpellingMap, matchRulesForAlwaysInline }, // AT_AlwaysInline
2790 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AnalyzerNoReturn
2791 : { 1, 0, 0, 0, 0, 0, 0, 1, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAnnotate }, // AT_Annotate
2792 : { 0, 0, 0, 1, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AnyX86NoCallerSavedRegisters
2793 : { 0, 0, 0, 1, 1, 0, 1, 1, checkAnyX86NoCfCheckAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64, defaultSpellingIndexToSemanticSpelling, matchRulesForAnyX86NoCfCheck }, // AT_AnyX86NoCfCheck
2794 : { 0, 0, 0, 0, 0, 0, 0, 1, checkArcWeakrefUnavailableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForArcWeakrefUnavailable }, // AT_ArcWeakrefUnavailable
2795 : { 3, 0, 0, 0, 0, 0, 0, 0, checkArgumentWithTypeTagAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, ArgumentWithTypeTagAttrSpellingMap, nullptr }, // AT_ArgumentWithTypeTag
2796 : { 0, 0, 0, 0, 0, 0, 1, 0, checkArtificialAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Artificial
2797 : { 0, 15, 0, 0, 0, 0, 0, 0, checkAssertCapabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, AssertCapabilityAttrSpellingMap, nullptr }, // AT_AssertCapability
2798 : { 0, 15, 0, 0, 0, 0, 0, 0, checkAssertExclusiveLockAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AssertExclusiveLock
2799 : { 0, 15, 0, 0, 0, 0, 0, 0, checkAssertSharedLockAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_AssertSharedLock
2800 : { 1, 1, 0, 0, 0, 0, 1, 1, checkAssumeAlignedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAssumeAligned }, // AT_AssumeAligned
2801 : { 8, 0, 1, 0, 0, 0, 0, 1, checkAvailabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForAvailability }, // AT_Availability
2802 : { 1, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Blocks
2803 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_CDecl
2804 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCFAuditedTransferAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCFAuditedTransfer }, // AT_CFAuditedTransfer
2805 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCFConsumedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCFConsumed }, // AT_CFConsumed
2806 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_CFReturnsNotRetained
2807 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_CFReturnsRetained
2808 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCFUnknownTransferAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCFUnknownTransfer }, // AT_CFUnknownTransfer
2809 : { 0, 15, 0, 0, 0, 0, 0, 1, checkCPUDispatchAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCPUDispatch }, // AT_CPUDispatch
2810 : { 0, 15, 0, 0, 0, 0, 0, 1, checkCPUSpecificAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCPUSpecific }, // AT_CPUSpecific
2811 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCUDAConstantAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCUDAConstant }, // AT_CUDAConstant
2812 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCUDADeviceAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCUDADevice }, // AT_CUDADevice
2813 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCUDAGlobalAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCUDAGlobal }, // AT_CUDAGlobal
2814 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCUDAHostAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCUDAHost }, // AT_CUDAHost
2815 : { 0, 0, 0, 0, 0, 0, 0, 0, checkCUDAInvalidTargetAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_CUDAInvalidTarget
2816 : { 1, 1, 0, 0, 0, 0, 0, 1, checkCUDALaunchBoundsAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCUDALaunchBounds }, // AT_CUDALaunchBounds
2817 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCUDASharedAppertainsTo, checkCUDALangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCUDAShared }, // AT_CUDAShared
2818 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCXX11NoReturnAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCXX11NoReturn }, // AT_CXX11NoReturn
2819 : { 0, 15, 0, 0, 0, 0, 0, 1, checkCallableWhenAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCallableWhen }, // AT_CallableWhen
2820 : { 1, 0, 0, 0, 0, 0, 0, 1, checkCapabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, CapabilityAttrSpellingMap, matchRulesForCapability }, // AT_Capability
2821 : { 0, 0, 0, 0, 0, 0, 0, 1, checkCarriesDependencyAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCarriesDependency }, // AT_CarriesDependency
2822 : { 1, 0, 0, 0, 0, 0, 1, 0, checkCleanupAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Cleanup
2823 : { 1, 0, 0, 0, 0, 0, 0, 0, checkCodeSegAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_CodeSeg
2824 : { 0, 0, 0, 0, 0, 0, 1, 1, checkColdAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCold }, // AT_Cold
2825 : { 0, 0, 0, 0, 0, 0, 1, 1, checkCommonAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForCommon }, // AT_Common
2826 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Const
2827 : { 0, 1, 0, 0, 0, 0, 1, 1, checkConstructorAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForConstructor }, // AT_Constructor
2828 : { 1, 0, 0, 0, 0, 0, 0, 1, checkConsumableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForConsumable }, // AT_Consumable
2829 : { 0, 0, 0, 0, 0, 0, 0, 1, checkConsumableAutoCastAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForConsumableAutoCast }, // AT_ConsumableAutoCast
2830 : { 0, 0, 0, 0, 0, 0, 0, 1, checkConsumableSetOnReadAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForConsumableSetOnRead }, // AT_ConsumableSetOnRead
2831 : { 0, 0, 0, 0, 0, 0, 0, 1, checkConvergentAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForConvergent }, // AT_Convergent
2832 : { 0, 0, 0, 1, 0, 0, 1, 1, checkDLLExportAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64armthumbaarch64Win32, defaultSpellingIndexToSemanticSpelling, matchRulesForDLLExport }, // AT_DLLExport
2833 : { 0, 0, 0, 1, 0, 0, 1, 1, checkDLLImportAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64armthumbaarch64Win32, defaultSpellingIndexToSemanticSpelling, matchRulesForDLLImport }, // AT_DLLImport
2834 : { 0, 2, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Deprecated
2835 : { 0, 1, 0, 0, 0, 0, 1, 1, checkDestructorAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForDestructor }, // AT_Destructor
2836 : { 3, 0, 0, 0, 0, 0, 0, 0, checkDiagnoseIfAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_DiagnoseIf
2837 : { 0, 0, 0, 0, 0, 0, 0, 1, checkDisableTailCallsAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForDisableTailCalls }, // AT_DisableTailCalls
2838 : { 0, 0, 0, 1, 0, 0, 0, 0, checkEmptyBasesAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64armthumbaarch64Microsoft, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_EmptyBases
2839 : { 2, 0, 0, 0, 0, 0, 0, 1, checkEnableIfAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForEnableIf }, // AT_EnableIf
2840 : { 1, 0, 0, 0, 0, 0, 0, 1, checkEnumExtensibilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForEnumExtensibility }, // AT_EnumExtensibility
2841 : { 0, 0, 0, 0, 0, 0, 0, 1, checkExcludeFromExplicitInstantiationAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForExcludeFromExplicitInstantiation }, // AT_ExcludeFromExplicitInstantiation
2842 : { 1, 15, 0, 0, 0, 0, 0, 0, checkExclusiveTrylockFunctionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ExclusiveTrylockFunction
2843 : { 1, 0, 0, 0, 0, 0, 0, 0, checkExtVectorTypeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ExtVectorType
2844 : { 0, 3, 1, 0, 0, 0, 0, 1, checkExternalSourceSymbolAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForExternalSourceSymbol }, // AT_ExternalSourceSymbol
2845 : { 0, 0, 0, 0, 0, 1, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_FallThrough
2846 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_FastCall
2847 : { 0, 0, 0, 0, 0, 0, 0, 1, checkFlagEnumAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForFlagEnum }, // AT_FlagEnum
2848 : { 0, 0, 0, 0, 0, 0, 1, 1, checkFlattenAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForFlatten }, // AT_Flatten
2849 : { 3, 0, 0, 0, 0, 0, 1, 0, checkFormatAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Format
2850 : { 1, 0, 0, 0, 0, 0, 1, 0, checkFormatArgAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_FormatArg
2851 : { 0, 0, 0, 0, 0, 0, 1, 1, checkGNUInlineAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForGNUInline }, // AT_GNUInline
2852 : { 1, 0, 0, 0, 0, 0, 0, 0, checkGuardedByAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_GuardedBy
2853 : { 0, 0, 0, 0, 0, 0, 0, 0, checkGuardedVarAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_GuardedVar
2854 : { 0, 0, 0, 0, 0, 0, 1, 1, checkHotAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForHot }, // AT_Hot
2855 : { 0, 0, 0, 0, 0, 0, 0, 1, checkIBActionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForIBAction }, // AT_IBAction
2856 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_IBOutlet
2857 : { 0, 1, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_IBOutletCollection
2858 : { 1, 0, 0, 1, 0, 0, 1, 1, checkIFuncAppertainsTo, defaultDiagnoseLangOpts, isTargetELF, defaultSpellingIndexToSemanticSpelling, matchRulesForIFunc }, // AT_IFunc
2859 : { 1, 0, 0, 0, 0, 0, 1, 1, checkInitPriorityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForInitPriority }, // AT_InitPriority
2860 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_IntelOclBicc
2861 : { 0, 0, 0, 0, 0, 0, 0, 1, checkInternalLinkageAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForInternalLinkage }, // AT_InternalLinkage
2862 : { 0, 0, 0, 0, 0, 0, 0, 1, checkLTOVisibilityPublicAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForLTOVisibilityPublic }, // AT_LTOVisibilityPublic
2863 : { 1, 0, 0, 1, 0, 0, 0, 0, checkLayoutVersionAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64armthumbaarch64Microsoft, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_LayoutVersion
2864 : { 0, 0, 0, 0, 1, 0, 0, 0, checkLifetimeBoundAppertainsTo, checkCPlusPlusLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_LifetimeBound
2865 : { 1, 0, 0, 0, 0, 0, 0, 0, checkLockReturnedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_LockReturned
2866 : { 0, 0, 0, 0, 0, 0, 0, 1, checkLockableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForLockable }, // AT_Lockable
2867 : { 0, 15, 0, 0, 0, 0, 0, 0, checkLocksExcludedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_LocksExcluded
2868 : { 3, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, LoopHintAttrSpellingMap, nullptr }, // AT_LoopHint
2869 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_MSABI
2870 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, checkMicrosoftExtLangOpts, defaultTargetRequirements, MSInheritanceAttrSpellingMap, nullptr }, // AT_MSInheritance
2871 : { 0, 0, 0, 1, 0, 0, 0, 0, checkMSNoVTableAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64armthumbaarch64Microsoft, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_MSNoVTable
2872 : { 0, 0, 0, 0, 0, 0, 1, 1, checkMSStructAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForMSStruct }, // AT_MSStruct
2873 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_MayAlias
2874 : { 0, 0, 0, 1, 0, 0, 1, 1, checkMicroMipsAppertainsTo, defaultDiagnoseLangOpts, isTargetmipsmipsel, defaultSpellingIndexToSemanticSpelling, matchRulesForMicroMips }, // AT_MicroMips
2875 : { 0, 0, 0, 0, 0, 0, 0, 1, checkMinSizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForMinSize }, // AT_MinSize
2876 : { 1, 0, 0, 0, 0, 0, 0, 1, checkMinVectorWidthAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForMinVectorWidth }, // AT_MinVectorWidth
2877 : { 0, 0, 0, 1, 0, 0, 1, 1, checkMips16AppertainsTo, defaultDiagnoseLangOpts, isTargetmipsmipsel, defaultSpellingIndexToSemanticSpelling, matchRulesForMips16 }, // AT_Mips16
2878 : { 0, 0, 0, 1, 0, 0, 1, 1, checkMipsLongCallAppertainsTo, defaultDiagnoseLangOpts, isTargetmipsmipselmips64mips64el, MipsLongCallAttrSpellingMap, matchRulesForMipsLongCall }, // AT_MipsLongCall
2879 : { 0, 0, 0, 1, 0, 0, 1, 1, checkMipsShortCallAppertainsTo, defaultDiagnoseLangOpts, isTargetmipsmipselmips64mips64el, MipsShortCallAttrSpellingMap, matchRulesForMipsShortCall }, // AT_MipsShortCall
2880 : { 1, 0, 0, 0, 0, 0, 1, 0, checkModeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Mode
2881 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNSConsumedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNSConsumed }, // AT_NSConsumed
2882 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNSConsumesSelfAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNSConsumesSelf }, // AT_NSConsumesSelf
2883 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NSReturnsAutoreleased
2884 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NSReturnsNotRetained
2885 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NSReturnsRetained
2886 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNakedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNaked }, // AT_Naked
2887 : { 1, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NeonPolyVectorType
2888 : { 1, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NeonVectorType
2889 : { 0, 0, 0, 0, 0, 0, 0, 0, checkNoAliasAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NoAlias
2890 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoCommonAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoCommon }, // AT_NoCommon
2891 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoDebugAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoDebug }, // AT_NoDebug
2892 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNoDestroyAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoDestroy }, // AT_NoDestroy
2893 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNoDuplicateAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoDuplicate }, // AT_NoDuplicate
2894 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNoEscapeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoEscape }, // AT_NoEscape
2895 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoInlineAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoInline }, // AT_NoInline
2896 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoInstrumentFunctionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoInstrumentFunction }, // AT_NoInstrumentFunction
2897 : { 0, 0, 0, 1, 0, 0, 1, 1, checkNoMicroMipsAppertainsTo, defaultDiagnoseLangOpts, isTargetmipsmipsel, defaultSpellingIndexToSemanticSpelling, matchRulesForNoMicroMips }, // AT_NoMicroMips
2898 : { 0, 0, 0, 1, 0, 0, 1, 1, checkNoMips16AppertainsTo, defaultDiagnoseLangOpts, isTargetmipsmipsel, defaultSpellingIndexToSemanticSpelling, matchRulesForNoMips16 }, // AT_NoMips16
2899 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NoReturn
2900 : { 0, 15, 0, 0, 0, 0, 0, 1, checkNoSanitizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoSanitize }, // AT_NoSanitize
2901 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoSanitizeSpecificAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoSanitizeSpecific }, // AT_NoSanitizeSpecific
2902 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoSplitStackAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoSplitStack }, // AT_NoSplitStack
2903 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNoStackProtectorAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoStackProtector }, // AT_NoStackProtector
2904 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNoThreadSafetyAnalysisAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoThreadSafetyAnalysis }, // AT_NoThreadSafetyAnalysis
2905 : { 0, 0, 0, 0, 0, 0, 1, 1, checkNoThrowAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNoThrow }, // AT_NoThrow
2906 : { 0, 15, 0, 0, 0, 0, 1, 0, checkNonNullAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_NonNull
2907 : { 0, 0, 0, 0, 0, 0, 0, 1, checkNotTailCalledAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForNotTailCalled }, // AT_NotTailCalled
2908 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCBoxableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCBoxable }, // AT_ObjCBoxable
2909 : { 1, 0, 0, 0, 0, 0, 0, 1, checkObjCBridgeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCBridge }, // AT_ObjCBridge
2910 : { 1, 0, 0, 0, 0, 0, 0, 1, checkObjCBridgeMutableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCBridgeMutable }, // AT_ObjCBridgeMutable
2911 : { 3, 0, 1, 0, 0, 0, 0, 1, checkObjCBridgeRelatedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCBridgeRelated }, // AT_ObjCBridgeRelated
2912 : { 0, 0, 0, 0, 0, 0, 0, 0, checkObjCDesignatedInitializerAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCDesignatedInitializer
2913 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCExceptionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCException }, // AT_ObjCException
2914 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCExplicitProtocolImplAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCExplicitProtocolImpl }, // AT_ObjCExplicitProtocolImpl
2915 : { 1, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCGC
2916 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCIndependentClass
2917 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCInertUnsafeUnretained
2918 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCKindOf
2919 : { 1, 0, 0, 0, 0, 0, 0, 1, checkObjCMethodFamilyAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCMethodFamily }, // AT_ObjCMethodFamily
2920 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCNSObject
2921 : { 1, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ObjCOwnership
2922 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCPreciseLifetimeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCPreciseLifetime }, // AT_ObjCPreciseLifetime
2923 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCRequiresPropertyDefsAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCRequiresPropertyDefs }, // AT_ObjCRequiresPropertyDefs
2924 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCRequiresSuperAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCRequiresSuper }, // AT_ObjCRequiresSuper
2925 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCReturnsInnerPointerAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCReturnsInnerPointer }, // AT_ObjCReturnsInnerPointer
2926 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCRootClassAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCRootClass }, // AT_ObjCRootClass
2927 : { 1, 0, 0, 0, 0, 0, 0, 1, checkObjCRuntimeNameAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCRuntimeName }, // AT_ObjCRuntimeName
2928 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCRuntimeVisibleAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCRuntimeVisible }, // AT_ObjCRuntimeVisible
2929 : { 0, 0, 0, 0, 0, 0, 0, 1, checkObjCSubclassingRestrictedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForObjCSubclassingRestricted }, // AT_ObjCSubclassingRestricted
2930 : { 0, 0, 0, 0, 0, 0, 0, 0, checkOpenCLAccessAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, OpenCLAccessAttrSpellingMap, nullptr }, // AT_OpenCLAccess
2931 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLConstantAddressSpace
2932 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLGenericAddressSpace
2933 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLGlobalAddressSpace
2934 : { 1, 0, 0, 0, 0, 0, 0, 1, checkOpenCLIntelReqdSubGroupSizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForOpenCLIntelReqdSubGroupSize }, // AT_OpenCLIntelReqdSubGroupSize
2935 : { 0, 0, 0, 0, 0, 0, 0, 0, checkOpenCLKernelAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLKernel
2936 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLLocalAddressSpace
2937 : { 0, 0, 0, 0, 0, 0, 0, 1, checkOpenCLNoSVMAppertainsTo, checkOpenCLLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForOpenCLNoSVM }, // AT_OpenCLNoSVM
2938 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLPrivateAddressSpace
2939 : { 1, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_OpenCLUnrollHint
2940 : { 0, 0, 0, 0, 0, 0, 0, 1, checkOptimizeNoneAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForOptimizeNone }, // AT_OptimizeNone
2941 : { 0, 0, 0, 0, 0, 0, 0, 1, checkOverloadableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForOverloadable }, // AT_Overloadable
2942 : { 1, 15, 0, 0, 0, 0, 0, 0, checkOwnershipAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, OwnershipAttrSpellingMap, nullptr }, // AT_Ownership
2943 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Packed
2944 : { 1, 0, 0, 0, 0, 0, 0, 1, checkParamTypestateAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForParamTypestate }, // AT_ParamTypestate
2945 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Pascal
2946 : { 1, 0, 0, 0, 0, 0, 0, 1, checkPassObjectSizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForPassObjectSize }, // AT_PassObjectSize
2947 : { 1, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Pcs
2948 : { 1, 0, 0, 0, 0, 0, 0, 0, checkPragmaClangBSSSectionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PragmaClangBSSSection
2949 : { 1, 0, 0, 0, 0, 0, 0, 0, checkPragmaClangDataSectionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PragmaClangDataSection
2950 : { 1, 0, 0, 0, 0, 0, 0, 0, checkPragmaClangRodataSectionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PragmaClangRodataSection
2951 : { 1, 0, 0, 0, 0, 0, 0, 0, checkPragmaClangTextSectionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PragmaClangTextSection
2952 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PreserveAll
2953 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PreserveMost
2954 : { 1, 0, 0, 0, 0, 0, 0, 0, checkPtGuardedByAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PtGuardedBy
2955 : { 0, 0, 0, 0, 0, 0, 0, 0, checkPtGuardedVarAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_PtGuardedVar
2956 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Ptr32
2957 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Ptr64
2958 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Pure
2959 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_RegCall
2960 : { 1, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Regparm
2961 : { 0, 0, 0, 0, 0, 0, 0, 0, checkReinitializesAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Reinitializes
2962 : { 0, 15, 0, 0, 0, 0, 0, 0, checkReleaseCapabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, ReleaseCapabilityAttrSpellingMap, nullptr }, // AT_ReleaseCapability
2963 : { 0, 0, 0, 0, 0, 0, 0, 1, checkRenderScriptKernelAppertainsTo, checkRenderScriptLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForRenderScriptKernel }, // AT_RenderScriptKernel
2964 : { 3, 0, 0, 0, 0, 0, 0, 1, checkReqdWorkGroupSizeAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForReqdWorkGroupSize }, // AT_ReqdWorkGroupSize
2965 : { 0, 0, 0, 0, 0, 0, 0, 1, checkRequireConstantInitAppertainsTo, checkCPlusPlusLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForRequireConstantInit }, // AT_RequireConstantInit
2966 : { 0, 15, 0, 0, 0, 0, 0, 0, checkRequiresCapabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, RequiresCapabilityAttrSpellingMap, nullptr }, // AT_RequiresCapability
2967 : { 0, 0, 0, 0, 0, 0, 1, 1, checkRestrictAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, RestrictAttrSpellingMap, matchRulesForRestrict }, // AT_Restrict
2968 : { 1, 0, 0, 0, 0, 0, 0, 1, checkReturnTypestateAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForReturnTypestate }, // AT_ReturnTypestate
2969 : { 0, 0, 0, 0, 0, 0, 1, 1, checkReturnsNonNullAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForReturnsNonNull }, // AT_ReturnsNonNull
2970 : { 0, 0, 0, 0, 0, 0, 1, 1, checkReturnsTwiceAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForReturnsTwice }, // AT_ReturnsTwice
2971 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_SPtr
2972 : { 0, 0, 0, 0, 0, 0, 0, 1, checkScopedLockableAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForScopedLockable }, // AT_ScopedLockable
2973 : { 1, 0, 0, 0, 0, 0, 1, 1, checkSectionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, SectionAttrSpellingMap, matchRulesForSection }, // AT_Section
2974 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_SelectAny
2975 : { 0, 2, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Sentinel
2976 : { 1, 0, 0, 0, 0, 0, 0, 1, checkSetTypestateAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForSetTypestate }, // AT_SetTypestate
2977 : { 1, 15, 0, 0, 0, 0, 0, 0, checkSharedTrylockFunctionAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_SharedTrylockFunction
2978 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_StdCall
2979 : { 0, 15, 0, 0, 0, 1, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Suppress
2980 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_SwiftCall
2981 : { 0, 0, 0, 0, 0, 0, 0, 1, checkSwiftContextAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForSwiftContext }, // AT_SwiftContext
2982 : { 0, 0, 0, 0, 0, 0, 0, 1, checkSwiftErrorResultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForSwiftErrorResult }, // AT_SwiftErrorResult
2983 : { 0, 0, 0, 0, 0, 0, 0, 1, checkSwiftIndirectResultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForSwiftIndirectResult }, // AT_SwiftIndirectResult
2984 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_SysVABI
2985 : { 1, 0, 0, 0, 0, 0, 1, 1, checkTLSModelAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForTLSModel }, // AT_TLSModel
2986 : { 1, 0, 0, 0, 0, 0, 1, 1, checkTargetAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForTarget }, // AT_Target
2987 : { 1, 0, 0, 0, 0, 0, 0, 1, checkTestTypestateAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForTestTypestate }, // AT_TestTypestate
2988 : { 0, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_ThisCall
2989 : { 0, 0, 0, 0, 0, 0, 0, 0, checkThreadAppertainsTo, checkMicrosoftExtLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Thread
2990 : { 0, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, checkNotCPlusPlusLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_TransparentUnion
2991 : { 0, 0, 0, 0, 0, 0, 0, 1, checkTrivialABIAppertainsTo, checkCPlusPlusLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForTrivialABI }, // AT_TrivialABI
2992 : { 1, 15, 0, 0, 0, 0, 0, 0, checkTryAcquireCapabilityAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, TryAcquireCapabilityAttrSpellingMap, nullptr }, // AT_TryAcquireCapability
2993 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_TypeNonNull
2994 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_TypeNullUnspecified
2995 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_TypeNullable
2996 : { 4, 0, 1, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_TypeTagForDatatype
2997 : { 1, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_TypeVisibility
2998 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_UPtr
2999 : { 0, 1, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Unavailable
3000 : { 0, 0, 0, 0, 0, 0, 1, 0, checkUnusedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, UnusedAttrSpellingMap, nullptr }, // AT_Unused
3001 : { 0, 0, 0, 0, 0, 0, 1, 0, checkUsedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Used
3002 : { 1, 0, 0, 0, 0, 0, 0, 0, checkUuidAppertainsTo, checkMicrosoftExtBorlandLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Uuid
3003 : { 0, 0, 0, 0, 0, 0, 0, 1, checkVecReturnAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForVecReturn }, // AT_VecReturn
3004 : { 1, 0, 0, 0, 0, 0, 0, 1, checkVecTypeHintAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForVecTypeHint }, // AT_VecTypeHint
3005 : { 0, 0, 0, 0, 1, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_VectorCall
3006 : { 1, 0, 0, 0, 1, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_VectorSize
3007 : { 1, 0, 0, 0, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_Visibility
3008 : { 0, 0, 0, 0, 0, 0, 1, 1, checkWarnUnusedAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForWarnUnused }, // AT_WarnUnused
3009 : { 0, 0, 0, 0, 0, 0, 1, 1, checkWarnUnusedResultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, WarnUnusedResultAttrSpellingMap, matchRulesForWarnUnusedResult }, // AT_WarnUnusedResult
3010 : { 0, 0, 0, 0, 0, 0, 1, 1, checkWeakAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForWeak }, // AT_Weak
3011 : { 0, 0, 0, 0, 0, 0, 0, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_WeakImport
3012 : { 0, 1, 0, 0, 0, 0, 1, 1, checkWeakRefAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForWeakRef }, // AT_WeakRef
3013 : { 3, 0, 0, 0, 0, 0, 0, 1, checkWorkGroupSizeHintAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForWorkGroupSizeHint }, // AT_WorkGroupSizeHint
3014 : { 0, 0, 0, 1, 0, 0, 1, 0, defaultAppertainsTo, defaultDiagnoseLangOpts, isTargetx86x86_64, defaultSpellingIndexToSemanticSpelling, nullptr }, // AT_X86ForceAlignArgPointer
3015 : { 0, 0, 0, 0, 0, 0, 0, 1, checkXRayInstrumentAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, XRayInstrumentAttrSpellingMap, matchRulesForXRayInstrument }, // AT_XRayInstrument
3016 : { 1, 0, 0, 0, 0, 0, 0, 1, checkXRayLogArgsAppertainsTo, defaultDiagnoseLangOpts, defaultTargetRequirements, defaultSpellingIndexToSemanticSpelling, matchRulesForXRayLogArgs } // AT_XRayLogArgs
3017 : };
3018 :
3019 934 : static bool checkAttributeMatchRuleAppliesTo(const Decl *D, attr::SubjectMatchRule rule) {
3020 934 : switch (rule) {
3021 15 : case attr::SubjectMatchRule_block:
3022 15 : return isa<BlockDecl>(D);
3023 42 : case attr::SubjectMatchRule_enum:
3024 42 : return isa<EnumDecl>(D);
3025 26 : case attr::SubjectMatchRule_enum_constant:
3026 26 : return isa<EnumConstantDecl>(D);
3027 53 : case attr::SubjectMatchRule_field:
3028 53 : return isa<FieldDecl>(D);
3029 129 : case attr::SubjectMatchRule_function:
3030 129 : return isa<FunctionDecl>(D);
3031 26 : case attr::SubjectMatchRule_function_is_member:
3032 26 : return isa<CXXMethodDecl>(D);
3033 34 : case attr::SubjectMatchRule_namespace:
3034 34 : return isa<NamespaceDecl>(D);
3035 25 : case attr::SubjectMatchRule_objc_category:
3036 25 : return isa<ObjCCategoryDecl>(D);
3037 71 : case attr::SubjectMatchRule_objc_interface:
3038 71 : return isa<ObjCInterfaceDecl>(D);
3039 47 : case attr::SubjectMatchRule_objc_method:
3040 47 : return isa<ObjCMethodDecl>(D);
3041 15 : case attr::SubjectMatchRule_objc_method_is_instance:
3042 : return isObjCInstanceMethod(D);
3043 37 : case attr::SubjectMatchRule_objc_property:
3044 37 : return isa<ObjCPropertyDecl>(D);
3045 28 : case attr::SubjectMatchRule_objc_protocol:
3046 28 : return isa<ObjCProtocolDecl>(D);
3047 32 : case attr::SubjectMatchRule_record:
3048 32 : return isa<RecordDecl>(D) || isa<CXXRecordDecl>(D);
3049 78 : case attr::SubjectMatchRule_record_not_is_union:
3050 : return isStruct(D);
3051 : case attr::SubjectMatchRule_hasType_abstract:
3052 : assert(false && "Abstract matcher rule isn't allowed");
3053 : return false;
3054 43 : case attr::SubjectMatchRule_hasType_functionType:
3055 : return isFunctionLike(D);
3056 28 : case attr::SubjectMatchRule_type_alias:
3057 28 : return isa<TypedefNameDecl>(D);
3058 110 : case attr::SubjectMatchRule_variable:
3059 110 : return isa<VarDecl>(D);
3060 2 : case attr::SubjectMatchRule_variable_is_thread_local:
3061 : return isTLSVar(D);
3062 35 : case attr::SubjectMatchRule_variable_is_global:
3063 : return isGlobalVar(D);
3064 28 : case attr::SubjectMatchRule_variable_is_parameter:
3065 28 : return isa<ParmVarDecl>(D);
3066 30 : case attr::SubjectMatchRule_variable_not_is_parameter:
3067 : return isNonParmVar(D);
3068 : }
3069 0 : llvm_unreachable("Invalid match rule");
3070 : return false;
3071 : }
3072 :
|