Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |
2 | |* *| |
||
3 | |* Parsed attribute helpers *| |
||
4 | |* *| |
||
5 | |* Automatically generated file, do not edit! *| |
||
6 | |* *| |
||
7 | \*===----------------------------------------------------------------------===*/ |
||
8 | |||
9 | #if !defined(WANT_DECL_MERGE_LOGIC) && !defined(WANT_STMT_MERGE_LOGIC) |
||
10 | static bool isStruct(const Decl *D) { |
||
11 | if (const auto *S = dyn_cast<RecordDecl>(D)) |
||
12 | return !S->isUnion(); |
||
13 | return false; |
||
14 | } |
||
15 | |||
16 | static bool isSharedVar(const Decl *D) { |
||
17 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
18 | return S->hasGlobalStorage() && !S->getTLSKind(); |
||
19 | return false; |
||
20 | } |
||
21 | |||
22 | static bool isGlobalVar(const Decl *D) { |
||
23 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
24 | return S->hasGlobalStorage(); |
||
25 | return false; |
||
26 | } |
||
27 | |||
28 | static bool isHasFunctionProto(const Decl *D) { |
||
29 | if (const auto *S = dyn_cast<Decl>(D)) |
||
30 | return (S->getFunctionType(true) != nullptr && |
||
31 | isa<FunctionProtoType>(S->getFunctionType())) || |
||
32 | isa<ObjCMethodDecl>(S) || |
||
33 | isa<BlockDecl>(S); |
||
34 | return false; |
||
35 | } |
||
36 | |||
37 | static bool isFunctionLike(const Decl *D) { |
||
38 | if (const auto *S = dyn_cast<Decl>(D)) |
||
39 | return S->getFunctionType(false) != nullptr; |
||
40 | return false; |
||
41 | } |
||
42 | |||
43 | static bool isInlineFunction(const Decl *D) { |
||
44 | if (const auto *S = dyn_cast<FunctionDecl>(D)) |
||
45 | return S->isInlineSpecified(); |
||
46 | return false; |
||
47 | } |
||
48 | |||
49 | static bool isLocalVar(const Decl *D) { |
||
50 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
51 | return S->hasLocalStorage() && !isa<ParmVarDecl>(S); |
||
52 | return false; |
||
53 | } |
||
54 | |||
55 | static bool isHLSLEntry(const Decl *D) { |
||
56 | if (const auto *S = dyn_cast<FunctionDecl>(D)) |
||
57 | return S->isExternallyVisible() && !isa<CXXMethodDecl>(S); |
||
58 | return false; |
||
59 | } |
||
60 | |||
61 | static bool isHLSLBufferObj(const Decl *D) { |
||
62 | if (const auto *S = dyn_cast<HLSLBufferDecl>(D)) |
||
63 | return isa<HLSLBufferDecl>(S); |
||
64 | return false; |
||
65 | } |
||
66 | |||
67 | static bool isExternalGlobalVar(const Decl *D) { |
||
68 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
69 | return S->hasGlobalStorage() && |
||
70 | S->getStorageClass()!=StorageClass::SC_Static && |
||
71 | !S->isLocalExternDecl(); |
||
72 | return false; |
||
73 | } |
||
74 | |||
75 | static bool isObjCInstanceMethod(const Decl *D) { |
||
76 | if (const auto *S = dyn_cast<ObjCMethodDecl>(D)) |
||
77 | return S->isInstanceMethod(); |
||
78 | return false; |
||
79 | } |
||
80 | |||
81 | static bool isImplicitObjectParameter(const Decl *D) { |
||
82 | if (const auto *S = dyn_cast<FunctionDecl>(D)) |
||
83 | return static_cast<void>(S), false; |
||
84 | return false; |
||
85 | } |
||
86 | |||
87 | static bool isNonParmVar(const Decl *D) { |
||
88 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
89 | return S->getKind() != Decl::ParmVar; |
||
90 | return false; |
||
91 | } |
||
92 | |||
93 | static bool isNonBitField(const Decl *D) { |
||
94 | if (const auto *S = dyn_cast<FieldDecl>(D)) |
||
95 | return !S->isBitField(); |
||
96 | return false; |
||
97 | } |
||
98 | |||
99 | static bool isNonStaticCXXMethod(const Decl *D) { |
||
100 | if (const auto *S = dyn_cast<CXXMethodDecl>(D)) |
||
101 | return !S->isStatic(); |
||
102 | return false; |
||
103 | } |
||
104 | |||
105 | static bool isClassTmpl(const Decl *D) { |
||
106 | if (const auto *S = dyn_cast<CXXRecordDecl>(D)) |
||
107 | return S->getDescribedClassTemplate(); |
||
108 | return false; |
||
109 | } |
||
110 | |||
111 | static bool isNonStaticNonConstCXXMethod(const Decl *D) { |
||
112 | if (const auto *S = dyn_cast<CXXMethodDecl>(D)) |
||
113 | return !S->isStatic() && !S->isConst(); |
||
114 | return false; |
||
115 | } |
||
116 | |||
117 | static bool isNonLocalVar(const Decl *D) { |
||
118 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
119 | return !S->hasLocalStorage(); |
||
120 | return false; |
||
121 | } |
||
122 | |||
123 | static bool isFunctionTmpl(const Decl *D) { |
||
124 | if (const auto *S = dyn_cast<FunctionDecl>(D)) |
||
125 | return S->getTemplatedKind() == |
||
126 | FunctionDecl::TK_FunctionTemplate; |
||
127 | return false; |
||
128 | } |
||
129 | |||
130 | static bool isTLSVar(const Decl *D) { |
||
131 | if (const auto *S = dyn_cast<VarDecl>(D)) |
||
132 | return S->getTLSKind() != 0; |
||
133 | return false; |
||
134 | } |
||
135 | |||
136 | static constexpr ParsedAttrInfo::Spelling AArch64SVEPcsSpellings[] = { |
||
137 | {AttributeCommonInfo::AS_GNU, "aarch64_sve_pcs"}, |
||
138 | {AttributeCommonInfo::AS_CXX11, "clang::aarch64_sve_pcs"}, |
||
139 | {AttributeCommonInfo::AS_C2x, "clang::aarch64_sve_pcs"}, |
||
140 | }; |
||
141 | struct ParsedAttrInfoAArch64SVEPcs final : public ParsedAttrInfo { |
||
142 | constexpr ParsedAttrInfoAArch64SVEPcs() : ParsedAttrInfo( |
||
143 | /*AttrKind=*/ParsedAttr::AT_AArch64SVEPcs, |
||
144 | /*NumArgs=*/0, |
||
145 | /*OptArgs=*/0, |
||
146 | /*NumArgMembers=*/0, |
||
147 | /*HasCustomParsing=*/0, |
||
148 | /*AcceptsExprPack=*/0, |
||
149 | /*IsTargetSpecific=*/0, |
||
150 | /*IsType=*/1, |
||
151 | /*IsStmt=*/0, |
||
152 | /*IsKnownToGCC=*/0, |
||
153 | /*IsSupportedByPragmaAttribute=*/0, |
||
154 | /*Spellings=*/AArch64SVEPcsSpellings, |
||
155 | /*ArgNames=*/{}) {} |
||
156 | bool isParamExpr(size_t N) const override { |
||
157 | return false; |
||
158 | } |
||
159 | |||
160 | static const ParsedAttrInfoAArch64SVEPcs Instance; |
||
161 | }; |
||
162 | const ParsedAttrInfoAArch64SVEPcs ParsedAttrInfoAArch64SVEPcs::Instance; |
||
163 | static constexpr ParsedAttrInfo::Spelling AArch64VectorPcsSpellings[] = { |
||
164 | {AttributeCommonInfo::AS_GNU, "aarch64_vector_pcs"}, |
||
165 | {AttributeCommonInfo::AS_CXX11, "clang::aarch64_vector_pcs"}, |
||
166 | {AttributeCommonInfo::AS_C2x, "clang::aarch64_vector_pcs"}, |
||
167 | }; |
||
168 | struct ParsedAttrInfoAArch64VectorPcs final : public ParsedAttrInfo { |
||
169 | constexpr ParsedAttrInfoAArch64VectorPcs() : ParsedAttrInfo( |
||
170 | /*AttrKind=*/ParsedAttr::AT_AArch64VectorPcs, |
||
171 | /*NumArgs=*/0, |
||
172 | /*OptArgs=*/0, |
||
173 | /*NumArgMembers=*/0, |
||
174 | /*HasCustomParsing=*/0, |
||
175 | /*AcceptsExprPack=*/0, |
||
176 | /*IsTargetSpecific=*/0, |
||
177 | /*IsType=*/1, |
||
178 | /*IsStmt=*/0, |
||
179 | /*IsKnownToGCC=*/0, |
||
180 | /*IsSupportedByPragmaAttribute=*/0, |
||
181 | /*Spellings=*/AArch64VectorPcsSpellings, |
||
182 | /*ArgNames=*/{}) {} |
||
183 | bool isParamExpr(size_t N) const override { |
||
184 | return false; |
||
185 | } |
||
186 | |||
187 | static const ParsedAttrInfoAArch64VectorPcs Instance; |
||
188 | }; |
||
189 | const ParsedAttrInfoAArch64VectorPcs ParsedAttrInfoAArch64VectorPcs::Instance; |
||
190 | static constexpr ParsedAttrInfo::Spelling AMDGPUFlatWorkGroupSizeSpellings[] = { |
||
191 | {AttributeCommonInfo::AS_GNU, "amdgpu_flat_work_group_size"}, |
||
192 | {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_flat_work_group_size"}, |
||
193 | }; |
||
194 | static constexpr const char *AMDGPUFlatWorkGroupSizeArgNames[] = { |
||
195 | "Min","Max",}; |
||
196 | struct ParsedAttrInfoAMDGPUFlatWorkGroupSize final : public ParsedAttrInfo { |
||
197 | constexpr ParsedAttrInfoAMDGPUFlatWorkGroupSize() : ParsedAttrInfo( |
||
198 | /*AttrKind=*/ParsedAttr::AT_AMDGPUFlatWorkGroupSize, |
||
199 | /*NumArgs=*/2, |
||
200 | /*OptArgs=*/0, |
||
201 | /*NumArgMembers=*/2, |
||
202 | /*HasCustomParsing=*/0, |
||
203 | /*AcceptsExprPack=*/0, |
||
204 | /*IsTargetSpecific=*/0, |
||
205 | /*IsType=*/0, |
||
206 | /*IsStmt=*/0, |
||
207 | /*IsKnownToGCC=*/0, |
||
208 | /*IsSupportedByPragmaAttribute=*/1, |
||
209 | /*Spellings=*/AMDGPUFlatWorkGroupSizeSpellings, |
||
210 | /*ArgNames=*/AMDGPUFlatWorkGroupSizeArgNames) {} |
||
211 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
212 | if (!isa<FunctionDecl>(D)) { |
||
213 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
214 | << Attr << "kernel functions"; |
||
215 | return false; |
||
216 | } |
||
217 | return true; |
||
218 | } |
||
219 | |||
220 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
221 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
222 | << AL << St->getBeginLoc(); |
||
223 | return false; |
||
224 | } |
||
225 | |||
226 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
227 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
228 | } |
||
229 | |||
230 | bool isParamExpr(size_t N) const override { |
||
231 | return (N == 0) || (N == 1) || false; |
||
232 | } |
||
233 | |||
234 | static const ParsedAttrInfoAMDGPUFlatWorkGroupSize Instance; |
||
235 | }; |
||
236 | const ParsedAttrInfoAMDGPUFlatWorkGroupSize ParsedAttrInfoAMDGPUFlatWorkGroupSize::Instance; |
||
237 | static constexpr ParsedAttrInfo::Spelling AMDGPUKernelCallSpellings[] = { |
||
238 | {AttributeCommonInfo::AS_GNU, "amdgpu_kernel"}, |
||
239 | {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_kernel"}, |
||
240 | {AttributeCommonInfo::AS_C2x, "clang::amdgpu_kernel"}, |
||
241 | }; |
||
242 | struct ParsedAttrInfoAMDGPUKernelCall final : public ParsedAttrInfo { |
||
243 | constexpr ParsedAttrInfoAMDGPUKernelCall() : ParsedAttrInfo( |
||
244 | /*AttrKind=*/ParsedAttr::AT_AMDGPUKernelCall, |
||
245 | /*NumArgs=*/0, |
||
246 | /*OptArgs=*/0, |
||
247 | /*NumArgMembers=*/0, |
||
248 | /*HasCustomParsing=*/0, |
||
249 | /*AcceptsExprPack=*/0, |
||
250 | /*IsTargetSpecific=*/0, |
||
251 | /*IsType=*/1, |
||
252 | /*IsStmt=*/0, |
||
253 | /*IsKnownToGCC=*/0, |
||
254 | /*IsSupportedByPragmaAttribute=*/0, |
||
255 | /*Spellings=*/AMDGPUKernelCallSpellings, |
||
256 | /*ArgNames=*/{}) {} |
||
257 | bool isParamExpr(size_t N) const override { |
||
258 | return false; |
||
259 | } |
||
260 | |||
261 | static const ParsedAttrInfoAMDGPUKernelCall Instance; |
||
262 | }; |
||
263 | const ParsedAttrInfoAMDGPUKernelCall ParsedAttrInfoAMDGPUKernelCall::Instance; |
||
264 | static constexpr ParsedAttrInfo::Spelling AMDGPUNumSGPRSpellings[] = { |
||
265 | {AttributeCommonInfo::AS_GNU, "amdgpu_num_sgpr"}, |
||
266 | {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_num_sgpr"}, |
||
267 | }; |
||
268 | static constexpr const char *AMDGPUNumSGPRArgNames[] = { |
||
269 | "NumSGPR",}; |
||
270 | struct ParsedAttrInfoAMDGPUNumSGPR final : public ParsedAttrInfo { |
||
271 | constexpr ParsedAttrInfoAMDGPUNumSGPR() : ParsedAttrInfo( |
||
272 | /*AttrKind=*/ParsedAttr::AT_AMDGPUNumSGPR, |
||
273 | /*NumArgs=*/1, |
||
274 | /*OptArgs=*/0, |
||
275 | /*NumArgMembers=*/1, |
||
276 | /*HasCustomParsing=*/0, |
||
277 | /*AcceptsExprPack=*/0, |
||
278 | /*IsTargetSpecific=*/0, |
||
279 | /*IsType=*/0, |
||
280 | /*IsStmt=*/0, |
||
281 | /*IsKnownToGCC=*/0, |
||
282 | /*IsSupportedByPragmaAttribute=*/1, |
||
283 | /*Spellings=*/AMDGPUNumSGPRSpellings, |
||
284 | /*ArgNames=*/AMDGPUNumSGPRArgNames) {} |
||
285 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
286 | if (!isa<FunctionDecl>(D)) { |
||
287 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
288 | << Attr << "kernel functions"; |
||
289 | return false; |
||
290 | } |
||
291 | return true; |
||
292 | } |
||
293 | |||
294 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
295 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
296 | << AL << St->getBeginLoc(); |
||
297 | return false; |
||
298 | } |
||
299 | |||
300 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
301 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
302 | } |
||
303 | |||
304 | bool isParamExpr(size_t N) const override { |
||
305 | return false; |
||
306 | } |
||
307 | |||
308 | static const ParsedAttrInfoAMDGPUNumSGPR Instance; |
||
309 | }; |
||
310 | const ParsedAttrInfoAMDGPUNumSGPR ParsedAttrInfoAMDGPUNumSGPR::Instance; |
||
311 | static constexpr ParsedAttrInfo::Spelling AMDGPUNumVGPRSpellings[] = { |
||
312 | {AttributeCommonInfo::AS_GNU, "amdgpu_num_vgpr"}, |
||
313 | {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_num_vgpr"}, |
||
314 | }; |
||
315 | static constexpr const char *AMDGPUNumVGPRArgNames[] = { |
||
316 | "NumVGPR",}; |
||
317 | struct ParsedAttrInfoAMDGPUNumVGPR final : public ParsedAttrInfo { |
||
318 | constexpr ParsedAttrInfoAMDGPUNumVGPR() : ParsedAttrInfo( |
||
319 | /*AttrKind=*/ParsedAttr::AT_AMDGPUNumVGPR, |
||
320 | /*NumArgs=*/1, |
||
321 | /*OptArgs=*/0, |
||
322 | /*NumArgMembers=*/1, |
||
323 | /*HasCustomParsing=*/0, |
||
324 | /*AcceptsExprPack=*/0, |
||
325 | /*IsTargetSpecific=*/0, |
||
326 | /*IsType=*/0, |
||
327 | /*IsStmt=*/0, |
||
328 | /*IsKnownToGCC=*/0, |
||
329 | /*IsSupportedByPragmaAttribute=*/1, |
||
330 | /*Spellings=*/AMDGPUNumVGPRSpellings, |
||
331 | /*ArgNames=*/AMDGPUNumVGPRArgNames) {} |
||
332 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
333 | if (!isa<FunctionDecl>(D)) { |
||
334 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
335 | << Attr << "kernel functions"; |
||
336 | return false; |
||
337 | } |
||
338 | return true; |
||
339 | } |
||
340 | |||
341 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
342 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
343 | << AL << St->getBeginLoc(); |
||
344 | return false; |
||
345 | } |
||
346 | |||
347 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
348 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
349 | } |
||
350 | |||
351 | bool isParamExpr(size_t N) const override { |
||
352 | return false; |
||
353 | } |
||
354 | |||
355 | static const ParsedAttrInfoAMDGPUNumVGPR Instance; |
||
356 | }; |
||
357 | const ParsedAttrInfoAMDGPUNumVGPR ParsedAttrInfoAMDGPUNumVGPR::Instance; |
||
358 | static constexpr ParsedAttrInfo::Spelling AMDGPUWavesPerEUSpellings[] = { |
||
359 | {AttributeCommonInfo::AS_GNU, "amdgpu_waves_per_eu"}, |
||
360 | {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_waves_per_eu"}, |
||
361 | }; |
||
362 | static constexpr const char *AMDGPUWavesPerEUArgNames[] = { |
||
363 | "Min","Max",}; |
||
364 | struct ParsedAttrInfoAMDGPUWavesPerEU final : public ParsedAttrInfo { |
||
365 | constexpr ParsedAttrInfoAMDGPUWavesPerEU() : ParsedAttrInfo( |
||
366 | /*AttrKind=*/ParsedAttr::AT_AMDGPUWavesPerEU, |
||
367 | /*NumArgs=*/1, |
||
368 | /*OptArgs=*/1, |
||
369 | /*NumArgMembers=*/2, |
||
370 | /*HasCustomParsing=*/0, |
||
371 | /*AcceptsExprPack=*/0, |
||
372 | /*IsTargetSpecific=*/0, |
||
373 | /*IsType=*/0, |
||
374 | /*IsStmt=*/0, |
||
375 | /*IsKnownToGCC=*/0, |
||
376 | /*IsSupportedByPragmaAttribute=*/1, |
||
377 | /*Spellings=*/AMDGPUWavesPerEUSpellings, |
||
378 | /*ArgNames=*/AMDGPUWavesPerEUArgNames) {} |
||
379 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
380 | if (!isa<FunctionDecl>(D)) { |
||
381 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
382 | << Attr << "kernel functions"; |
||
383 | return false; |
||
384 | } |
||
385 | return true; |
||
386 | } |
||
387 | |||
388 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
389 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
390 | << AL << St->getBeginLoc(); |
||
391 | return false; |
||
392 | } |
||
393 | |||
394 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
395 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
396 | } |
||
397 | |||
398 | bool isParamExpr(size_t N) const override { |
||
399 | return (N == 0) || (N == 1) || false; |
||
400 | } |
||
401 | |||
402 | static const ParsedAttrInfoAMDGPUWavesPerEU Instance; |
||
403 | }; |
||
404 | const ParsedAttrInfoAMDGPUWavesPerEU ParsedAttrInfoAMDGPUWavesPerEU::Instance; |
||
405 | static constexpr ParsedAttrInfo::Spelling InterruptSpellings[] = { |
||
406 | {AttributeCommonInfo::AS_GNU, "interrupt"}, |
||
407 | {AttributeCommonInfo::AS_CXX11, "gnu::interrupt"}, |
||
408 | {AttributeCommonInfo::AS_C2x, "gnu::interrupt"}, |
||
409 | }; |
||
410 | static constexpr const char *InterruptArgNames[] = { |
||
411 | "Interrupt",}; |
||
412 | struct ParsedAttrInfoInterrupt final : public ParsedAttrInfo { |
||
413 | constexpr ParsedAttrInfoInterrupt() : ParsedAttrInfo( |
||
414 | /*AttrKind=*/ParsedAttr::AT_Interrupt, |
||
415 | /*NumArgs=*/0, |
||
416 | /*OptArgs=*/1, |
||
417 | /*NumArgMembers=*/1, |
||
418 | /*HasCustomParsing=*/1, |
||
419 | /*AcceptsExprPack=*/0, |
||
420 | /*IsTargetSpecific=*/1, |
||
421 | /*IsType=*/0, |
||
422 | /*IsStmt=*/0, |
||
423 | /*IsKnownToGCC=*/1, |
||
424 | /*IsSupportedByPragmaAttribute=*/0, |
||
425 | /*Spellings=*/InterruptSpellings, |
||
426 | /*ArgNames=*/InterruptArgNames) {} |
||
427 | bool existsInTarget(const TargetInfo &Target) const override { |
||
428 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
429 | 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::m68k || 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); |
||
430 | } |
||
431 | |||
432 | bool isParamExpr(size_t N) const override { |
||
433 | return false; |
||
434 | } |
||
435 | |||
436 | static const ParsedAttrInfoInterrupt Instance; |
||
437 | }; |
||
438 | const ParsedAttrInfoInterrupt ParsedAttrInfoInterrupt::Instance; |
||
439 | static constexpr ParsedAttrInfo::Spelling AVRSignalSpellings[] = { |
||
440 | {AttributeCommonInfo::AS_GNU, "signal"}, |
||
441 | {AttributeCommonInfo::AS_CXX11, "gnu::signal"}, |
||
442 | {AttributeCommonInfo::AS_C2x, "gnu::signal"}, |
||
443 | }; |
||
444 | struct ParsedAttrInfoAVRSignal final : public ParsedAttrInfo { |
||
445 | constexpr ParsedAttrInfoAVRSignal() : ParsedAttrInfo( |
||
446 | /*AttrKind=*/ParsedAttr::AT_AVRSignal, |
||
447 | /*NumArgs=*/0, |
||
448 | /*OptArgs=*/0, |
||
449 | /*NumArgMembers=*/0, |
||
450 | /*HasCustomParsing=*/0, |
||
451 | /*AcceptsExprPack=*/0, |
||
452 | /*IsTargetSpecific=*/1, |
||
453 | /*IsType=*/0, |
||
454 | /*IsStmt=*/0, |
||
455 | /*IsKnownToGCC=*/1, |
||
456 | /*IsSupportedByPragmaAttribute=*/1, |
||
457 | /*Spellings=*/AVRSignalSpellings, |
||
458 | /*ArgNames=*/{}) {} |
||
459 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
460 | if (!isa<FunctionDecl>(D)) { |
||
461 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
462 | << Attr << "functions"; |
||
463 | return false; |
||
464 | } |
||
465 | return true; |
||
466 | } |
||
467 | |||
468 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
469 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
470 | << AL << St->getBeginLoc(); |
||
471 | return false; |
||
472 | } |
||
473 | |||
474 | bool existsInTarget(const TargetInfo &Target) const override { |
||
475 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
476 | return true && (T.getArch() == llvm::Triple::avr); |
||
477 | } |
||
478 | |||
479 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
480 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
481 | } |
||
482 | |||
483 | bool isParamExpr(size_t N) const override { |
||
484 | return false; |
||
485 | } |
||
486 | |||
487 | static const ParsedAttrInfoAVRSignal Instance; |
||
488 | }; |
||
489 | const ParsedAttrInfoAVRSignal ParsedAttrInfoAVRSignal::Instance; |
||
490 | static constexpr ParsedAttrInfo::Spelling AbiTagSpellings[] = { |
||
491 | {AttributeCommonInfo::AS_GNU, "abi_tag"}, |
||
492 | {AttributeCommonInfo::AS_CXX11, "gnu::abi_tag"}, |
||
493 | }; |
||
494 | static constexpr const char *AbiTagArgNames[] = { |
||
495 | "Tags...",}; |
||
496 | struct ParsedAttrInfoAbiTag final : public ParsedAttrInfo { |
||
497 | constexpr ParsedAttrInfoAbiTag() : ParsedAttrInfo( |
||
498 | /*AttrKind=*/ParsedAttr::AT_AbiTag, |
||
499 | /*NumArgs=*/0, |
||
500 | /*OptArgs=*/15, |
||
501 | /*NumArgMembers=*/1, |
||
502 | /*HasCustomParsing=*/0, |
||
503 | /*AcceptsExprPack=*/0, |
||
504 | /*IsTargetSpecific=*/0, |
||
505 | /*IsType=*/0, |
||
506 | /*IsStmt=*/0, |
||
507 | /*IsKnownToGCC=*/1, |
||
508 | /*IsSupportedByPragmaAttribute=*/1, |
||
509 | /*Spellings=*/AbiTagSpellings, |
||
510 | /*ArgNames=*/AbiTagArgNames) {} |
||
511 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
512 | if (!isStruct(D) && !isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<NamespaceDecl>(D)) { |
||
513 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
514 | << Attr << "structs, variables, functions, and namespaces"; |
||
515 | return false; |
||
516 | } |
||
517 | return true; |
||
518 | } |
||
519 | |||
520 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
521 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
522 | << AL << St->getBeginLoc(); |
||
523 | return false; |
||
524 | } |
||
525 | |||
526 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
527 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true)); |
||
528 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
529 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
530 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus)); |
||
531 | } |
||
532 | |||
533 | bool isParamExpr(size_t N) const override { |
||
534 | return false; |
||
535 | } |
||
536 | |||
537 | static const ParsedAttrInfoAbiTag Instance; |
||
538 | }; |
||
539 | const ParsedAttrInfoAbiTag ParsedAttrInfoAbiTag::Instance; |
||
540 | static constexpr ParsedAttrInfo::Spelling AcquireCapabilitySpellings[] = { |
||
541 | {AttributeCommonInfo::AS_GNU, "acquire_capability"}, |
||
542 | {AttributeCommonInfo::AS_CXX11, "clang::acquire_capability"}, |
||
543 | {AttributeCommonInfo::AS_GNU, "acquire_shared_capability"}, |
||
544 | {AttributeCommonInfo::AS_CXX11, "clang::acquire_shared_capability"}, |
||
545 | {AttributeCommonInfo::AS_GNU, "exclusive_lock_function"}, |
||
546 | {AttributeCommonInfo::AS_GNU, "shared_lock_function"}, |
||
547 | }; |
||
548 | static constexpr const char *AcquireCapabilityArgNames[] = { |
||
549 | "Args...",}; |
||
550 | struct ParsedAttrInfoAcquireCapability final : public ParsedAttrInfo { |
||
551 | constexpr ParsedAttrInfoAcquireCapability() : ParsedAttrInfo( |
||
552 | /*AttrKind=*/ParsedAttr::AT_AcquireCapability, |
||
553 | /*NumArgs=*/0, |
||
554 | /*OptArgs=*/15, |
||
555 | /*NumArgMembers=*/1, |
||
556 | /*HasCustomParsing=*/0, |
||
557 | /*AcceptsExprPack=*/0, |
||
558 | /*IsTargetSpecific=*/0, |
||
559 | /*IsType=*/0, |
||
560 | /*IsStmt=*/0, |
||
561 | /*IsKnownToGCC=*/0, |
||
562 | /*IsSupportedByPragmaAttribute=*/0, |
||
563 | /*Spellings=*/AcquireCapabilitySpellings, |
||
564 | /*ArgNames=*/AcquireCapabilityArgNames) {} |
||
565 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
566 | if (!isa<FunctionDecl>(D)) { |
||
567 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
568 | << Attr << "functions"; |
||
569 | return false; |
||
570 | } |
||
571 | return true; |
||
572 | } |
||
573 | |||
574 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
575 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
576 | << AL << St->getBeginLoc(); |
||
577 | return false; |
||
578 | } |
||
579 | |||
580 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
581 | enum Spelling { |
||
582 | GNU_acquire_capability = 0, |
||
583 | CXX11_clang_acquire_capability = 1, |
||
584 | GNU_acquire_shared_capability = 2, |
||
585 | CXX11_clang_acquire_shared_capability = 3, |
||
586 | GNU_exclusive_lock_function = 4, |
||
587 | GNU_shared_lock_function = 5, |
||
588 | SpellingNotCalculated = 15 |
||
589 | |||
590 | }; |
||
591 | |||
592 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
593 | switch (Idx) { |
||
594 | default: llvm_unreachable("Unknown spelling list index"); |
||
595 | case 0: return GNU_acquire_capability; |
||
596 | case 1: return CXX11_clang_acquire_capability; |
||
597 | case 2: return GNU_acquire_shared_capability; |
||
598 | case 3: return CXX11_clang_acquire_shared_capability; |
||
599 | case 4: return GNU_exclusive_lock_function; |
||
600 | case 5: return GNU_shared_lock_function; |
||
601 | } |
||
602 | } |
||
603 | |||
604 | bool isParamExpr(size_t N) const override { |
||
605 | return (N == 0) || false; |
||
606 | } |
||
607 | |||
608 | static const ParsedAttrInfoAcquireCapability Instance; |
||
609 | }; |
||
610 | const ParsedAttrInfoAcquireCapability ParsedAttrInfoAcquireCapability::Instance; |
||
611 | static constexpr ParsedAttrInfo::Spelling AcquireHandleSpellings[] = { |
||
612 | {AttributeCommonInfo::AS_GNU, "acquire_handle"}, |
||
613 | {AttributeCommonInfo::AS_CXX11, "clang::acquire_handle"}, |
||
614 | {AttributeCommonInfo::AS_C2x, "clang::acquire_handle"}, |
||
615 | }; |
||
616 | static constexpr const char *AcquireHandleArgNames[] = { |
||
617 | "HandleType",}; |
||
618 | struct ParsedAttrInfoAcquireHandle final : public ParsedAttrInfo { |
||
619 | constexpr ParsedAttrInfoAcquireHandle() : ParsedAttrInfo( |
||
620 | /*AttrKind=*/ParsedAttr::AT_AcquireHandle, |
||
621 | /*NumArgs=*/1, |
||
622 | /*OptArgs=*/0, |
||
623 | /*NumArgMembers=*/1, |
||
624 | /*HasCustomParsing=*/0, |
||
625 | /*AcceptsExprPack=*/0, |
||
626 | /*IsTargetSpecific=*/0, |
||
627 | /*IsType=*/1, |
||
628 | /*IsStmt=*/0, |
||
629 | /*IsKnownToGCC=*/0, |
||
630 | /*IsSupportedByPragmaAttribute=*/1, |
||
631 | /*Spellings=*/AcquireHandleSpellings, |
||
632 | /*ArgNames=*/AcquireHandleArgNames) {} |
||
633 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
634 | if (!isa<FunctionDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<ParmVarDecl>(D)) { |
||
635 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
636 | << Attr << "functions, typedefs, and parameters"; |
||
637 | return false; |
||
638 | } |
||
639 | return true; |
||
640 | } |
||
641 | |||
642 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
643 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
644 | << AL << St->getBeginLoc(); |
||
645 | return false; |
||
646 | } |
||
647 | |||
648 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
649 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
650 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
651 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
652 | } |
||
653 | |||
654 | bool isParamExpr(size_t N) const override { |
||
655 | return false; |
||
656 | } |
||
657 | |||
658 | static const ParsedAttrInfoAcquireHandle Instance; |
||
659 | }; |
||
660 | const ParsedAttrInfoAcquireHandle ParsedAttrInfoAcquireHandle::Instance; |
||
661 | static constexpr ParsedAttrInfo::Spelling AcquiredAfterSpellings[] = { |
||
662 | {AttributeCommonInfo::AS_GNU, "acquired_after"}, |
||
663 | }; |
||
664 | static constexpr const char *AcquiredAfterArgNames[] = { |
||
665 | "Args...",}; |
||
666 | struct ParsedAttrInfoAcquiredAfter final : public ParsedAttrInfo { |
||
667 | constexpr ParsedAttrInfoAcquiredAfter() : ParsedAttrInfo( |
||
668 | /*AttrKind=*/ParsedAttr::AT_AcquiredAfter, |
||
669 | /*NumArgs=*/0, |
||
670 | /*OptArgs=*/15, |
||
671 | /*NumArgMembers=*/1, |
||
672 | /*HasCustomParsing=*/0, |
||
673 | /*AcceptsExprPack=*/0, |
||
674 | /*IsTargetSpecific=*/0, |
||
675 | /*IsType=*/0, |
||
676 | /*IsStmt=*/0, |
||
677 | /*IsKnownToGCC=*/0, |
||
678 | /*IsSupportedByPragmaAttribute=*/0, |
||
679 | /*Spellings=*/AcquiredAfterSpellings, |
||
680 | /*ArgNames=*/AcquiredAfterArgNames) {} |
||
681 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
682 | if (!isa<FieldDecl>(D) && !isSharedVar(D)) { |
||
683 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
684 | << Attr << "non-static data members and global variables"; |
||
685 | return false; |
||
686 | } |
||
687 | return true; |
||
688 | } |
||
689 | |||
690 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
691 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
692 | << AL << St->getBeginLoc(); |
||
693 | return false; |
||
694 | } |
||
695 | |||
696 | bool isParamExpr(size_t N) const override { |
||
697 | return (N == 0) || false; |
||
698 | } |
||
699 | |||
700 | static const ParsedAttrInfoAcquiredAfter Instance; |
||
701 | }; |
||
702 | const ParsedAttrInfoAcquiredAfter ParsedAttrInfoAcquiredAfter::Instance; |
||
703 | static constexpr ParsedAttrInfo::Spelling AcquiredBeforeSpellings[] = { |
||
704 | {AttributeCommonInfo::AS_GNU, "acquired_before"}, |
||
705 | }; |
||
706 | static constexpr const char *AcquiredBeforeArgNames[] = { |
||
707 | "Args...",}; |
||
708 | struct ParsedAttrInfoAcquiredBefore final : public ParsedAttrInfo { |
||
709 | constexpr ParsedAttrInfoAcquiredBefore() : ParsedAttrInfo( |
||
710 | /*AttrKind=*/ParsedAttr::AT_AcquiredBefore, |
||
711 | /*NumArgs=*/0, |
||
712 | /*OptArgs=*/15, |
||
713 | /*NumArgMembers=*/1, |
||
714 | /*HasCustomParsing=*/0, |
||
715 | /*AcceptsExprPack=*/0, |
||
716 | /*IsTargetSpecific=*/0, |
||
717 | /*IsType=*/0, |
||
718 | /*IsStmt=*/0, |
||
719 | /*IsKnownToGCC=*/0, |
||
720 | /*IsSupportedByPragmaAttribute=*/0, |
||
721 | /*Spellings=*/AcquiredBeforeSpellings, |
||
722 | /*ArgNames=*/AcquiredBeforeArgNames) {} |
||
723 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
724 | if (!isa<FieldDecl>(D) && !isSharedVar(D)) { |
||
725 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
726 | << Attr << "non-static data members and global variables"; |
||
727 | return false; |
||
728 | } |
||
729 | return true; |
||
730 | } |
||
731 | |||
732 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
733 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
734 | << AL << St->getBeginLoc(); |
||
735 | return false; |
||
736 | } |
||
737 | |||
738 | bool isParamExpr(size_t N) const override { |
||
739 | return (N == 0) || false; |
||
740 | } |
||
741 | |||
742 | static const ParsedAttrInfoAcquiredBefore Instance; |
||
743 | }; |
||
744 | const ParsedAttrInfoAcquiredBefore ParsedAttrInfoAcquiredBefore::Instance; |
||
745 | static constexpr ParsedAttrInfo::Spelling AddressSpaceSpellings[] = { |
||
746 | {AttributeCommonInfo::AS_GNU, "address_space"}, |
||
747 | {AttributeCommonInfo::AS_CXX11, "clang::address_space"}, |
||
748 | {AttributeCommonInfo::AS_C2x, "clang::address_space"}, |
||
749 | }; |
||
750 | static constexpr const char *AddressSpaceArgNames[] = { |
||
751 | "AddressSpace",}; |
||
752 | struct ParsedAttrInfoAddressSpace final : public ParsedAttrInfo { |
||
753 | constexpr ParsedAttrInfoAddressSpace() : ParsedAttrInfo( |
||
754 | /*AttrKind=*/ParsedAttr::AT_AddressSpace, |
||
755 | /*NumArgs=*/1, |
||
756 | /*OptArgs=*/0, |
||
757 | /*NumArgMembers=*/1, |
||
758 | /*HasCustomParsing=*/0, |
||
759 | /*AcceptsExprPack=*/0, |
||
760 | /*IsTargetSpecific=*/0, |
||
761 | /*IsType=*/1, |
||
762 | /*IsStmt=*/0, |
||
763 | /*IsKnownToGCC=*/0, |
||
764 | /*IsSupportedByPragmaAttribute=*/0, |
||
765 | /*Spellings=*/AddressSpaceSpellings, |
||
766 | /*ArgNames=*/AddressSpaceArgNames) {} |
||
767 | bool isParamExpr(size_t N) const override { |
||
768 | return false; |
||
769 | } |
||
770 | |||
771 | static const ParsedAttrInfoAddressSpace Instance; |
||
772 | }; |
||
773 | const ParsedAttrInfoAddressSpace ParsedAttrInfoAddressSpace::Instance; |
||
774 | static constexpr ParsedAttrInfo::Spelling AliasSpellings[] = { |
||
775 | {AttributeCommonInfo::AS_GNU, "alias"}, |
||
776 | {AttributeCommonInfo::AS_CXX11, "gnu::alias"}, |
||
777 | {AttributeCommonInfo::AS_C2x, "gnu::alias"}, |
||
778 | }; |
||
779 | static constexpr const char *AliasArgNames[] = { |
||
780 | "Aliasee",}; |
||
781 | struct ParsedAttrInfoAlias final : public ParsedAttrInfo { |
||
782 | constexpr ParsedAttrInfoAlias() : ParsedAttrInfo( |
||
783 | /*AttrKind=*/ParsedAttr::AT_Alias, |
||
784 | /*NumArgs=*/1, |
||
785 | /*OptArgs=*/0, |
||
786 | /*NumArgMembers=*/1, |
||
787 | /*HasCustomParsing=*/0, |
||
788 | /*AcceptsExprPack=*/0, |
||
789 | /*IsTargetSpecific=*/0, |
||
790 | /*IsType=*/0, |
||
791 | /*IsStmt=*/0, |
||
792 | /*IsKnownToGCC=*/1, |
||
793 | /*IsSupportedByPragmaAttribute=*/1, |
||
794 | /*Spellings=*/AliasSpellings, |
||
795 | /*ArgNames=*/AliasArgNames) {} |
||
796 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
797 | if (!isa<FunctionDecl>(D) && !isGlobalVar(D)) { |
||
798 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
799 | << Attr << "functions and global variables"; |
||
800 | return false; |
||
801 | } |
||
802 | return true; |
||
803 | } |
||
804 | |||
805 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
806 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
807 | << AL << St->getBeginLoc(); |
||
808 | return false; |
||
809 | } |
||
810 | |||
811 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
812 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
813 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
814 | } |
||
815 | |||
816 | bool isParamExpr(size_t N) const override { |
||
817 | return false; |
||
818 | } |
||
819 | |||
820 | static const ParsedAttrInfoAlias Instance; |
||
821 | }; |
||
822 | const ParsedAttrInfoAlias ParsedAttrInfoAlias::Instance; |
||
823 | static constexpr ParsedAttrInfo::Spelling AlignValueSpellings[] = { |
||
824 | {AttributeCommonInfo::AS_GNU, "align_value"}, |
||
825 | }; |
||
826 | static constexpr const char *AlignValueArgNames[] = { |
||
827 | "Alignment",}; |
||
828 | struct ParsedAttrInfoAlignValue final : public ParsedAttrInfo { |
||
829 | constexpr ParsedAttrInfoAlignValue() : ParsedAttrInfo( |
||
830 | /*AttrKind=*/ParsedAttr::AT_AlignValue, |
||
831 | /*NumArgs=*/1, |
||
832 | /*OptArgs=*/0, |
||
833 | /*NumArgMembers=*/1, |
||
834 | /*HasCustomParsing=*/0, |
||
835 | /*AcceptsExprPack=*/0, |
||
836 | /*IsTargetSpecific=*/0, |
||
837 | /*IsType=*/0, |
||
838 | /*IsStmt=*/0, |
||
839 | /*IsKnownToGCC=*/0, |
||
840 | /*IsSupportedByPragmaAttribute=*/1, |
||
841 | /*Spellings=*/AlignValueSpellings, |
||
842 | /*ArgNames=*/AlignValueArgNames) {} |
||
843 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
844 | if (!isa<VarDecl>(D) && !isa<TypedefNameDecl>(D)) { |
||
845 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
846 | << Attr << "variables and typedefs"; |
||
847 | return false; |
||
848 | } |
||
849 | return true; |
||
850 | } |
||
851 | |||
852 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
853 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
854 | << AL << St->getBeginLoc(); |
||
855 | return false; |
||
856 | } |
||
857 | |||
858 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
859 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
860 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
861 | } |
||
862 | |||
863 | bool isParamExpr(size_t N) const override { |
||
864 | return (N == 0) || false; |
||
865 | } |
||
866 | |||
867 | static const ParsedAttrInfoAlignValue Instance; |
||
868 | }; |
||
869 | const ParsedAttrInfoAlignValue ParsedAttrInfoAlignValue::Instance; |
||
870 | static constexpr ParsedAttrInfo::Spelling AlignedSpellings[] = { |
||
871 | {AttributeCommonInfo::AS_GNU, "aligned"}, |
||
872 | {AttributeCommonInfo::AS_CXX11, "gnu::aligned"}, |
||
873 | {AttributeCommonInfo::AS_C2x, "gnu::aligned"}, |
||
874 | {AttributeCommonInfo::AS_Declspec, "align"}, |
||
875 | {AttributeCommonInfo::AS_Keyword, "alignas"}, |
||
876 | {AttributeCommonInfo::AS_Keyword, "_Alignas"}, |
||
877 | }; |
||
878 | static constexpr const char *AlignedArgNames[] = { |
||
879 | "Alignment",}; |
||
880 | struct ParsedAttrInfoAligned final : public ParsedAttrInfo { |
||
881 | constexpr ParsedAttrInfoAligned() : ParsedAttrInfo( |
||
882 | /*AttrKind=*/ParsedAttr::AT_Aligned, |
||
883 | /*NumArgs=*/0, |
||
884 | /*OptArgs=*/1, |
||
885 | /*NumArgMembers=*/1, |
||
886 | /*HasCustomParsing=*/0, |
||
887 | /*AcceptsExprPack=*/0, |
||
888 | /*IsTargetSpecific=*/0, |
||
889 | /*IsType=*/0, |
||
890 | /*IsStmt=*/0, |
||
891 | /*IsKnownToGCC=*/1, |
||
892 | /*IsSupportedByPragmaAttribute=*/0, |
||
893 | /*Spellings=*/AlignedSpellings, |
||
894 | /*ArgNames=*/AlignedArgNames) {} |
||
895 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
896 | enum Spelling { |
||
897 | GNU_aligned = 0, |
||
898 | CXX11_gnu_aligned = 1, |
||
899 | C2x_gnu_aligned = 2, |
||
900 | Declspec_align = 3, |
||
901 | Keyword_alignas = 4, |
||
902 | Keyword_Alignas = 5, |
||
903 | SpellingNotCalculated = 15 |
||
904 | |||
905 | }; |
||
906 | |||
907 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
908 | switch (Idx) { |
||
909 | default: llvm_unreachable("Unknown spelling list index"); |
||
910 | case 0: return GNU_aligned; |
||
911 | case 1: return CXX11_gnu_aligned; |
||
912 | case 2: return C2x_gnu_aligned; |
||
913 | case 3: return Declspec_align; |
||
914 | case 4: return Keyword_alignas; |
||
915 | case 5: return Keyword_Alignas; |
||
916 | } |
||
917 | } |
||
918 | |||
919 | bool isParamExpr(size_t N) const override { |
||
920 | return false; |
||
921 | } |
||
922 | |||
923 | static const ParsedAttrInfoAligned Instance; |
||
924 | }; |
||
925 | const ParsedAttrInfoAligned ParsedAttrInfoAligned::Instance; |
||
926 | static constexpr ParsedAttrInfo::Spelling AllocAlignSpellings[] = { |
||
927 | {AttributeCommonInfo::AS_GNU, "alloc_align"}, |
||
928 | {AttributeCommonInfo::AS_CXX11, "gnu::alloc_align"}, |
||
929 | {AttributeCommonInfo::AS_C2x, "gnu::alloc_align"}, |
||
930 | }; |
||
931 | static constexpr const char *AllocAlignArgNames[] = { |
||
932 | "ParamIndex",}; |
||
933 | struct ParsedAttrInfoAllocAlign final : public ParsedAttrInfo { |
||
934 | constexpr ParsedAttrInfoAllocAlign() : ParsedAttrInfo( |
||
935 | /*AttrKind=*/ParsedAttr::AT_AllocAlign, |
||
936 | /*NumArgs=*/1, |
||
937 | /*OptArgs=*/0, |
||
938 | /*NumArgMembers=*/1, |
||
939 | /*HasCustomParsing=*/0, |
||
940 | /*AcceptsExprPack=*/0, |
||
941 | /*IsTargetSpecific=*/0, |
||
942 | /*IsType=*/0, |
||
943 | /*IsStmt=*/0, |
||
944 | /*IsKnownToGCC=*/1, |
||
945 | /*IsSupportedByPragmaAttribute=*/0, |
||
946 | /*Spellings=*/AllocAlignSpellings, |
||
947 | /*ArgNames=*/AllocAlignArgNames) {} |
||
948 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
949 | if (!isHasFunctionProto(D)) { |
||
950 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
951 | << Attr << "non-K&R-style functions"; |
||
952 | return false; |
||
953 | } |
||
954 | return true; |
||
955 | } |
||
956 | |||
957 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
958 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
959 | << AL << St->getBeginLoc(); |
||
960 | return false; |
||
961 | } |
||
962 | |||
963 | bool isParamExpr(size_t N) const override { |
||
964 | return false; |
||
965 | } |
||
966 | |||
967 | static const ParsedAttrInfoAllocAlign Instance; |
||
968 | }; |
||
969 | const ParsedAttrInfoAllocAlign ParsedAttrInfoAllocAlign::Instance; |
||
970 | static constexpr ParsedAttrInfo::Spelling AllocSizeSpellings[] = { |
||
971 | {AttributeCommonInfo::AS_GNU, "alloc_size"}, |
||
972 | {AttributeCommonInfo::AS_CXX11, "gnu::alloc_size"}, |
||
973 | {AttributeCommonInfo::AS_C2x, "gnu::alloc_size"}, |
||
974 | }; |
||
975 | static constexpr const char *AllocSizeArgNames[] = { |
||
976 | "ElemSizeParam","NumElemsParam",}; |
||
977 | struct ParsedAttrInfoAllocSize final : public ParsedAttrInfo { |
||
978 | constexpr ParsedAttrInfoAllocSize() : ParsedAttrInfo( |
||
979 | /*AttrKind=*/ParsedAttr::AT_AllocSize, |
||
980 | /*NumArgs=*/1, |
||
981 | /*OptArgs=*/1, |
||
982 | /*NumArgMembers=*/2, |
||
983 | /*HasCustomParsing=*/0, |
||
984 | /*AcceptsExprPack=*/0, |
||
985 | /*IsTargetSpecific=*/0, |
||
986 | /*IsType=*/0, |
||
987 | /*IsStmt=*/0, |
||
988 | /*IsKnownToGCC=*/1, |
||
989 | /*IsSupportedByPragmaAttribute=*/0, |
||
990 | /*Spellings=*/AllocSizeSpellings, |
||
991 | /*ArgNames=*/AllocSizeArgNames) {} |
||
992 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
993 | if (!isHasFunctionProto(D)) { |
||
994 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
995 | << Attr << "non-K&R-style functions"; |
||
996 | return false; |
||
997 | } |
||
998 | return true; |
||
999 | } |
||
1000 | |||
1001 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1002 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1003 | << AL << St->getBeginLoc(); |
||
1004 | return false; |
||
1005 | } |
||
1006 | |||
1007 | bool isParamExpr(size_t N) const override { |
||
1008 | return false; |
||
1009 | } |
||
1010 | |||
1011 | static const ParsedAttrInfoAllocSize Instance; |
||
1012 | }; |
||
1013 | const ParsedAttrInfoAllocSize ParsedAttrInfoAllocSize::Instance; |
||
1014 | static constexpr ParsedAttrInfo::Spelling AlwaysDestroySpellings[] = { |
||
1015 | {AttributeCommonInfo::AS_GNU, "always_destroy"}, |
||
1016 | {AttributeCommonInfo::AS_CXX11, "clang::always_destroy"}, |
||
1017 | }; |
||
1018 | struct ParsedAttrInfoAlwaysDestroy final : public ParsedAttrInfo { |
||
1019 | constexpr ParsedAttrInfoAlwaysDestroy() : ParsedAttrInfo( |
||
1020 | /*AttrKind=*/ParsedAttr::AT_AlwaysDestroy, |
||
1021 | /*NumArgs=*/0, |
||
1022 | /*OptArgs=*/0, |
||
1023 | /*NumArgMembers=*/0, |
||
1024 | /*HasCustomParsing=*/0, |
||
1025 | /*AcceptsExprPack=*/0, |
||
1026 | /*IsTargetSpecific=*/0, |
||
1027 | /*IsType=*/0, |
||
1028 | /*IsStmt=*/0, |
||
1029 | /*IsKnownToGCC=*/0, |
||
1030 | /*IsSupportedByPragmaAttribute=*/1, |
||
1031 | /*Spellings=*/AlwaysDestroySpellings, |
||
1032 | /*ArgNames=*/{}) {} |
||
1033 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1034 | if (!isa<VarDecl>(D)) { |
||
1035 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1036 | << Attr << "variables"; |
||
1037 | return false; |
||
1038 | } |
||
1039 | return true; |
||
1040 | } |
||
1041 | |||
1042 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1043 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1044 | << AL << St->getBeginLoc(); |
||
1045 | return false; |
||
1046 | } |
||
1047 | |||
1048 | using ParsedAttrInfo::diagMutualExclusion; |
||
1049 | |||
1050 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
1051 | if (const auto *A = D->getAttr<NoDestroyAttr>()) { |
||
1052 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
1053 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
1054 | return false; |
||
1055 | } |
||
1056 | return true; |
||
1057 | } |
||
1058 | |||
1059 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1060 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
1061 | } |
||
1062 | |||
1063 | bool isParamExpr(size_t N) const override { |
||
1064 | return false; |
||
1065 | } |
||
1066 | |||
1067 | static const ParsedAttrInfoAlwaysDestroy Instance; |
||
1068 | }; |
||
1069 | const ParsedAttrInfoAlwaysDestroy ParsedAttrInfoAlwaysDestroy::Instance; |
||
1070 | static constexpr ParsedAttrInfo::Spelling AlwaysInlineSpellings[] = { |
||
1071 | {AttributeCommonInfo::AS_GNU, "always_inline"}, |
||
1072 | {AttributeCommonInfo::AS_CXX11, "gnu::always_inline"}, |
||
1073 | {AttributeCommonInfo::AS_C2x, "gnu::always_inline"}, |
||
1074 | {AttributeCommonInfo::AS_CXX11, "clang::always_inline"}, |
||
1075 | {AttributeCommonInfo::AS_C2x, "clang::always_inline"}, |
||
1076 | {AttributeCommonInfo::AS_Keyword, "__forceinline"}, |
||
1077 | }; |
||
1078 | struct ParsedAttrInfoAlwaysInline final : public ParsedAttrInfo { |
||
1079 | constexpr ParsedAttrInfoAlwaysInline() : ParsedAttrInfo( |
||
1080 | /*AttrKind=*/ParsedAttr::AT_AlwaysInline, |
||
1081 | /*NumArgs=*/0, |
||
1082 | /*OptArgs=*/0, |
||
1083 | /*NumArgMembers=*/0, |
||
1084 | /*HasCustomParsing=*/0, |
||
1085 | /*AcceptsExprPack=*/0, |
||
1086 | /*IsTargetSpecific=*/0, |
||
1087 | /*IsType=*/0, |
||
1088 | /*IsStmt=*/1, |
||
1089 | /*IsKnownToGCC=*/1, |
||
1090 | /*IsSupportedByPragmaAttribute=*/1, |
||
1091 | /*Spellings=*/AlwaysInlineSpellings, |
||
1092 | /*ArgNames=*/{}) {} |
||
1093 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1094 | if (!isa<FunctionDecl>(D)) { |
||
1095 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1096 | << Attr << "functions and statements"; |
||
1097 | return false; |
||
1098 | } |
||
1099 | return true; |
||
1100 | } |
||
1101 | |||
1102 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override { |
||
1103 | if (!isa<Stmt>(St)) { |
||
1104 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1105 | << Attr << "functions and statements"; |
||
1106 | return false; |
||
1107 | } |
||
1108 | return true; |
||
1109 | } |
||
1110 | |||
1111 | using ParsedAttrInfo::diagMutualExclusion; |
||
1112 | |||
1113 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
1114 | if (const auto *A = D->getAttr<NotTailCalledAttr>()) { |
||
1115 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
1116 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
1117 | return false; |
||
1118 | } |
||
1119 | return true; |
||
1120 | } |
||
1121 | |||
1122 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
1123 | enum Spelling { |
||
1124 | GNU_always_inline = 0, |
||
1125 | CXX11_gnu_always_inline = 1, |
||
1126 | C2x_gnu_always_inline = 2, |
||
1127 | CXX11_clang_always_inline = 3, |
||
1128 | C2x_clang_always_inline = 4, |
||
1129 | Keyword_forceinline = 5, |
||
1130 | SpellingNotCalculated = 15 |
||
1131 | |||
1132 | }; |
||
1133 | |||
1134 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
1135 | switch (Idx) { |
||
1136 | default: llvm_unreachable("Unknown spelling list index"); |
||
1137 | case 0: return GNU_always_inline; |
||
1138 | case 1: return CXX11_gnu_always_inline; |
||
1139 | case 2: return C2x_gnu_always_inline; |
||
1140 | case 3: return CXX11_clang_always_inline; |
||
1141 | case 4: return C2x_clang_always_inline; |
||
1142 | case 5: return Keyword_forceinline; |
||
1143 | } |
||
1144 | } |
||
1145 | |||
1146 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1147 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
1148 | } |
||
1149 | |||
1150 | bool isParamExpr(size_t N) const override { |
||
1151 | return false; |
||
1152 | } |
||
1153 | |||
1154 | static const ParsedAttrInfoAlwaysInline Instance; |
||
1155 | }; |
||
1156 | const ParsedAttrInfoAlwaysInline ParsedAttrInfoAlwaysInline::Instance; |
||
1157 | static constexpr ParsedAttrInfo::Spelling AnalyzerNoReturnSpellings[] = { |
||
1158 | {AttributeCommonInfo::AS_GNU, "analyzer_noreturn"}, |
||
1159 | }; |
||
1160 | struct ParsedAttrInfoAnalyzerNoReturn final : public ParsedAttrInfo { |
||
1161 | constexpr ParsedAttrInfoAnalyzerNoReturn() : ParsedAttrInfo( |
||
1162 | /*AttrKind=*/ParsedAttr::AT_AnalyzerNoReturn, |
||
1163 | /*NumArgs=*/0, |
||
1164 | /*OptArgs=*/0, |
||
1165 | /*NumArgMembers=*/0, |
||
1166 | /*HasCustomParsing=*/0, |
||
1167 | /*AcceptsExprPack=*/0, |
||
1168 | /*IsTargetSpecific=*/0, |
||
1169 | /*IsType=*/0, |
||
1170 | /*IsStmt=*/0, |
||
1171 | /*IsKnownToGCC=*/0, |
||
1172 | /*IsSupportedByPragmaAttribute=*/0, |
||
1173 | /*Spellings=*/AnalyzerNoReturnSpellings, |
||
1174 | /*ArgNames=*/{}) {} |
||
1175 | bool isParamExpr(size_t N) const override { |
||
1176 | return false; |
||
1177 | } |
||
1178 | |||
1179 | static const ParsedAttrInfoAnalyzerNoReturn Instance; |
||
1180 | }; |
||
1181 | const ParsedAttrInfoAnalyzerNoReturn ParsedAttrInfoAnalyzerNoReturn::Instance; |
||
1182 | static constexpr ParsedAttrInfo::Spelling AnnotateSpellings[] = { |
||
1183 | {AttributeCommonInfo::AS_GNU, "annotate"}, |
||
1184 | {AttributeCommonInfo::AS_CXX11, "clang::annotate"}, |
||
1185 | {AttributeCommonInfo::AS_C2x, "clang::annotate"}, |
||
1186 | }; |
||
1187 | static constexpr const char *AnnotateArgNames[] = { |
||
1188 | "Annotation","Args...",}; |
||
1189 | struct ParsedAttrInfoAnnotate final : public ParsedAttrInfo { |
||
1190 | constexpr ParsedAttrInfoAnnotate() : ParsedAttrInfo( |
||
1191 | /*AttrKind=*/ParsedAttr::AT_Annotate, |
||
1192 | /*NumArgs=*/1, |
||
1193 | /*OptArgs=*/15, |
||
1194 | /*NumArgMembers=*/2, |
||
1195 | /*HasCustomParsing=*/0, |
||
1196 | /*AcceptsExprPack=*/1, |
||
1197 | /*IsTargetSpecific=*/0, |
||
1198 | /*IsType=*/0, |
||
1199 | /*IsStmt=*/0, |
||
1200 | /*IsKnownToGCC=*/0, |
||
1201 | /*IsSupportedByPragmaAttribute=*/1, |
||
1202 | /*Spellings=*/AnnotateSpellings, |
||
1203 | /*ArgNames=*/AnnotateArgNames) {} |
||
1204 | bool isParamExpr(size_t N) const override { |
||
1205 | return (N == 1) || false; |
||
1206 | } |
||
1207 | |||
1208 | static const ParsedAttrInfoAnnotate Instance; |
||
1209 | }; |
||
1210 | const ParsedAttrInfoAnnotate ParsedAttrInfoAnnotate::Instance; |
||
1211 | static constexpr ParsedAttrInfo::Spelling AnnotateTypeSpellings[] = { |
||
1212 | {AttributeCommonInfo::AS_CXX11, "clang::annotate_type"}, |
||
1213 | {AttributeCommonInfo::AS_C2x, "clang::annotate_type"}, |
||
1214 | }; |
||
1215 | static constexpr const char *AnnotateTypeArgNames[] = { |
||
1216 | "Annotation","Args...",}; |
||
1217 | struct ParsedAttrInfoAnnotateType final : public ParsedAttrInfo { |
||
1218 | constexpr ParsedAttrInfoAnnotateType() : ParsedAttrInfo( |
||
1219 | /*AttrKind=*/ParsedAttr::AT_AnnotateType, |
||
1220 | /*NumArgs=*/1, |
||
1221 | /*OptArgs=*/15, |
||
1222 | /*NumArgMembers=*/2, |
||
1223 | /*HasCustomParsing=*/1, |
||
1224 | /*AcceptsExprPack=*/1, |
||
1225 | /*IsTargetSpecific=*/0, |
||
1226 | /*IsType=*/1, |
||
1227 | /*IsStmt=*/0, |
||
1228 | /*IsKnownToGCC=*/0, |
||
1229 | /*IsSupportedByPragmaAttribute=*/0, |
||
1230 | /*Spellings=*/AnnotateTypeSpellings, |
||
1231 | /*ArgNames=*/AnnotateTypeArgNames) {} |
||
1232 | bool isParamExpr(size_t N) const override { |
||
1233 | return (N == 1) || false; |
||
1234 | } |
||
1235 | |||
1236 | static const ParsedAttrInfoAnnotateType Instance; |
||
1237 | }; |
||
1238 | const ParsedAttrInfoAnnotateType ParsedAttrInfoAnnotateType::Instance; |
||
1239 | static constexpr ParsedAttrInfo::Spelling AnyX86NoCallerSavedRegistersSpellings[] = { |
||
1240 | {AttributeCommonInfo::AS_GNU, "no_caller_saved_registers"}, |
||
1241 | {AttributeCommonInfo::AS_CXX11, "gnu::no_caller_saved_registers"}, |
||
1242 | {AttributeCommonInfo::AS_C2x, "gnu::no_caller_saved_registers"}, |
||
1243 | }; |
||
1244 | struct ParsedAttrInfoAnyX86NoCallerSavedRegisters final : public ParsedAttrInfo { |
||
1245 | constexpr ParsedAttrInfoAnyX86NoCallerSavedRegisters() : ParsedAttrInfo( |
||
1246 | /*AttrKind=*/ParsedAttr::AT_AnyX86NoCallerSavedRegisters, |
||
1247 | /*NumArgs=*/0, |
||
1248 | /*OptArgs=*/0, |
||
1249 | /*NumArgMembers=*/0, |
||
1250 | /*HasCustomParsing=*/0, |
||
1251 | /*AcceptsExprPack=*/0, |
||
1252 | /*IsTargetSpecific=*/1, |
||
1253 | /*IsType=*/0, |
||
1254 | /*IsStmt=*/0, |
||
1255 | /*IsKnownToGCC=*/1, |
||
1256 | /*IsSupportedByPragmaAttribute=*/0, |
||
1257 | /*Spellings=*/AnyX86NoCallerSavedRegistersSpellings, |
||
1258 | /*ArgNames=*/{}) {} |
||
1259 | bool existsInTarget(const TargetInfo &Target) const override { |
||
1260 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
1261 | return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64); |
||
1262 | } |
||
1263 | |||
1264 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
1265 | D->addAttr(::new (S.Context) AnyX86NoCallerSavedRegistersAttr(S.Context, Attr)); |
||
1266 | return AttributeApplied; |
||
1267 | } |
||
1268 | |||
1269 | bool isParamExpr(size_t N) const override { |
||
1270 | return false; |
||
1271 | } |
||
1272 | |||
1273 | static const ParsedAttrInfoAnyX86NoCallerSavedRegisters Instance; |
||
1274 | }; |
||
1275 | const ParsedAttrInfoAnyX86NoCallerSavedRegisters ParsedAttrInfoAnyX86NoCallerSavedRegisters::Instance; |
||
1276 | static constexpr ParsedAttrInfo::Spelling AnyX86NoCfCheckSpellings[] = { |
||
1277 | {AttributeCommonInfo::AS_GNU, "nocf_check"}, |
||
1278 | {AttributeCommonInfo::AS_CXX11, "gnu::nocf_check"}, |
||
1279 | {AttributeCommonInfo::AS_C2x, "gnu::nocf_check"}, |
||
1280 | }; |
||
1281 | struct ParsedAttrInfoAnyX86NoCfCheck final : public ParsedAttrInfo { |
||
1282 | constexpr ParsedAttrInfoAnyX86NoCfCheck() : ParsedAttrInfo( |
||
1283 | /*AttrKind=*/ParsedAttr::AT_AnyX86NoCfCheck, |
||
1284 | /*NumArgs=*/0, |
||
1285 | /*OptArgs=*/0, |
||
1286 | /*NumArgMembers=*/0, |
||
1287 | /*HasCustomParsing=*/0, |
||
1288 | /*AcceptsExprPack=*/0, |
||
1289 | /*IsTargetSpecific=*/1, |
||
1290 | /*IsType=*/1, |
||
1291 | /*IsStmt=*/0, |
||
1292 | /*IsKnownToGCC=*/1, |
||
1293 | /*IsSupportedByPragmaAttribute=*/1, |
||
1294 | /*Spellings=*/AnyX86NoCfCheckSpellings, |
||
1295 | /*ArgNames=*/{}) {} |
||
1296 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1297 | if (!isFunctionLike(D)) { |
||
1298 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1299 | << Attr << "functions and function pointers"; |
||
1300 | return false; |
||
1301 | } |
||
1302 | return true; |
||
1303 | } |
||
1304 | |||
1305 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1306 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1307 | << AL << St->getBeginLoc(); |
||
1308 | return false; |
||
1309 | } |
||
1310 | |||
1311 | bool existsInTarget(const TargetInfo &Target) const override { |
||
1312 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
1313 | return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64); |
||
1314 | } |
||
1315 | |||
1316 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1317 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true)); |
||
1318 | } |
||
1319 | |||
1320 | bool isParamExpr(size_t N) const override { |
||
1321 | return false; |
||
1322 | } |
||
1323 | |||
1324 | static const ParsedAttrInfoAnyX86NoCfCheck Instance; |
||
1325 | }; |
||
1326 | const ParsedAttrInfoAnyX86NoCfCheck ParsedAttrInfoAnyX86NoCfCheck::Instance; |
||
1327 | static constexpr ParsedAttrInfo::Spelling ArcWeakrefUnavailableSpellings[] = { |
||
1328 | {AttributeCommonInfo::AS_GNU, "objc_arc_weak_reference_unavailable"}, |
||
1329 | {AttributeCommonInfo::AS_CXX11, "clang::objc_arc_weak_reference_unavailable"}, |
||
1330 | {AttributeCommonInfo::AS_C2x, "clang::objc_arc_weak_reference_unavailable"}, |
||
1331 | }; |
||
1332 | struct ParsedAttrInfoArcWeakrefUnavailable final : public ParsedAttrInfo { |
||
1333 | constexpr ParsedAttrInfoArcWeakrefUnavailable() : ParsedAttrInfo( |
||
1334 | /*AttrKind=*/ParsedAttr::AT_ArcWeakrefUnavailable, |
||
1335 | /*NumArgs=*/0, |
||
1336 | /*OptArgs=*/0, |
||
1337 | /*NumArgMembers=*/0, |
||
1338 | /*HasCustomParsing=*/0, |
||
1339 | /*AcceptsExprPack=*/0, |
||
1340 | /*IsTargetSpecific=*/0, |
||
1341 | /*IsType=*/0, |
||
1342 | /*IsStmt=*/0, |
||
1343 | /*IsKnownToGCC=*/0, |
||
1344 | /*IsSupportedByPragmaAttribute=*/1, |
||
1345 | /*Spellings=*/ArcWeakrefUnavailableSpellings, |
||
1346 | /*ArgNames=*/{}) {} |
||
1347 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1348 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
1349 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
1350 | << Attr << "Objective-C interfaces"; |
||
1351 | return false; |
||
1352 | } |
||
1353 | return true; |
||
1354 | } |
||
1355 | |||
1356 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1357 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1358 | << AL << St->getBeginLoc(); |
||
1359 | return false; |
||
1360 | } |
||
1361 | |||
1362 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1363 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
1364 | } |
||
1365 | |||
1366 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
1367 | D->addAttr(::new (S.Context) ArcWeakrefUnavailableAttr(S.Context, Attr)); |
||
1368 | return AttributeApplied; |
||
1369 | } |
||
1370 | |||
1371 | bool isParamExpr(size_t N) const override { |
||
1372 | return false; |
||
1373 | } |
||
1374 | |||
1375 | static const ParsedAttrInfoArcWeakrefUnavailable Instance; |
||
1376 | }; |
||
1377 | const ParsedAttrInfoArcWeakrefUnavailable ParsedAttrInfoArcWeakrefUnavailable::Instance; |
||
1378 | static constexpr ParsedAttrInfo::Spelling ArgumentWithTypeTagSpellings[] = { |
||
1379 | {AttributeCommonInfo::AS_GNU, "argument_with_type_tag"}, |
||
1380 | {AttributeCommonInfo::AS_CXX11, "clang::argument_with_type_tag"}, |
||
1381 | {AttributeCommonInfo::AS_C2x, "clang::argument_with_type_tag"}, |
||
1382 | {AttributeCommonInfo::AS_GNU, "pointer_with_type_tag"}, |
||
1383 | {AttributeCommonInfo::AS_CXX11, "clang::pointer_with_type_tag"}, |
||
1384 | {AttributeCommonInfo::AS_C2x, "clang::pointer_with_type_tag"}, |
||
1385 | }; |
||
1386 | static constexpr const char *ArgumentWithTypeTagArgNames[] = { |
||
1387 | "ArgumentKind","ArgumentIdx","TypeTagIdx",}; |
||
1388 | struct ParsedAttrInfoArgumentWithTypeTag final : public ParsedAttrInfo { |
||
1389 | constexpr ParsedAttrInfoArgumentWithTypeTag() : ParsedAttrInfo( |
||
1390 | /*AttrKind=*/ParsedAttr::AT_ArgumentWithTypeTag, |
||
1391 | /*NumArgs=*/3, |
||
1392 | /*OptArgs=*/0, |
||
1393 | /*NumArgMembers=*/3, |
||
1394 | /*HasCustomParsing=*/0, |
||
1395 | /*AcceptsExprPack=*/0, |
||
1396 | /*IsTargetSpecific=*/0, |
||
1397 | /*IsType=*/0, |
||
1398 | /*IsStmt=*/0, |
||
1399 | /*IsKnownToGCC=*/0, |
||
1400 | /*IsSupportedByPragmaAttribute=*/0, |
||
1401 | /*Spellings=*/ArgumentWithTypeTagSpellings, |
||
1402 | /*ArgNames=*/ArgumentWithTypeTagArgNames) {} |
||
1403 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1404 | if (!isHasFunctionProto(D)) { |
||
1405 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
1406 | << Attr << "non-K&R-style functions"; |
||
1407 | return false; |
||
1408 | } |
||
1409 | return true; |
||
1410 | } |
||
1411 | |||
1412 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1413 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1414 | << AL << St->getBeginLoc(); |
||
1415 | return false; |
||
1416 | } |
||
1417 | |||
1418 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
1419 | enum Spelling { |
||
1420 | GNU_argument_with_type_tag = 0, |
||
1421 | CXX11_clang_argument_with_type_tag = 1, |
||
1422 | C2x_clang_argument_with_type_tag = 2, |
||
1423 | GNU_pointer_with_type_tag = 3, |
||
1424 | CXX11_clang_pointer_with_type_tag = 4, |
||
1425 | C2x_clang_pointer_with_type_tag = 5, |
||
1426 | SpellingNotCalculated = 15 |
||
1427 | |||
1428 | }; |
||
1429 | |||
1430 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
1431 | switch (Idx) { |
||
1432 | default: llvm_unreachable("Unknown spelling list index"); |
||
1433 | case 0: return GNU_argument_with_type_tag; |
||
1434 | case 1: return CXX11_clang_argument_with_type_tag; |
||
1435 | case 2: return C2x_clang_argument_with_type_tag; |
||
1436 | case 3: return GNU_pointer_with_type_tag; |
||
1437 | case 4: return CXX11_clang_pointer_with_type_tag; |
||
1438 | case 5: return C2x_clang_pointer_with_type_tag; |
||
1439 | } |
||
1440 | } |
||
1441 | |||
1442 | bool isParamExpr(size_t N) const override { |
||
1443 | return false; |
||
1444 | } |
||
1445 | |||
1446 | static const ParsedAttrInfoArgumentWithTypeTag Instance; |
||
1447 | }; |
||
1448 | const ParsedAttrInfoArgumentWithTypeTag ParsedAttrInfoArgumentWithTypeTag::Instance; |
||
1449 | static constexpr ParsedAttrInfo::Spelling ArmBuiltinAliasSpellings[] = { |
||
1450 | {AttributeCommonInfo::AS_GNU, "__clang_arm_builtin_alias"}, |
||
1451 | {AttributeCommonInfo::AS_CXX11, "clang::__clang_arm_builtin_alias"}, |
||
1452 | {AttributeCommonInfo::AS_C2x, "clang::__clang_arm_builtin_alias"}, |
||
1453 | }; |
||
1454 | static constexpr const char *ArmBuiltinAliasArgNames[] = { |
||
1455 | "BuiltinName",}; |
||
1456 | struct ParsedAttrInfoArmBuiltinAlias final : public ParsedAttrInfo { |
||
1457 | constexpr ParsedAttrInfoArmBuiltinAlias() : ParsedAttrInfo( |
||
1458 | /*AttrKind=*/ParsedAttr::AT_ArmBuiltinAlias, |
||
1459 | /*NumArgs=*/1, |
||
1460 | /*OptArgs=*/0, |
||
1461 | /*NumArgMembers=*/1, |
||
1462 | /*HasCustomParsing=*/0, |
||
1463 | /*AcceptsExprPack=*/0, |
||
1464 | /*IsTargetSpecific=*/1, |
||
1465 | /*IsType=*/0, |
||
1466 | /*IsStmt=*/0, |
||
1467 | /*IsKnownToGCC=*/0, |
||
1468 | /*IsSupportedByPragmaAttribute=*/1, |
||
1469 | /*Spellings=*/ArmBuiltinAliasSpellings, |
||
1470 | /*ArgNames=*/ArmBuiltinAliasArgNames) {} |
||
1471 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1472 | if (!isa<FunctionDecl>(D)) { |
||
1473 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
1474 | << Attr << "functions"; |
||
1475 | return false; |
||
1476 | } |
||
1477 | return true; |
||
1478 | } |
||
1479 | |||
1480 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1481 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1482 | << AL << St->getBeginLoc(); |
||
1483 | return false; |
||
1484 | } |
||
1485 | |||
1486 | bool existsInTarget(const TargetInfo &Target) const override { |
||
1487 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
1488 | 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::aarch64); |
||
1489 | } |
||
1490 | |||
1491 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1492 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
1493 | } |
||
1494 | |||
1495 | bool isParamExpr(size_t N) const override { |
||
1496 | return false; |
||
1497 | } |
||
1498 | |||
1499 | static const ParsedAttrInfoArmBuiltinAlias Instance; |
||
1500 | }; |
||
1501 | const ParsedAttrInfoArmBuiltinAlias ParsedAttrInfoArmBuiltinAlias::Instance; |
||
1502 | static constexpr ParsedAttrInfo::Spelling ArmMveStrictPolymorphismSpellings[] = { |
||
1503 | {AttributeCommonInfo::AS_GNU, "__clang_arm_mve_strict_polymorphism"}, |
||
1504 | {AttributeCommonInfo::AS_CXX11, "clang::__clang_arm_mve_strict_polymorphism"}, |
||
1505 | {AttributeCommonInfo::AS_C2x, "clang::__clang_arm_mve_strict_polymorphism"}, |
||
1506 | }; |
||
1507 | struct ParsedAttrInfoArmMveStrictPolymorphism final : public ParsedAttrInfo { |
||
1508 | constexpr ParsedAttrInfoArmMveStrictPolymorphism() : ParsedAttrInfo( |
||
1509 | /*AttrKind=*/ParsedAttr::AT_ArmMveStrictPolymorphism, |
||
1510 | /*NumArgs=*/0, |
||
1511 | /*OptArgs=*/0, |
||
1512 | /*NumArgMembers=*/0, |
||
1513 | /*HasCustomParsing=*/0, |
||
1514 | /*AcceptsExprPack=*/0, |
||
1515 | /*IsTargetSpecific=*/1, |
||
1516 | /*IsType=*/1, |
||
1517 | /*IsStmt=*/0, |
||
1518 | /*IsKnownToGCC=*/0, |
||
1519 | /*IsSupportedByPragmaAttribute=*/0, |
||
1520 | /*Spellings=*/ArmMveStrictPolymorphismSpellings, |
||
1521 | /*ArgNames=*/{}) {} |
||
1522 | bool existsInTarget(const TargetInfo &Target) const override { |
||
1523 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
1524 | return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb); |
||
1525 | } |
||
1526 | |||
1527 | bool isParamExpr(size_t N) const override { |
||
1528 | return false; |
||
1529 | } |
||
1530 | |||
1531 | static const ParsedAttrInfoArmMveStrictPolymorphism Instance; |
||
1532 | }; |
||
1533 | const ParsedAttrInfoArmMveStrictPolymorphism ParsedAttrInfoArmMveStrictPolymorphism::Instance; |
||
1534 | static constexpr ParsedAttrInfo::Spelling ArmSveVectorBitsSpellings[] = { |
||
1535 | {AttributeCommonInfo::AS_GNU, "arm_sve_vector_bits"}, |
||
1536 | }; |
||
1537 | static constexpr const char *ArmSveVectorBitsArgNames[] = { |
||
1538 | "NumBits",}; |
||
1539 | struct ParsedAttrInfoArmSveVectorBits final : public ParsedAttrInfo { |
||
1540 | constexpr ParsedAttrInfoArmSveVectorBits() : ParsedAttrInfo( |
||
1541 | /*AttrKind=*/ParsedAttr::AT_ArmSveVectorBits, |
||
1542 | /*NumArgs=*/1, |
||
1543 | /*OptArgs=*/0, |
||
1544 | /*NumArgMembers=*/1, |
||
1545 | /*HasCustomParsing=*/0, |
||
1546 | /*AcceptsExprPack=*/0, |
||
1547 | /*IsTargetSpecific=*/0, |
||
1548 | /*IsType=*/1, |
||
1549 | /*IsStmt=*/0, |
||
1550 | /*IsKnownToGCC=*/0, |
||
1551 | /*IsSupportedByPragmaAttribute=*/0, |
||
1552 | /*Spellings=*/ArmSveVectorBitsSpellings, |
||
1553 | /*ArgNames=*/ArmSveVectorBitsArgNames) {} |
||
1554 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1555 | if (!isa<TypedefNameDecl>(D)) { |
||
1556 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
1557 | << Attr << "typedefs"; |
||
1558 | return false; |
||
1559 | } |
||
1560 | return true; |
||
1561 | } |
||
1562 | |||
1563 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1564 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1565 | << AL << St->getBeginLoc(); |
||
1566 | return false; |
||
1567 | } |
||
1568 | |||
1569 | bool isParamExpr(size_t N) const override { |
||
1570 | return false; |
||
1571 | } |
||
1572 | |||
1573 | static const ParsedAttrInfoArmSveVectorBits Instance; |
||
1574 | }; |
||
1575 | const ParsedAttrInfoArmSveVectorBits ParsedAttrInfoArmSveVectorBits::Instance; |
||
1576 | static constexpr ParsedAttrInfo::Spelling ArtificialSpellings[] = { |
||
1577 | {AttributeCommonInfo::AS_GNU, "artificial"}, |
||
1578 | {AttributeCommonInfo::AS_CXX11, "gnu::artificial"}, |
||
1579 | {AttributeCommonInfo::AS_C2x, "gnu::artificial"}, |
||
1580 | }; |
||
1581 | struct ParsedAttrInfoArtificial final : public ParsedAttrInfo { |
||
1582 | constexpr ParsedAttrInfoArtificial() : ParsedAttrInfo( |
||
1583 | /*AttrKind=*/ParsedAttr::AT_Artificial, |
||
1584 | /*NumArgs=*/0, |
||
1585 | /*OptArgs=*/0, |
||
1586 | /*NumArgMembers=*/0, |
||
1587 | /*HasCustomParsing=*/0, |
||
1588 | /*AcceptsExprPack=*/0, |
||
1589 | /*IsTargetSpecific=*/0, |
||
1590 | /*IsType=*/0, |
||
1591 | /*IsStmt=*/0, |
||
1592 | /*IsKnownToGCC=*/1, |
||
1593 | /*IsSupportedByPragmaAttribute=*/0, |
||
1594 | /*Spellings=*/ArtificialSpellings, |
||
1595 | /*ArgNames=*/{}) {} |
||
1596 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1597 | if (!isInlineFunction(D)) { |
||
1598 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1599 | << Attr << "inline functions"; |
||
1600 | return false; |
||
1601 | } |
||
1602 | return true; |
||
1603 | } |
||
1604 | |||
1605 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1606 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1607 | << AL << St->getBeginLoc(); |
||
1608 | return false; |
||
1609 | } |
||
1610 | |||
1611 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
1612 | D->addAttr(::new (S.Context) ArtificialAttr(S.Context, Attr)); |
||
1613 | return AttributeApplied; |
||
1614 | } |
||
1615 | |||
1616 | bool isParamExpr(size_t N) const override { |
||
1617 | return false; |
||
1618 | } |
||
1619 | |||
1620 | static const ParsedAttrInfoArtificial Instance; |
||
1621 | }; |
||
1622 | const ParsedAttrInfoArtificial ParsedAttrInfoArtificial::Instance; |
||
1623 | static constexpr ParsedAttrInfo::Spelling AssertCapabilitySpellings[] = { |
||
1624 | {AttributeCommonInfo::AS_GNU, "assert_capability"}, |
||
1625 | {AttributeCommonInfo::AS_CXX11, "clang::assert_capability"}, |
||
1626 | {AttributeCommonInfo::AS_GNU, "assert_shared_capability"}, |
||
1627 | {AttributeCommonInfo::AS_CXX11, "clang::assert_shared_capability"}, |
||
1628 | }; |
||
1629 | static constexpr const char *AssertCapabilityArgNames[] = { |
||
1630 | "Args...",}; |
||
1631 | struct ParsedAttrInfoAssertCapability final : public ParsedAttrInfo { |
||
1632 | constexpr ParsedAttrInfoAssertCapability() : ParsedAttrInfo( |
||
1633 | /*AttrKind=*/ParsedAttr::AT_AssertCapability, |
||
1634 | /*NumArgs=*/0, |
||
1635 | /*OptArgs=*/15, |
||
1636 | /*NumArgMembers=*/1, |
||
1637 | /*HasCustomParsing=*/0, |
||
1638 | /*AcceptsExprPack=*/0, |
||
1639 | /*IsTargetSpecific=*/0, |
||
1640 | /*IsType=*/0, |
||
1641 | /*IsStmt=*/0, |
||
1642 | /*IsKnownToGCC=*/0, |
||
1643 | /*IsSupportedByPragmaAttribute=*/0, |
||
1644 | /*Spellings=*/AssertCapabilitySpellings, |
||
1645 | /*ArgNames=*/AssertCapabilityArgNames) {} |
||
1646 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1647 | if (!isa<FunctionDecl>(D)) { |
||
1648 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1649 | << Attr << "functions"; |
||
1650 | return false; |
||
1651 | } |
||
1652 | return true; |
||
1653 | } |
||
1654 | |||
1655 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1656 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1657 | << AL << St->getBeginLoc(); |
||
1658 | return false; |
||
1659 | } |
||
1660 | |||
1661 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
1662 | enum Spelling { |
||
1663 | GNU_assert_capability = 0, |
||
1664 | CXX11_clang_assert_capability = 1, |
||
1665 | GNU_assert_shared_capability = 2, |
||
1666 | CXX11_clang_assert_shared_capability = 3, |
||
1667 | SpellingNotCalculated = 15 |
||
1668 | |||
1669 | }; |
||
1670 | |||
1671 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
1672 | switch (Idx) { |
||
1673 | default: llvm_unreachable("Unknown spelling list index"); |
||
1674 | case 0: return GNU_assert_capability; |
||
1675 | case 1: return CXX11_clang_assert_capability; |
||
1676 | case 2: return GNU_assert_shared_capability; |
||
1677 | case 3: return CXX11_clang_assert_shared_capability; |
||
1678 | } |
||
1679 | } |
||
1680 | |||
1681 | bool isParamExpr(size_t N) const override { |
||
1682 | return (N == 0) || false; |
||
1683 | } |
||
1684 | |||
1685 | static const ParsedAttrInfoAssertCapability Instance; |
||
1686 | }; |
||
1687 | const ParsedAttrInfoAssertCapability ParsedAttrInfoAssertCapability::Instance; |
||
1688 | static constexpr ParsedAttrInfo::Spelling AssertExclusiveLockSpellings[] = { |
||
1689 | {AttributeCommonInfo::AS_GNU, "assert_exclusive_lock"}, |
||
1690 | }; |
||
1691 | static constexpr const char *AssertExclusiveLockArgNames[] = { |
||
1692 | "Args...",}; |
||
1693 | struct ParsedAttrInfoAssertExclusiveLock final : public ParsedAttrInfo { |
||
1694 | constexpr ParsedAttrInfoAssertExclusiveLock() : ParsedAttrInfo( |
||
1695 | /*AttrKind=*/ParsedAttr::AT_AssertExclusiveLock, |
||
1696 | /*NumArgs=*/0, |
||
1697 | /*OptArgs=*/15, |
||
1698 | /*NumArgMembers=*/1, |
||
1699 | /*HasCustomParsing=*/0, |
||
1700 | /*AcceptsExprPack=*/0, |
||
1701 | /*IsTargetSpecific=*/0, |
||
1702 | /*IsType=*/0, |
||
1703 | /*IsStmt=*/0, |
||
1704 | /*IsKnownToGCC=*/0, |
||
1705 | /*IsSupportedByPragmaAttribute=*/0, |
||
1706 | /*Spellings=*/AssertExclusiveLockSpellings, |
||
1707 | /*ArgNames=*/AssertExclusiveLockArgNames) {} |
||
1708 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1709 | if (!isa<FunctionDecl>(D)) { |
||
1710 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1711 | << Attr << "functions"; |
||
1712 | return false; |
||
1713 | } |
||
1714 | return true; |
||
1715 | } |
||
1716 | |||
1717 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1718 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1719 | << AL << St->getBeginLoc(); |
||
1720 | return false; |
||
1721 | } |
||
1722 | |||
1723 | bool isParamExpr(size_t N) const override { |
||
1724 | return (N == 0) || false; |
||
1725 | } |
||
1726 | |||
1727 | static const ParsedAttrInfoAssertExclusiveLock Instance; |
||
1728 | }; |
||
1729 | const ParsedAttrInfoAssertExclusiveLock ParsedAttrInfoAssertExclusiveLock::Instance; |
||
1730 | static constexpr ParsedAttrInfo::Spelling AssertSharedLockSpellings[] = { |
||
1731 | {AttributeCommonInfo::AS_GNU, "assert_shared_lock"}, |
||
1732 | }; |
||
1733 | static constexpr const char *AssertSharedLockArgNames[] = { |
||
1734 | "Args...",}; |
||
1735 | struct ParsedAttrInfoAssertSharedLock final : public ParsedAttrInfo { |
||
1736 | constexpr ParsedAttrInfoAssertSharedLock() : ParsedAttrInfo( |
||
1737 | /*AttrKind=*/ParsedAttr::AT_AssertSharedLock, |
||
1738 | /*NumArgs=*/0, |
||
1739 | /*OptArgs=*/15, |
||
1740 | /*NumArgMembers=*/1, |
||
1741 | /*HasCustomParsing=*/0, |
||
1742 | /*AcceptsExprPack=*/0, |
||
1743 | /*IsTargetSpecific=*/0, |
||
1744 | /*IsType=*/0, |
||
1745 | /*IsStmt=*/0, |
||
1746 | /*IsKnownToGCC=*/0, |
||
1747 | /*IsSupportedByPragmaAttribute=*/0, |
||
1748 | /*Spellings=*/AssertSharedLockSpellings, |
||
1749 | /*ArgNames=*/AssertSharedLockArgNames) {} |
||
1750 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1751 | if (!isa<FunctionDecl>(D)) { |
||
1752 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1753 | << Attr << "functions"; |
||
1754 | return false; |
||
1755 | } |
||
1756 | return true; |
||
1757 | } |
||
1758 | |||
1759 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1760 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1761 | << AL << St->getBeginLoc(); |
||
1762 | return false; |
||
1763 | } |
||
1764 | |||
1765 | bool isParamExpr(size_t N) const override { |
||
1766 | return (N == 0) || false; |
||
1767 | } |
||
1768 | |||
1769 | static const ParsedAttrInfoAssertSharedLock Instance; |
||
1770 | }; |
||
1771 | const ParsedAttrInfoAssertSharedLock ParsedAttrInfoAssertSharedLock::Instance; |
||
1772 | static constexpr ParsedAttrInfo::Spelling AssumeAlignedSpellings[] = { |
||
1773 | {AttributeCommonInfo::AS_GNU, "assume_aligned"}, |
||
1774 | {AttributeCommonInfo::AS_CXX11, "gnu::assume_aligned"}, |
||
1775 | {AttributeCommonInfo::AS_C2x, "gnu::assume_aligned"}, |
||
1776 | }; |
||
1777 | static constexpr const char *AssumeAlignedArgNames[] = { |
||
1778 | "Alignment","Offset",}; |
||
1779 | struct ParsedAttrInfoAssumeAligned final : public ParsedAttrInfo { |
||
1780 | constexpr ParsedAttrInfoAssumeAligned() : ParsedAttrInfo( |
||
1781 | /*AttrKind=*/ParsedAttr::AT_AssumeAligned, |
||
1782 | /*NumArgs=*/1, |
||
1783 | /*OptArgs=*/1, |
||
1784 | /*NumArgMembers=*/2, |
||
1785 | /*HasCustomParsing=*/0, |
||
1786 | /*AcceptsExprPack=*/0, |
||
1787 | /*IsTargetSpecific=*/0, |
||
1788 | /*IsType=*/0, |
||
1789 | /*IsStmt=*/0, |
||
1790 | /*IsKnownToGCC=*/1, |
||
1791 | /*IsSupportedByPragmaAttribute=*/1, |
||
1792 | /*Spellings=*/AssumeAlignedSpellings, |
||
1793 | /*ArgNames=*/AssumeAlignedArgNames) {} |
||
1794 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1795 | if (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) { |
||
1796 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1797 | << Attr << "Objective-C methods and functions"; |
||
1798 | return false; |
||
1799 | } |
||
1800 | return true; |
||
1801 | } |
||
1802 | |||
1803 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1804 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1805 | << AL << St->getBeginLoc(); |
||
1806 | return false; |
||
1807 | } |
||
1808 | |||
1809 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1810 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
1811 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
1812 | } |
||
1813 | |||
1814 | bool isParamExpr(size_t N) const override { |
||
1815 | return (N == 0) || (N == 1) || false; |
||
1816 | } |
||
1817 | |||
1818 | static const ParsedAttrInfoAssumeAligned Instance; |
||
1819 | }; |
||
1820 | const ParsedAttrInfoAssumeAligned ParsedAttrInfoAssumeAligned::Instance; |
||
1821 | static constexpr ParsedAttrInfo::Spelling AssumptionSpellings[] = { |
||
1822 | {AttributeCommonInfo::AS_GNU, "assume"}, |
||
1823 | {AttributeCommonInfo::AS_CXX11, "clang::assume"}, |
||
1824 | {AttributeCommonInfo::AS_C2x, "clang::assume"}, |
||
1825 | }; |
||
1826 | static constexpr const char *AssumptionArgNames[] = { |
||
1827 | "Assumption",}; |
||
1828 | struct ParsedAttrInfoAssumption final : public ParsedAttrInfo { |
||
1829 | constexpr ParsedAttrInfoAssumption() : ParsedAttrInfo( |
||
1830 | /*AttrKind=*/ParsedAttr::AT_Assumption, |
||
1831 | /*NumArgs=*/1, |
||
1832 | /*OptArgs=*/0, |
||
1833 | /*NumArgMembers=*/1, |
||
1834 | /*HasCustomParsing=*/0, |
||
1835 | /*AcceptsExprPack=*/0, |
||
1836 | /*IsTargetSpecific=*/0, |
||
1837 | /*IsType=*/0, |
||
1838 | /*IsStmt=*/0, |
||
1839 | /*IsKnownToGCC=*/0, |
||
1840 | /*IsSupportedByPragmaAttribute=*/1, |
||
1841 | /*Spellings=*/AssumptionSpellings, |
||
1842 | /*ArgNames=*/AssumptionArgNames) {} |
||
1843 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1844 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
1845 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1846 | << Attr << "functions and Objective-C methods"; |
||
1847 | return false; |
||
1848 | } |
||
1849 | return true; |
||
1850 | } |
||
1851 | |||
1852 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1853 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1854 | << AL << St->getBeginLoc(); |
||
1855 | return false; |
||
1856 | } |
||
1857 | |||
1858 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1859 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
1860 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
1861 | } |
||
1862 | |||
1863 | bool isParamExpr(size_t N) const override { |
||
1864 | return false; |
||
1865 | } |
||
1866 | |||
1867 | static const ParsedAttrInfoAssumption Instance; |
||
1868 | }; |
||
1869 | const ParsedAttrInfoAssumption ParsedAttrInfoAssumption::Instance; |
||
1870 | static constexpr ParsedAttrInfo::Spelling AvailabilitySpellings[] = { |
||
1871 | {AttributeCommonInfo::AS_GNU, "availability"}, |
||
1872 | {AttributeCommonInfo::AS_CXX11, "clang::availability"}, |
||
1873 | {AttributeCommonInfo::AS_C2x, "clang::availability"}, |
||
1874 | }; |
||
1875 | static constexpr const char *AvailabilityArgNames[] = { |
||
1876 | "platform","introduced","deprecated","obsoleted","unavailable","message","strict","replacement","priority",}; |
||
1877 | struct ParsedAttrInfoAvailability final : public ParsedAttrInfo { |
||
1878 | constexpr ParsedAttrInfoAvailability() : ParsedAttrInfo( |
||
1879 | /*AttrKind=*/ParsedAttr::AT_Availability, |
||
1880 | /*NumArgs=*/9, |
||
1881 | /*OptArgs=*/0, |
||
1882 | /*NumArgMembers=*/9, |
||
1883 | /*HasCustomParsing=*/1, |
||
1884 | /*AcceptsExprPack=*/0, |
||
1885 | /*IsTargetSpecific=*/0, |
||
1886 | /*IsType=*/0, |
||
1887 | /*IsStmt=*/0, |
||
1888 | /*IsKnownToGCC=*/0, |
||
1889 | /*IsSupportedByPragmaAttribute=*/1, |
||
1890 | /*Spellings=*/AvailabilitySpellings, |
||
1891 | /*ArgNames=*/AvailabilityArgNames) {} |
||
1892 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1893 | if (!isa<NamedDecl>(D)) { |
||
1894 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
1895 | << Attr << "named declarations"; |
||
1896 | return false; |
||
1897 | } |
||
1898 | return true; |
||
1899 | } |
||
1900 | |||
1901 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1902 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1903 | << AL << St->getBeginLoc(); |
||
1904 | return false; |
||
1905 | } |
||
1906 | |||
1907 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1908 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
1909 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true)); |
||
1910 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum_constant, /*IsSupported=*/true)); |
||
1911 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true)); |
||
1912 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
1913 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus)); |
||
1914 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC)); |
||
1915 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC)); |
||
1916 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
1917 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
1918 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC)); |
||
1919 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC)); |
||
1920 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
1921 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
1922 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
1923 | } |
||
1924 | |||
1925 | bool isParamExpr(size_t N) const override { |
||
1926 | return false; |
||
1927 | } |
||
1928 | |||
1929 | static const ParsedAttrInfoAvailability Instance; |
||
1930 | }; |
||
1931 | const ParsedAttrInfoAvailability ParsedAttrInfoAvailability::Instance; |
||
1932 | static constexpr ParsedAttrInfo::Spelling BPFPreserveAccessIndexSpellings[] = { |
||
1933 | {AttributeCommonInfo::AS_GNU, "preserve_access_index"}, |
||
1934 | {AttributeCommonInfo::AS_CXX11, "clang::preserve_access_index"}, |
||
1935 | {AttributeCommonInfo::AS_C2x, "clang::preserve_access_index"}, |
||
1936 | }; |
||
1937 | struct ParsedAttrInfoBPFPreserveAccessIndex final : public ParsedAttrInfo { |
||
1938 | constexpr ParsedAttrInfoBPFPreserveAccessIndex() : ParsedAttrInfo( |
||
1939 | /*AttrKind=*/ParsedAttr::AT_BPFPreserveAccessIndex, |
||
1940 | /*NumArgs=*/0, |
||
1941 | /*OptArgs=*/0, |
||
1942 | /*NumArgMembers=*/0, |
||
1943 | /*HasCustomParsing=*/0, |
||
1944 | /*AcceptsExprPack=*/0, |
||
1945 | /*IsTargetSpecific=*/1, |
||
1946 | /*IsType=*/0, |
||
1947 | /*IsStmt=*/0, |
||
1948 | /*IsKnownToGCC=*/0, |
||
1949 | /*IsSupportedByPragmaAttribute=*/1, |
||
1950 | /*Spellings=*/BPFPreserveAccessIndexSpellings, |
||
1951 | /*ArgNames=*/{}) {} |
||
1952 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
1953 | if (!isa<RecordDecl>(D)) { |
||
1954 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
1955 | << Attr << "structs, unions, and classes"; |
||
1956 | return false; |
||
1957 | } |
||
1958 | return true; |
||
1959 | } |
||
1960 | |||
1961 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
1962 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
1963 | << AL << St->getBeginLoc(); |
||
1964 | return false; |
||
1965 | } |
||
1966 | |||
1967 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
1968 | return (!LangOpts.CPlusPlus); |
||
1969 | } |
||
1970 | |||
1971 | bool existsInTarget(const TargetInfo &Target) const override { |
||
1972 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
1973 | return true && (T.getArch() == llvm::Triple::bpfel || T.getArch() == llvm::Triple::bpfeb); |
||
1974 | } |
||
1975 | |||
1976 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
1977 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
1978 | } |
||
1979 | |||
1980 | bool isParamExpr(size_t N) const override { |
||
1981 | return false; |
||
1982 | } |
||
1983 | |||
1984 | static const ParsedAttrInfoBPFPreserveAccessIndex Instance; |
||
1985 | }; |
||
1986 | const ParsedAttrInfoBPFPreserveAccessIndex ParsedAttrInfoBPFPreserveAccessIndex::Instance; |
||
1987 | static constexpr ParsedAttrInfo::Spelling BTFDeclTagSpellings[] = { |
||
1988 | {AttributeCommonInfo::AS_GNU, "btf_decl_tag"}, |
||
1989 | {AttributeCommonInfo::AS_CXX11, "clang::btf_decl_tag"}, |
||
1990 | {AttributeCommonInfo::AS_C2x, "clang::btf_decl_tag"}, |
||
1991 | }; |
||
1992 | static constexpr const char *BTFDeclTagArgNames[] = { |
||
1993 | "BTFDeclTag",}; |
||
1994 | struct ParsedAttrInfoBTFDeclTag final : public ParsedAttrInfo { |
||
1995 | constexpr ParsedAttrInfoBTFDeclTag() : ParsedAttrInfo( |
||
1996 | /*AttrKind=*/ParsedAttr::AT_BTFDeclTag, |
||
1997 | /*NumArgs=*/1, |
||
1998 | /*OptArgs=*/0, |
||
1999 | /*NumArgMembers=*/1, |
||
2000 | /*HasCustomParsing=*/0, |
||
2001 | /*AcceptsExprPack=*/0, |
||
2002 | /*IsTargetSpecific=*/0, |
||
2003 | /*IsType=*/0, |
||
2004 | /*IsStmt=*/0, |
||
2005 | /*IsKnownToGCC=*/0, |
||
2006 | /*IsSupportedByPragmaAttribute=*/1, |
||
2007 | /*Spellings=*/BTFDeclTagSpellings, |
||
2008 | /*ArgNames=*/BTFDeclTagArgNames) {} |
||
2009 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2010 | if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<RecordDecl>(D) && !isa<FieldDecl>(D) && !isa<TypedefNameDecl>(D)) { |
||
2011 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
2012 | << Attr << "variables, functions, structs, unions, classes, non-static data members, and typedefs"; |
||
2013 | return false; |
||
2014 | } |
||
2015 | return true; |
||
2016 | } |
||
2017 | |||
2018 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2019 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2020 | << AL << St->getBeginLoc(); |
||
2021 | return false; |
||
2022 | } |
||
2023 | |||
2024 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2025 | return (!LangOpts.CPlusPlus); |
||
2026 | } |
||
2027 | |||
2028 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2029 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
2030 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2031 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
2032 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true)); |
||
2033 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
2034 | } |
||
2035 | |||
2036 | bool isParamExpr(size_t N) const override { |
||
2037 | return false; |
||
2038 | } |
||
2039 | |||
2040 | static const ParsedAttrInfoBTFDeclTag Instance; |
||
2041 | }; |
||
2042 | const ParsedAttrInfoBTFDeclTag ParsedAttrInfoBTFDeclTag::Instance; |
||
2043 | static constexpr ParsedAttrInfo::Spelling BTFTypeTagSpellings[] = { |
||
2044 | {AttributeCommonInfo::AS_GNU, "btf_type_tag"}, |
||
2045 | {AttributeCommonInfo::AS_CXX11, "clang::btf_type_tag"}, |
||
2046 | {AttributeCommonInfo::AS_C2x, "clang::btf_type_tag"}, |
||
2047 | }; |
||
2048 | static constexpr const char *BTFTypeTagArgNames[] = { |
||
2049 | "BTFTypeTag",}; |
||
2050 | struct ParsedAttrInfoBTFTypeTag final : public ParsedAttrInfo { |
||
2051 | constexpr ParsedAttrInfoBTFTypeTag() : ParsedAttrInfo( |
||
2052 | /*AttrKind=*/ParsedAttr::AT_BTFTypeTag, |
||
2053 | /*NumArgs=*/1, |
||
2054 | /*OptArgs=*/0, |
||
2055 | /*NumArgMembers=*/1, |
||
2056 | /*HasCustomParsing=*/0, |
||
2057 | /*AcceptsExprPack=*/0, |
||
2058 | /*IsTargetSpecific=*/0, |
||
2059 | /*IsType=*/1, |
||
2060 | /*IsStmt=*/0, |
||
2061 | /*IsKnownToGCC=*/0, |
||
2062 | /*IsSupportedByPragmaAttribute=*/0, |
||
2063 | /*Spellings=*/BTFTypeTagSpellings, |
||
2064 | /*ArgNames=*/BTFTypeTagArgNames) {} |
||
2065 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2066 | return (!LangOpts.CPlusPlus); |
||
2067 | } |
||
2068 | |||
2069 | bool isParamExpr(size_t N) const override { |
||
2070 | return false; |
||
2071 | } |
||
2072 | |||
2073 | static const ParsedAttrInfoBTFTypeTag Instance; |
||
2074 | }; |
||
2075 | const ParsedAttrInfoBTFTypeTag ParsedAttrInfoBTFTypeTag::Instance; |
||
2076 | static constexpr ParsedAttrInfo::Spelling BlocksSpellings[] = { |
||
2077 | {AttributeCommonInfo::AS_GNU, "blocks"}, |
||
2078 | {AttributeCommonInfo::AS_CXX11, "clang::blocks"}, |
||
2079 | {AttributeCommonInfo::AS_C2x, "clang::blocks"}, |
||
2080 | }; |
||
2081 | static constexpr const char *BlocksArgNames[] = { |
||
2082 | "Type",}; |
||
2083 | struct ParsedAttrInfoBlocks final : public ParsedAttrInfo { |
||
2084 | constexpr ParsedAttrInfoBlocks() : ParsedAttrInfo( |
||
2085 | /*AttrKind=*/ParsedAttr::AT_Blocks, |
||
2086 | /*NumArgs=*/1, |
||
2087 | /*OptArgs=*/0, |
||
2088 | /*NumArgMembers=*/1, |
||
2089 | /*HasCustomParsing=*/0, |
||
2090 | /*AcceptsExprPack=*/0, |
||
2091 | /*IsTargetSpecific=*/0, |
||
2092 | /*IsType=*/0, |
||
2093 | /*IsStmt=*/0, |
||
2094 | /*IsKnownToGCC=*/0, |
||
2095 | /*IsSupportedByPragmaAttribute=*/0, |
||
2096 | /*Spellings=*/BlocksSpellings, |
||
2097 | /*ArgNames=*/BlocksArgNames) {} |
||
2098 | bool isParamExpr(size_t N) const override { |
||
2099 | return false; |
||
2100 | } |
||
2101 | |||
2102 | static const ParsedAttrInfoBlocks Instance; |
||
2103 | }; |
||
2104 | const ParsedAttrInfoBlocks ParsedAttrInfoBlocks::Instance; |
||
2105 | static constexpr ParsedAttrInfo::Spelling BuiltinAliasSpellings[] = { |
||
2106 | {AttributeCommonInfo::AS_CXX11, "clang::builtin_alias"}, |
||
2107 | {AttributeCommonInfo::AS_C2x, "clang::builtin_alias"}, |
||
2108 | {AttributeCommonInfo::AS_GNU, "clang_builtin_alias"}, |
||
2109 | }; |
||
2110 | static constexpr const char *BuiltinAliasArgNames[] = { |
||
2111 | "BuiltinName",}; |
||
2112 | struct ParsedAttrInfoBuiltinAlias final : public ParsedAttrInfo { |
||
2113 | constexpr ParsedAttrInfoBuiltinAlias() : ParsedAttrInfo( |
||
2114 | /*AttrKind=*/ParsedAttr::AT_BuiltinAlias, |
||
2115 | /*NumArgs=*/1, |
||
2116 | /*OptArgs=*/0, |
||
2117 | /*NumArgMembers=*/1, |
||
2118 | /*HasCustomParsing=*/0, |
||
2119 | /*AcceptsExprPack=*/0, |
||
2120 | /*IsTargetSpecific=*/0, |
||
2121 | /*IsType=*/0, |
||
2122 | /*IsStmt=*/0, |
||
2123 | /*IsKnownToGCC=*/0, |
||
2124 | /*IsSupportedByPragmaAttribute=*/1, |
||
2125 | /*Spellings=*/BuiltinAliasSpellings, |
||
2126 | /*ArgNames=*/BuiltinAliasArgNames) {} |
||
2127 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2128 | if (!isa<FunctionDecl>(D)) { |
||
2129 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
2130 | << Attr << "functions"; |
||
2131 | return false; |
||
2132 | } |
||
2133 | return true; |
||
2134 | } |
||
2135 | |||
2136 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2137 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2138 | << AL << St->getBeginLoc(); |
||
2139 | return false; |
||
2140 | } |
||
2141 | |||
2142 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
2143 | enum Spelling { |
||
2144 | CXX11_clang_builtin_alias = 0, |
||
2145 | C2x_clang_builtin_alias = 1, |
||
2146 | GNU_clang_builtin_alias = 2, |
||
2147 | SpellingNotCalculated = 15 |
||
2148 | |||
2149 | }; |
||
2150 | |||
2151 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
2152 | switch (Idx) { |
||
2153 | default: llvm_unreachable("Unknown spelling list index"); |
||
2154 | case 0: return CXX11_clang_builtin_alias; |
||
2155 | case 1: return C2x_clang_builtin_alias; |
||
2156 | case 2: return GNU_clang_builtin_alias; |
||
2157 | } |
||
2158 | } |
||
2159 | |||
2160 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2161 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2162 | } |
||
2163 | |||
2164 | bool isParamExpr(size_t N) const override { |
||
2165 | return false; |
||
2166 | } |
||
2167 | |||
2168 | static const ParsedAttrInfoBuiltinAlias Instance; |
||
2169 | }; |
||
2170 | const ParsedAttrInfoBuiltinAlias ParsedAttrInfoBuiltinAlias::Instance; |
||
2171 | static constexpr ParsedAttrInfo::Spelling CDeclSpellings[] = { |
||
2172 | {AttributeCommonInfo::AS_GNU, "cdecl"}, |
||
2173 | {AttributeCommonInfo::AS_CXX11, "gnu::cdecl"}, |
||
2174 | {AttributeCommonInfo::AS_C2x, "gnu::cdecl"}, |
||
2175 | {AttributeCommonInfo::AS_Keyword, "__cdecl"}, |
||
2176 | {AttributeCommonInfo::AS_Keyword, "_cdecl"}, |
||
2177 | }; |
||
2178 | struct ParsedAttrInfoCDecl final : public ParsedAttrInfo { |
||
2179 | constexpr ParsedAttrInfoCDecl() : ParsedAttrInfo( |
||
2180 | /*AttrKind=*/ParsedAttr::AT_CDecl, |
||
2181 | /*NumArgs=*/0, |
||
2182 | /*OptArgs=*/0, |
||
2183 | /*NumArgMembers=*/0, |
||
2184 | /*HasCustomParsing=*/0, |
||
2185 | /*AcceptsExprPack=*/0, |
||
2186 | /*IsTargetSpecific=*/0, |
||
2187 | /*IsType=*/1, |
||
2188 | /*IsStmt=*/0, |
||
2189 | /*IsKnownToGCC=*/1, |
||
2190 | /*IsSupportedByPragmaAttribute=*/0, |
||
2191 | /*Spellings=*/CDeclSpellings, |
||
2192 | /*ArgNames=*/{}) {} |
||
2193 | bool isParamExpr(size_t N) const override { |
||
2194 | return false; |
||
2195 | } |
||
2196 | |||
2197 | static const ParsedAttrInfoCDecl Instance; |
||
2198 | }; |
||
2199 | const ParsedAttrInfoCDecl ParsedAttrInfoCDecl::Instance; |
||
2200 | static constexpr ParsedAttrInfo::Spelling CFAuditedTransferSpellings[] = { |
||
2201 | {AttributeCommonInfo::AS_GNU, "cf_audited_transfer"}, |
||
2202 | {AttributeCommonInfo::AS_CXX11, "clang::cf_audited_transfer"}, |
||
2203 | {AttributeCommonInfo::AS_C2x, "clang::cf_audited_transfer"}, |
||
2204 | }; |
||
2205 | struct ParsedAttrInfoCFAuditedTransfer final : public ParsedAttrInfo { |
||
2206 | constexpr ParsedAttrInfoCFAuditedTransfer() : ParsedAttrInfo( |
||
2207 | /*AttrKind=*/ParsedAttr::AT_CFAuditedTransfer, |
||
2208 | /*NumArgs=*/0, |
||
2209 | /*OptArgs=*/0, |
||
2210 | /*NumArgMembers=*/0, |
||
2211 | /*HasCustomParsing=*/0, |
||
2212 | /*AcceptsExprPack=*/0, |
||
2213 | /*IsTargetSpecific=*/0, |
||
2214 | /*IsType=*/0, |
||
2215 | /*IsStmt=*/0, |
||
2216 | /*IsKnownToGCC=*/0, |
||
2217 | /*IsSupportedByPragmaAttribute=*/1, |
||
2218 | /*Spellings=*/CFAuditedTransferSpellings, |
||
2219 | /*ArgNames=*/{}) {} |
||
2220 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2221 | if (!isa<FunctionDecl>(D)) { |
||
2222 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
2223 | << Attr << "functions"; |
||
2224 | return false; |
||
2225 | } |
||
2226 | return true; |
||
2227 | } |
||
2228 | |||
2229 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2230 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2231 | << AL << St->getBeginLoc(); |
||
2232 | return false; |
||
2233 | } |
||
2234 | |||
2235 | using ParsedAttrInfo::diagMutualExclusion; |
||
2236 | |||
2237 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2238 | if (const auto *A = D->getAttr<CFUnknownTransferAttr>()) { |
||
2239 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2240 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2241 | return false; |
||
2242 | } |
||
2243 | return true; |
||
2244 | } |
||
2245 | |||
2246 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2247 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2248 | } |
||
2249 | |||
2250 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
2251 | D->addAttr(::new (S.Context) CFAuditedTransferAttr(S.Context, Attr)); |
||
2252 | return AttributeApplied; |
||
2253 | } |
||
2254 | |||
2255 | bool isParamExpr(size_t N) const override { |
||
2256 | return false; |
||
2257 | } |
||
2258 | |||
2259 | static const ParsedAttrInfoCFAuditedTransfer Instance; |
||
2260 | }; |
||
2261 | const ParsedAttrInfoCFAuditedTransfer ParsedAttrInfoCFAuditedTransfer::Instance; |
||
2262 | static constexpr ParsedAttrInfo::Spelling CFConsumedSpellings[] = { |
||
2263 | {AttributeCommonInfo::AS_GNU, "cf_consumed"}, |
||
2264 | {AttributeCommonInfo::AS_CXX11, "clang::cf_consumed"}, |
||
2265 | {AttributeCommonInfo::AS_C2x, "clang::cf_consumed"}, |
||
2266 | }; |
||
2267 | struct ParsedAttrInfoCFConsumed final : public ParsedAttrInfo { |
||
2268 | constexpr ParsedAttrInfoCFConsumed() : ParsedAttrInfo( |
||
2269 | /*AttrKind=*/ParsedAttr::AT_CFConsumed, |
||
2270 | /*NumArgs=*/0, |
||
2271 | /*OptArgs=*/0, |
||
2272 | /*NumArgMembers=*/0, |
||
2273 | /*HasCustomParsing=*/0, |
||
2274 | /*AcceptsExprPack=*/0, |
||
2275 | /*IsTargetSpecific=*/0, |
||
2276 | /*IsType=*/0, |
||
2277 | /*IsStmt=*/0, |
||
2278 | /*IsKnownToGCC=*/0, |
||
2279 | /*IsSupportedByPragmaAttribute=*/1, |
||
2280 | /*Spellings=*/CFConsumedSpellings, |
||
2281 | /*ArgNames=*/{}) {} |
||
2282 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2283 | if (!isa<ParmVarDecl>(D)) { |
||
2284 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2285 | << Attr << "parameters"; |
||
2286 | return false; |
||
2287 | } |
||
2288 | return true; |
||
2289 | } |
||
2290 | |||
2291 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2292 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2293 | << AL << St->getBeginLoc(); |
||
2294 | return false; |
||
2295 | } |
||
2296 | |||
2297 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2298 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
2299 | } |
||
2300 | |||
2301 | bool isParamExpr(size_t N) const override { |
||
2302 | return false; |
||
2303 | } |
||
2304 | |||
2305 | static const ParsedAttrInfoCFConsumed Instance; |
||
2306 | }; |
||
2307 | const ParsedAttrInfoCFConsumed ParsedAttrInfoCFConsumed::Instance; |
||
2308 | static constexpr ParsedAttrInfo::Spelling CFGuardSpellings[] = { |
||
2309 | {AttributeCommonInfo::AS_Declspec, "guard"}, |
||
2310 | {AttributeCommonInfo::AS_GNU, "guard"}, |
||
2311 | {AttributeCommonInfo::AS_CXX11, "clang::guard"}, |
||
2312 | {AttributeCommonInfo::AS_C2x, "clang::guard"}, |
||
2313 | }; |
||
2314 | static constexpr const char *CFGuardArgNames[] = { |
||
2315 | "Guard",}; |
||
2316 | struct ParsedAttrInfoCFGuard final : public ParsedAttrInfo { |
||
2317 | constexpr ParsedAttrInfoCFGuard() : ParsedAttrInfo( |
||
2318 | /*AttrKind=*/ParsedAttr::AT_CFGuard, |
||
2319 | /*NumArgs=*/1, |
||
2320 | /*OptArgs=*/0, |
||
2321 | /*NumArgMembers=*/1, |
||
2322 | /*HasCustomParsing=*/0, |
||
2323 | /*AcceptsExprPack=*/0, |
||
2324 | /*IsTargetSpecific=*/1, |
||
2325 | /*IsType=*/0, |
||
2326 | /*IsStmt=*/0, |
||
2327 | /*IsKnownToGCC=*/0, |
||
2328 | /*IsSupportedByPragmaAttribute=*/1, |
||
2329 | /*Spellings=*/CFGuardSpellings, |
||
2330 | /*ArgNames=*/CFGuardArgNames) {} |
||
2331 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2332 | if (!isa<FunctionDecl>(D)) { |
||
2333 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2334 | << Attr << "functions"; |
||
2335 | return false; |
||
2336 | } |
||
2337 | return true; |
||
2338 | } |
||
2339 | |||
2340 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2341 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2342 | << AL << St->getBeginLoc(); |
||
2343 | return false; |
||
2344 | } |
||
2345 | |||
2346 | bool existsInTarget(const TargetInfo &Target) const override { |
||
2347 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
2348 | return true && (T.getOS() == llvm::Triple::Win32); |
||
2349 | } |
||
2350 | |||
2351 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2352 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2353 | } |
||
2354 | |||
2355 | bool isParamExpr(size_t N) const override { |
||
2356 | return false; |
||
2357 | } |
||
2358 | |||
2359 | static const ParsedAttrInfoCFGuard Instance; |
||
2360 | }; |
||
2361 | const ParsedAttrInfoCFGuard ParsedAttrInfoCFGuard::Instance; |
||
2362 | static constexpr ParsedAttrInfo::Spelling CFICanonicalJumpTableSpellings[] = { |
||
2363 | {AttributeCommonInfo::AS_GNU, "cfi_canonical_jump_table"}, |
||
2364 | {AttributeCommonInfo::AS_CXX11, "clang::cfi_canonical_jump_table"}, |
||
2365 | {AttributeCommonInfo::AS_C2x, "clang::cfi_canonical_jump_table"}, |
||
2366 | }; |
||
2367 | struct ParsedAttrInfoCFICanonicalJumpTable final : public ParsedAttrInfo { |
||
2368 | constexpr ParsedAttrInfoCFICanonicalJumpTable() : ParsedAttrInfo( |
||
2369 | /*AttrKind=*/ParsedAttr::AT_CFICanonicalJumpTable, |
||
2370 | /*NumArgs=*/0, |
||
2371 | /*OptArgs=*/0, |
||
2372 | /*NumArgMembers=*/0, |
||
2373 | /*HasCustomParsing=*/0, |
||
2374 | /*AcceptsExprPack=*/0, |
||
2375 | /*IsTargetSpecific=*/0, |
||
2376 | /*IsType=*/0, |
||
2377 | /*IsStmt=*/0, |
||
2378 | /*IsKnownToGCC=*/0, |
||
2379 | /*IsSupportedByPragmaAttribute=*/1, |
||
2380 | /*Spellings=*/CFICanonicalJumpTableSpellings, |
||
2381 | /*ArgNames=*/{}) {} |
||
2382 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2383 | if (!isa<FunctionDecl>(D)) { |
||
2384 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
2385 | << Attr << "functions"; |
||
2386 | return false; |
||
2387 | } |
||
2388 | return true; |
||
2389 | } |
||
2390 | |||
2391 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2392 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2393 | << AL << St->getBeginLoc(); |
||
2394 | return false; |
||
2395 | } |
||
2396 | |||
2397 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2398 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2399 | } |
||
2400 | |||
2401 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
2402 | D->addAttr(::new (S.Context) CFICanonicalJumpTableAttr(S.Context, Attr)); |
||
2403 | return AttributeApplied; |
||
2404 | } |
||
2405 | |||
2406 | bool isParamExpr(size_t N) const override { |
||
2407 | return false; |
||
2408 | } |
||
2409 | |||
2410 | static const ParsedAttrInfoCFICanonicalJumpTable Instance; |
||
2411 | }; |
||
2412 | const ParsedAttrInfoCFICanonicalJumpTable ParsedAttrInfoCFICanonicalJumpTable::Instance; |
||
2413 | static constexpr ParsedAttrInfo::Spelling CFReturnsNotRetainedSpellings[] = { |
||
2414 | {AttributeCommonInfo::AS_GNU, "cf_returns_not_retained"}, |
||
2415 | {AttributeCommonInfo::AS_CXX11, "clang::cf_returns_not_retained"}, |
||
2416 | {AttributeCommonInfo::AS_C2x, "clang::cf_returns_not_retained"}, |
||
2417 | }; |
||
2418 | struct ParsedAttrInfoCFReturnsNotRetained final : public ParsedAttrInfo { |
||
2419 | constexpr ParsedAttrInfoCFReturnsNotRetained() : ParsedAttrInfo( |
||
2420 | /*AttrKind=*/ParsedAttr::AT_CFReturnsNotRetained, |
||
2421 | /*NumArgs=*/0, |
||
2422 | /*OptArgs=*/0, |
||
2423 | /*NumArgMembers=*/0, |
||
2424 | /*HasCustomParsing=*/0, |
||
2425 | /*AcceptsExprPack=*/0, |
||
2426 | /*IsTargetSpecific=*/0, |
||
2427 | /*IsType=*/0, |
||
2428 | /*IsStmt=*/0, |
||
2429 | /*IsKnownToGCC=*/0, |
||
2430 | /*IsSupportedByPragmaAttribute=*/0, |
||
2431 | /*Spellings=*/CFReturnsNotRetainedSpellings, |
||
2432 | /*ArgNames=*/{}) {} |
||
2433 | bool isParamExpr(size_t N) const override { |
||
2434 | return false; |
||
2435 | } |
||
2436 | |||
2437 | static const ParsedAttrInfoCFReturnsNotRetained Instance; |
||
2438 | }; |
||
2439 | const ParsedAttrInfoCFReturnsNotRetained ParsedAttrInfoCFReturnsNotRetained::Instance; |
||
2440 | static constexpr ParsedAttrInfo::Spelling CFReturnsRetainedSpellings[] = { |
||
2441 | {AttributeCommonInfo::AS_GNU, "cf_returns_retained"}, |
||
2442 | {AttributeCommonInfo::AS_CXX11, "clang::cf_returns_retained"}, |
||
2443 | {AttributeCommonInfo::AS_C2x, "clang::cf_returns_retained"}, |
||
2444 | }; |
||
2445 | struct ParsedAttrInfoCFReturnsRetained final : public ParsedAttrInfo { |
||
2446 | constexpr ParsedAttrInfoCFReturnsRetained() : ParsedAttrInfo( |
||
2447 | /*AttrKind=*/ParsedAttr::AT_CFReturnsRetained, |
||
2448 | /*NumArgs=*/0, |
||
2449 | /*OptArgs=*/0, |
||
2450 | /*NumArgMembers=*/0, |
||
2451 | /*HasCustomParsing=*/0, |
||
2452 | /*AcceptsExprPack=*/0, |
||
2453 | /*IsTargetSpecific=*/0, |
||
2454 | /*IsType=*/0, |
||
2455 | /*IsStmt=*/0, |
||
2456 | /*IsKnownToGCC=*/0, |
||
2457 | /*IsSupportedByPragmaAttribute=*/0, |
||
2458 | /*Spellings=*/CFReturnsRetainedSpellings, |
||
2459 | /*ArgNames=*/{}) {} |
||
2460 | bool isParamExpr(size_t N) const override { |
||
2461 | return false; |
||
2462 | } |
||
2463 | |||
2464 | static const ParsedAttrInfoCFReturnsRetained Instance; |
||
2465 | }; |
||
2466 | const ParsedAttrInfoCFReturnsRetained ParsedAttrInfoCFReturnsRetained::Instance; |
||
2467 | static constexpr ParsedAttrInfo::Spelling CFUnknownTransferSpellings[] = { |
||
2468 | {AttributeCommonInfo::AS_GNU, "cf_unknown_transfer"}, |
||
2469 | {AttributeCommonInfo::AS_CXX11, "clang::cf_unknown_transfer"}, |
||
2470 | {AttributeCommonInfo::AS_C2x, "clang::cf_unknown_transfer"}, |
||
2471 | }; |
||
2472 | struct ParsedAttrInfoCFUnknownTransfer final : public ParsedAttrInfo { |
||
2473 | constexpr ParsedAttrInfoCFUnknownTransfer() : ParsedAttrInfo( |
||
2474 | /*AttrKind=*/ParsedAttr::AT_CFUnknownTransfer, |
||
2475 | /*NumArgs=*/0, |
||
2476 | /*OptArgs=*/0, |
||
2477 | /*NumArgMembers=*/0, |
||
2478 | /*HasCustomParsing=*/0, |
||
2479 | /*AcceptsExprPack=*/0, |
||
2480 | /*IsTargetSpecific=*/0, |
||
2481 | /*IsType=*/0, |
||
2482 | /*IsStmt=*/0, |
||
2483 | /*IsKnownToGCC=*/0, |
||
2484 | /*IsSupportedByPragmaAttribute=*/1, |
||
2485 | /*Spellings=*/CFUnknownTransferSpellings, |
||
2486 | /*ArgNames=*/{}) {} |
||
2487 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2488 | if (!isa<FunctionDecl>(D)) { |
||
2489 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
2490 | << Attr << "functions"; |
||
2491 | return false; |
||
2492 | } |
||
2493 | return true; |
||
2494 | } |
||
2495 | |||
2496 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2497 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2498 | << AL << St->getBeginLoc(); |
||
2499 | return false; |
||
2500 | } |
||
2501 | |||
2502 | using ParsedAttrInfo::diagMutualExclusion; |
||
2503 | |||
2504 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2505 | if (const auto *A = D->getAttr<CFAuditedTransferAttr>()) { |
||
2506 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2507 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2508 | return false; |
||
2509 | } |
||
2510 | return true; |
||
2511 | } |
||
2512 | |||
2513 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2514 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2515 | } |
||
2516 | |||
2517 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
2518 | D->addAttr(::new (S.Context) CFUnknownTransferAttr(S.Context, Attr)); |
||
2519 | return AttributeApplied; |
||
2520 | } |
||
2521 | |||
2522 | bool isParamExpr(size_t N) const override { |
||
2523 | return false; |
||
2524 | } |
||
2525 | |||
2526 | static const ParsedAttrInfoCFUnknownTransfer Instance; |
||
2527 | }; |
||
2528 | const ParsedAttrInfoCFUnknownTransfer ParsedAttrInfoCFUnknownTransfer::Instance; |
||
2529 | static constexpr ParsedAttrInfo::Spelling CPUDispatchSpellings[] = { |
||
2530 | {AttributeCommonInfo::AS_GNU, "cpu_dispatch"}, |
||
2531 | {AttributeCommonInfo::AS_CXX11, "clang::cpu_dispatch"}, |
||
2532 | {AttributeCommonInfo::AS_C2x, "clang::cpu_dispatch"}, |
||
2533 | {AttributeCommonInfo::AS_Declspec, "cpu_dispatch"}, |
||
2534 | }; |
||
2535 | static constexpr const char *CPUDispatchArgNames[] = { |
||
2536 | "Cpus...",}; |
||
2537 | struct ParsedAttrInfoCPUDispatch final : public ParsedAttrInfo { |
||
2538 | constexpr ParsedAttrInfoCPUDispatch() : ParsedAttrInfo( |
||
2539 | /*AttrKind=*/ParsedAttr::AT_CPUDispatch, |
||
2540 | /*NumArgs=*/0, |
||
2541 | /*OptArgs=*/15, |
||
2542 | /*NumArgMembers=*/1, |
||
2543 | /*HasCustomParsing=*/0, |
||
2544 | /*AcceptsExprPack=*/0, |
||
2545 | /*IsTargetSpecific=*/0, |
||
2546 | /*IsType=*/0, |
||
2547 | /*IsStmt=*/0, |
||
2548 | /*IsKnownToGCC=*/0, |
||
2549 | /*IsSupportedByPragmaAttribute=*/1, |
||
2550 | /*Spellings=*/CPUDispatchSpellings, |
||
2551 | /*ArgNames=*/CPUDispatchArgNames) {} |
||
2552 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2553 | if (!isa<FunctionDecl>(D)) { |
||
2554 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2555 | << Attr << "functions"; |
||
2556 | return false; |
||
2557 | } |
||
2558 | return true; |
||
2559 | } |
||
2560 | |||
2561 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2562 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2563 | << AL << St->getBeginLoc(); |
||
2564 | return false; |
||
2565 | } |
||
2566 | |||
2567 | using ParsedAttrInfo::diagMutualExclusion; |
||
2568 | |||
2569 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2570 | if (const auto *A = D->getAttr<TargetClonesAttr>()) { |
||
2571 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2572 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2573 | return false; |
||
2574 | } |
||
2575 | if (const auto *A = D->getAttr<TargetVersionAttr>()) { |
||
2576 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2577 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2578 | return false; |
||
2579 | } |
||
2580 | if (const auto *A = D->getAttr<TargetAttr>()) { |
||
2581 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2582 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2583 | return false; |
||
2584 | } |
||
2585 | if (const auto *A = D->getAttr<CPUSpecificAttr>()) { |
||
2586 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2587 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2588 | return false; |
||
2589 | } |
||
2590 | return true; |
||
2591 | } |
||
2592 | |||
2593 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2594 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2595 | } |
||
2596 | |||
2597 | bool isParamExpr(size_t N) const override { |
||
2598 | return false; |
||
2599 | } |
||
2600 | |||
2601 | static const ParsedAttrInfoCPUDispatch Instance; |
||
2602 | }; |
||
2603 | const ParsedAttrInfoCPUDispatch ParsedAttrInfoCPUDispatch::Instance; |
||
2604 | static constexpr ParsedAttrInfo::Spelling CPUSpecificSpellings[] = { |
||
2605 | {AttributeCommonInfo::AS_GNU, "cpu_specific"}, |
||
2606 | {AttributeCommonInfo::AS_CXX11, "clang::cpu_specific"}, |
||
2607 | {AttributeCommonInfo::AS_C2x, "clang::cpu_specific"}, |
||
2608 | {AttributeCommonInfo::AS_Declspec, "cpu_specific"}, |
||
2609 | }; |
||
2610 | static constexpr const char *CPUSpecificArgNames[] = { |
||
2611 | "Cpus...",}; |
||
2612 | struct ParsedAttrInfoCPUSpecific final : public ParsedAttrInfo { |
||
2613 | constexpr ParsedAttrInfoCPUSpecific() : ParsedAttrInfo( |
||
2614 | /*AttrKind=*/ParsedAttr::AT_CPUSpecific, |
||
2615 | /*NumArgs=*/0, |
||
2616 | /*OptArgs=*/15, |
||
2617 | /*NumArgMembers=*/1, |
||
2618 | /*HasCustomParsing=*/0, |
||
2619 | /*AcceptsExprPack=*/0, |
||
2620 | /*IsTargetSpecific=*/0, |
||
2621 | /*IsType=*/0, |
||
2622 | /*IsStmt=*/0, |
||
2623 | /*IsKnownToGCC=*/0, |
||
2624 | /*IsSupportedByPragmaAttribute=*/1, |
||
2625 | /*Spellings=*/CPUSpecificSpellings, |
||
2626 | /*ArgNames=*/CPUSpecificArgNames) {} |
||
2627 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2628 | if (!isa<FunctionDecl>(D)) { |
||
2629 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2630 | << Attr << "functions"; |
||
2631 | return false; |
||
2632 | } |
||
2633 | return true; |
||
2634 | } |
||
2635 | |||
2636 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2637 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2638 | << AL << St->getBeginLoc(); |
||
2639 | return false; |
||
2640 | } |
||
2641 | |||
2642 | using ParsedAttrInfo::diagMutualExclusion; |
||
2643 | |||
2644 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2645 | if (const auto *A = D->getAttr<TargetClonesAttr>()) { |
||
2646 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2647 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2648 | return false; |
||
2649 | } |
||
2650 | if (const auto *A = D->getAttr<TargetVersionAttr>()) { |
||
2651 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2652 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2653 | return false; |
||
2654 | } |
||
2655 | if (const auto *A = D->getAttr<TargetAttr>()) { |
||
2656 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2657 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2658 | return false; |
||
2659 | } |
||
2660 | if (const auto *A = D->getAttr<CPUDispatchAttr>()) { |
||
2661 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2662 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2663 | return false; |
||
2664 | } |
||
2665 | return true; |
||
2666 | } |
||
2667 | |||
2668 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2669 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2670 | } |
||
2671 | |||
2672 | bool isParamExpr(size_t N) const override { |
||
2673 | return false; |
||
2674 | } |
||
2675 | |||
2676 | static const ParsedAttrInfoCPUSpecific Instance; |
||
2677 | }; |
||
2678 | const ParsedAttrInfoCPUSpecific ParsedAttrInfoCPUSpecific::Instance; |
||
2679 | static constexpr ParsedAttrInfo::Spelling CUDAConstantSpellings[] = { |
||
2680 | {AttributeCommonInfo::AS_GNU, "constant"}, |
||
2681 | {AttributeCommonInfo::AS_Declspec, "__constant__"}, |
||
2682 | }; |
||
2683 | struct ParsedAttrInfoCUDAConstant final : public ParsedAttrInfo { |
||
2684 | constexpr ParsedAttrInfoCUDAConstant() : ParsedAttrInfo( |
||
2685 | /*AttrKind=*/ParsedAttr::AT_CUDAConstant, |
||
2686 | /*NumArgs=*/0, |
||
2687 | /*OptArgs=*/0, |
||
2688 | /*NumArgMembers=*/0, |
||
2689 | /*HasCustomParsing=*/0, |
||
2690 | /*AcceptsExprPack=*/0, |
||
2691 | /*IsTargetSpecific=*/0, |
||
2692 | /*IsType=*/0, |
||
2693 | /*IsStmt=*/0, |
||
2694 | /*IsKnownToGCC=*/0, |
||
2695 | /*IsSupportedByPragmaAttribute=*/1, |
||
2696 | /*Spellings=*/CUDAConstantSpellings, |
||
2697 | /*ArgNames=*/{}) {} |
||
2698 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2699 | if (!isa<VarDecl>(D)) { |
||
2700 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2701 | << Attr << "variables"; |
||
2702 | return false; |
||
2703 | } |
||
2704 | return true; |
||
2705 | } |
||
2706 | |||
2707 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2708 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2709 | << AL << St->getBeginLoc(); |
||
2710 | return false; |
||
2711 | } |
||
2712 | |||
2713 | using ParsedAttrInfo::diagMutualExclusion; |
||
2714 | |||
2715 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2716 | if (const auto *A = D->getAttr<CUDASharedAttr>()) { |
||
2717 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2718 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2719 | return false; |
||
2720 | } |
||
2721 | if (const auto *A = D->getAttr<HIPManagedAttr>()) { |
||
2722 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2723 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2724 | return false; |
||
2725 | } |
||
2726 | return true; |
||
2727 | } |
||
2728 | |||
2729 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2730 | return LangOpts.CUDA; |
||
2731 | } |
||
2732 | |||
2733 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2734 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
2735 | } |
||
2736 | |||
2737 | bool isParamExpr(size_t N) const override { |
||
2738 | return false; |
||
2739 | } |
||
2740 | |||
2741 | static const ParsedAttrInfoCUDAConstant Instance; |
||
2742 | }; |
||
2743 | const ParsedAttrInfoCUDAConstant ParsedAttrInfoCUDAConstant::Instance; |
||
2744 | static constexpr ParsedAttrInfo::Spelling CUDADeviceSpellings[] = { |
||
2745 | {AttributeCommonInfo::AS_GNU, "device"}, |
||
2746 | {AttributeCommonInfo::AS_Declspec, "__device__"}, |
||
2747 | }; |
||
2748 | struct ParsedAttrInfoCUDADevice final : public ParsedAttrInfo { |
||
2749 | constexpr ParsedAttrInfoCUDADevice() : ParsedAttrInfo( |
||
2750 | /*AttrKind=*/ParsedAttr::AT_CUDADevice, |
||
2751 | /*NumArgs=*/0, |
||
2752 | /*OptArgs=*/0, |
||
2753 | /*NumArgMembers=*/0, |
||
2754 | /*HasCustomParsing=*/0, |
||
2755 | /*AcceptsExprPack=*/0, |
||
2756 | /*IsTargetSpecific=*/0, |
||
2757 | /*IsType=*/0, |
||
2758 | /*IsStmt=*/0, |
||
2759 | /*IsKnownToGCC=*/0, |
||
2760 | /*IsSupportedByPragmaAttribute=*/1, |
||
2761 | /*Spellings=*/CUDADeviceSpellings, |
||
2762 | /*ArgNames=*/{}) {} |
||
2763 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2764 | if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) { |
||
2765 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2766 | << Attr << "functions and variables"; |
||
2767 | return false; |
||
2768 | } |
||
2769 | return true; |
||
2770 | } |
||
2771 | |||
2772 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2773 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2774 | << AL << St->getBeginLoc(); |
||
2775 | return false; |
||
2776 | } |
||
2777 | |||
2778 | using ParsedAttrInfo::diagMutualExclusion; |
||
2779 | |||
2780 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2781 | if (const auto *A = D->getAttr<CUDAGlobalAttr>()) { |
||
2782 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2783 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2784 | return false; |
||
2785 | } |
||
2786 | return true; |
||
2787 | } |
||
2788 | |||
2789 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2790 | return LangOpts.CUDA; |
||
2791 | } |
||
2792 | |||
2793 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2794 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2795 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
2796 | } |
||
2797 | |||
2798 | bool isParamExpr(size_t N) const override { |
||
2799 | return false; |
||
2800 | } |
||
2801 | |||
2802 | static const ParsedAttrInfoCUDADevice Instance; |
||
2803 | }; |
||
2804 | const ParsedAttrInfoCUDADevice ParsedAttrInfoCUDADevice::Instance; |
||
2805 | static constexpr ParsedAttrInfo::Spelling CUDADeviceBuiltinSurfaceTypeSpellings[] = { |
||
2806 | {AttributeCommonInfo::AS_GNU, "device_builtin_surface_type"}, |
||
2807 | {AttributeCommonInfo::AS_Declspec, "__device_builtin_surface_type__"}, |
||
2808 | }; |
||
2809 | struct ParsedAttrInfoCUDADeviceBuiltinSurfaceType final : public ParsedAttrInfo { |
||
2810 | constexpr ParsedAttrInfoCUDADeviceBuiltinSurfaceType() : ParsedAttrInfo( |
||
2811 | /*AttrKind=*/ParsedAttr::AT_CUDADeviceBuiltinSurfaceType, |
||
2812 | /*NumArgs=*/0, |
||
2813 | /*OptArgs=*/0, |
||
2814 | /*NumArgMembers=*/0, |
||
2815 | /*HasCustomParsing=*/0, |
||
2816 | /*AcceptsExprPack=*/0, |
||
2817 | /*IsTargetSpecific=*/0, |
||
2818 | /*IsType=*/0, |
||
2819 | /*IsStmt=*/0, |
||
2820 | /*IsKnownToGCC=*/0, |
||
2821 | /*IsSupportedByPragmaAttribute=*/1, |
||
2822 | /*Spellings=*/CUDADeviceBuiltinSurfaceTypeSpellings, |
||
2823 | /*ArgNames=*/{}) {} |
||
2824 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2825 | if (!isa<CXXRecordDecl>(D)) { |
||
2826 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2827 | << Attr << "classes"; |
||
2828 | return false; |
||
2829 | } |
||
2830 | return true; |
||
2831 | } |
||
2832 | |||
2833 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2834 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2835 | << AL << St->getBeginLoc(); |
||
2836 | return false; |
||
2837 | } |
||
2838 | |||
2839 | using ParsedAttrInfo::diagMutualExclusion; |
||
2840 | |||
2841 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2842 | if (const auto *A = D->getAttr<CUDADeviceBuiltinTextureTypeAttr>()) { |
||
2843 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2844 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2845 | return false; |
||
2846 | } |
||
2847 | return true; |
||
2848 | } |
||
2849 | |||
2850 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2851 | return LangOpts.CUDA; |
||
2852 | } |
||
2853 | |||
2854 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2855 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
2856 | } |
||
2857 | |||
2858 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
2859 | D->addAttr(::new (S.Context) CUDADeviceBuiltinSurfaceTypeAttr(S.Context, Attr)); |
||
2860 | return AttributeApplied; |
||
2861 | } |
||
2862 | |||
2863 | bool isParamExpr(size_t N) const override { |
||
2864 | return false; |
||
2865 | } |
||
2866 | |||
2867 | static const ParsedAttrInfoCUDADeviceBuiltinSurfaceType Instance; |
||
2868 | }; |
||
2869 | const ParsedAttrInfoCUDADeviceBuiltinSurfaceType ParsedAttrInfoCUDADeviceBuiltinSurfaceType::Instance; |
||
2870 | static constexpr ParsedAttrInfo::Spelling CUDADeviceBuiltinTextureTypeSpellings[] = { |
||
2871 | {AttributeCommonInfo::AS_GNU, "device_builtin_texture_type"}, |
||
2872 | {AttributeCommonInfo::AS_Declspec, "__device_builtin_texture_type__"}, |
||
2873 | }; |
||
2874 | struct ParsedAttrInfoCUDADeviceBuiltinTextureType final : public ParsedAttrInfo { |
||
2875 | constexpr ParsedAttrInfoCUDADeviceBuiltinTextureType() : ParsedAttrInfo( |
||
2876 | /*AttrKind=*/ParsedAttr::AT_CUDADeviceBuiltinTextureType, |
||
2877 | /*NumArgs=*/0, |
||
2878 | /*OptArgs=*/0, |
||
2879 | /*NumArgMembers=*/0, |
||
2880 | /*HasCustomParsing=*/0, |
||
2881 | /*AcceptsExprPack=*/0, |
||
2882 | /*IsTargetSpecific=*/0, |
||
2883 | /*IsType=*/0, |
||
2884 | /*IsStmt=*/0, |
||
2885 | /*IsKnownToGCC=*/0, |
||
2886 | /*IsSupportedByPragmaAttribute=*/1, |
||
2887 | /*Spellings=*/CUDADeviceBuiltinTextureTypeSpellings, |
||
2888 | /*ArgNames=*/{}) {} |
||
2889 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2890 | if (!isa<CXXRecordDecl>(D)) { |
||
2891 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2892 | << Attr << "classes"; |
||
2893 | return false; |
||
2894 | } |
||
2895 | return true; |
||
2896 | } |
||
2897 | |||
2898 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2899 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2900 | << AL << St->getBeginLoc(); |
||
2901 | return false; |
||
2902 | } |
||
2903 | |||
2904 | using ParsedAttrInfo::diagMutualExclusion; |
||
2905 | |||
2906 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2907 | if (const auto *A = D->getAttr<CUDADeviceBuiltinSurfaceTypeAttr>()) { |
||
2908 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2909 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2910 | return false; |
||
2911 | } |
||
2912 | return true; |
||
2913 | } |
||
2914 | |||
2915 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2916 | return LangOpts.CUDA; |
||
2917 | } |
||
2918 | |||
2919 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2920 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
2921 | } |
||
2922 | |||
2923 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
2924 | D->addAttr(::new (S.Context) CUDADeviceBuiltinTextureTypeAttr(S.Context, Attr)); |
||
2925 | return AttributeApplied; |
||
2926 | } |
||
2927 | |||
2928 | bool isParamExpr(size_t N) const override { |
||
2929 | return false; |
||
2930 | } |
||
2931 | |||
2932 | static const ParsedAttrInfoCUDADeviceBuiltinTextureType Instance; |
||
2933 | }; |
||
2934 | const ParsedAttrInfoCUDADeviceBuiltinTextureType ParsedAttrInfoCUDADeviceBuiltinTextureType::Instance; |
||
2935 | static constexpr ParsedAttrInfo::Spelling CUDAGlobalSpellings[] = { |
||
2936 | {AttributeCommonInfo::AS_GNU, "global"}, |
||
2937 | {AttributeCommonInfo::AS_Declspec, "__global__"}, |
||
2938 | }; |
||
2939 | struct ParsedAttrInfoCUDAGlobal final : public ParsedAttrInfo { |
||
2940 | constexpr ParsedAttrInfoCUDAGlobal() : ParsedAttrInfo( |
||
2941 | /*AttrKind=*/ParsedAttr::AT_CUDAGlobal, |
||
2942 | /*NumArgs=*/0, |
||
2943 | /*OptArgs=*/0, |
||
2944 | /*NumArgMembers=*/0, |
||
2945 | /*HasCustomParsing=*/0, |
||
2946 | /*AcceptsExprPack=*/0, |
||
2947 | /*IsTargetSpecific=*/0, |
||
2948 | /*IsType=*/0, |
||
2949 | /*IsStmt=*/0, |
||
2950 | /*IsKnownToGCC=*/0, |
||
2951 | /*IsSupportedByPragmaAttribute=*/1, |
||
2952 | /*Spellings=*/CUDAGlobalSpellings, |
||
2953 | /*ArgNames=*/{}) {} |
||
2954 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
2955 | if (!isa<FunctionDecl>(D)) { |
||
2956 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
2957 | << Attr << "functions"; |
||
2958 | return false; |
||
2959 | } |
||
2960 | return true; |
||
2961 | } |
||
2962 | |||
2963 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
2964 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
2965 | << AL << St->getBeginLoc(); |
||
2966 | return false; |
||
2967 | } |
||
2968 | |||
2969 | using ParsedAttrInfo::diagMutualExclusion; |
||
2970 | |||
2971 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
2972 | if (const auto *A = D->getAttr<CUDADeviceAttr>()) { |
||
2973 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2974 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2975 | return false; |
||
2976 | } |
||
2977 | if (const auto *A = D->getAttr<CUDAHostAttr>()) { |
||
2978 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
2979 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
2980 | return false; |
||
2981 | } |
||
2982 | return true; |
||
2983 | } |
||
2984 | |||
2985 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
2986 | return LangOpts.CUDA; |
||
2987 | } |
||
2988 | |||
2989 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
2990 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
2991 | } |
||
2992 | |||
2993 | bool isParamExpr(size_t N) const override { |
||
2994 | return false; |
||
2995 | } |
||
2996 | |||
2997 | static const ParsedAttrInfoCUDAGlobal Instance; |
||
2998 | }; |
||
2999 | const ParsedAttrInfoCUDAGlobal ParsedAttrInfoCUDAGlobal::Instance; |
||
3000 | static constexpr ParsedAttrInfo::Spelling CUDAHostSpellings[] = { |
||
3001 | {AttributeCommonInfo::AS_GNU, "host"}, |
||
3002 | {AttributeCommonInfo::AS_Declspec, "__host__"}, |
||
3003 | }; |
||
3004 | struct ParsedAttrInfoCUDAHost final : public ParsedAttrInfo { |
||
3005 | constexpr ParsedAttrInfoCUDAHost() : ParsedAttrInfo( |
||
3006 | /*AttrKind=*/ParsedAttr::AT_CUDAHost, |
||
3007 | /*NumArgs=*/0, |
||
3008 | /*OptArgs=*/0, |
||
3009 | /*NumArgMembers=*/0, |
||
3010 | /*HasCustomParsing=*/0, |
||
3011 | /*AcceptsExprPack=*/0, |
||
3012 | /*IsTargetSpecific=*/0, |
||
3013 | /*IsType=*/0, |
||
3014 | /*IsStmt=*/0, |
||
3015 | /*IsKnownToGCC=*/0, |
||
3016 | /*IsSupportedByPragmaAttribute=*/1, |
||
3017 | /*Spellings=*/CUDAHostSpellings, |
||
3018 | /*ArgNames=*/{}) {} |
||
3019 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3020 | if (!isa<FunctionDecl>(D)) { |
||
3021 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3022 | << Attr << "functions"; |
||
3023 | return false; |
||
3024 | } |
||
3025 | return true; |
||
3026 | } |
||
3027 | |||
3028 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3029 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3030 | << AL << St->getBeginLoc(); |
||
3031 | return false; |
||
3032 | } |
||
3033 | |||
3034 | using ParsedAttrInfo::diagMutualExclusion; |
||
3035 | |||
3036 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
3037 | if (const auto *A = D->getAttr<CUDAGlobalAttr>()) { |
||
3038 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
3039 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
3040 | return false; |
||
3041 | } |
||
3042 | return true; |
||
3043 | } |
||
3044 | |||
3045 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3046 | return LangOpts.CUDA; |
||
3047 | } |
||
3048 | |||
3049 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3050 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3051 | } |
||
3052 | |||
3053 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
3054 | D->addAttr(::new (S.Context) CUDAHostAttr(S.Context, Attr)); |
||
3055 | return AttributeApplied; |
||
3056 | } |
||
3057 | |||
3058 | bool isParamExpr(size_t N) const override { |
||
3059 | return false; |
||
3060 | } |
||
3061 | |||
3062 | static const ParsedAttrInfoCUDAHost Instance; |
||
3063 | }; |
||
3064 | const ParsedAttrInfoCUDAHost ParsedAttrInfoCUDAHost::Instance; |
||
3065 | struct ParsedAttrInfoCUDAInvalidTarget final : public ParsedAttrInfo { |
||
3066 | constexpr ParsedAttrInfoCUDAInvalidTarget() : ParsedAttrInfo( |
||
3067 | /*AttrKind=*/ParsedAttr::AT_CUDAInvalidTarget, |
||
3068 | /*NumArgs=*/0, |
||
3069 | /*OptArgs=*/0, |
||
3070 | /*NumArgMembers=*/0, |
||
3071 | /*HasCustomParsing=*/0, |
||
3072 | /*AcceptsExprPack=*/0, |
||
3073 | /*IsTargetSpecific=*/0, |
||
3074 | /*IsType=*/0, |
||
3075 | /*IsStmt=*/0, |
||
3076 | /*IsKnownToGCC=*/0, |
||
3077 | /*IsSupportedByPragmaAttribute=*/0, |
||
3078 | /*Spellings=*/{}, |
||
3079 | /*ArgNames=*/{}) {} |
||
3080 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3081 | if (!isa<FunctionDecl>(D)) { |
||
3082 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3083 | << Attr << "functions"; |
||
3084 | return false; |
||
3085 | } |
||
3086 | return true; |
||
3087 | } |
||
3088 | |||
3089 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3090 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3091 | << AL << St->getBeginLoc(); |
||
3092 | return false; |
||
3093 | } |
||
3094 | |||
3095 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3096 | return LangOpts.CUDA; |
||
3097 | } |
||
3098 | |||
3099 | bool isParamExpr(size_t N) const override { |
||
3100 | return false; |
||
3101 | } |
||
3102 | |||
3103 | static const ParsedAttrInfoCUDAInvalidTarget Instance; |
||
3104 | }; |
||
3105 | const ParsedAttrInfoCUDAInvalidTarget ParsedAttrInfoCUDAInvalidTarget::Instance; |
||
3106 | static constexpr ParsedAttrInfo::Spelling CUDALaunchBoundsSpellings[] = { |
||
3107 | {AttributeCommonInfo::AS_GNU, "launch_bounds"}, |
||
3108 | {AttributeCommonInfo::AS_Declspec, "__launch_bounds__"}, |
||
3109 | }; |
||
3110 | static constexpr const char *CUDALaunchBoundsArgNames[] = { |
||
3111 | "MaxThreads","MinBlocks",}; |
||
3112 | struct ParsedAttrInfoCUDALaunchBounds final : public ParsedAttrInfo { |
||
3113 | constexpr ParsedAttrInfoCUDALaunchBounds() : ParsedAttrInfo( |
||
3114 | /*AttrKind=*/ParsedAttr::AT_CUDALaunchBounds, |
||
3115 | /*NumArgs=*/1, |
||
3116 | /*OptArgs=*/1, |
||
3117 | /*NumArgMembers=*/2, |
||
3118 | /*HasCustomParsing=*/0, |
||
3119 | /*AcceptsExprPack=*/0, |
||
3120 | /*IsTargetSpecific=*/0, |
||
3121 | /*IsType=*/0, |
||
3122 | /*IsStmt=*/0, |
||
3123 | /*IsKnownToGCC=*/0, |
||
3124 | /*IsSupportedByPragmaAttribute=*/1, |
||
3125 | /*Spellings=*/CUDALaunchBoundsSpellings, |
||
3126 | /*ArgNames=*/CUDALaunchBoundsArgNames) {} |
||
3127 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3128 | if (!isa<ObjCMethodDecl>(D) && !isFunctionLike(D)) { |
||
3129 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3130 | << Attr << "Objective-C methods, functions, and function pointers"; |
||
3131 | return false; |
||
3132 | } |
||
3133 | return true; |
||
3134 | } |
||
3135 | |||
3136 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3137 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3138 | << AL << St->getBeginLoc(); |
||
3139 | return false; |
||
3140 | } |
||
3141 | |||
3142 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3143 | return LangOpts.CUDA; |
||
3144 | } |
||
3145 | |||
3146 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3147 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
3148 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true)); |
||
3149 | } |
||
3150 | |||
3151 | bool isParamExpr(size_t N) const override { |
||
3152 | return (N == 0) || (N == 1) || false; |
||
3153 | } |
||
3154 | |||
3155 | static const ParsedAttrInfoCUDALaunchBounds Instance; |
||
3156 | }; |
||
3157 | const ParsedAttrInfoCUDALaunchBounds ParsedAttrInfoCUDALaunchBounds::Instance; |
||
3158 | static constexpr ParsedAttrInfo::Spelling CUDASharedSpellings[] = { |
||
3159 | {AttributeCommonInfo::AS_GNU, "shared"}, |
||
3160 | {AttributeCommonInfo::AS_Declspec, "__shared__"}, |
||
3161 | }; |
||
3162 | struct ParsedAttrInfoCUDAShared final : public ParsedAttrInfo { |
||
3163 | constexpr ParsedAttrInfoCUDAShared() : ParsedAttrInfo( |
||
3164 | /*AttrKind=*/ParsedAttr::AT_CUDAShared, |
||
3165 | /*NumArgs=*/0, |
||
3166 | /*OptArgs=*/0, |
||
3167 | /*NumArgMembers=*/0, |
||
3168 | /*HasCustomParsing=*/0, |
||
3169 | /*AcceptsExprPack=*/0, |
||
3170 | /*IsTargetSpecific=*/0, |
||
3171 | /*IsType=*/0, |
||
3172 | /*IsStmt=*/0, |
||
3173 | /*IsKnownToGCC=*/0, |
||
3174 | /*IsSupportedByPragmaAttribute=*/1, |
||
3175 | /*Spellings=*/CUDASharedSpellings, |
||
3176 | /*ArgNames=*/{}) {} |
||
3177 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3178 | if (!isa<VarDecl>(D)) { |
||
3179 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3180 | << Attr << "variables"; |
||
3181 | return false; |
||
3182 | } |
||
3183 | return true; |
||
3184 | } |
||
3185 | |||
3186 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3187 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3188 | << AL << St->getBeginLoc(); |
||
3189 | return false; |
||
3190 | } |
||
3191 | |||
3192 | using ParsedAttrInfo::diagMutualExclusion; |
||
3193 | |||
3194 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
3195 | if (const auto *A = D->getAttr<CUDAConstantAttr>()) { |
||
3196 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
3197 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
3198 | return false; |
||
3199 | } |
||
3200 | if (const auto *A = D->getAttr<HIPManagedAttr>()) { |
||
3201 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
3202 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
3203 | return false; |
||
3204 | } |
||
3205 | return true; |
||
3206 | } |
||
3207 | |||
3208 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3209 | return LangOpts.CUDA; |
||
3210 | } |
||
3211 | |||
3212 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3213 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
3214 | } |
||
3215 | |||
3216 | bool isParamExpr(size_t N) const override { |
||
3217 | return false; |
||
3218 | } |
||
3219 | |||
3220 | static const ParsedAttrInfoCUDAShared Instance; |
||
3221 | }; |
||
3222 | const ParsedAttrInfoCUDAShared ParsedAttrInfoCUDAShared::Instance; |
||
3223 | static constexpr ParsedAttrInfo::Spelling CXX11NoReturnSpellings[] = { |
||
3224 | {AttributeCommonInfo::AS_CXX11, "noreturn"}, |
||
3225 | {AttributeCommonInfo::AS_C2x, "noreturn"}, |
||
3226 | {AttributeCommonInfo::AS_C2x, "_Noreturn"}, |
||
3227 | }; |
||
3228 | struct ParsedAttrInfoCXX11NoReturn final : public ParsedAttrInfo { |
||
3229 | constexpr ParsedAttrInfoCXX11NoReturn() : ParsedAttrInfo( |
||
3230 | /*AttrKind=*/ParsedAttr::AT_CXX11NoReturn, |
||
3231 | /*NumArgs=*/0, |
||
3232 | /*OptArgs=*/0, |
||
3233 | /*NumArgMembers=*/0, |
||
3234 | /*HasCustomParsing=*/0, |
||
3235 | /*AcceptsExprPack=*/0, |
||
3236 | /*IsTargetSpecific=*/0, |
||
3237 | /*IsType=*/0, |
||
3238 | /*IsStmt=*/0, |
||
3239 | /*IsKnownToGCC=*/0, |
||
3240 | /*IsSupportedByPragmaAttribute=*/1, |
||
3241 | /*Spellings=*/CXX11NoReturnSpellings, |
||
3242 | /*ArgNames=*/{}) {} |
||
3243 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3244 | if (!isa<FunctionDecl>(D)) { |
||
3245 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
3246 | << Attr << "functions"; |
||
3247 | return false; |
||
3248 | } |
||
3249 | return true; |
||
3250 | } |
||
3251 | |||
3252 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3253 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3254 | << AL << St->getBeginLoc(); |
||
3255 | return false; |
||
3256 | } |
||
3257 | |||
3258 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
3259 | enum Spelling { |
||
3260 | CXX11_noreturn = 0, |
||
3261 | C2x_noreturn = 1, |
||
3262 | C2x_Noreturn = 2, |
||
3263 | SpellingNotCalculated = 15 |
||
3264 | |||
3265 | }; |
||
3266 | |||
3267 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
3268 | switch (Idx) { |
||
3269 | default: llvm_unreachable("Unknown spelling list index"); |
||
3270 | case 0: return CXX11_noreturn; |
||
3271 | case 1: return C2x_noreturn; |
||
3272 | case 2: return C2x_Noreturn; |
||
3273 | } |
||
3274 | } |
||
3275 | |||
3276 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3277 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3278 | } |
||
3279 | |||
3280 | bool isParamExpr(size_t N) const override { |
||
3281 | return false; |
||
3282 | } |
||
3283 | |||
3284 | static const ParsedAttrInfoCXX11NoReturn Instance; |
||
3285 | }; |
||
3286 | const ParsedAttrInfoCXX11NoReturn ParsedAttrInfoCXX11NoReturn::Instance; |
||
3287 | static constexpr ParsedAttrInfo::Spelling CallableWhenSpellings[] = { |
||
3288 | {AttributeCommonInfo::AS_GNU, "callable_when"}, |
||
3289 | {AttributeCommonInfo::AS_CXX11, "clang::callable_when"}, |
||
3290 | }; |
||
3291 | static constexpr const char *CallableWhenArgNames[] = { |
||
3292 | "CallableStates...",}; |
||
3293 | struct ParsedAttrInfoCallableWhen final : public ParsedAttrInfo { |
||
3294 | constexpr ParsedAttrInfoCallableWhen() : ParsedAttrInfo( |
||
3295 | /*AttrKind=*/ParsedAttr::AT_CallableWhen, |
||
3296 | /*NumArgs=*/0, |
||
3297 | /*OptArgs=*/15, |
||
3298 | /*NumArgMembers=*/1, |
||
3299 | /*HasCustomParsing=*/0, |
||
3300 | /*AcceptsExprPack=*/0, |
||
3301 | /*IsTargetSpecific=*/0, |
||
3302 | /*IsType=*/0, |
||
3303 | /*IsStmt=*/0, |
||
3304 | /*IsKnownToGCC=*/0, |
||
3305 | /*IsSupportedByPragmaAttribute=*/1, |
||
3306 | /*Spellings=*/CallableWhenSpellings, |
||
3307 | /*ArgNames=*/CallableWhenArgNames) {} |
||
3308 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3309 | if (!isa<CXXMethodDecl>(D)) { |
||
3310 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3311 | << Attr << "functions"; |
||
3312 | return false; |
||
3313 | } |
||
3314 | return true; |
||
3315 | } |
||
3316 | |||
3317 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3318 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3319 | << AL << St->getBeginLoc(); |
||
3320 | return false; |
||
3321 | } |
||
3322 | |||
3323 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3324 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus)); |
||
3325 | } |
||
3326 | |||
3327 | bool isParamExpr(size_t N) const override { |
||
3328 | return false; |
||
3329 | } |
||
3330 | |||
3331 | static const ParsedAttrInfoCallableWhen Instance; |
||
3332 | }; |
||
3333 | const ParsedAttrInfoCallableWhen ParsedAttrInfoCallableWhen::Instance; |
||
3334 | static constexpr ParsedAttrInfo::Spelling CallbackSpellings[] = { |
||
3335 | {AttributeCommonInfo::AS_GNU, "callback"}, |
||
3336 | {AttributeCommonInfo::AS_CXX11, "clang::callback"}, |
||
3337 | {AttributeCommonInfo::AS_C2x, "clang::callback"}, |
||
3338 | }; |
||
3339 | static constexpr const char *CallbackArgNames[] = { |
||
3340 | "Encoding...",}; |
||
3341 | struct ParsedAttrInfoCallback final : public ParsedAttrInfo { |
||
3342 | constexpr ParsedAttrInfoCallback() : ParsedAttrInfo( |
||
3343 | /*AttrKind=*/ParsedAttr::AT_Callback, |
||
3344 | /*NumArgs=*/0, |
||
3345 | /*OptArgs=*/15, |
||
3346 | /*NumArgMembers=*/1, |
||
3347 | /*HasCustomParsing=*/0, |
||
3348 | /*AcceptsExprPack=*/0, |
||
3349 | /*IsTargetSpecific=*/0, |
||
3350 | /*IsType=*/0, |
||
3351 | /*IsStmt=*/0, |
||
3352 | /*IsKnownToGCC=*/0, |
||
3353 | /*IsSupportedByPragmaAttribute=*/1, |
||
3354 | /*Spellings=*/CallbackSpellings, |
||
3355 | /*ArgNames=*/CallbackArgNames) {} |
||
3356 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3357 | if (!isa<FunctionDecl>(D)) { |
||
3358 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3359 | << Attr << "functions"; |
||
3360 | return false; |
||
3361 | } |
||
3362 | return true; |
||
3363 | } |
||
3364 | |||
3365 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3366 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3367 | << AL << St->getBeginLoc(); |
||
3368 | return false; |
||
3369 | } |
||
3370 | |||
3371 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3372 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3373 | } |
||
3374 | |||
3375 | bool isParamExpr(size_t N) const override { |
||
3376 | return false; |
||
3377 | } |
||
3378 | |||
3379 | static const ParsedAttrInfoCallback Instance; |
||
3380 | }; |
||
3381 | const ParsedAttrInfoCallback ParsedAttrInfoCallback::Instance; |
||
3382 | static constexpr ParsedAttrInfo::Spelling CalledOnceSpellings[] = { |
||
3383 | {AttributeCommonInfo::AS_GNU, "called_once"}, |
||
3384 | {AttributeCommonInfo::AS_CXX11, "clang::called_once"}, |
||
3385 | {AttributeCommonInfo::AS_C2x, "clang::called_once"}, |
||
3386 | }; |
||
3387 | struct ParsedAttrInfoCalledOnce final : public ParsedAttrInfo { |
||
3388 | constexpr ParsedAttrInfoCalledOnce() : ParsedAttrInfo( |
||
3389 | /*AttrKind=*/ParsedAttr::AT_CalledOnce, |
||
3390 | /*NumArgs=*/0, |
||
3391 | /*OptArgs=*/0, |
||
3392 | /*NumArgMembers=*/0, |
||
3393 | /*HasCustomParsing=*/0, |
||
3394 | /*AcceptsExprPack=*/0, |
||
3395 | /*IsTargetSpecific=*/0, |
||
3396 | /*IsType=*/0, |
||
3397 | /*IsStmt=*/0, |
||
3398 | /*IsKnownToGCC=*/0, |
||
3399 | /*IsSupportedByPragmaAttribute=*/1, |
||
3400 | /*Spellings=*/CalledOnceSpellings, |
||
3401 | /*ArgNames=*/{}) {} |
||
3402 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3403 | if (!isa<ParmVarDecl>(D)) { |
||
3404 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3405 | << Attr << "parameters"; |
||
3406 | return false; |
||
3407 | } |
||
3408 | return true; |
||
3409 | } |
||
3410 | |||
3411 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3412 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3413 | << AL << St->getBeginLoc(); |
||
3414 | return false; |
||
3415 | } |
||
3416 | |||
3417 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3418 | return LangOpts.ObjC; |
||
3419 | } |
||
3420 | |||
3421 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3422 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
3423 | } |
||
3424 | |||
3425 | bool isParamExpr(size_t N) const override { |
||
3426 | return false; |
||
3427 | } |
||
3428 | |||
3429 | static const ParsedAttrInfoCalledOnce Instance; |
||
3430 | }; |
||
3431 | const ParsedAttrInfoCalledOnce ParsedAttrInfoCalledOnce::Instance; |
||
3432 | static constexpr ParsedAttrInfo::Spelling CapabilitySpellings[] = { |
||
3433 | {AttributeCommonInfo::AS_GNU, "capability"}, |
||
3434 | {AttributeCommonInfo::AS_CXX11, "clang::capability"}, |
||
3435 | {AttributeCommonInfo::AS_GNU, "shared_capability"}, |
||
3436 | {AttributeCommonInfo::AS_CXX11, "clang::shared_capability"}, |
||
3437 | }; |
||
3438 | static constexpr const char *CapabilityArgNames[] = { |
||
3439 | "Name",}; |
||
3440 | struct ParsedAttrInfoCapability final : public ParsedAttrInfo { |
||
3441 | constexpr ParsedAttrInfoCapability() : ParsedAttrInfo( |
||
3442 | /*AttrKind=*/ParsedAttr::AT_Capability, |
||
3443 | /*NumArgs=*/1, |
||
3444 | /*OptArgs=*/0, |
||
3445 | /*NumArgMembers=*/1, |
||
3446 | /*HasCustomParsing=*/0, |
||
3447 | /*AcceptsExprPack=*/0, |
||
3448 | /*IsTargetSpecific=*/0, |
||
3449 | /*IsType=*/0, |
||
3450 | /*IsStmt=*/0, |
||
3451 | /*IsKnownToGCC=*/0, |
||
3452 | /*IsSupportedByPragmaAttribute=*/1, |
||
3453 | /*Spellings=*/CapabilitySpellings, |
||
3454 | /*ArgNames=*/CapabilityArgNames) {} |
||
3455 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3456 | if (!isa<RecordDecl>(D) && !isa<TypedefNameDecl>(D)) { |
||
3457 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
3458 | << Attr << "structs, unions, classes, and typedefs"; |
||
3459 | return false; |
||
3460 | } |
||
3461 | return true; |
||
3462 | } |
||
3463 | |||
3464 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3465 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3466 | << AL << St->getBeginLoc(); |
||
3467 | return false; |
||
3468 | } |
||
3469 | |||
3470 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
3471 | enum Spelling { |
||
3472 | GNU_capability = 0, |
||
3473 | CXX11_clang_capability = 1, |
||
3474 | GNU_shared_capability = 2, |
||
3475 | CXX11_clang_shared_capability = 3, |
||
3476 | SpellingNotCalculated = 15 |
||
3477 | |||
3478 | }; |
||
3479 | |||
3480 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
3481 | switch (Idx) { |
||
3482 | default: llvm_unreachable("Unknown spelling list index"); |
||
3483 | case 0: return GNU_capability; |
||
3484 | case 1: return CXX11_clang_capability; |
||
3485 | case 2: return GNU_shared_capability; |
||
3486 | case 3: return CXX11_clang_shared_capability; |
||
3487 | } |
||
3488 | } |
||
3489 | |||
3490 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3491 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
3492 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
3493 | } |
||
3494 | |||
3495 | bool isParamExpr(size_t N) const override { |
||
3496 | return false; |
||
3497 | } |
||
3498 | |||
3499 | static const ParsedAttrInfoCapability Instance; |
||
3500 | }; |
||
3501 | const ParsedAttrInfoCapability ParsedAttrInfoCapability::Instance; |
||
3502 | static constexpr ParsedAttrInfo::Spelling CarriesDependencySpellings[] = { |
||
3503 | {AttributeCommonInfo::AS_GNU, "carries_dependency"}, |
||
3504 | {AttributeCommonInfo::AS_CXX11, "carries_dependency"}, |
||
3505 | }; |
||
3506 | struct ParsedAttrInfoCarriesDependency final : public ParsedAttrInfo { |
||
3507 | constexpr ParsedAttrInfoCarriesDependency() : ParsedAttrInfo( |
||
3508 | /*AttrKind=*/ParsedAttr::AT_CarriesDependency, |
||
3509 | /*NumArgs=*/0, |
||
3510 | /*OptArgs=*/0, |
||
3511 | /*NumArgMembers=*/0, |
||
3512 | /*HasCustomParsing=*/0, |
||
3513 | /*AcceptsExprPack=*/0, |
||
3514 | /*IsTargetSpecific=*/0, |
||
3515 | /*IsType=*/0, |
||
3516 | /*IsStmt=*/0, |
||
3517 | /*IsKnownToGCC=*/0, |
||
3518 | /*IsSupportedByPragmaAttribute=*/1, |
||
3519 | /*Spellings=*/CarriesDependencySpellings, |
||
3520 | /*ArgNames=*/{}) {} |
||
3521 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3522 | if (!isa<ParmVarDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) { |
||
3523 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
3524 | << Attr << "parameters, Objective-C methods, and functions"; |
||
3525 | return false; |
||
3526 | } |
||
3527 | return true; |
||
3528 | } |
||
3529 | |||
3530 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3531 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3532 | << AL << St->getBeginLoc(); |
||
3533 | return false; |
||
3534 | } |
||
3535 | |||
3536 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3537 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
3538 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
3539 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3540 | } |
||
3541 | |||
3542 | bool isParamExpr(size_t N) const override { |
||
3543 | return false; |
||
3544 | } |
||
3545 | |||
3546 | static const ParsedAttrInfoCarriesDependency Instance; |
||
3547 | }; |
||
3548 | const ParsedAttrInfoCarriesDependency ParsedAttrInfoCarriesDependency::Instance; |
||
3549 | static constexpr ParsedAttrInfo::Spelling CleanupSpellings[] = { |
||
3550 | {AttributeCommonInfo::AS_GNU, "cleanup"}, |
||
3551 | {AttributeCommonInfo::AS_CXX11, "gnu::cleanup"}, |
||
3552 | {AttributeCommonInfo::AS_C2x, "gnu::cleanup"}, |
||
3553 | }; |
||
3554 | static constexpr const char *CleanupArgNames[] = { |
||
3555 | "FunctionDecl",}; |
||
3556 | struct ParsedAttrInfoCleanup final : public ParsedAttrInfo { |
||
3557 | constexpr ParsedAttrInfoCleanup() : ParsedAttrInfo( |
||
3558 | /*AttrKind=*/ParsedAttr::AT_Cleanup, |
||
3559 | /*NumArgs=*/1, |
||
3560 | /*OptArgs=*/0, |
||
3561 | /*NumArgMembers=*/1, |
||
3562 | /*HasCustomParsing=*/0, |
||
3563 | /*AcceptsExprPack=*/0, |
||
3564 | /*IsTargetSpecific=*/0, |
||
3565 | /*IsType=*/0, |
||
3566 | /*IsStmt=*/0, |
||
3567 | /*IsKnownToGCC=*/1, |
||
3568 | /*IsSupportedByPragmaAttribute=*/1, |
||
3569 | /*Spellings=*/CleanupSpellings, |
||
3570 | /*ArgNames=*/CleanupArgNames) {} |
||
3571 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3572 | if (!isLocalVar(D)) { |
||
3573 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3574 | << Attr << "local variables"; |
||
3575 | return false; |
||
3576 | } |
||
3577 | return true; |
||
3578 | } |
||
3579 | |||
3580 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3581 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3582 | << AL << St->getBeginLoc(); |
||
3583 | return false; |
||
3584 | } |
||
3585 | |||
3586 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3587 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_local, /*IsSupported=*/true)); |
||
3588 | } |
||
3589 | |||
3590 | bool isParamExpr(size_t N) const override { |
||
3591 | return false; |
||
3592 | } |
||
3593 | |||
3594 | static const ParsedAttrInfoCleanup Instance; |
||
3595 | }; |
||
3596 | const ParsedAttrInfoCleanup ParsedAttrInfoCleanup::Instance; |
||
3597 | static constexpr ParsedAttrInfo::Spelling CmseNSCallSpellings[] = { |
||
3598 | {AttributeCommonInfo::AS_GNU, "cmse_nonsecure_call"}, |
||
3599 | }; |
||
3600 | struct ParsedAttrInfoCmseNSCall final : public ParsedAttrInfo { |
||
3601 | constexpr ParsedAttrInfoCmseNSCall() : ParsedAttrInfo( |
||
3602 | /*AttrKind=*/ParsedAttr::AT_CmseNSCall, |
||
3603 | /*NumArgs=*/0, |
||
3604 | /*OptArgs=*/0, |
||
3605 | /*NumArgMembers=*/0, |
||
3606 | /*HasCustomParsing=*/0, |
||
3607 | /*AcceptsExprPack=*/0, |
||
3608 | /*IsTargetSpecific=*/1, |
||
3609 | /*IsType=*/1, |
||
3610 | /*IsStmt=*/0, |
||
3611 | /*IsKnownToGCC=*/0, |
||
3612 | /*IsSupportedByPragmaAttribute=*/0, |
||
3613 | /*Spellings=*/CmseNSCallSpellings, |
||
3614 | /*ArgNames=*/{}) {} |
||
3615 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3616 | return LangOpts.Cmse; |
||
3617 | } |
||
3618 | |||
3619 | bool existsInTarget(const TargetInfo &Target) const override { |
||
3620 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
3621 | return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb); |
||
3622 | } |
||
3623 | |||
3624 | bool isParamExpr(size_t N) const override { |
||
3625 | return false; |
||
3626 | } |
||
3627 | |||
3628 | static const ParsedAttrInfoCmseNSCall Instance; |
||
3629 | }; |
||
3630 | const ParsedAttrInfoCmseNSCall ParsedAttrInfoCmseNSCall::Instance; |
||
3631 | static constexpr ParsedAttrInfo::Spelling CmseNSEntrySpellings[] = { |
||
3632 | {AttributeCommonInfo::AS_GNU, "cmse_nonsecure_entry"}, |
||
3633 | }; |
||
3634 | struct ParsedAttrInfoCmseNSEntry final : public ParsedAttrInfo { |
||
3635 | constexpr ParsedAttrInfoCmseNSEntry() : ParsedAttrInfo( |
||
3636 | /*AttrKind=*/ParsedAttr::AT_CmseNSEntry, |
||
3637 | /*NumArgs=*/0, |
||
3638 | /*OptArgs=*/0, |
||
3639 | /*NumArgMembers=*/0, |
||
3640 | /*HasCustomParsing=*/0, |
||
3641 | /*AcceptsExprPack=*/0, |
||
3642 | /*IsTargetSpecific=*/1, |
||
3643 | /*IsType=*/0, |
||
3644 | /*IsStmt=*/0, |
||
3645 | /*IsKnownToGCC=*/0, |
||
3646 | /*IsSupportedByPragmaAttribute=*/1, |
||
3647 | /*Spellings=*/CmseNSEntrySpellings, |
||
3648 | /*ArgNames=*/{}) {} |
||
3649 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3650 | if (!isa<FunctionDecl>(D)) { |
||
3651 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3652 | << Attr << "functions"; |
||
3653 | return false; |
||
3654 | } |
||
3655 | return true; |
||
3656 | } |
||
3657 | |||
3658 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3659 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3660 | << AL << St->getBeginLoc(); |
||
3661 | return false; |
||
3662 | } |
||
3663 | |||
3664 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3665 | return LangOpts.Cmse; |
||
3666 | } |
||
3667 | |||
3668 | bool existsInTarget(const TargetInfo &Target) const override { |
||
3669 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
3670 | return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb); |
||
3671 | } |
||
3672 | |||
3673 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3674 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3675 | } |
||
3676 | |||
3677 | bool isParamExpr(size_t N) const override { |
||
3678 | return false; |
||
3679 | } |
||
3680 | |||
3681 | static const ParsedAttrInfoCmseNSEntry Instance; |
||
3682 | }; |
||
3683 | const ParsedAttrInfoCmseNSEntry ParsedAttrInfoCmseNSEntry::Instance; |
||
3684 | static constexpr ParsedAttrInfo::Spelling CodeSegSpellings[] = { |
||
3685 | {AttributeCommonInfo::AS_Declspec, "code_seg"}, |
||
3686 | }; |
||
3687 | static constexpr const char *CodeSegArgNames[] = { |
||
3688 | "Name",}; |
||
3689 | struct ParsedAttrInfoCodeSeg final : public ParsedAttrInfo { |
||
3690 | constexpr ParsedAttrInfoCodeSeg() : ParsedAttrInfo( |
||
3691 | /*AttrKind=*/ParsedAttr::AT_CodeSeg, |
||
3692 | /*NumArgs=*/1, |
||
3693 | /*OptArgs=*/0, |
||
3694 | /*NumArgMembers=*/1, |
||
3695 | /*HasCustomParsing=*/0, |
||
3696 | /*AcceptsExprPack=*/0, |
||
3697 | /*IsTargetSpecific=*/0, |
||
3698 | /*IsType=*/0, |
||
3699 | /*IsStmt=*/0, |
||
3700 | /*IsKnownToGCC=*/0, |
||
3701 | /*IsSupportedByPragmaAttribute=*/0, |
||
3702 | /*Spellings=*/CodeSegSpellings, |
||
3703 | /*ArgNames=*/CodeSegArgNames) {} |
||
3704 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3705 | if (!isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) { |
||
3706 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
3707 | << Attr << "functions and classes"; |
||
3708 | return false; |
||
3709 | } |
||
3710 | return true; |
||
3711 | } |
||
3712 | |||
3713 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3714 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3715 | << AL << St->getBeginLoc(); |
||
3716 | return false; |
||
3717 | } |
||
3718 | |||
3719 | bool isParamExpr(size_t N) const override { |
||
3720 | return false; |
||
3721 | } |
||
3722 | |||
3723 | static const ParsedAttrInfoCodeSeg Instance; |
||
3724 | }; |
||
3725 | const ParsedAttrInfoCodeSeg ParsedAttrInfoCodeSeg::Instance; |
||
3726 | static constexpr ParsedAttrInfo::Spelling ColdSpellings[] = { |
||
3727 | {AttributeCommonInfo::AS_GNU, "cold"}, |
||
3728 | {AttributeCommonInfo::AS_CXX11, "gnu::cold"}, |
||
3729 | {AttributeCommonInfo::AS_C2x, "gnu::cold"}, |
||
3730 | }; |
||
3731 | struct ParsedAttrInfoCold final : public ParsedAttrInfo { |
||
3732 | constexpr ParsedAttrInfoCold() : ParsedAttrInfo( |
||
3733 | /*AttrKind=*/ParsedAttr::AT_Cold, |
||
3734 | /*NumArgs=*/0, |
||
3735 | /*OptArgs=*/0, |
||
3736 | /*NumArgMembers=*/0, |
||
3737 | /*HasCustomParsing=*/0, |
||
3738 | /*AcceptsExprPack=*/0, |
||
3739 | /*IsTargetSpecific=*/0, |
||
3740 | /*IsType=*/0, |
||
3741 | /*IsStmt=*/0, |
||
3742 | /*IsKnownToGCC=*/1, |
||
3743 | /*IsSupportedByPragmaAttribute=*/1, |
||
3744 | /*Spellings=*/ColdSpellings, |
||
3745 | /*ArgNames=*/{}) {} |
||
3746 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3747 | if (!isa<FunctionDecl>(D)) { |
||
3748 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3749 | << Attr << "functions"; |
||
3750 | return false; |
||
3751 | } |
||
3752 | return true; |
||
3753 | } |
||
3754 | |||
3755 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3756 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3757 | << AL << St->getBeginLoc(); |
||
3758 | return false; |
||
3759 | } |
||
3760 | |||
3761 | using ParsedAttrInfo::diagMutualExclusion; |
||
3762 | |||
3763 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
3764 | if (const auto *A = D->getAttr<HotAttr>()) { |
||
3765 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
3766 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
3767 | return false; |
||
3768 | } |
||
3769 | return true; |
||
3770 | } |
||
3771 | |||
3772 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3773 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3774 | } |
||
3775 | |||
3776 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
3777 | D->addAttr(::new (S.Context) ColdAttr(S.Context, Attr)); |
||
3778 | return AttributeApplied; |
||
3779 | } |
||
3780 | |||
3781 | bool isParamExpr(size_t N) const override { |
||
3782 | return false; |
||
3783 | } |
||
3784 | |||
3785 | static const ParsedAttrInfoCold Instance; |
||
3786 | }; |
||
3787 | const ParsedAttrInfoCold ParsedAttrInfoCold::Instance; |
||
3788 | static constexpr ParsedAttrInfo::Spelling CommonSpellings[] = { |
||
3789 | {AttributeCommonInfo::AS_GNU, "common"}, |
||
3790 | {AttributeCommonInfo::AS_CXX11, "gnu::common"}, |
||
3791 | {AttributeCommonInfo::AS_C2x, "gnu::common"}, |
||
3792 | }; |
||
3793 | struct ParsedAttrInfoCommon final : public ParsedAttrInfo { |
||
3794 | constexpr ParsedAttrInfoCommon() : ParsedAttrInfo( |
||
3795 | /*AttrKind=*/ParsedAttr::AT_Common, |
||
3796 | /*NumArgs=*/0, |
||
3797 | /*OptArgs=*/0, |
||
3798 | /*NumArgMembers=*/0, |
||
3799 | /*HasCustomParsing=*/0, |
||
3800 | /*AcceptsExprPack=*/0, |
||
3801 | /*IsTargetSpecific=*/0, |
||
3802 | /*IsType=*/0, |
||
3803 | /*IsStmt=*/0, |
||
3804 | /*IsKnownToGCC=*/1, |
||
3805 | /*IsSupportedByPragmaAttribute=*/1, |
||
3806 | /*Spellings=*/CommonSpellings, |
||
3807 | /*ArgNames=*/{}) {} |
||
3808 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3809 | if (!isa<VarDecl>(D)) { |
||
3810 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3811 | << Attr << "variables"; |
||
3812 | return false; |
||
3813 | } |
||
3814 | return true; |
||
3815 | } |
||
3816 | |||
3817 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3818 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3819 | << AL << St->getBeginLoc(); |
||
3820 | return false; |
||
3821 | } |
||
3822 | |||
3823 | using ParsedAttrInfo::diagMutualExclusion; |
||
3824 | |||
3825 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
3826 | if (const auto *A = D->getAttr<InternalLinkageAttr>()) { |
||
3827 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
3828 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
3829 | return false; |
||
3830 | } |
||
3831 | return true; |
||
3832 | } |
||
3833 | |||
3834 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3835 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
3836 | } |
||
3837 | |||
3838 | bool isParamExpr(size_t N) const override { |
||
3839 | return false; |
||
3840 | } |
||
3841 | |||
3842 | static const ParsedAttrInfoCommon Instance; |
||
3843 | }; |
||
3844 | const ParsedAttrInfoCommon ParsedAttrInfoCommon::Instance; |
||
3845 | static constexpr ParsedAttrInfo::Spelling ConstSpellings[] = { |
||
3846 | {AttributeCommonInfo::AS_GNU, "const"}, |
||
3847 | {AttributeCommonInfo::AS_CXX11, "gnu::const"}, |
||
3848 | {AttributeCommonInfo::AS_C2x, "gnu::const"}, |
||
3849 | {AttributeCommonInfo::AS_GNU, "__const"}, |
||
3850 | {AttributeCommonInfo::AS_CXX11, "gnu::__const"}, |
||
3851 | {AttributeCommonInfo::AS_C2x, "gnu::__const"}, |
||
3852 | }; |
||
3853 | struct ParsedAttrInfoConst final : public ParsedAttrInfo { |
||
3854 | constexpr ParsedAttrInfoConst() : ParsedAttrInfo( |
||
3855 | /*AttrKind=*/ParsedAttr::AT_Const, |
||
3856 | /*NumArgs=*/0, |
||
3857 | /*OptArgs=*/0, |
||
3858 | /*NumArgMembers=*/0, |
||
3859 | /*HasCustomParsing=*/0, |
||
3860 | /*AcceptsExprPack=*/0, |
||
3861 | /*IsTargetSpecific=*/0, |
||
3862 | /*IsType=*/0, |
||
3863 | /*IsStmt=*/0, |
||
3864 | /*IsKnownToGCC=*/1, |
||
3865 | /*IsSupportedByPragmaAttribute=*/0, |
||
3866 | /*Spellings=*/ConstSpellings, |
||
3867 | /*ArgNames=*/{}) {} |
||
3868 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
3869 | D->addAttr(::new (S.Context) ConstAttr(S.Context, Attr)); |
||
3870 | return AttributeApplied; |
||
3871 | } |
||
3872 | |||
3873 | bool isParamExpr(size_t N) const override { |
||
3874 | return false; |
||
3875 | } |
||
3876 | |||
3877 | static const ParsedAttrInfoConst Instance; |
||
3878 | }; |
||
3879 | const ParsedAttrInfoConst ParsedAttrInfoConst::Instance; |
||
3880 | static constexpr ParsedAttrInfo::Spelling ConstInitSpellings[] = { |
||
3881 | {AttributeCommonInfo::AS_Keyword, "constinit"}, |
||
3882 | {AttributeCommonInfo::AS_GNU, "require_constant_initialization"}, |
||
3883 | {AttributeCommonInfo::AS_CXX11, "clang::require_constant_initialization"}, |
||
3884 | }; |
||
3885 | struct ParsedAttrInfoConstInit final : public ParsedAttrInfo { |
||
3886 | constexpr ParsedAttrInfoConstInit() : ParsedAttrInfo( |
||
3887 | /*AttrKind=*/ParsedAttr::AT_ConstInit, |
||
3888 | /*NumArgs=*/0, |
||
3889 | /*OptArgs=*/0, |
||
3890 | /*NumArgMembers=*/0, |
||
3891 | /*HasCustomParsing=*/0, |
||
3892 | /*AcceptsExprPack=*/0, |
||
3893 | /*IsTargetSpecific=*/0, |
||
3894 | /*IsType=*/0, |
||
3895 | /*IsStmt=*/0, |
||
3896 | /*IsKnownToGCC=*/0, |
||
3897 | /*IsSupportedByPragmaAttribute=*/1, |
||
3898 | /*Spellings=*/ConstInitSpellings, |
||
3899 | /*ArgNames=*/{}) {} |
||
3900 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3901 | if (!isGlobalVar(D)) { |
||
3902 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
3903 | << Attr << "global variables"; |
||
3904 | return false; |
||
3905 | } |
||
3906 | return true; |
||
3907 | } |
||
3908 | |||
3909 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3910 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3911 | << AL << St->getBeginLoc(); |
||
3912 | return false; |
||
3913 | } |
||
3914 | |||
3915 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
3916 | return LangOpts.CPlusPlus; |
||
3917 | } |
||
3918 | |||
3919 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
3920 | enum Spelling { |
||
3921 | Keyword_constinit = 0, |
||
3922 | GNU_require_constant_initialization = 1, |
||
3923 | CXX11_clang_require_constant_initialization = 2, |
||
3924 | SpellingNotCalculated = 15 |
||
3925 | |||
3926 | }; |
||
3927 | |||
3928 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
3929 | switch (Idx) { |
||
3930 | default: llvm_unreachable("Unknown spelling list index"); |
||
3931 | case 0: return Keyword_constinit; |
||
3932 | case 1: return GNU_require_constant_initialization; |
||
3933 | case 2: return CXX11_clang_require_constant_initialization; |
||
3934 | } |
||
3935 | } |
||
3936 | |||
3937 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3938 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
3939 | } |
||
3940 | |||
3941 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
3942 | D->addAttr(::new (S.Context) ConstInitAttr(S.Context, Attr)); |
||
3943 | return AttributeApplied; |
||
3944 | } |
||
3945 | |||
3946 | bool isParamExpr(size_t N) const override { |
||
3947 | return false; |
||
3948 | } |
||
3949 | |||
3950 | static const ParsedAttrInfoConstInit Instance; |
||
3951 | }; |
||
3952 | const ParsedAttrInfoConstInit ParsedAttrInfoConstInit::Instance; |
||
3953 | static constexpr ParsedAttrInfo::Spelling ConstructorSpellings[] = { |
||
3954 | {AttributeCommonInfo::AS_GNU, "constructor"}, |
||
3955 | {AttributeCommonInfo::AS_CXX11, "gnu::constructor"}, |
||
3956 | {AttributeCommonInfo::AS_C2x, "gnu::constructor"}, |
||
3957 | }; |
||
3958 | static constexpr const char *ConstructorArgNames[] = { |
||
3959 | "Priority",}; |
||
3960 | struct ParsedAttrInfoConstructor final : public ParsedAttrInfo { |
||
3961 | constexpr ParsedAttrInfoConstructor() : ParsedAttrInfo( |
||
3962 | /*AttrKind=*/ParsedAttr::AT_Constructor, |
||
3963 | /*NumArgs=*/0, |
||
3964 | /*OptArgs=*/1, |
||
3965 | /*NumArgMembers=*/1, |
||
3966 | /*HasCustomParsing=*/0, |
||
3967 | /*AcceptsExprPack=*/0, |
||
3968 | /*IsTargetSpecific=*/0, |
||
3969 | /*IsType=*/0, |
||
3970 | /*IsStmt=*/0, |
||
3971 | /*IsKnownToGCC=*/1, |
||
3972 | /*IsSupportedByPragmaAttribute=*/1, |
||
3973 | /*Spellings=*/ConstructorSpellings, |
||
3974 | /*ArgNames=*/ConstructorArgNames) {} |
||
3975 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
3976 | if (!isa<FunctionDecl>(D)) { |
||
3977 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
3978 | << Attr << "functions"; |
||
3979 | return false; |
||
3980 | } |
||
3981 | return true; |
||
3982 | } |
||
3983 | |||
3984 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
3985 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
3986 | << AL << St->getBeginLoc(); |
||
3987 | return false; |
||
3988 | } |
||
3989 | |||
3990 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
3991 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
3992 | } |
||
3993 | |||
3994 | bool isParamExpr(size_t N) const override { |
||
3995 | return false; |
||
3996 | } |
||
3997 | |||
3998 | static const ParsedAttrInfoConstructor Instance; |
||
3999 | }; |
||
4000 | const ParsedAttrInfoConstructor ParsedAttrInfoConstructor::Instance; |
||
4001 | static constexpr ParsedAttrInfo::Spelling ConsumableSpellings[] = { |
||
4002 | {AttributeCommonInfo::AS_GNU, "consumable"}, |
||
4003 | {AttributeCommonInfo::AS_CXX11, "clang::consumable"}, |
||
4004 | }; |
||
4005 | static constexpr const char *ConsumableArgNames[] = { |
||
4006 | "DefaultState",}; |
||
4007 | struct ParsedAttrInfoConsumable final : public ParsedAttrInfo { |
||
4008 | constexpr ParsedAttrInfoConsumable() : ParsedAttrInfo( |
||
4009 | /*AttrKind=*/ParsedAttr::AT_Consumable, |
||
4010 | /*NumArgs=*/1, |
||
4011 | /*OptArgs=*/0, |
||
4012 | /*NumArgMembers=*/1, |
||
4013 | /*HasCustomParsing=*/0, |
||
4014 | /*AcceptsExprPack=*/0, |
||
4015 | /*IsTargetSpecific=*/0, |
||
4016 | /*IsType=*/0, |
||
4017 | /*IsStmt=*/0, |
||
4018 | /*IsKnownToGCC=*/0, |
||
4019 | /*IsSupportedByPragmaAttribute=*/1, |
||
4020 | /*Spellings=*/ConsumableSpellings, |
||
4021 | /*ArgNames=*/ConsumableArgNames) {} |
||
4022 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4023 | if (!isa<CXXRecordDecl>(D)) { |
||
4024 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4025 | << Attr << "classes"; |
||
4026 | return false; |
||
4027 | } |
||
4028 | return true; |
||
4029 | } |
||
4030 | |||
4031 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4032 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4033 | << AL << St->getBeginLoc(); |
||
4034 | return false; |
||
4035 | } |
||
4036 | |||
4037 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4038 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
4039 | } |
||
4040 | |||
4041 | bool isParamExpr(size_t N) const override { |
||
4042 | return false; |
||
4043 | } |
||
4044 | |||
4045 | static const ParsedAttrInfoConsumable Instance; |
||
4046 | }; |
||
4047 | const ParsedAttrInfoConsumable ParsedAttrInfoConsumable::Instance; |
||
4048 | static constexpr ParsedAttrInfo::Spelling ConsumableAutoCastSpellings[] = { |
||
4049 | {AttributeCommonInfo::AS_GNU, "consumable_auto_cast_state"}, |
||
4050 | {AttributeCommonInfo::AS_CXX11, "clang::consumable_auto_cast_state"}, |
||
4051 | }; |
||
4052 | struct ParsedAttrInfoConsumableAutoCast final : public ParsedAttrInfo { |
||
4053 | constexpr ParsedAttrInfoConsumableAutoCast() : ParsedAttrInfo( |
||
4054 | /*AttrKind=*/ParsedAttr::AT_ConsumableAutoCast, |
||
4055 | /*NumArgs=*/0, |
||
4056 | /*OptArgs=*/0, |
||
4057 | /*NumArgMembers=*/0, |
||
4058 | /*HasCustomParsing=*/0, |
||
4059 | /*AcceptsExprPack=*/0, |
||
4060 | /*IsTargetSpecific=*/0, |
||
4061 | /*IsType=*/0, |
||
4062 | /*IsStmt=*/0, |
||
4063 | /*IsKnownToGCC=*/0, |
||
4064 | /*IsSupportedByPragmaAttribute=*/1, |
||
4065 | /*Spellings=*/ConsumableAutoCastSpellings, |
||
4066 | /*ArgNames=*/{}) {} |
||
4067 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4068 | if (!isa<CXXRecordDecl>(D)) { |
||
4069 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4070 | << Attr << "classes"; |
||
4071 | return false; |
||
4072 | } |
||
4073 | return true; |
||
4074 | } |
||
4075 | |||
4076 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4077 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4078 | << AL << St->getBeginLoc(); |
||
4079 | return false; |
||
4080 | } |
||
4081 | |||
4082 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4083 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
4084 | } |
||
4085 | |||
4086 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
4087 | D->addAttr(::new (S.Context) ConsumableAutoCastAttr(S.Context, Attr)); |
||
4088 | return AttributeApplied; |
||
4089 | } |
||
4090 | |||
4091 | bool isParamExpr(size_t N) const override { |
||
4092 | return false; |
||
4093 | } |
||
4094 | |||
4095 | static const ParsedAttrInfoConsumableAutoCast Instance; |
||
4096 | }; |
||
4097 | const ParsedAttrInfoConsumableAutoCast ParsedAttrInfoConsumableAutoCast::Instance; |
||
4098 | static constexpr ParsedAttrInfo::Spelling ConsumableSetOnReadSpellings[] = { |
||
4099 | {AttributeCommonInfo::AS_GNU, "consumable_set_state_on_read"}, |
||
4100 | {AttributeCommonInfo::AS_CXX11, "clang::consumable_set_state_on_read"}, |
||
4101 | }; |
||
4102 | struct ParsedAttrInfoConsumableSetOnRead final : public ParsedAttrInfo { |
||
4103 | constexpr ParsedAttrInfoConsumableSetOnRead() : ParsedAttrInfo( |
||
4104 | /*AttrKind=*/ParsedAttr::AT_ConsumableSetOnRead, |
||
4105 | /*NumArgs=*/0, |
||
4106 | /*OptArgs=*/0, |
||
4107 | /*NumArgMembers=*/0, |
||
4108 | /*HasCustomParsing=*/0, |
||
4109 | /*AcceptsExprPack=*/0, |
||
4110 | /*IsTargetSpecific=*/0, |
||
4111 | /*IsType=*/0, |
||
4112 | /*IsStmt=*/0, |
||
4113 | /*IsKnownToGCC=*/0, |
||
4114 | /*IsSupportedByPragmaAttribute=*/1, |
||
4115 | /*Spellings=*/ConsumableSetOnReadSpellings, |
||
4116 | /*ArgNames=*/{}) {} |
||
4117 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4118 | if (!isa<CXXRecordDecl>(D)) { |
||
4119 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4120 | << Attr << "classes"; |
||
4121 | return false; |
||
4122 | } |
||
4123 | return true; |
||
4124 | } |
||
4125 | |||
4126 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4127 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4128 | << AL << St->getBeginLoc(); |
||
4129 | return false; |
||
4130 | } |
||
4131 | |||
4132 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4133 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
4134 | } |
||
4135 | |||
4136 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
4137 | D->addAttr(::new (S.Context) ConsumableSetOnReadAttr(S.Context, Attr)); |
||
4138 | return AttributeApplied; |
||
4139 | } |
||
4140 | |||
4141 | bool isParamExpr(size_t N) const override { |
||
4142 | return false; |
||
4143 | } |
||
4144 | |||
4145 | static const ParsedAttrInfoConsumableSetOnRead Instance; |
||
4146 | }; |
||
4147 | const ParsedAttrInfoConsumableSetOnRead ParsedAttrInfoConsumableSetOnRead::Instance; |
||
4148 | static constexpr ParsedAttrInfo::Spelling ConvergentSpellings[] = { |
||
4149 | {AttributeCommonInfo::AS_GNU, "convergent"}, |
||
4150 | {AttributeCommonInfo::AS_CXX11, "clang::convergent"}, |
||
4151 | {AttributeCommonInfo::AS_C2x, "clang::convergent"}, |
||
4152 | }; |
||
4153 | struct ParsedAttrInfoConvergent final : public ParsedAttrInfo { |
||
4154 | constexpr ParsedAttrInfoConvergent() : ParsedAttrInfo( |
||
4155 | /*AttrKind=*/ParsedAttr::AT_Convergent, |
||
4156 | /*NumArgs=*/0, |
||
4157 | /*OptArgs=*/0, |
||
4158 | /*NumArgMembers=*/0, |
||
4159 | /*HasCustomParsing=*/0, |
||
4160 | /*AcceptsExprPack=*/0, |
||
4161 | /*IsTargetSpecific=*/0, |
||
4162 | /*IsType=*/0, |
||
4163 | /*IsStmt=*/0, |
||
4164 | /*IsKnownToGCC=*/0, |
||
4165 | /*IsSupportedByPragmaAttribute=*/1, |
||
4166 | /*Spellings=*/ConvergentSpellings, |
||
4167 | /*ArgNames=*/{}) {} |
||
4168 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4169 | if (!isa<FunctionDecl>(D)) { |
||
4170 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4171 | << Attr << "functions"; |
||
4172 | return false; |
||
4173 | } |
||
4174 | return true; |
||
4175 | } |
||
4176 | |||
4177 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4178 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4179 | << AL << St->getBeginLoc(); |
||
4180 | return false; |
||
4181 | } |
||
4182 | |||
4183 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4184 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4185 | } |
||
4186 | |||
4187 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
4188 | D->addAttr(::new (S.Context) ConvergentAttr(S.Context, Attr)); |
||
4189 | return AttributeApplied; |
||
4190 | } |
||
4191 | |||
4192 | bool isParamExpr(size_t N) const override { |
||
4193 | return false; |
||
4194 | } |
||
4195 | |||
4196 | static const ParsedAttrInfoConvergent Instance; |
||
4197 | }; |
||
4198 | const ParsedAttrInfoConvergent ParsedAttrInfoConvergent::Instance; |
||
4199 | static constexpr ParsedAttrInfo::Spelling DLLExportSpellings[] = { |
||
4200 | {AttributeCommonInfo::AS_Declspec, "dllexport"}, |
||
4201 | {AttributeCommonInfo::AS_GNU, "dllexport"}, |
||
4202 | {AttributeCommonInfo::AS_CXX11, "gnu::dllexport"}, |
||
4203 | {AttributeCommonInfo::AS_C2x, "gnu::dllexport"}, |
||
4204 | }; |
||
4205 | struct ParsedAttrInfoDLLExport final : public ParsedAttrInfo { |
||
4206 | constexpr ParsedAttrInfoDLLExport() : ParsedAttrInfo( |
||
4207 | /*AttrKind=*/ParsedAttr::AT_DLLExport, |
||
4208 | /*NumArgs=*/0, |
||
4209 | /*OptArgs=*/0, |
||
4210 | /*NumArgMembers=*/0, |
||
4211 | /*HasCustomParsing=*/0, |
||
4212 | /*AcceptsExprPack=*/0, |
||
4213 | /*IsTargetSpecific=*/1, |
||
4214 | /*IsType=*/0, |
||
4215 | /*IsStmt=*/0, |
||
4216 | /*IsKnownToGCC=*/1, |
||
4217 | /*IsSupportedByPragmaAttribute=*/1, |
||
4218 | /*Spellings=*/DLLExportSpellings, |
||
4219 | /*ArgNames=*/{}) {} |
||
4220 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4221 | if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D) && !isa<CXXRecordDecl>(D) && !isa<ObjCInterfaceDecl>(D)) { |
||
4222 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4223 | << Attr << "functions, variables, classes, and Objective-C interfaces"; |
||
4224 | return false; |
||
4225 | } |
||
4226 | return true; |
||
4227 | } |
||
4228 | |||
4229 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4230 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4231 | << AL << St->getBeginLoc(); |
||
4232 | return false; |
||
4233 | } |
||
4234 | |||
4235 | bool existsInTarget(const TargetInfo &Target) const override { |
||
4236 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
4237 | return true && ( Target.getTriple().hasDLLImportExport() ); |
||
4238 | } |
||
4239 | |||
4240 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4241 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4242 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
4243 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
4244 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
4245 | } |
||
4246 | |||
4247 | bool isParamExpr(size_t N) const override { |
||
4248 | return false; |
||
4249 | } |
||
4250 | |||
4251 | static const ParsedAttrInfoDLLExport Instance; |
||
4252 | }; |
||
4253 | const ParsedAttrInfoDLLExport ParsedAttrInfoDLLExport::Instance; |
||
4254 | struct ParsedAttrInfoDLLExportStaticLocal final : public ParsedAttrInfo { |
||
4255 | constexpr ParsedAttrInfoDLLExportStaticLocal() : ParsedAttrInfo( |
||
4256 | /*AttrKind=*/ParsedAttr::AT_DLLExportStaticLocal, |
||
4257 | /*NumArgs=*/0, |
||
4258 | /*OptArgs=*/0, |
||
4259 | /*NumArgMembers=*/0, |
||
4260 | /*HasCustomParsing=*/0, |
||
4261 | /*AcceptsExprPack=*/0, |
||
4262 | /*IsTargetSpecific=*/1, |
||
4263 | /*IsType=*/0, |
||
4264 | /*IsStmt=*/0, |
||
4265 | /*IsKnownToGCC=*/0, |
||
4266 | /*IsSupportedByPragmaAttribute=*/0, |
||
4267 | /*Spellings=*/{}, |
||
4268 | /*ArgNames=*/{}) {} |
||
4269 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4270 | if (!isa<FunctionDecl>(D)) { |
||
4271 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4272 | << Attr << "functions"; |
||
4273 | return false; |
||
4274 | } |
||
4275 | return true; |
||
4276 | } |
||
4277 | |||
4278 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4279 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4280 | << AL << St->getBeginLoc(); |
||
4281 | return false; |
||
4282 | } |
||
4283 | |||
4284 | bool existsInTarget(const TargetInfo &Target) const override { |
||
4285 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
4286 | return true && ( Target.getTriple().hasDLLImportExport() ); |
||
4287 | } |
||
4288 | |||
4289 | bool isParamExpr(size_t N) const override { |
||
4290 | return false; |
||
4291 | } |
||
4292 | |||
4293 | static const ParsedAttrInfoDLLExportStaticLocal Instance; |
||
4294 | }; |
||
4295 | const ParsedAttrInfoDLLExportStaticLocal ParsedAttrInfoDLLExportStaticLocal::Instance; |
||
4296 | static constexpr ParsedAttrInfo::Spelling DLLImportSpellings[] = { |
||
4297 | {AttributeCommonInfo::AS_Declspec, "dllimport"}, |
||
4298 | {AttributeCommonInfo::AS_GNU, "dllimport"}, |
||
4299 | {AttributeCommonInfo::AS_CXX11, "gnu::dllimport"}, |
||
4300 | {AttributeCommonInfo::AS_C2x, "gnu::dllimport"}, |
||
4301 | }; |
||
4302 | struct ParsedAttrInfoDLLImport final : public ParsedAttrInfo { |
||
4303 | constexpr ParsedAttrInfoDLLImport() : ParsedAttrInfo( |
||
4304 | /*AttrKind=*/ParsedAttr::AT_DLLImport, |
||
4305 | /*NumArgs=*/0, |
||
4306 | /*OptArgs=*/0, |
||
4307 | /*NumArgMembers=*/0, |
||
4308 | /*HasCustomParsing=*/0, |
||
4309 | /*AcceptsExprPack=*/0, |
||
4310 | /*IsTargetSpecific=*/1, |
||
4311 | /*IsType=*/0, |
||
4312 | /*IsStmt=*/0, |
||
4313 | /*IsKnownToGCC=*/1, |
||
4314 | /*IsSupportedByPragmaAttribute=*/1, |
||
4315 | /*Spellings=*/DLLImportSpellings, |
||
4316 | /*ArgNames=*/{}) {} |
||
4317 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4318 | if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D) && !isa<CXXRecordDecl>(D) && !isa<ObjCInterfaceDecl>(D)) { |
||
4319 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4320 | << Attr << "functions, variables, classes, and Objective-C interfaces"; |
||
4321 | return false; |
||
4322 | } |
||
4323 | return true; |
||
4324 | } |
||
4325 | |||
4326 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4327 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4328 | << AL << St->getBeginLoc(); |
||
4329 | return false; |
||
4330 | } |
||
4331 | |||
4332 | bool existsInTarget(const TargetInfo &Target) const override { |
||
4333 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
4334 | return true && ( Target.getTriple().hasDLLImportExport() ); |
||
4335 | } |
||
4336 | |||
4337 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4338 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4339 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
4340 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
4341 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
4342 | } |
||
4343 | |||
4344 | bool isParamExpr(size_t N) const override { |
||
4345 | return false; |
||
4346 | } |
||
4347 | |||
4348 | static const ParsedAttrInfoDLLImport Instance; |
||
4349 | }; |
||
4350 | const ParsedAttrInfoDLLImport ParsedAttrInfoDLLImport::Instance; |
||
4351 | struct ParsedAttrInfoDLLImportStaticLocal final : public ParsedAttrInfo { |
||
4352 | constexpr ParsedAttrInfoDLLImportStaticLocal() : ParsedAttrInfo( |
||
4353 | /*AttrKind=*/ParsedAttr::AT_DLLImportStaticLocal, |
||
4354 | /*NumArgs=*/0, |
||
4355 | /*OptArgs=*/0, |
||
4356 | /*NumArgMembers=*/0, |
||
4357 | /*HasCustomParsing=*/0, |
||
4358 | /*AcceptsExprPack=*/0, |
||
4359 | /*IsTargetSpecific=*/1, |
||
4360 | /*IsType=*/0, |
||
4361 | /*IsStmt=*/0, |
||
4362 | /*IsKnownToGCC=*/0, |
||
4363 | /*IsSupportedByPragmaAttribute=*/0, |
||
4364 | /*Spellings=*/{}, |
||
4365 | /*ArgNames=*/{}) {} |
||
4366 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4367 | if (!isa<FunctionDecl>(D)) { |
||
4368 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4369 | << Attr << "functions"; |
||
4370 | return false; |
||
4371 | } |
||
4372 | return true; |
||
4373 | } |
||
4374 | |||
4375 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4376 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4377 | << AL << St->getBeginLoc(); |
||
4378 | return false; |
||
4379 | } |
||
4380 | |||
4381 | bool existsInTarget(const TargetInfo &Target) const override { |
||
4382 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
4383 | return true && ( Target.getTriple().hasDLLImportExport() ); |
||
4384 | } |
||
4385 | |||
4386 | bool isParamExpr(size_t N) const override { |
||
4387 | return false; |
||
4388 | } |
||
4389 | |||
4390 | static const ParsedAttrInfoDLLImportStaticLocal Instance; |
||
4391 | }; |
||
4392 | const ParsedAttrInfoDLLImportStaticLocal ParsedAttrInfoDLLImportStaticLocal::Instance; |
||
4393 | static constexpr ParsedAttrInfo::Spelling DeprecatedSpellings[] = { |
||
4394 | {AttributeCommonInfo::AS_GNU, "deprecated"}, |
||
4395 | {AttributeCommonInfo::AS_CXX11, "gnu::deprecated"}, |
||
4396 | {AttributeCommonInfo::AS_C2x, "gnu::deprecated"}, |
||
4397 | {AttributeCommonInfo::AS_Declspec, "deprecated"}, |
||
4398 | {AttributeCommonInfo::AS_CXX11, "deprecated"}, |
||
4399 | {AttributeCommonInfo::AS_C2x, "deprecated"}, |
||
4400 | }; |
||
4401 | static constexpr const char *DeprecatedArgNames[] = { |
||
4402 | "Message","Replacement",}; |
||
4403 | struct ParsedAttrInfoDeprecated final : public ParsedAttrInfo { |
||
4404 | constexpr ParsedAttrInfoDeprecated() : ParsedAttrInfo( |
||
4405 | /*AttrKind=*/ParsedAttr::AT_Deprecated, |
||
4406 | /*NumArgs=*/0, |
||
4407 | /*OptArgs=*/2, |
||
4408 | /*NumArgMembers=*/2, |
||
4409 | /*HasCustomParsing=*/0, |
||
4410 | /*AcceptsExprPack=*/0, |
||
4411 | /*IsTargetSpecific=*/0, |
||
4412 | /*IsType=*/0, |
||
4413 | /*IsStmt=*/0, |
||
4414 | /*IsKnownToGCC=*/1, |
||
4415 | /*IsSupportedByPragmaAttribute=*/0, |
||
4416 | /*Spellings=*/DeprecatedSpellings, |
||
4417 | /*ArgNames=*/DeprecatedArgNames) {} |
||
4418 | bool isParamExpr(size_t N) const override { |
||
4419 | return false; |
||
4420 | } |
||
4421 | |||
4422 | static const ParsedAttrInfoDeprecated Instance; |
||
4423 | }; |
||
4424 | const ParsedAttrInfoDeprecated ParsedAttrInfoDeprecated::Instance; |
||
4425 | static constexpr ParsedAttrInfo::Spelling DestructorSpellings[] = { |
||
4426 | {AttributeCommonInfo::AS_GNU, "destructor"}, |
||
4427 | {AttributeCommonInfo::AS_CXX11, "gnu::destructor"}, |
||
4428 | {AttributeCommonInfo::AS_C2x, "gnu::destructor"}, |
||
4429 | }; |
||
4430 | static constexpr const char *DestructorArgNames[] = { |
||
4431 | "Priority",}; |
||
4432 | struct ParsedAttrInfoDestructor final : public ParsedAttrInfo { |
||
4433 | constexpr ParsedAttrInfoDestructor() : ParsedAttrInfo( |
||
4434 | /*AttrKind=*/ParsedAttr::AT_Destructor, |
||
4435 | /*NumArgs=*/0, |
||
4436 | /*OptArgs=*/1, |
||
4437 | /*NumArgMembers=*/1, |
||
4438 | /*HasCustomParsing=*/0, |
||
4439 | /*AcceptsExprPack=*/0, |
||
4440 | /*IsTargetSpecific=*/0, |
||
4441 | /*IsType=*/0, |
||
4442 | /*IsStmt=*/0, |
||
4443 | /*IsKnownToGCC=*/1, |
||
4444 | /*IsSupportedByPragmaAttribute=*/1, |
||
4445 | /*Spellings=*/DestructorSpellings, |
||
4446 | /*ArgNames=*/DestructorArgNames) {} |
||
4447 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4448 | if (!isa<FunctionDecl>(D)) { |
||
4449 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4450 | << Attr << "functions"; |
||
4451 | return false; |
||
4452 | } |
||
4453 | return true; |
||
4454 | } |
||
4455 | |||
4456 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4457 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4458 | << AL << St->getBeginLoc(); |
||
4459 | return false; |
||
4460 | } |
||
4461 | |||
4462 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4463 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4464 | } |
||
4465 | |||
4466 | bool isParamExpr(size_t N) const override { |
||
4467 | return false; |
||
4468 | } |
||
4469 | |||
4470 | static const ParsedAttrInfoDestructor Instance; |
||
4471 | }; |
||
4472 | const ParsedAttrInfoDestructor ParsedAttrInfoDestructor::Instance; |
||
4473 | static constexpr ParsedAttrInfo::Spelling DiagnoseAsBuiltinSpellings[] = { |
||
4474 | {AttributeCommonInfo::AS_GNU, "diagnose_as_builtin"}, |
||
4475 | {AttributeCommonInfo::AS_CXX11, "clang::diagnose_as_builtin"}, |
||
4476 | {AttributeCommonInfo::AS_C2x, "clang::diagnose_as_builtin"}, |
||
4477 | }; |
||
4478 | static constexpr const char *DiagnoseAsBuiltinArgNames[] = { |
||
4479 | "Function","ArgIndices...",}; |
||
4480 | struct ParsedAttrInfoDiagnoseAsBuiltin final : public ParsedAttrInfo { |
||
4481 | constexpr ParsedAttrInfoDiagnoseAsBuiltin() : ParsedAttrInfo( |
||
4482 | /*AttrKind=*/ParsedAttr::AT_DiagnoseAsBuiltin, |
||
4483 | /*NumArgs=*/1, |
||
4484 | /*OptArgs=*/15, |
||
4485 | /*NumArgMembers=*/2, |
||
4486 | /*HasCustomParsing=*/0, |
||
4487 | /*AcceptsExprPack=*/0, |
||
4488 | /*IsTargetSpecific=*/0, |
||
4489 | /*IsType=*/0, |
||
4490 | /*IsStmt=*/0, |
||
4491 | /*IsKnownToGCC=*/0, |
||
4492 | /*IsSupportedByPragmaAttribute=*/1, |
||
4493 | /*Spellings=*/DiagnoseAsBuiltinSpellings, |
||
4494 | /*ArgNames=*/DiagnoseAsBuiltinArgNames) {} |
||
4495 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4496 | if (!isa<FunctionDecl>(D)) { |
||
4497 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4498 | << Attr << "functions"; |
||
4499 | return false; |
||
4500 | } |
||
4501 | return true; |
||
4502 | } |
||
4503 | |||
4504 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4505 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4506 | << AL << St->getBeginLoc(); |
||
4507 | return false; |
||
4508 | } |
||
4509 | |||
4510 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4511 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4512 | } |
||
4513 | |||
4514 | bool isParamExpr(size_t N) const override { |
||
4515 | return false; |
||
4516 | } |
||
4517 | |||
4518 | static const ParsedAttrInfoDiagnoseAsBuiltin Instance; |
||
4519 | }; |
||
4520 | const ParsedAttrInfoDiagnoseAsBuiltin ParsedAttrInfoDiagnoseAsBuiltin::Instance; |
||
4521 | static constexpr ParsedAttrInfo::Spelling DiagnoseIfSpellings[] = { |
||
4522 | {AttributeCommonInfo::AS_GNU, "diagnose_if"}, |
||
4523 | }; |
||
4524 | static constexpr const char *DiagnoseIfArgNames[] = { |
||
4525 | "Cond","Message","DiagnosticType",}; |
||
4526 | struct ParsedAttrInfoDiagnoseIf final : public ParsedAttrInfo { |
||
4527 | constexpr ParsedAttrInfoDiagnoseIf() : ParsedAttrInfo( |
||
4528 | /*AttrKind=*/ParsedAttr::AT_DiagnoseIf, |
||
4529 | /*NumArgs=*/3, |
||
4530 | /*OptArgs=*/0, |
||
4531 | /*NumArgMembers=*/3, |
||
4532 | /*HasCustomParsing=*/0, |
||
4533 | /*AcceptsExprPack=*/0, |
||
4534 | /*IsTargetSpecific=*/0, |
||
4535 | /*IsType=*/0, |
||
4536 | /*IsStmt=*/0, |
||
4537 | /*IsKnownToGCC=*/0, |
||
4538 | /*IsSupportedByPragmaAttribute=*/0, |
||
4539 | /*Spellings=*/DiagnoseIfSpellings, |
||
4540 | /*ArgNames=*/DiagnoseIfArgNames) {} |
||
4541 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4542 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D)) { |
||
4543 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4544 | << Attr << "functions, Objective-C methods, and Objective-C properties"; |
||
4545 | return false; |
||
4546 | } |
||
4547 | return true; |
||
4548 | } |
||
4549 | |||
4550 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4551 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4552 | << AL << St->getBeginLoc(); |
||
4553 | return false; |
||
4554 | } |
||
4555 | |||
4556 | bool isParamExpr(size_t N) const override { |
||
4557 | return (N == 0) || false; |
||
4558 | } |
||
4559 | |||
4560 | static const ParsedAttrInfoDiagnoseIf Instance; |
||
4561 | }; |
||
4562 | const ParsedAttrInfoDiagnoseIf ParsedAttrInfoDiagnoseIf::Instance; |
||
4563 | static constexpr ParsedAttrInfo::Spelling DisableSanitizerInstrumentationSpellings[] = { |
||
4564 | {AttributeCommonInfo::AS_GNU, "disable_sanitizer_instrumentation"}, |
||
4565 | {AttributeCommonInfo::AS_CXX11, "clang::disable_sanitizer_instrumentation"}, |
||
4566 | {AttributeCommonInfo::AS_C2x, "clang::disable_sanitizer_instrumentation"}, |
||
4567 | }; |
||
4568 | struct ParsedAttrInfoDisableSanitizerInstrumentation final : public ParsedAttrInfo { |
||
4569 | constexpr ParsedAttrInfoDisableSanitizerInstrumentation() : ParsedAttrInfo( |
||
4570 | /*AttrKind=*/ParsedAttr::AT_DisableSanitizerInstrumentation, |
||
4571 | /*NumArgs=*/0, |
||
4572 | /*OptArgs=*/0, |
||
4573 | /*NumArgMembers=*/0, |
||
4574 | /*HasCustomParsing=*/0, |
||
4575 | /*AcceptsExprPack=*/0, |
||
4576 | /*IsTargetSpecific=*/0, |
||
4577 | /*IsType=*/0, |
||
4578 | /*IsStmt=*/0, |
||
4579 | /*IsKnownToGCC=*/0, |
||
4580 | /*IsSupportedByPragmaAttribute=*/1, |
||
4581 | /*Spellings=*/DisableSanitizerInstrumentationSpellings, |
||
4582 | /*ArgNames=*/{}) {} |
||
4583 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4584 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isGlobalVar(D)) { |
||
4585 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4586 | << Attr << "functions, Objective-C methods, and global variables"; |
||
4587 | return false; |
||
4588 | } |
||
4589 | return true; |
||
4590 | } |
||
4591 | |||
4592 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4593 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4594 | << AL << St->getBeginLoc(); |
||
4595 | return false; |
||
4596 | } |
||
4597 | |||
4598 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4599 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4600 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
4601 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
4602 | } |
||
4603 | |||
4604 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
4605 | D->addAttr(::new (S.Context) DisableSanitizerInstrumentationAttr(S.Context, Attr)); |
||
4606 | return AttributeApplied; |
||
4607 | } |
||
4608 | |||
4609 | bool isParamExpr(size_t N) const override { |
||
4610 | return false; |
||
4611 | } |
||
4612 | |||
4613 | static const ParsedAttrInfoDisableSanitizerInstrumentation Instance; |
||
4614 | }; |
||
4615 | const ParsedAttrInfoDisableSanitizerInstrumentation ParsedAttrInfoDisableSanitizerInstrumentation::Instance; |
||
4616 | static constexpr ParsedAttrInfo::Spelling DisableTailCallsSpellings[] = { |
||
4617 | {AttributeCommonInfo::AS_GNU, "disable_tail_calls"}, |
||
4618 | {AttributeCommonInfo::AS_CXX11, "clang::disable_tail_calls"}, |
||
4619 | {AttributeCommonInfo::AS_C2x, "clang::disable_tail_calls"}, |
||
4620 | }; |
||
4621 | struct ParsedAttrInfoDisableTailCalls final : public ParsedAttrInfo { |
||
4622 | constexpr ParsedAttrInfoDisableTailCalls() : ParsedAttrInfo( |
||
4623 | /*AttrKind=*/ParsedAttr::AT_DisableTailCalls, |
||
4624 | /*NumArgs=*/0, |
||
4625 | /*OptArgs=*/0, |
||
4626 | /*NumArgMembers=*/0, |
||
4627 | /*HasCustomParsing=*/0, |
||
4628 | /*AcceptsExprPack=*/0, |
||
4629 | /*IsTargetSpecific=*/0, |
||
4630 | /*IsType=*/0, |
||
4631 | /*IsStmt=*/0, |
||
4632 | /*IsKnownToGCC=*/0, |
||
4633 | /*IsSupportedByPragmaAttribute=*/1, |
||
4634 | /*Spellings=*/DisableTailCallsSpellings, |
||
4635 | /*ArgNames=*/{}) {} |
||
4636 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4637 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
4638 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4639 | << Attr << "functions and Objective-C methods"; |
||
4640 | return false; |
||
4641 | } |
||
4642 | return true; |
||
4643 | } |
||
4644 | |||
4645 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4646 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4647 | << AL << St->getBeginLoc(); |
||
4648 | return false; |
||
4649 | } |
||
4650 | |||
4651 | using ParsedAttrInfo::diagMutualExclusion; |
||
4652 | |||
4653 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
4654 | if (const auto *A = D->getAttr<NakedAttr>()) { |
||
4655 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
4656 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
4657 | return false; |
||
4658 | } |
||
4659 | return true; |
||
4660 | } |
||
4661 | |||
4662 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4663 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4664 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
4665 | } |
||
4666 | |||
4667 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
4668 | D->addAttr(::new (S.Context) DisableTailCallsAttr(S.Context, Attr)); |
||
4669 | return AttributeApplied; |
||
4670 | } |
||
4671 | |||
4672 | bool isParamExpr(size_t N) const override { |
||
4673 | return false; |
||
4674 | } |
||
4675 | |||
4676 | static const ParsedAttrInfoDisableTailCalls Instance; |
||
4677 | }; |
||
4678 | const ParsedAttrInfoDisableTailCalls ParsedAttrInfoDisableTailCalls::Instance; |
||
4679 | static constexpr ParsedAttrInfo::Spelling EmptyBasesSpellings[] = { |
||
4680 | {AttributeCommonInfo::AS_Declspec, "empty_bases"}, |
||
4681 | }; |
||
4682 | struct ParsedAttrInfoEmptyBases final : public ParsedAttrInfo { |
||
4683 | constexpr ParsedAttrInfoEmptyBases() : ParsedAttrInfo( |
||
4684 | /*AttrKind=*/ParsedAttr::AT_EmptyBases, |
||
4685 | /*NumArgs=*/0, |
||
4686 | /*OptArgs=*/0, |
||
4687 | /*NumArgMembers=*/0, |
||
4688 | /*HasCustomParsing=*/0, |
||
4689 | /*AcceptsExprPack=*/0, |
||
4690 | /*IsTargetSpecific=*/1, |
||
4691 | /*IsType=*/0, |
||
4692 | /*IsStmt=*/0, |
||
4693 | /*IsKnownToGCC=*/0, |
||
4694 | /*IsSupportedByPragmaAttribute=*/0, |
||
4695 | /*Spellings=*/EmptyBasesSpellings, |
||
4696 | /*ArgNames=*/{}) {} |
||
4697 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4698 | if (!isa<CXXRecordDecl>(D)) { |
||
4699 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4700 | << Attr << "classes"; |
||
4701 | return false; |
||
4702 | } |
||
4703 | return true; |
||
4704 | } |
||
4705 | |||
4706 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4707 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4708 | << AL << St->getBeginLoc(); |
||
4709 | return false; |
||
4710 | } |
||
4711 | |||
4712 | bool existsInTarget(const TargetInfo &Target) const override { |
||
4713 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
4714 | 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().isMicrosoft() ); |
||
4715 | } |
||
4716 | |||
4717 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
4718 | D->addAttr(::new (S.Context) EmptyBasesAttr(S.Context, Attr)); |
||
4719 | return AttributeApplied; |
||
4720 | } |
||
4721 | |||
4722 | bool isParamExpr(size_t N) const override { |
||
4723 | return false; |
||
4724 | } |
||
4725 | |||
4726 | static const ParsedAttrInfoEmptyBases Instance; |
||
4727 | }; |
||
4728 | const ParsedAttrInfoEmptyBases ParsedAttrInfoEmptyBases::Instance; |
||
4729 | static constexpr ParsedAttrInfo::Spelling EnableIfSpellings[] = { |
||
4730 | {AttributeCommonInfo::AS_GNU, "enable_if"}, |
||
4731 | }; |
||
4732 | static constexpr const char *EnableIfArgNames[] = { |
||
4733 | "Cond","Message",}; |
||
4734 | struct ParsedAttrInfoEnableIf final : public ParsedAttrInfo { |
||
4735 | constexpr ParsedAttrInfoEnableIf() : ParsedAttrInfo( |
||
4736 | /*AttrKind=*/ParsedAttr::AT_EnableIf, |
||
4737 | /*NumArgs=*/2, |
||
4738 | /*OptArgs=*/0, |
||
4739 | /*NumArgMembers=*/2, |
||
4740 | /*HasCustomParsing=*/0, |
||
4741 | /*AcceptsExprPack=*/0, |
||
4742 | /*IsTargetSpecific=*/0, |
||
4743 | /*IsType=*/0, |
||
4744 | /*IsStmt=*/0, |
||
4745 | /*IsKnownToGCC=*/0, |
||
4746 | /*IsSupportedByPragmaAttribute=*/1, |
||
4747 | /*Spellings=*/EnableIfSpellings, |
||
4748 | /*ArgNames=*/EnableIfArgNames) {} |
||
4749 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4750 | if (!isa<FunctionDecl>(D)) { |
||
4751 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4752 | << Attr << "functions"; |
||
4753 | return false; |
||
4754 | } |
||
4755 | return true; |
||
4756 | } |
||
4757 | |||
4758 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4759 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4760 | << AL << St->getBeginLoc(); |
||
4761 | return false; |
||
4762 | } |
||
4763 | |||
4764 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4765 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4766 | } |
||
4767 | |||
4768 | bool isParamExpr(size_t N) const override { |
||
4769 | return (N == 0) || false; |
||
4770 | } |
||
4771 | |||
4772 | static const ParsedAttrInfoEnableIf Instance; |
||
4773 | }; |
||
4774 | const ParsedAttrInfoEnableIf ParsedAttrInfoEnableIf::Instance; |
||
4775 | static constexpr ParsedAttrInfo::Spelling EnforceTCBSpellings[] = { |
||
4776 | {AttributeCommonInfo::AS_GNU, "enforce_tcb"}, |
||
4777 | {AttributeCommonInfo::AS_CXX11, "clang::enforce_tcb"}, |
||
4778 | {AttributeCommonInfo::AS_C2x, "clang::enforce_tcb"}, |
||
4779 | }; |
||
4780 | static constexpr const char *EnforceTCBArgNames[] = { |
||
4781 | "TCBName",}; |
||
4782 | struct ParsedAttrInfoEnforceTCB final : public ParsedAttrInfo { |
||
4783 | constexpr ParsedAttrInfoEnforceTCB() : ParsedAttrInfo( |
||
4784 | /*AttrKind=*/ParsedAttr::AT_EnforceTCB, |
||
4785 | /*NumArgs=*/1, |
||
4786 | /*OptArgs=*/0, |
||
4787 | /*NumArgMembers=*/1, |
||
4788 | /*HasCustomParsing=*/0, |
||
4789 | /*AcceptsExprPack=*/0, |
||
4790 | /*IsTargetSpecific=*/0, |
||
4791 | /*IsType=*/0, |
||
4792 | /*IsStmt=*/0, |
||
4793 | /*IsKnownToGCC=*/0, |
||
4794 | /*IsSupportedByPragmaAttribute=*/1, |
||
4795 | /*Spellings=*/EnforceTCBSpellings, |
||
4796 | /*ArgNames=*/EnforceTCBArgNames) {} |
||
4797 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4798 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
4799 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4800 | << Attr << "functions and Objective-C methods"; |
||
4801 | return false; |
||
4802 | } |
||
4803 | return true; |
||
4804 | } |
||
4805 | |||
4806 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4807 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4808 | << AL << St->getBeginLoc(); |
||
4809 | return false; |
||
4810 | } |
||
4811 | |||
4812 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4813 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4814 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
4815 | } |
||
4816 | |||
4817 | bool isParamExpr(size_t N) const override { |
||
4818 | return false; |
||
4819 | } |
||
4820 | |||
4821 | static const ParsedAttrInfoEnforceTCB Instance; |
||
4822 | }; |
||
4823 | const ParsedAttrInfoEnforceTCB ParsedAttrInfoEnforceTCB::Instance; |
||
4824 | static constexpr ParsedAttrInfo::Spelling EnforceTCBLeafSpellings[] = { |
||
4825 | {AttributeCommonInfo::AS_GNU, "enforce_tcb_leaf"}, |
||
4826 | {AttributeCommonInfo::AS_CXX11, "clang::enforce_tcb_leaf"}, |
||
4827 | {AttributeCommonInfo::AS_C2x, "clang::enforce_tcb_leaf"}, |
||
4828 | }; |
||
4829 | static constexpr const char *EnforceTCBLeafArgNames[] = { |
||
4830 | "TCBName",}; |
||
4831 | struct ParsedAttrInfoEnforceTCBLeaf final : public ParsedAttrInfo { |
||
4832 | constexpr ParsedAttrInfoEnforceTCBLeaf() : ParsedAttrInfo( |
||
4833 | /*AttrKind=*/ParsedAttr::AT_EnforceTCBLeaf, |
||
4834 | /*NumArgs=*/1, |
||
4835 | /*OptArgs=*/0, |
||
4836 | /*NumArgMembers=*/1, |
||
4837 | /*HasCustomParsing=*/0, |
||
4838 | /*AcceptsExprPack=*/0, |
||
4839 | /*IsTargetSpecific=*/0, |
||
4840 | /*IsType=*/0, |
||
4841 | /*IsStmt=*/0, |
||
4842 | /*IsKnownToGCC=*/0, |
||
4843 | /*IsSupportedByPragmaAttribute=*/1, |
||
4844 | /*Spellings=*/EnforceTCBLeafSpellings, |
||
4845 | /*ArgNames=*/EnforceTCBLeafArgNames) {} |
||
4846 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4847 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
4848 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4849 | << Attr << "functions and Objective-C methods"; |
||
4850 | return false; |
||
4851 | } |
||
4852 | return true; |
||
4853 | } |
||
4854 | |||
4855 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4856 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4857 | << AL << St->getBeginLoc(); |
||
4858 | return false; |
||
4859 | } |
||
4860 | |||
4861 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4862 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4863 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
4864 | } |
||
4865 | |||
4866 | bool isParamExpr(size_t N) const override { |
||
4867 | return false; |
||
4868 | } |
||
4869 | |||
4870 | static const ParsedAttrInfoEnforceTCBLeaf Instance; |
||
4871 | }; |
||
4872 | const ParsedAttrInfoEnforceTCBLeaf ParsedAttrInfoEnforceTCBLeaf::Instance; |
||
4873 | static constexpr ParsedAttrInfo::Spelling EnumExtensibilitySpellings[] = { |
||
4874 | {AttributeCommonInfo::AS_GNU, "enum_extensibility"}, |
||
4875 | {AttributeCommonInfo::AS_CXX11, "clang::enum_extensibility"}, |
||
4876 | {AttributeCommonInfo::AS_C2x, "clang::enum_extensibility"}, |
||
4877 | }; |
||
4878 | static constexpr const char *EnumExtensibilityArgNames[] = { |
||
4879 | "Extensibility",}; |
||
4880 | struct ParsedAttrInfoEnumExtensibility final : public ParsedAttrInfo { |
||
4881 | constexpr ParsedAttrInfoEnumExtensibility() : ParsedAttrInfo( |
||
4882 | /*AttrKind=*/ParsedAttr::AT_EnumExtensibility, |
||
4883 | /*NumArgs=*/1, |
||
4884 | /*OptArgs=*/0, |
||
4885 | /*NumArgMembers=*/1, |
||
4886 | /*HasCustomParsing=*/0, |
||
4887 | /*AcceptsExprPack=*/0, |
||
4888 | /*IsTargetSpecific=*/0, |
||
4889 | /*IsType=*/0, |
||
4890 | /*IsStmt=*/0, |
||
4891 | /*IsKnownToGCC=*/0, |
||
4892 | /*IsSupportedByPragmaAttribute=*/1, |
||
4893 | /*Spellings=*/EnumExtensibilitySpellings, |
||
4894 | /*ArgNames=*/EnumExtensibilityArgNames) {} |
||
4895 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4896 | if (!isa<EnumDecl>(D)) { |
||
4897 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
4898 | << Attr << "enums"; |
||
4899 | return false; |
||
4900 | } |
||
4901 | return true; |
||
4902 | } |
||
4903 | |||
4904 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4905 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4906 | << AL << St->getBeginLoc(); |
||
4907 | return false; |
||
4908 | } |
||
4909 | |||
4910 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4911 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true)); |
||
4912 | } |
||
4913 | |||
4914 | bool isParamExpr(size_t N) const override { |
||
4915 | return false; |
||
4916 | } |
||
4917 | |||
4918 | static const ParsedAttrInfoEnumExtensibility Instance; |
||
4919 | }; |
||
4920 | const ParsedAttrInfoEnumExtensibility ParsedAttrInfoEnumExtensibility::Instance; |
||
4921 | static constexpr ParsedAttrInfo::Spelling ErrorSpellings[] = { |
||
4922 | {AttributeCommonInfo::AS_GNU, "error"}, |
||
4923 | {AttributeCommonInfo::AS_CXX11, "gnu::error"}, |
||
4924 | {AttributeCommonInfo::AS_C2x, "gnu::error"}, |
||
4925 | {AttributeCommonInfo::AS_GNU, "warning"}, |
||
4926 | {AttributeCommonInfo::AS_CXX11, "gnu::warning"}, |
||
4927 | {AttributeCommonInfo::AS_C2x, "gnu::warning"}, |
||
4928 | }; |
||
4929 | static constexpr const char *ErrorArgNames[] = { |
||
4930 | "UserDiagnostic",}; |
||
4931 | struct ParsedAttrInfoError final : public ParsedAttrInfo { |
||
4932 | constexpr ParsedAttrInfoError() : ParsedAttrInfo( |
||
4933 | /*AttrKind=*/ParsedAttr::AT_Error, |
||
4934 | /*NumArgs=*/1, |
||
4935 | /*OptArgs=*/0, |
||
4936 | /*NumArgMembers=*/1, |
||
4937 | /*HasCustomParsing=*/0, |
||
4938 | /*AcceptsExprPack=*/0, |
||
4939 | /*IsTargetSpecific=*/0, |
||
4940 | /*IsType=*/0, |
||
4941 | /*IsStmt=*/0, |
||
4942 | /*IsKnownToGCC=*/1, |
||
4943 | /*IsSupportedByPragmaAttribute=*/1, |
||
4944 | /*Spellings=*/ErrorSpellings, |
||
4945 | /*ArgNames=*/ErrorArgNames) {} |
||
4946 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
4947 | if (!isa<FunctionDecl>(D)) { |
||
4948 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
4949 | << Attr << "functions"; |
||
4950 | return false; |
||
4951 | } |
||
4952 | return true; |
||
4953 | } |
||
4954 | |||
4955 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
4956 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
4957 | << AL << St->getBeginLoc(); |
||
4958 | return false; |
||
4959 | } |
||
4960 | |||
4961 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
4962 | enum Spelling { |
||
4963 | GNU_error = 0, |
||
4964 | CXX11_gnu_error = 1, |
||
4965 | C2x_gnu_error = 2, |
||
4966 | GNU_warning = 3, |
||
4967 | CXX11_gnu_warning = 4, |
||
4968 | C2x_gnu_warning = 5, |
||
4969 | SpellingNotCalculated = 15 |
||
4970 | |||
4971 | }; |
||
4972 | |||
4973 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
4974 | switch (Idx) { |
||
4975 | default: llvm_unreachable("Unknown spelling list index"); |
||
4976 | case 0: return GNU_error; |
||
4977 | case 1: return CXX11_gnu_error; |
||
4978 | case 2: return C2x_gnu_error; |
||
4979 | case 3: return GNU_warning; |
||
4980 | case 4: return CXX11_gnu_warning; |
||
4981 | case 5: return C2x_gnu_warning; |
||
4982 | } |
||
4983 | } |
||
4984 | |||
4985 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
4986 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
4987 | } |
||
4988 | |||
4989 | bool isParamExpr(size_t N) const override { |
||
4990 | return false; |
||
4991 | } |
||
4992 | |||
4993 | static const ParsedAttrInfoError Instance; |
||
4994 | }; |
||
4995 | const ParsedAttrInfoError ParsedAttrInfoError::Instance; |
||
4996 | static constexpr ParsedAttrInfo::Spelling ExcludeFromExplicitInstantiationSpellings[] = { |
||
4997 | {AttributeCommonInfo::AS_GNU, "exclude_from_explicit_instantiation"}, |
||
4998 | {AttributeCommonInfo::AS_CXX11, "clang::exclude_from_explicit_instantiation"}, |
||
4999 | {AttributeCommonInfo::AS_C2x, "clang::exclude_from_explicit_instantiation"}, |
||
5000 | }; |
||
5001 | struct ParsedAttrInfoExcludeFromExplicitInstantiation final : public ParsedAttrInfo { |
||
5002 | constexpr ParsedAttrInfoExcludeFromExplicitInstantiation() : ParsedAttrInfo( |
||
5003 | /*AttrKind=*/ParsedAttr::AT_ExcludeFromExplicitInstantiation, |
||
5004 | /*NumArgs=*/0, |
||
5005 | /*OptArgs=*/0, |
||
5006 | /*NumArgMembers=*/0, |
||
5007 | /*HasCustomParsing=*/0, |
||
5008 | /*AcceptsExprPack=*/0, |
||
5009 | /*IsTargetSpecific=*/0, |
||
5010 | /*IsType=*/0, |
||
5011 | /*IsStmt=*/0, |
||
5012 | /*IsKnownToGCC=*/0, |
||
5013 | /*IsSupportedByPragmaAttribute=*/1, |
||
5014 | /*Spellings=*/ExcludeFromExplicitInstantiationSpellings, |
||
5015 | /*ArgNames=*/{}) {} |
||
5016 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5017 | if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) { |
||
5018 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5019 | << Attr << "variables, functions, and classes"; |
||
5020 | return false; |
||
5021 | } |
||
5022 | return true; |
||
5023 | } |
||
5024 | |||
5025 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5026 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5027 | << AL << St->getBeginLoc(); |
||
5028 | return false; |
||
5029 | } |
||
5030 | |||
5031 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5032 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
5033 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
5034 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
5035 | } |
||
5036 | |||
5037 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
5038 | D->addAttr(::new (S.Context) ExcludeFromExplicitInstantiationAttr(S.Context, Attr)); |
||
5039 | return AttributeApplied; |
||
5040 | } |
||
5041 | |||
5042 | bool isParamExpr(size_t N) const override { |
||
5043 | return false; |
||
5044 | } |
||
5045 | |||
5046 | static const ParsedAttrInfoExcludeFromExplicitInstantiation Instance; |
||
5047 | }; |
||
5048 | const ParsedAttrInfoExcludeFromExplicitInstantiation ParsedAttrInfoExcludeFromExplicitInstantiation::Instance; |
||
5049 | static constexpr ParsedAttrInfo::Spelling ExclusiveTrylockFunctionSpellings[] = { |
||
5050 | {AttributeCommonInfo::AS_GNU, "exclusive_trylock_function"}, |
||
5051 | }; |
||
5052 | static constexpr const char *ExclusiveTrylockFunctionArgNames[] = { |
||
5053 | "SuccessValue","Args...",}; |
||
5054 | struct ParsedAttrInfoExclusiveTrylockFunction final : public ParsedAttrInfo { |
||
5055 | constexpr ParsedAttrInfoExclusiveTrylockFunction() : ParsedAttrInfo( |
||
5056 | /*AttrKind=*/ParsedAttr::AT_ExclusiveTrylockFunction, |
||
5057 | /*NumArgs=*/1, |
||
5058 | /*OptArgs=*/15, |
||
5059 | /*NumArgMembers=*/2, |
||
5060 | /*HasCustomParsing=*/0, |
||
5061 | /*AcceptsExprPack=*/0, |
||
5062 | /*IsTargetSpecific=*/0, |
||
5063 | /*IsType=*/0, |
||
5064 | /*IsStmt=*/0, |
||
5065 | /*IsKnownToGCC=*/0, |
||
5066 | /*IsSupportedByPragmaAttribute=*/0, |
||
5067 | /*Spellings=*/ExclusiveTrylockFunctionSpellings, |
||
5068 | /*ArgNames=*/ExclusiveTrylockFunctionArgNames) {} |
||
5069 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5070 | if (!isa<FunctionDecl>(D)) { |
||
5071 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5072 | << Attr << "functions"; |
||
5073 | return false; |
||
5074 | } |
||
5075 | return true; |
||
5076 | } |
||
5077 | |||
5078 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5079 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5080 | << AL << St->getBeginLoc(); |
||
5081 | return false; |
||
5082 | } |
||
5083 | |||
5084 | bool isParamExpr(size_t N) const override { |
||
5085 | return (N == 0) || (N == 1) || false; |
||
5086 | } |
||
5087 | |||
5088 | static const ParsedAttrInfoExclusiveTrylockFunction Instance; |
||
5089 | }; |
||
5090 | const ParsedAttrInfoExclusiveTrylockFunction ParsedAttrInfoExclusiveTrylockFunction::Instance; |
||
5091 | static constexpr ParsedAttrInfo::Spelling ExtVectorTypeSpellings[] = { |
||
5092 | {AttributeCommonInfo::AS_GNU, "ext_vector_type"}, |
||
5093 | }; |
||
5094 | static constexpr const char *ExtVectorTypeArgNames[] = { |
||
5095 | "NumElements",}; |
||
5096 | struct ParsedAttrInfoExtVectorType final : public ParsedAttrInfo { |
||
5097 | constexpr ParsedAttrInfoExtVectorType() : ParsedAttrInfo( |
||
5098 | /*AttrKind=*/ParsedAttr::AT_ExtVectorType, |
||
5099 | /*NumArgs=*/1, |
||
5100 | /*OptArgs=*/0, |
||
5101 | /*NumArgMembers=*/1, |
||
5102 | /*HasCustomParsing=*/0, |
||
5103 | /*AcceptsExprPack=*/0, |
||
5104 | /*IsTargetSpecific=*/0, |
||
5105 | /*IsType=*/0, |
||
5106 | /*IsStmt=*/0, |
||
5107 | /*IsKnownToGCC=*/0, |
||
5108 | /*IsSupportedByPragmaAttribute=*/0, |
||
5109 | /*Spellings=*/ExtVectorTypeSpellings, |
||
5110 | /*ArgNames=*/ExtVectorTypeArgNames) {} |
||
5111 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5112 | if (!isa<TypedefNameDecl>(D)) { |
||
5113 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
5114 | << Attr << "typedefs"; |
||
5115 | return false; |
||
5116 | } |
||
5117 | return true; |
||
5118 | } |
||
5119 | |||
5120 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5121 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5122 | << AL << St->getBeginLoc(); |
||
5123 | return false; |
||
5124 | } |
||
5125 | |||
5126 | bool isParamExpr(size_t N) const override { |
||
5127 | return (N == 0) || false; |
||
5128 | } |
||
5129 | |||
5130 | static const ParsedAttrInfoExtVectorType Instance; |
||
5131 | }; |
||
5132 | const ParsedAttrInfoExtVectorType ParsedAttrInfoExtVectorType::Instance; |
||
5133 | static constexpr ParsedAttrInfo::Spelling ExternalSourceSymbolSpellings[] = { |
||
5134 | {AttributeCommonInfo::AS_GNU, "external_source_symbol"}, |
||
5135 | {AttributeCommonInfo::AS_CXX11, "clang::external_source_symbol"}, |
||
5136 | {AttributeCommonInfo::AS_C2x, "clang::external_source_symbol"}, |
||
5137 | }; |
||
5138 | static constexpr const char *ExternalSourceSymbolArgNames[] = { |
||
5139 | "language","definedIn","generatedDeclaration",}; |
||
5140 | struct ParsedAttrInfoExternalSourceSymbol final : public ParsedAttrInfo { |
||
5141 | constexpr ParsedAttrInfoExternalSourceSymbol() : ParsedAttrInfo( |
||
5142 | /*AttrKind=*/ParsedAttr::AT_ExternalSourceSymbol, |
||
5143 | /*NumArgs=*/0, |
||
5144 | /*OptArgs=*/3, |
||
5145 | /*NumArgMembers=*/3, |
||
5146 | /*HasCustomParsing=*/1, |
||
5147 | /*AcceptsExprPack=*/0, |
||
5148 | /*IsTargetSpecific=*/0, |
||
5149 | /*IsType=*/0, |
||
5150 | /*IsStmt=*/0, |
||
5151 | /*IsKnownToGCC=*/0, |
||
5152 | /*IsSupportedByPragmaAttribute=*/1, |
||
5153 | /*Spellings=*/ExternalSourceSymbolSpellings, |
||
5154 | /*ArgNames=*/ExternalSourceSymbolArgNames) {} |
||
5155 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5156 | if (!isa<NamedDecl>(D)) { |
||
5157 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5158 | << Attr << "named declarations"; |
||
5159 | return false; |
||
5160 | } |
||
5161 | return true; |
||
5162 | } |
||
5163 | |||
5164 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5165 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5166 | << AL << St->getBeginLoc(); |
||
5167 | return false; |
||
5168 | } |
||
5169 | |||
5170 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5171 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
5172 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true)); |
||
5173 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum_constant, /*IsSupported=*/true)); |
||
5174 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true)); |
||
5175 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
5176 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus)); |
||
5177 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC)); |
||
5178 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC)); |
||
5179 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
5180 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
5181 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC)); |
||
5182 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC)); |
||
5183 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
5184 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
5185 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
5186 | } |
||
5187 | |||
5188 | bool isParamExpr(size_t N) const override { |
||
5189 | return false; |
||
5190 | } |
||
5191 | |||
5192 | static const ParsedAttrInfoExternalSourceSymbol Instance; |
||
5193 | }; |
||
5194 | const ParsedAttrInfoExternalSourceSymbol ParsedAttrInfoExternalSourceSymbol::Instance; |
||
5195 | static constexpr ParsedAttrInfo::Spelling FallThroughSpellings[] = { |
||
5196 | {AttributeCommonInfo::AS_CXX11, "fallthrough"}, |
||
5197 | {AttributeCommonInfo::AS_C2x, "fallthrough"}, |
||
5198 | {AttributeCommonInfo::AS_CXX11, "clang::fallthrough"}, |
||
5199 | {AttributeCommonInfo::AS_GNU, "fallthrough"}, |
||
5200 | {AttributeCommonInfo::AS_CXX11, "gnu::fallthrough"}, |
||
5201 | {AttributeCommonInfo::AS_C2x, "gnu::fallthrough"}, |
||
5202 | }; |
||
5203 | struct ParsedAttrInfoFallThrough final : public ParsedAttrInfo { |
||
5204 | constexpr ParsedAttrInfoFallThrough() : ParsedAttrInfo( |
||
5205 | /*AttrKind=*/ParsedAttr::AT_FallThrough, |
||
5206 | /*NumArgs=*/0, |
||
5207 | /*OptArgs=*/0, |
||
5208 | /*NumArgMembers=*/0, |
||
5209 | /*HasCustomParsing=*/0, |
||
5210 | /*AcceptsExprPack=*/0, |
||
5211 | /*IsTargetSpecific=*/0, |
||
5212 | /*IsType=*/0, |
||
5213 | /*IsStmt=*/1, |
||
5214 | /*IsKnownToGCC=*/1, |
||
5215 | /*IsSupportedByPragmaAttribute=*/0, |
||
5216 | /*Spellings=*/FallThroughSpellings, |
||
5217 | /*ArgNames=*/{}) {} |
||
5218 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
5219 | S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl) |
||
5220 | << AL << D->getLocation(); |
||
5221 | return false; |
||
5222 | } |
||
5223 | |||
5224 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override { |
||
5225 | if (!isa<NullStmt>(St) && !isa<SwitchCase>(St)) { |
||
5226 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
5227 | << Attr << "empty statements"; |
||
5228 | return false; |
||
5229 | } |
||
5230 | return true; |
||
5231 | } |
||
5232 | |||
5233 | bool isParamExpr(size_t N) const override { |
||
5234 | return false; |
||
5235 | } |
||
5236 | |||
5237 | static const ParsedAttrInfoFallThrough Instance; |
||
5238 | }; |
||
5239 | const ParsedAttrInfoFallThrough ParsedAttrInfoFallThrough::Instance; |
||
5240 | static constexpr ParsedAttrInfo::Spelling FastCallSpellings[] = { |
||
5241 | {AttributeCommonInfo::AS_GNU, "fastcall"}, |
||
5242 | {AttributeCommonInfo::AS_CXX11, "gnu::fastcall"}, |
||
5243 | {AttributeCommonInfo::AS_C2x, "gnu::fastcall"}, |
||
5244 | {AttributeCommonInfo::AS_Keyword, "__fastcall"}, |
||
5245 | {AttributeCommonInfo::AS_Keyword, "_fastcall"}, |
||
5246 | }; |
||
5247 | struct ParsedAttrInfoFastCall final : public ParsedAttrInfo { |
||
5248 | constexpr ParsedAttrInfoFastCall() : ParsedAttrInfo( |
||
5249 | /*AttrKind=*/ParsedAttr::AT_FastCall, |
||
5250 | /*NumArgs=*/0, |
||
5251 | /*OptArgs=*/0, |
||
5252 | /*NumArgMembers=*/0, |
||
5253 | /*HasCustomParsing=*/0, |
||
5254 | /*AcceptsExprPack=*/0, |
||
5255 | /*IsTargetSpecific=*/0, |
||
5256 | /*IsType=*/1, |
||
5257 | /*IsStmt=*/0, |
||
5258 | /*IsKnownToGCC=*/1, |
||
5259 | /*IsSupportedByPragmaAttribute=*/0, |
||
5260 | /*Spellings=*/FastCallSpellings, |
||
5261 | /*ArgNames=*/{}) {} |
||
5262 | bool isParamExpr(size_t N) const override { |
||
5263 | return false; |
||
5264 | } |
||
5265 | |||
5266 | static const ParsedAttrInfoFastCall Instance; |
||
5267 | }; |
||
5268 | const ParsedAttrInfoFastCall ParsedAttrInfoFastCall::Instance; |
||
5269 | static constexpr ParsedAttrInfo::Spelling FlagEnumSpellings[] = { |
||
5270 | {AttributeCommonInfo::AS_GNU, "flag_enum"}, |
||
5271 | {AttributeCommonInfo::AS_CXX11, "clang::flag_enum"}, |
||
5272 | {AttributeCommonInfo::AS_C2x, "clang::flag_enum"}, |
||
5273 | }; |
||
5274 | struct ParsedAttrInfoFlagEnum final : public ParsedAttrInfo { |
||
5275 | constexpr ParsedAttrInfoFlagEnum() : ParsedAttrInfo( |
||
5276 | /*AttrKind=*/ParsedAttr::AT_FlagEnum, |
||
5277 | /*NumArgs=*/0, |
||
5278 | /*OptArgs=*/0, |
||
5279 | /*NumArgMembers=*/0, |
||
5280 | /*HasCustomParsing=*/0, |
||
5281 | /*AcceptsExprPack=*/0, |
||
5282 | /*IsTargetSpecific=*/0, |
||
5283 | /*IsType=*/0, |
||
5284 | /*IsStmt=*/0, |
||
5285 | /*IsKnownToGCC=*/0, |
||
5286 | /*IsSupportedByPragmaAttribute=*/1, |
||
5287 | /*Spellings=*/FlagEnumSpellings, |
||
5288 | /*ArgNames=*/{}) {} |
||
5289 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5290 | if (!isa<EnumDecl>(D)) { |
||
5291 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5292 | << Attr << "enums"; |
||
5293 | return false; |
||
5294 | } |
||
5295 | return true; |
||
5296 | } |
||
5297 | |||
5298 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5299 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5300 | << AL << St->getBeginLoc(); |
||
5301 | return false; |
||
5302 | } |
||
5303 | |||
5304 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5305 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true)); |
||
5306 | } |
||
5307 | |||
5308 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
5309 | D->addAttr(::new (S.Context) FlagEnumAttr(S.Context, Attr)); |
||
5310 | return AttributeApplied; |
||
5311 | } |
||
5312 | |||
5313 | bool isParamExpr(size_t N) const override { |
||
5314 | return false; |
||
5315 | } |
||
5316 | |||
5317 | static const ParsedAttrInfoFlagEnum Instance; |
||
5318 | }; |
||
5319 | const ParsedAttrInfoFlagEnum ParsedAttrInfoFlagEnum::Instance; |
||
5320 | static constexpr ParsedAttrInfo::Spelling FlattenSpellings[] = { |
||
5321 | {AttributeCommonInfo::AS_GNU, "flatten"}, |
||
5322 | {AttributeCommonInfo::AS_CXX11, "gnu::flatten"}, |
||
5323 | {AttributeCommonInfo::AS_C2x, "gnu::flatten"}, |
||
5324 | }; |
||
5325 | struct ParsedAttrInfoFlatten final : public ParsedAttrInfo { |
||
5326 | constexpr ParsedAttrInfoFlatten() : ParsedAttrInfo( |
||
5327 | /*AttrKind=*/ParsedAttr::AT_Flatten, |
||
5328 | /*NumArgs=*/0, |
||
5329 | /*OptArgs=*/0, |
||
5330 | /*NumArgMembers=*/0, |
||
5331 | /*HasCustomParsing=*/0, |
||
5332 | /*AcceptsExprPack=*/0, |
||
5333 | /*IsTargetSpecific=*/0, |
||
5334 | /*IsType=*/0, |
||
5335 | /*IsStmt=*/0, |
||
5336 | /*IsKnownToGCC=*/1, |
||
5337 | /*IsSupportedByPragmaAttribute=*/1, |
||
5338 | /*Spellings=*/FlattenSpellings, |
||
5339 | /*ArgNames=*/{}) {} |
||
5340 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5341 | if (!isa<FunctionDecl>(D)) { |
||
5342 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
5343 | << Attr << "functions"; |
||
5344 | return false; |
||
5345 | } |
||
5346 | return true; |
||
5347 | } |
||
5348 | |||
5349 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5350 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5351 | << AL << St->getBeginLoc(); |
||
5352 | return false; |
||
5353 | } |
||
5354 | |||
5355 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5356 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
5357 | } |
||
5358 | |||
5359 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
5360 | D->addAttr(::new (S.Context) FlattenAttr(S.Context, Attr)); |
||
5361 | return AttributeApplied; |
||
5362 | } |
||
5363 | |||
5364 | bool isParamExpr(size_t N) const override { |
||
5365 | return false; |
||
5366 | } |
||
5367 | |||
5368 | static const ParsedAttrInfoFlatten Instance; |
||
5369 | }; |
||
5370 | const ParsedAttrInfoFlatten ParsedAttrInfoFlatten::Instance; |
||
5371 | static constexpr ParsedAttrInfo::Spelling FormatSpellings[] = { |
||
5372 | {AttributeCommonInfo::AS_GNU, "format"}, |
||
5373 | {AttributeCommonInfo::AS_CXX11, "gnu::format"}, |
||
5374 | {AttributeCommonInfo::AS_C2x, "gnu::format"}, |
||
5375 | }; |
||
5376 | static constexpr const char *FormatArgNames[] = { |
||
5377 | "Type","FormatIdx","FirstArg",}; |
||
5378 | struct ParsedAttrInfoFormat final : public ParsedAttrInfo { |
||
5379 | constexpr ParsedAttrInfoFormat() : ParsedAttrInfo( |
||
5380 | /*AttrKind=*/ParsedAttr::AT_Format, |
||
5381 | /*NumArgs=*/3, |
||
5382 | /*OptArgs=*/0, |
||
5383 | /*NumArgMembers=*/3, |
||
5384 | /*HasCustomParsing=*/0, |
||
5385 | /*AcceptsExprPack=*/0, |
||
5386 | /*IsTargetSpecific=*/0, |
||
5387 | /*IsType=*/0, |
||
5388 | /*IsStmt=*/0, |
||
5389 | /*IsKnownToGCC=*/1, |
||
5390 | /*IsSupportedByPragmaAttribute=*/0, |
||
5391 | /*Spellings=*/FormatSpellings, |
||
5392 | /*ArgNames=*/FormatArgNames) {} |
||
5393 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5394 | if (!isa<ObjCMethodDecl>(D) && !isa<BlockDecl>(D) && !isHasFunctionProto(D)) { |
||
5395 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5396 | << Attr << "Objective-C methods, blocks, and non-K&R-style functions"; |
||
5397 | return false; |
||
5398 | } |
||
5399 | return true; |
||
5400 | } |
||
5401 | |||
5402 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5403 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5404 | << AL << St->getBeginLoc(); |
||
5405 | return false; |
||
5406 | } |
||
5407 | |||
5408 | bool isParamExpr(size_t N) const override { |
||
5409 | return false; |
||
5410 | } |
||
5411 | |||
5412 | static const ParsedAttrInfoFormat Instance; |
||
5413 | }; |
||
5414 | const ParsedAttrInfoFormat ParsedAttrInfoFormat::Instance; |
||
5415 | static constexpr ParsedAttrInfo::Spelling FormatArgSpellings[] = { |
||
5416 | {AttributeCommonInfo::AS_GNU, "format_arg"}, |
||
5417 | {AttributeCommonInfo::AS_CXX11, "gnu::format_arg"}, |
||
5418 | {AttributeCommonInfo::AS_C2x, "gnu::format_arg"}, |
||
5419 | }; |
||
5420 | static constexpr const char *FormatArgArgNames[] = { |
||
5421 | "FormatIdx",}; |
||
5422 | struct ParsedAttrInfoFormatArg final : public ParsedAttrInfo { |
||
5423 | constexpr ParsedAttrInfoFormatArg() : ParsedAttrInfo( |
||
5424 | /*AttrKind=*/ParsedAttr::AT_FormatArg, |
||
5425 | /*NumArgs=*/1, |
||
5426 | /*OptArgs=*/0, |
||
5427 | /*NumArgMembers=*/1, |
||
5428 | /*HasCustomParsing=*/0, |
||
5429 | /*AcceptsExprPack=*/0, |
||
5430 | /*IsTargetSpecific=*/0, |
||
5431 | /*IsType=*/0, |
||
5432 | /*IsStmt=*/0, |
||
5433 | /*IsKnownToGCC=*/1, |
||
5434 | /*IsSupportedByPragmaAttribute=*/0, |
||
5435 | /*Spellings=*/FormatArgSpellings, |
||
5436 | /*ArgNames=*/FormatArgArgNames) {} |
||
5437 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5438 | if (!isa<ObjCMethodDecl>(D) && !isHasFunctionProto(D)) { |
||
5439 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5440 | << Attr << "Objective-C methods and non-K&R-style functions"; |
||
5441 | return false; |
||
5442 | } |
||
5443 | return true; |
||
5444 | } |
||
5445 | |||
5446 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5447 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5448 | << AL << St->getBeginLoc(); |
||
5449 | return false; |
||
5450 | } |
||
5451 | |||
5452 | bool isParamExpr(size_t N) const override { |
||
5453 | return false; |
||
5454 | } |
||
5455 | |||
5456 | static const ParsedAttrInfoFormatArg Instance; |
||
5457 | }; |
||
5458 | const ParsedAttrInfoFormatArg ParsedAttrInfoFormatArg::Instance; |
||
5459 | static constexpr ParsedAttrInfo::Spelling FunctionReturnThunksSpellings[] = { |
||
5460 | {AttributeCommonInfo::AS_GNU, "function_return"}, |
||
5461 | {AttributeCommonInfo::AS_CXX11, "gnu::function_return"}, |
||
5462 | {AttributeCommonInfo::AS_C2x, "gnu::function_return"}, |
||
5463 | }; |
||
5464 | static constexpr const char *FunctionReturnThunksArgNames[] = { |
||
5465 | "ThunkType",}; |
||
5466 | struct ParsedAttrInfoFunctionReturnThunks final : public ParsedAttrInfo { |
||
5467 | constexpr ParsedAttrInfoFunctionReturnThunks() : ParsedAttrInfo( |
||
5468 | /*AttrKind=*/ParsedAttr::AT_FunctionReturnThunks, |
||
5469 | /*NumArgs=*/1, |
||
5470 | /*OptArgs=*/0, |
||
5471 | /*NumArgMembers=*/1, |
||
5472 | /*HasCustomParsing=*/0, |
||
5473 | /*AcceptsExprPack=*/0, |
||
5474 | /*IsTargetSpecific=*/1, |
||
5475 | /*IsType=*/0, |
||
5476 | /*IsStmt=*/0, |
||
5477 | /*IsKnownToGCC=*/1, |
||
5478 | /*IsSupportedByPragmaAttribute=*/1, |
||
5479 | /*Spellings=*/FunctionReturnThunksSpellings, |
||
5480 | /*ArgNames=*/FunctionReturnThunksArgNames) {} |
||
5481 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5482 | if (!isa<FunctionDecl>(D)) { |
||
5483 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5484 | << Attr << "functions"; |
||
5485 | return false; |
||
5486 | } |
||
5487 | return true; |
||
5488 | } |
||
5489 | |||
5490 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5491 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5492 | << AL << St->getBeginLoc(); |
||
5493 | return false; |
||
5494 | } |
||
5495 | |||
5496 | bool existsInTarget(const TargetInfo &Target) const override { |
||
5497 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
5498 | return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64); |
||
5499 | } |
||
5500 | |||
5501 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5502 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
5503 | } |
||
5504 | |||
5505 | bool isParamExpr(size_t N) const override { |
||
5506 | return false; |
||
5507 | } |
||
5508 | |||
5509 | static const ParsedAttrInfoFunctionReturnThunks Instance; |
||
5510 | }; |
||
5511 | const ParsedAttrInfoFunctionReturnThunks ParsedAttrInfoFunctionReturnThunks::Instance; |
||
5512 | static constexpr ParsedAttrInfo::Spelling GNUInlineSpellings[] = { |
||
5513 | {AttributeCommonInfo::AS_GNU, "gnu_inline"}, |
||
5514 | {AttributeCommonInfo::AS_CXX11, "gnu::gnu_inline"}, |
||
5515 | {AttributeCommonInfo::AS_C2x, "gnu::gnu_inline"}, |
||
5516 | }; |
||
5517 | struct ParsedAttrInfoGNUInline final : public ParsedAttrInfo { |
||
5518 | constexpr ParsedAttrInfoGNUInline() : ParsedAttrInfo( |
||
5519 | /*AttrKind=*/ParsedAttr::AT_GNUInline, |
||
5520 | /*NumArgs=*/0, |
||
5521 | /*OptArgs=*/0, |
||
5522 | /*NumArgMembers=*/0, |
||
5523 | /*HasCustomParsing=*/0, |
||
5524 | /*AcceptsExprPack=*/0, |
||
5525 | /*IsTargetSpecific=*/0, |
||
5526 | /*IsType=*/0, |
||
5527 | /*IsStmt=*/0, |
||
5528 | /*IsKnownToGCC=*/1, |
||
5529 | /*IsSupportedByPragmaAttribute=*/1, |
||
5530 | /*Spellings=*/GNUInlineSpellings, |
||
5531 | /*ArgNames=*/{}) {} |
||
5532 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5533 | if (!isa<FunctionDecl>(D)) { |
||
5534 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5535 | << Attr << "functions"; |
||
5536 | return false; |
||
5537 | } |
||
5538 | return true; |
||
5539 | } |
||
5540 | |||
5541 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5542 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5543 | << AL << St->getBeginLoc(); |
||
5544 | return false; |
||
5545 | } |
||
5546 | |||
5547 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5548 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
5549 | } |
||
5550 | |||
5551 | bool isParamExpr(size_t N) const override { |
||
5552 | return false; |
||
5553 | } |
||
5554 | |||
5555 | static const ParsedAttrInfoGNUInline Instance; |
||
5556 | }; |
||
5557 | const ParsedAttrInfoGNUInline ParsedAttrInfoGNUInline::Instance; |
||
5558 | static constexpr ParsedAttrInfo::Spelling GuardedBySpellings[] = { |
||
5559 | {AttributeCommonInfo::AS_GNU, "guarded_by"}, |
||
5560 | }; |
||
5561 | static constexpr const char *GuardedByArgNames[] = { |
||
5562 | "Arg",}; |
||
5563 | struct ParsedAttrInfoGuardedBy final : public ParsedAttrInfo { |
||
5564 | constexpr ParsedAttrInfoGuardedBy() : ParsedAttrInfo( |
||
5565 | /*AttrKind=*/ParsedAttr::AT_GuardedBy, |
||
5566 | /*NumArgs=*/1, |
||
5567 | /*OptArgs=*/0, |
||
5568 | /*NumArgMembers=*/1, |
||
5569 | /*HasCustomParsing=*/0, |
||
5570 | /*AcceptsExprPack=*/0, |
||
5571 | /*IsTargetSpecific=*/0, |
||
5572 | /*IsType=*/0, |
||
5573 | /*IsStmt=*/0, |
||
5574 | /*IsKnownToGCC=*/0, |
||
5575 | /*IsSupportedByPragmaAttribute=*/0, |
||
5576 | /*Spellings=*/GuardedBySpellings, |
||
5577 | /*ArgNames=*/GuardedByArgNames) {} |
||
5578 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5579 | if (!isa<FieldDecl>(D) && !isSharedVar(D)) { |
||
5580 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5581 | << Attr << "non-static data members and global variables"; |
||
5582 | return false; |
||
5583 | } |
||
5584 | return true; |
||
5585 | } |
||
5586 | |||
5587 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5588 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5589 | << AL << St->getBeginLoc(); |
||
5590 | return false; |
||
5591 | } |
||
5592 | |||
5593 | bool isParamExpr(size_t N) const override { |
||
5594 | return (N == 0) || false; |
||
5595 | } |
||
5596 | |||
5597 | static const ParsedAttrInfoGuardedBy Instance; |
||
5598 | }; |
||
5599 | const ParsedAttrInfoGuardedBy ParsedAttrInfoGuardedBy::Instance; |
||
5600 | static constexpr ParsedAttrInfo::Spelling GuardedVarSpellings[] = { |
||
5601 | {AttributeCommonInfo::AS_GNU, "guarded_var"}, |
||
5602 | {AttributeCommonInfo::AS_CXX11, "clang::guarded_var"}, |
||
5603 | }; |
||
5604 | struct ParsedAttrInfoGuardedVar final : public ParsedAttrInfo { |
||
5605 | constexpr ParsedAttrInfoGuardedVar() : ParsedAttrInfo( |
||
5606 | /*AttrKind=*/ParsedAttr::AT_GuardedVar, |
||
5607 | /*NumArgs=*/0, |
||
5608 | /*OptArgs=*/0, |
||
5609 | /*NumArgMembers=*/0, |
||
5610 | /*HasCustomParsing=*/0, |
||
5611 | /*AcceptsExprPack=*/0, |
||
5612 | /*IsTargetSpecific=*/0, |
||
5613 | /*IsType=*/0, |
||
5614 | /*IsStmt=*/0, |
||
5615 | /*IsKnownToGCC=*/0, |
||
5616 | /*IsSupportedByPragmaAttribute=*/0, |
||
5617 | /*Spellings=*/GuardedVarSpellings, |
||
5618 | /*ArgNames=*/{}) {} |
||
5619 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5620 | if (!isa<FieldDecl>(D) && !isSharedVar(D)) { |
||
5621 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5622 | << Attr << "non-static data members and global variables"; |
||
5623 | return false; |
||
5624 | } |
||
5625 | return true; |
||
5626 | } |
||
5627 | |||
5628 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5629 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5630 | << AL << St->getBeginLoc(); |
||
5631 | return false; |
||
5632 | } |
||
5633 | |||
5634 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
5635 | D->addAttr(::new (S.Context) GuardedVarAttr(S.Context, Attr)); |
||
5636 | return AttributeApplied; |
||
5637 | } |
||
5638 | |||
5639 | bool isParamExpr(size_t N) const override { |
||
5640 | return false; |
||
5641 | } |
||
5642 | |||
5643 | static const ParsedAttrInfoGuardedVar Instance; |
||
5644 | }; |
||
5645 | const ParsedAttrInfoGuardedVar ParsedAttrInfoGuardedVar::Instance; |
||
5646 | static constexpr ParsedAttrInfo::Spelling HIPManagedSpellings[] = { |
||
5647 | {AttributeCommonInfo::AS_GNU, "managed"}, |
||
5648 | {AttributeCommonInfo::AS_Declspec, "__managed__"}, |
||
5649 | }; |
||
5650 | struct ParsedAttrInfoHIPManaged final : public ParsedAttrInfo { |
||
5651 | constexpr ParsedAttrInfoHIPManaged() : ParsedAttrInfo( |
||
5652 | /*AttrKind=*/ParsedAttr::AT_HIPManaged, |
||
5653 | /*NumArgs=*/0, |
||
5654 | /*OptArgs=*/0, |
||
5655 | /*NumArgMembers=*/0, |
||
5656 | /*HasCustomParsing=*/0, |
||
5657 | /*AcceptsExprPack=*/0, |
||
5658 | /*IsTargetSpecific=*/0, |
||
5659 | /*IsType=*/0, |
||
5660 | /*IsStmt=*/0, |
||
5661 | /*IsKnownToGCC=*/0, |
||
5662 | /*IsSupportedByPragmaAttribute=*/1, |
||
5663 | /*Spellings=*/HIPManagedSpellings, |
||
5664 | /*ArgNames=*/{}) {} |
||
5665 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5666 | if (!isa<VarDecl>(D)) { |
||
5667 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5668 | << Attr << "variables"; |
||
5669 | return false; |
||
5670 | } |
||
5671 | return true; |
||
5672 | } |
||
5673 | |||
5674 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5675 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5676 | << AL << St->getBeginLoc(); |
||
5677 | return false; |
||
5678 | } |
||
5679 | |||
5680 | using ParsedAttrInfo::diagMutualExclusion; |
||
5681 | |||
5682 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
5683 | if (const auto *A = D->getAttr<CUDAConstantAttr>()) { |
||
5684 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
5685 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
5686 | return false; |
||
5687 | } |
||
5688 | if (const auto *A = D->getAttr<CUDASharedAttr>()) { |
||
5689 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
5690 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
5691 | return false; |
||
5692 | } |
||
5693 | return true; |
||
5694 | } |
||
5695 | |||
5696 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
5697 | return LangOpts.HIP; |
||
5698 | } |
||
5699 | |||
5700 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
5701 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
5702 | } |
||
5703 | |||
5704 | bool isParamExpr(size_t N) const override { |
||
5705 | return false; |
||
5706 | } |
||
5707 | |||
5708 | static const ParsedAttrInfoHIPManaged Instance; |
||
5709 | }; |
||
5710 | const ParsedAttrInfoHIPManaged ParsedAttrInfoHIPManaged::Instance; |
||
5711 | static constexpr ParsedAttrInfo::Spelling HLSLGroupSharedAddressSpaceSpellings[] = { |
||
5712 | {AttributeCommonInfo::AS_Keyword, "groupshared"}, |
||
5713 | }; |
||
5714 | struct ParsedAttrInfoHLSLGroupSharedAddressSpace final : public ParsedAttrInfo { |
||
5715 | constexpr ParsedAttrInfoHLSLGroupSharedAddressSpace() : ParsedAttrInfo( |
||
5716 | /*AttrKind=*/ParsedAttr::AT_HLSLGroupSharedAddressSpace, |
||
5717 | /*NumArgs=*/0, |
||
5718 | /*OptArgs=*/0, |
||
5719 | /*NumArgMembers=*/0, |
||
5720 | /*HasCustomParsing=*/0, |
||
5721 | /*AcceptsExprPack=*/0, |
||
5722 | /*IsTargetSpecific=*/0, |
||
5723 | /*IsType=*/1, |
||
5724 | /*IsStmt=*/0, |
||
5725 | /*IsKnownToGCC=*/0, |
||
5726 | /*IsSupportedByPragmaAttribute=*/0, |
||
5727 | /*Spellings=*/HLSLGroupSharedAddressSpaceSpellings, |
||
5728 | /*ArgNames=*/{}) {} |
||
5729 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5730 | if (!isa<VarDecl>(D)) { |
||
5731 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5732 | << Attr << "variables"; |
||
5733 | return false; |
||
5734 | } |
||
5735 | return true; |
||
5736 | } |
||
5737 | |||
5738 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5739 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5740 | << AL << St->getBeginLoc(); |
||
5741 | return false; |
||
5742 | } |
||
5743 | |||
5744 | bool isParamExpr(size_t N) const override { |
||
5745 | return false; |
||
5746 | } |
||
5747 | |||
5748 | static const ParsedAttrInfoHLSLGroupSharedAddressSpace Instance; |
||
5749 | }; |
||
5750 | const ParsedAttrInfoHLSLGroupSharedAddressSpace ParsedAttrInfoHLSLGroupSharedAddressSpace::Instance; |
||
5751 | static constexpr ParsedAttrInfo::Spelling HLSLNumThreadsSpellings[] = { |
||
5752 | {AttributeCommonInfo::AS_Microsoft, "numthreads"}, |
||
5753 | }; |
||
5754 | static constexpr const char *HLSLNumThreadsArgNames[] = { |
||
5755 | "X","Y","Z",}; |
||
5756 | struct ParsedAttrInfoHLSLNumThreads final : public ParsedAttrInfo { |
||
5757 | constexpr ParsedAttrInfoHLSLNumThreads() : ParsedAttrInfo( |
||
5758 | /*AttrKind=*/ParsedAttr::AT_HLSLNumThreads, |
||
5759 | /*NumArgs=*/3, |
||
5760 | /*OptArgs=*/0, |
||
5761 | /*NumArgMembers=*/3, |
||
5762 | /*HasCustomParsing=*/0, |
||
5763 | /*AcceptsExprPack=*/0, |
||
5764 | /*IsTargetSpecific=*/0, |
||
5765 | /*IsType=*/0, |
||
5766 | /*IsStmt=*/0, |
||
5767 | /*IsKnownToGCC=*/0, |
||
5768 | /*IsSupportedByPragmaAttribute=*/0, |
||
5769 | /*Spellings=*/HLSLNumThreadsSpellings, |
||
5770 | /*ArgNames=*/HLSLNumThreadsArgNames) {} |
||
5771 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5772 | if (!isHLSLEntry(D)) { |
||
5773 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5774 | << Attr << "global functions"; |
||
5775 | return false; |
||
5776 | } |
||
5777 | return true; |
||
5778 | } |
||
5779 | |||
5780 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5781 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5782 | << AL << St->getBeginLoc(); |
||
5783 | return false; |
||
5784 | } |
||
5785 | |||
5786 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
5787 | return LangOpts.HLSL; |
||
5788 | } |
||
5789 | |||
5790 | bool isParamExpr(size_t N) const override { |
||
5791 | return false; |
||
5792 | } |
||
5793 | |||
5794 | static const ParsedAttrInfoHLSLNumThreads Instance; |
||
5795 | }; |
||
5796 | const ParsedAttrInfoHLSLNumThreads ParsedAttrInfoHLSLNumThreads::Instance; |
||
5797 | static constexpr const char *HLSLResourceArgNames[] = { |
||
5798 | "ResourceType","ResourceShape",}; |
||
5799 | struct ParsedAttrInfoHLSLResource final : public ParsedAttrInfo { |
||
5800 | constexpr ParsedAttrInfoHLSLResource() : ParsedAttrInfo( |
||
5801 | /*AttrKind=*/ParsedAttr::AT_HLSLResource, |
||
5802 | /*NumArgs=*/2, |
||
5803 | /*OptArgs=*/0, |
||
5804 | /*NumArgMembers=*/2, |
||
5805 | /*HasCustomParsing=*/0, |
||
5806 | /*AcceptsExprPack=*/0, |
||
5807 | /*IsTargetSpecific=*/0, |
||
5808 | /*IsType=*/0, |
||
5809 | /*IsStmt=*/0, |
||
5810 | /*IsKnownToGCC=*/0, |
||
5811 | /*IsSupportedByPragmaAttribute=*/0, |
||
5812 | /*Spellings=*/{}, |
||
5813 | /*ArgNames=*/HLSLResourceArgNames) {} |
||
5814 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5815 | if (!isStruct(D)) { |
||
5816 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5817 | << Attr << "structs"; |
||
5818 | return false; |
||
5819 | } |
||
5820 | return true; |
||
5821 | } |
||
5822 | |||
5823 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5824 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5825 | << AL << St->getBeginLoc(); |
||
5826 | return false; |
||
5827 | } |
||
5828 | |||
5829 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
5830 | return LangOpts.HLSL; |
||
5831 | } |
||
5832 | |||
5833 | bool isParamExpr(size_t N) const override { |
||
5834 | return false; |
||
5835 | } |
||
5836 | |||
5837 | static const ParsedAttrInfoHLSLResource Instance; |
||
5838 | }; |
||
5839 | const ParsedAttrInfoHLSLResource ParsedAttrInfoHLSLResource::Instance; |
||
5840 | static constexpr ParsedAttrInfo::Spelling HLSLResourceBindingSpellings[] = { |
||
5841 | {AttributeCommonInfo::AS_HLSLSemantic, "register"}, |
||
5842 | }; |
||
5843 | static constexpr const char *HLSLResourceBindingArgNames[] = { |
||
5844 | "Slot","Space",}; |
||
5845 | struct ParsedAttrInfoHLSLResourceBinding final : public ParsedAttrInfo { |
||
5846 | constexpr ParsedAttrInfoHLSLResourceBinding() : ParsedAttrInfo( |
||
5847 | /*AttrKind=*/ParsedAttr::AT_HLSLResourceBinding, |
||
5848 | /*NumArgs=*/1, |
||
5849 | /*OptArgs=*/1, |
||
5850 | /*NumArgMembers=*/2, |
||
5851 | /*HasCustomParsing=*/0, |
||
5852 | /*AcceptsExprPack=*/0, |
||
5853 | /*IsTargetSpecific=*/0, |
||
5854 | /*IsType=*/0, |
||
5855 | /*IsStmt=*/0, |
||
5856 | /*IsKnownToGCC=*/0, |
||
5857 | /*IsSupportedByPragmaAttribute=*/0, |
||
5858 | /*Spellings=*/HLSLResourceBindingSpellings, |
||
5859 | /*ArgNames=*/HLSLResourceBindingArgNames) {} |
||
5860 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5861 | if (!isHLSLBufferObj(D) && !isExternalGlobalVar(D)) { |
||
5862 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5863 | << Attr << "cbuffer/tbuffer and external global variables"; |
||
5864 | return false; |
||
5865 | } |
||
5866 | return true; |
||
5867 | } |
||
5868 | |||
5869 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5870 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5871 | << AL << St->getBeginLoc(); |
||
5872 | return false; |
||
5873 | } |
||
5874 | |||
5875 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
5876 | return LangOpts.HLSL; |
||
5877 | } |
||
5878 | |||
5879 | bool isParamExpr(size_t N) const override { |
||
5880 | return false; |
||
5881 | } |
||
5882 | |||
5883 | static const ParsedAttrInfoHLSLResourceBinding Instance; |
||
5884 | }; |
||
5885 | const ParsedAttrInfoHLSLResourceBinding ParsedAttrInfoHLSLResourceBinding::Instance; |
||
5886 | static constexpr ParsedAttrInfo::Spelling HLSLSV_DispatchThreadIDSpellings[] = { |
||
5887 | {AttributeCommonInfo::AS_HLSLSemantic, "SV_DispatchThreadID"}, |
||
5888 | }; |
||
5889 | struct ParsedAttrInfoHLSLSV_DispatchThreadID final : public ParsedAttrInfo { |
||
5890 | constexpr ParsedAttrInfoHLSLSV_DispatchThreadID() : ParsedAttrInfo( |
||
5891 | /*AttrKind=*/ParsedAttr::AT_HLSLSV_DispatchThreadID, |
||
5892 | /*NumArgs=*/0, |
||
5893 | /*OptArgs=*/0, |
||
5894 | /*NumArgMembers=*/0, |
||
5895 | /*HasCustomParsing=*/0, |
||
5896 | /*AcceptsExprPack=*/0, |
||
5897 | /*IsTargetSpecific=*/0, |
||
5898 | /*IsType=*/0, |
||
5899 | /*IsStmt=*/0, |
||
5900 | /*IsKnownToGCC=*/0, |
||
5901 | /*IsSupportedByPragmaAttribute=*/0, |
||
5902 | /*Spellings=*/HLSLSV_DispatchThreadIDSpellings, |
||
5903 | /*ArgNames=*/{}) {} |
||
5904 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5905 | if (!isa<ParmVarDecl>(D) && !isa<FieldDecl>(D)) { |
||
5906 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5907 | << Attr << "parameters and non-static data members"; |
||
5908 | return false; |
||
5909 | } |
||
5910 | return true; |
||
5911 | } |
||
5912 | |||
5913 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5914 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5915 | << AL << St->getBeginLoc(); |
||
5916 | return false; |
||
5917 | } |
||
5918 | |||
5919 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
5920 | return LangOpts.HLSL; |
||
5921 | } |
||
5922 | |||
5923 | bool isParamExpr(size_t N) const override { |
||
5924 | return false; |
||
5925 | } |
||
5926 | |||
5927 | static const ParsedAttrInfoHLSLSV_DispatchThreadID Instance; |
||
5928 | }; |
||
5929 | const ParsedAttrInfoHLSLSV_DispatchThreadID ParsedAttrInfoHLSLSV_DispatchThreadID::Instance; |
||
5930 | static constexpr ParsedAttrInfo::Spelling HLSLSV_GroupIndexSpellings[] = { |
||
5931 | {AttributeCommonInfo::AS_HLSLSemantic, "SV_GroupIndex"}, |
||
5932 | }; |
||
5933 | struct ParsedAttrInfoHLSLSV_GroupIndex final : public ParsedAttrInfo { |
||
5934 | constexpr ParsedAttrInfoHLSLSV_GroupIndex() : ParsedAttrInfo( |
||
5935 | /*AttrKind=*/ParsedAttr::AT_HLSLSV_GroupIndex, |
||
5936 | /*NumArgs=*/0, |
||
5937 | /*OptArgs=*/0, |
||
5938 | /*NumArgMembers=*/0, |
||
5939 | /*HasCustomParsing=*/0, |
||
5940 | /*AcceptsExprPack=*/0, |
||
5941 | /*IsTargetSpecific=*/0, |
||
5942 | /*IsType=*/0, |
||
5943 | /*IsStmt=*/0, |
||
5944 | /*IsKnownToGCC=*/0, |
||
5945 | /*IsSupportedByPragmaAttribute=*/0, |
||
5946 | /*Spellings=*/HLSLSV_GroupIndexSpellings, |
||
5947 | /*ArgNames=*/{}) {} |
||
5948 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5949 | if (!isa<ParmVarDecl>(D) && !isGlobalVar(D)) { |
||
5950 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5951 | << Attr << "parameters and global variables"; |
||
5952 | return false; |
||
5953 | } |
||
5954 | return true; |
||
5955 | } |
||
5956 | |||
5957 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
5958 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
5959 | << AL << St->getBeginLoc(); |
||
5960 | return false; |
||
5961 | } |
||
5962 | |||
5963 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
5964 | return LangOpts.HLSL; |
||
5965 | } |
||
5966 | |||
5967 | bool isParamExpr(size_t N) const override { |
||
5968 | return false; |
||
5969 | } |
||
5970 | |||
5971 | static const ParsedAttrInfoHLSLSV_GroupIndex Instance; |
||
5972 | }; |
||
5973 | const ParsedAttrInfoHLSLSV_GroupIndex ParsedAttrInfoHLSLSV_GroupIndex::Instance; |
||
5974 | static constexpr ParsedAttrInfo::Spelling HLSLShaderSpellings[] = { |
||
5975 | {AttributeCommonInfo::AS_Microsoft, "shader"}, |
||
5976 | }; |
||
5977 | static constexpr const char *HLSLShaderArgNames[] = { |
||
5978 | "Type",}; |
||
5979 | struct ParsedAttrInfoHLSLShader final : public ParsedAttrInfo { |
||
5980 | constexpr ParsedAttrInfoHLSLShader() : ParsedAttrInfo( |
||
5981 | /*AttrKind=*/ParsedAttr::AT_HLSLShader, |
||
5982 | /*NumArgs=*/1, |
||
5983 | /*OptArgs=*/0, |
||
5984 | /*NumArgMembers=*/1, |
||
5985 | /*HasCustomParsing=*/0, |
||
5986 | /*AcceptsExprPack=*/0, |
||
5987 | /*IsTargetSpecific=*/0, |
||
5988 | /*IsType=*/0, |
||
5989 | /*IsStmt=*/0, |
||
5990 | /*IsKnownToGCC=*/0, |
||
5991 | /*IsSupportedByPragmaAttribute=*/0, |
||
5992 | /*Spellings=*/HLSLShaderSpellings, |
||
5993 | /*ArgNames=*/HLSLShaderArgNames) {} |
||
5994 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
5995 | if (!isHLSLEntry(D)) { |
||
5996 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
5997 | << Attr << "global functions"; |
||
5998 | return false; |
||
5999 | } |
||
6000 | return true; |
||
6001 | } |
||
6002 | |||
6003 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6004 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6005 | << AL << St->getBeginLoc(); |
||
6006 | return false; |
||
6007 | } |
||
6008 | |||
6009 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
6010 | return LangOpts.HLSL; |
||
6011 | } |
||
6012 | |||
6013 | bool isParamExpr(size_t N) const override { |
||
6014 | return false; |
||
6015 | } |
||
6016 | |||
6017 | static const ParsedAttrInfoHLSLShader Instance; |
||
6018 | }; |
||
6019 | const ParsedAttrInfoHLSLShader ParsedAttrInfoHLSLShader::Instance; |
||
6020 | static constexpr ParsedAttrInfo::Spelling HotSpellings[] = { |
||
6021 | {AttributeCommonInfo::AS_GNU, "hot"}, |
||
6022 | {AttributeCommonInfo::AS_CXX11, "gnu::hot"}, |
||
6023 | {AttributeCommonInfo::AS_C2x, "gnu::hot"}, |
||
6024 | }; |
||
6025 | struct ParsedAttrInfoHot final : public ParsedAttrInfo { |
||
6026 | constexpr ParsedAttrInfoHot() : ParsedAttrInfo( |
||
6027 | /*AttrKind=*/ParsedAttr::AT_Hot, |
||
6028 | /*NumArgs=*/0, |
||
6029 | /*OptArgs=*/0, |
||
6030 | /*NumArgMembers=*/0, |
||
6031 | /*HasCustomParsing=*/0, |
||
6032 | /*AcceptsExprPack=*/0, |
||
6033 | /*IsTargetSpecific=*/0, |
||
6034 | /*IsType=*/0, |
||
6035 | /*IsStmt=*/0, |
||
6036 | /*IsKnownToGCC=*/1, |
||
6037 | /*IsSupportedByPragmaAttribute=*/1, |
||
6038 | /*Spellings=*/HotSpellings, |
||
6039 | /*ArgNames=*/{}) {} |
||
6040 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6041 | if (!isa<FunctionDecl>(D)) { |
||
6042 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6043 | << Attr << "functions"; |
||
6044 | return false; |
||
6045 | } |
||
6046 | return true; |
||
6047 | } |
||
6048 | |||
6049 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6050 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6051 | << AL << St->getBeginLoc(); |
||
6052 | return false; |
||
6053 | } |
||
6054 | |||
6055 | using ParsedAttrInfo::diagMutualExclusion; |
||
6056 | |||
6057 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
6058 | if (const auto *A = D->getAttr<ColdAttr>()) { |
||
6059 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
6060 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
6061 | return false; |
||
6062 | } |
||
6063 | return true; |
||
6064 | } |
||
6065 | |||
6066 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6067 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
6068 | } |
||
6069 | |||
6070 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
6071 | D->addAttr(::new (S.Context) HotAttr(S.Context, Attr)); |
||
6072 | return AttributeApplied; |
||
6073 | } |
||
6074 | |||
6075 | bool isParamExpr(size_t N) const override { |
||
6076 | return false; |
||
6077 | } |
||
6078 | |||
6079 | static const ParsedAttrInfoHot Instance; |
||
6080 | }; |
||
6081 | const ParsedAttrInfoHot ParsedAttrInfoHot::Instance; |
||
6082 | static constexpr ParsedAttrInfo::Spelling IBActionSpellings[] = { |
||
6083 | {AttributeCommonInfo::AS_GNU, "ibaction"}, |
||
6084 | {AttributeCommonInfo::AS_CXX11, "clang::ibaction"}, |
||
6085 | {AttributeCommonInfo::AS_C2x, "clang::ibaction"}, |
||
6086 | }; |
||
6087 | struct ParsedAttrInfoIBAction final : public ParsedAttrInfo { |
||
6088 | constexpr ParsedAttrInfoIBAction() : ParsedAttrInfo( |
||
6089 | /*AttrKind=*/ParsedAttr::AT_IBAction, |
||
6090 | /*NumArgs=*/0, |
||
6091 | /*OptArgs=*/0, |
||
6092 | /*NumArgMembers=*/0, |
||
6093 | /*HasCustomParsing=*/0, |
||
6094 | /*AcceptsExprPack=*/0, |
||
6095 | /*IsTargetSpecific=*/0, |
||
6096 | /*IsType=*/0, |
||
6097 | /*IsStmt=*/0, |
||
6098 | /*IsKnownToGCC=*/0, |
||
6099 | /*IsSupportedByPragmaAttribute=*/1, |
||
6100 | /*Spellings=*/IBActionSpellings, |
||
6101 | /*ArgNames=*/{}) {} |
||
6102 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6103 | if (!isObjCInstanceMethod(D)) { |
||
6104 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6105 | << Attr << "Objective-C instance methods"; |
||
6106 | return false; |
||
6107 | } |
||
6108 | return true; |
||
6109 | } |
||
6110 | |||
6111 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6112 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6113 | << AL << St->getBeginLoc(); |
||
6114 | return false; |
||
6115 | } |
||
6116 | |||
6117 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6118 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method_is_instance, /*IsSupported=*/LangOpts.ObjC)); |
||
6119 | } |
||
6120 | |||
6121 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
6122 | D->addAttr(::new (S.Context) IBActionAttr(S.Context, Attr)); |
||
6123 | return AttributeApplied; |
||
6124 | } |
||
6125 | |||
6126 | bool isParamExpr(size_t N) const override { |
||
6127 | return false; |
||
6128 | } |
||
6129 | |||
6130 | static const ParsedAttrInfoIBAction Instance; |
||
6131 | }; |
||
6132 | const ParsedAttrInfoIBAction ParsedAttrInfoIBAction::Instance; |
||
6133 | static constexpr ParsedAttrInfo::Spelling IBOutletSpellings[] = { |
||
6134 | {AttributeCommonInfo::AS_GNU, "iboutlet"}, |
||
6135 | {AttributeCommonInfo::AS_CXX11, "clang::iboutlet"}, |
||
6136 | {AttributeCommonInfo::AS_C2x, "clang::iboutlet"}, |
||
6137 | }; |
||
6138 | struct ParsedAttrInfoIBOutlet final : public ParsedAttrInfo { |
||
6139 | constexpr ParsedAttrInfoIBOutlet() : ParsedAttrInfo( |
||
6140 | /*AttrKind=*/ParsedAttr::AT_IBOutlet, |
||
6141 | /*NumArgs=*/0, |
||
6142 | /*OptArgs=*/0, |
||
6143 | /*NumArgMembers=*/0, |
||
6144 | /*HasCustomParsing=*/0, |
||
6145 | /*AcceptsExprPack=*/0, |
||
6146 | /*IsTargetSpecific=*/0, |
||
6147 | /*IsType=*/0, |
||
6148 | /*IsStmt=*/0, |
||
6149 | /*IsKnownToGCC=*/0, |
||
6150 | /*IsSupportedByPragmaAttribute=*/0, |
||
6151 | /*Spellings=*/IBOutletSpellings, |
||
6152 | /*ArgNames=*/{}) {} |
||
6153 | bool isParamExpr(size_t N) const override { |
||
6154 | return false; |
||
6155 | } |
||
6156 | |||
6157 | static const ParsedAttrInfoIBOutlet Instance; |
||
6158 | }; |
||
6159 | const ParsedAttrInfoIBOutlet ParsedAttrInfoIBOutlet::Instance; |
||
6160 | static constexpr ParsedAttrInfo::Spelling IBOutletCollectionSpellings[] = { |
||
6161 | {AttributeCommonInfo::AS_GNU, "iboutletcollection"}, |
||
6162 | {AttributeCommonInfo::AS_CXX11, "clang::iboutletcollection"}, |
||
6163 | {AttributeCommonInfo::AS_C2x, "clang::iboutletcollection"}, |
||
6164 | }; |
||
6165 | static constexpr const char *IBOutletCollectionArgNames[] = { |
||
6166 | "Interface",}; |
||
6167 | struct ParsedAttrInfoIBOutletCollection final : public ParsedAttrInfo { |
||
6168 | constexpr ParsedAttrInfoIBOutletCollection() : ParsedAttrInfo( |
||
6169 | /*AttrKind=*/ParsedAttr::AT_IBOutletCollection, |
||
6170 | /*NumArgs=*/0, |
||
6171 | /*OptArgs=*/1, |
||
6172 | /*NumArgMembers=*/1, |
||
6173 | /*HasCustomParsing=*/0, |
||
6174 | /*AcceptsExprPack=*/0, |
||
6175 | /*IsTargetSpecific=*/0, |
||
6176 | /*IsType=*/0, |
||
6177 | /*IsStmt=*/0, |
||
6178 | /*IsKnownToGCC=*/0, |
||
6179 | /*IsSupportedByPragmaAttribute=*/0, |
||
6180 | /*Spellings=*/IBOutletCollectionSpellings, |
||
6181 | /*ArgNames=*/IBOutletCollectionArgNames) {} |
||
6182 | bool isParamExpr(size_t N) const override { |
||
6183 | return false; |
||
6184 | } |
||
6185 | |||
6186 | static const ParsedAttrInfoIBOutletCollection Instance; |
||
6187 | }; |
||
6188 | const ParsedAttrInfoIBOutletCollection ParsedAttrInfoIBOutletCollection::Instance; |
||
6189 | static constexpr ParsedAttrInfo::Spelling IFuncSpellings[] = { |
||
6190 | {AttributeCommonInfo::AS_GNU, "ifunc"}, |
||
6191 | {AttributeCommonInfo::AS_CXX11, "gnu::ifunc"}, |
||
6192 | {AttributeCommonInfo::AS_C2x, "gnu::ifunc"}, |
||
6193 | }; |
||
6194 | static constexpr const char *IFuncArgNames[] = { |
||
6195 | "Resolver",}; |
||
6196 | struct ParsedAttrInfoIFunc final : public ParsedAttrInfo { |
||
6197 | constexpr ParsedAttrInfoIFunc() : ParsedAttrInfo( |
||
6198 | /*AttrKind=*/ParsedAttr::AT_IFunc, |
||
6199 | /*NumArgs=*/1, |
||
6200 | /*OptArgs=*/0, |
||
6201 | /*NumArgMembers=*/1, |
||
6202 | /*HasCustomParsing=*/0, |
||
6203 | /*AcceptsExprPack=*/0, |
||
6204 | /*IsTargetSpecific=*/1, |
||
6205 | /*IsType=*/0, |
||
6206 | /*IsStmt=*/0, |
||
6207 | /*IsKnownToGCC=*/1, |
||
6208 | /*IsSupportedByPragmaAttribute=*/1, |
||
6209 | /*Spellings=*/IFuncSpellings, |
||
6210 | /*ArgNames=*/IFuncArgNames) {} |
||
6211 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6212 | if (!isa<FunctionDecl>(D)) { |
||
6213 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6214 | << Attr << "functions"; |
||
6215 | return false; |
||
6216 | } |
||
6217 | return true; |
||
6218 | } |
||
6219 | |||
6220 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6221 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6222 | << AL << St->getBeginLoc(); |
||
6223 | return false; |
||
6224 | } |
||
6225 | |||
6226 | bool existsInTarget(const TargetInfo &Target) const override { |
||
6227 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
6228 | return true && (T.getObjectFormat() == llvm::Triple::ELF); |
||
6229 | } |
||
6230 | |||
6231 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6232 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
6233 | } |
||
6234 | |||
6235 | bool isParamExpr(size_t N) const override { |
||
6236 | return false; |
||
6237 | } |
||
6238 | |||
6239 | static const ParsedAttrInfoIFunc Instance; |
||
6240 | }; |
||
6241 | const ParsedAttrInfoIFunc ParsedAttrInfoIFunc::Instance; |
||
6242 | static constexpr ParsedAttrInfo::Spelling InitPrioritySpellings[] = { |
||
6243 | {AttributeCommonInfo::AS_GNU, "init_priority"}, |
||
6244 | {AttributeCommonInfo::AS_CXX11, "gnu::init_priority"}, |
||
6245 | }; |
||
6246 | static constexpr const char *InitPriorityArgNames[] = { |
||
6247 | "Priority",}; |
||
6248 | struct ParsedAttrInfoInitPriority final : public ParsedAttrInfo { |
||
6249 | constexpr ParsedAttrInfoInitPriority() : ParsedAttrInfo( |
||
6250 | /*AttrKind=*/ParsedAttr::AT_InitPriority, |
||
6251 | /*NumArgs=*/1, |
||
6252 | /*OptArgs=*/0, |
||
6253 | /*NumArgMembers=*/1, |
||
6254 | /*HasCustomParsing=*/0, |
||
6255 | /*AcceptsExprPack=*/0, |
||
6256 | /*IsTargetSpecific=*/1, |
||
6257 | /*IsType=*/0, |
||
6258 | /*IsStmt=*/0, |
||
6259 | /*IsKnownToGCC=*/1, |
||
6260 | /*IsSupportedByPragmaAttribute=*/1, |
||
6261 | /*Spellings=*/InitPrioritySpellings, |
||
6262 | /*ArgNames=*/InitPriorityArgNames) {} |
||
6263 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6264 | if (!isa<VarDecl>(D)) { |
||
6265 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
6266 | << Attr << "variables"; |
||
6267 | return false; |
||
6268 | } |
||
6269 | return true; |
||
6270 | } |
||
6271 | |||
6272 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6273 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6274 | << AL << St->getBeginLoc(); |
||
6275 | return false; |
||
6276 | } |
||
6277 | |||
6278 | bool existsInTarget(const TargetInfo &Target) const override { |
||
6279 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
6280 | return true && ( !Target.getTriple().isOSzOS() ); |
||
6281 | } |
||
6282 | |||
6283 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6284 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
6285 | } |
||
6286 | |||
6287 | bool isParamExpr(size_t N) const override { |
||
6288 | return false; |
||
6289 | } |
||
6290 | |||
6291 | static const ParsedAttrInfoInitPriority Instance; |
||
6292 | }; |
||
6293 | const ParsedAttrInfoInitPriority ParsedAttrInfoInitPriority::Instance; |
||
6294 | static constexpr ParsedAttrInfo::Spelling IntelOclBiccSpellings[] = { |
||
6295 | {AttributeCommonInfo::AS_GNU, "intel_ocl_bicc"}, |
||
6296 | {AttributeCommonInfo::AS_CXX11, "clang::intel_ocl_bicc"}, |
||
6297 | }; |
||
6298 | struct ParsedAttrInfoIntelOclBicc final : public ParsedAttrInfo { |
||
6299 | constexpr ParsedAttrInfoIntelOclBicc() : ParsedAttrInfo( |
||
6300 | /*AttrKind=*/ParsedAttr::AT_IntelOclBicc, |
||
6301 | /*NumArgs=*/0, |
||
6302 | /*OptArgs=*/0, |
||
6303 | /*NumArgMembers=*/0, |
||
6304 | /*HasCustomParsing=*/0, |
||
6305 | /*AcceptsExprPack=*/0, |
||
6306 | /*IsTargetSpecific=*/0, |
||
6307 | /*IsType=*/1, |
||
6308 | /*IsStmt=*/0, |
||
6309 | /*IsKnownToGCC=*/0, |
||
6310 | /*IsSupportedByPragmaAttribute=*/0, |
||
6311 | /*Spellings=*/IntelOclBiccSpellings, |
||
6312 | /*ArgNames=*/{}) {} |
||
6313 | bool isParamExpr(size_t N) const override { |
||
6314 | return false; |
||
6315 | } |
||
6316 | |||
6317 | static const ParsedAttrInfoIntelOclBicc Instance; |
||
6318 | }; |
||
6319 | const ParsedAttrInfoIntelOclBicc ParsedAttrInfoIntelOclBicc::Instance; |
||
6320 | static constexpr ParsedAttrInfo::Spelling InternalLinkageSpellings[] = { |
||
6321 | {AttributeCommonInfo::AS_GNU, "internal_linkage"}, |
||
6322 | {AttributeCommonInfo::AS_CXX11, "clang::internal_linkage"}, |
||
6323 | {AttributeCommonInfo::AS_C2x, "clang::internal_linkage"}, |
||
6324 | }; |
||
6325 | struct ParsedAttrInfoInternalLinkage final : public ParsedAttrInfo { |
||
6326 | constexpr ParsedAttrInfoInternalLinkage() : ParsedAttrInfo( |
||
6327 | /*AttrKind=*/ParsedAttr::AT_InternalLinkage, |
||
6328 | /*NumArgs=*/0, |
||
6329 | /*OptArgs=*/0, |
||
6330 | /*NumArgMembers=*/0, |
||
6331 | /*HasCustomParsing=*/0, |
||
6332 | /*AcceptsExprPack=*/0, |
||
6333 | /*IsTargetSpecific=*/0, |
||
6334 | /*IsType=*/0, |
||
6335 | /*IsStmt=*/0, |
||
6336 | /*IsKnownToGCC=*/0, |
||
6337 | /*IsSupportedByPragmaAttribute=*/1, |
||
6338 | /*Spellings=*/InternalLinkageSpellings, |
||
6339 | /*ArgNames=*/{}) {} |
||
6340 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6341 | if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) { |
||
6342 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6343 | << Attr << "variables, functions, and classes"; |
||
6344 | return false; |
||
6345 | } |
||
6346 | return true; |
||
6347 | } |
||
6348 | |||
6349 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6350 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6351 | << AL << St->getBeginLoc(); |
||
6352 | return false; |
||
6353 | } |
||
6354 | |||
6355 | using ParsedAttrInfo::diagMutualExclusion; |
||
6356 | |||
6357 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
6358 | if (const auto *A = D->getAttr<CommonAttr>()) { |
||
6359 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
6360 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
6361 | return false; |
||
6362 | } |
||
6363 | return true; |
||
6364 | } |
||
6365 | |||
6366 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6367 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
6368 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
6369 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
6370 | } |
||
6371 | |||
6372 | bool isParamExpr(size_t N) const override { |
||
6373 | return false; |
||
6374 | } |
||
6375 | |||
6376 | static const ParsedAttrInfoInternalLinkage Instance; |
||
6377 | }; |
||
6378 | const ParsedAttrInfoInternalLinkage ParsedAttrInfoInternalLinkage::Instance; |
||
6379 | static constexpr ParsedAttrInfo::Spelling LTOVisibilityPublicSpellings[] = { |
||
6380 | {AttributeCommonInfo::AS_GNU, "lto_visibility_public"}, |
||
6381 | {AttributeCommonInfo::AS_CXX11, "clang::lto_visibility_public"}, |
||
6382 | {AttributeCommonInfo::AS_C2x, "clang::lto_visibility_public"}, |
||
6383 | }; |
||
6384 | struct ParsedAttrInfoLTOVisibilityPublic final : public ParsedAttrInfo { |
||
6385 | constexpr ParsedAttrInfoLTOVisibilityPublic() : ParsedAttrInfo( |
||
6386 | /*AttrKind=*/ParsedAttr::AT_LTOVisibilityPublic, |
||
6387 | /*NumArgs=*/0, |
||
6388 | /*OptArgs=*/0, |
||
6389 | /*NumArgMembers=*/0, |
||
6390 | /*HasCustomParsing=*/0, |
||
6391 | /*AcceptsExprPack=*/0, |
||
6392 | /*IsTargetSpecific=*/0, |
||
6393 | /*IsType=*/0, |
||
6394 | /*IsStmt=*/0, |
||
6395 | /*IsKnownToGCC=*/0, |
||
6396 | /*IsSupportedByPragmaAttribute=*/1, |
||
6397 | /*Spellings=*/LTOVisibilityPublicSpellings, |
||
6398 | /*ArgNames=*/{}) {} |
||
6399 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6400 | if (!isa<RecordDecl>(D)) { |
||
6401 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6402 | << Attr << "structs, unions, and classes"; |
||
6403 | return false; |
||
6404 | } |
||
6405 | return true; |
||
6406 | } |
||
6407 | |||
6408 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6409 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6410 | << AL << St->getBeginLoc(); |
||
6411 | return false; |
||
6412 | } |
||
6413 | |||
6414 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6415 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
6416 | } |
||
6417 | |||
6418 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
6419 | D->addAttr(::new (S.Context) LTOVisibilityPublicAttr(S.Context, Attr)); |
||
6420 | return AttributeApplied; |
||
6421 | } |
||
6422 | |||
6423 | bool isParamExpr(size_t N) const override { |
||
6424 | return false; |
||
6425 | } |
||
6426 | |||
6427 | static const ParsedAttrInfoLTOVisibilityPublic Instance; |
||
6428 | }; |
||
6429 | const ParsedAttrInfoLTOVisibilityPublic ParsedAttrInfoLTOVisibilityPublic::Instance; |
||
6430 | static constexpr ParsedAttrInfo::Spelling LayoutVersionSpellings[] = { |
||
6431 | {AttributeCommonInfo::AS_Declspec, "layout_version"}, |
||
6432 | }; |
||
6433 | static constexpr const char *LayoutVersionArgNames[] = { |
||
6434 | "Version",}; |
||
6435 | struct ParsedAttrInfoLayoutVersion final : public ParsedAttrInfo { |
||
6436 | constexpr ParsedAttrInfoLayoutVersion() : ParsedAttrInfo( |
||
6437 | /*AttrKind=*/ParsedAttr::AT_LayoutVersion, |
||
6438 | /*NumArgs=*/1, |
||
6439 | /*OptArgs=*/0, |
||
6440 | /*NumArgMembers=*/1, |
||
6441 | /*HasCustomParsing=*/0, |
||
6442 | /*AcceptsExprPack=*/0, |
||
6443 | /*IsTargetSpecific=*/1, |
||
6444 | /*IsType=*/0, |
||
6445 | /*IsStmt=*/0, |
||
6446 | /*IsKnownToGCC=*/0, |
||
6447 | /*IsSupportedByPragmaAttribute=*/0, |
||
6448 | /*Spellings=*/LayoutVersionSpellings, |
||
6449 | /*ArgNames=*/LayoutVersionArgNames) {} |
||
6450 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6451 | if (!isa<CXXRecordDecl>(D)) { |
||
6452 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6453 | << Attr << "classes"; |
||
6454 | return false; |
||
6455 | } |
||
6456 | return true; |
||
6457 | } |
||
6458 | |||
6459 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6460 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6461 | << AL << St->getBeginLoc(); |
||
6462 | return false; |
||
6463 | } |
||
6464 | |||
6465 | bool existsInTarget(const TargetInfo &Target) const override { |
||
6466 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
6467 | 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().isMicrosoft() ); |
||
6468 | } |
||
6469 | |||
6470 | bool isParamExpr(size_t N) const override { |
||
6471 | return false; |
||
6472 | } |
||
6473 | |||
6474 | static const ParsedAttrInfoLayoutVersion Instance; |
||
6475 | }; |
||
6476 | const ParsedAttrInfoLayoutVersion ParsedAttrInfoLayoutVersion::Instance; |
||
6477 | static constexpr ParsedAttrInfo::Spelling LeafSpellings[] = { |
||
6478 | {AttributeCommonInfo::AS_GNU, "leaf"}, |
||
6479 | {AttributeCommonInfo::AS_CXX11, "gnu::leaf"}, |
||
6480 | {AttributeCommonInfo::AS_C2x, "gnu::leaf"}, |
||
6481 | }; |
||
6482 | struct ParsedAttrInfoLeaf final : public ParsedAttrInfo { |
||
6483 | constexpr ParsedAttrInfoLeaf() : ParsedAttrInfo( |
||
6484 | /*AttrKind=*/ParsedAttr::AT_Leaf, |
||
6485 | /*NumArgs=*/0, |
||
6486 | /*OptArgs=*/0, |
||
6487 | /*NumArgMembers=*/0, |
||
6488 | /*HasCustomParsing=*/0, |
||
6489 | /*AcceptsExprPack=*/0, |
||
6490 | /*IsTargetSpecific=*/0, |
||
6491 | /*IsType=*/0, |
||
6492 | /*IsStmt=*/0, |
||
6493 | /*IsKnownToGCC=*/1, |
||
6494 | /*IsSupportedByPragmaAttribute=*/1, |
||
6495 | /*Spellings=*/LeafSpellings, |
||
6496 | /*ArgNames=*/{}) {} |
||
6497 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6498 | if (!isa<FunctionDecl>(D)) { |
||
6499 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6500 | << Attr << "functions"; |
||
6501 | return false; |
||
6502 | } |
||
6503 | return true; |
||
6504 | } |
||
6505 | |||
6506 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6507 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6508 | << AL << St->getBeginLoc(); |
||
6509 | return false; |
||
6510 | } |
||
6511 | |||
6512 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6513 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
6514 | } |
||
6515 | |||
6516 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
6517 | D->addAttr(::new (S.Context) LeafAttr(S.Context, Attr)); |
||
6518 | return AttributeApplied; |
||
6519 | } |
||
6520 | |||
6521 | bool isParamExpr(size_t N) const override { |
||
6522 | return false; |
||
6523 | } |
||
6524 | |||
6525 | static const ParsedAttrInfoLeaf Instance; |
||
6526 | }; |
||
6527 | const ParsedAttrInfoLeaf ParsedAttrInfoLeaf::Instance; |
||
6528 | static constexpr ParsedAttrInfo::Spelling LifetimeBoundSpellings[] = { |
||
6529 | {AttributeCommonInfo::AS_GNU, "lifetimebound"}, |
||
6530 | {AttributeCommonInfo::AS_CXX11, "clang::lifetimebound"}, |
||
6531 | }; |
||
6532 | struct ParsedAttrInfoLifetimeBound final : public ParsedAttrInfo { |
||
6533 | constexpr ParsedAttrInfoLifetimeBound() : ParsedAttrInfo( |
||
6534 | /*AttrKind=*/ParsedAttr::AT_LifetimeBound, |
||
6535 | /*NumArgs=*/0, |
||
6536 | /*OptArgs=*/0, |
||
6537 | /*NumArgMembers=*/0, |
||
6538 | /*HasCustomParsing=*/0, |
||
6539 | /*AcceptsExprPack=*/0, |
||
6540 | /*IsTargetSpecific=*/0, |
||
6541 | /*IsType=*/1, |
||
6542 | /*IsStmt=*/0, |
||
6543 | /*IsKnownToGCC=*/0, |
||
6544 | /*IsSupportedByPragmaAttribute=*/0, |
||
6545 | /*Spellings=*/LifetimeBoundSpellings, |
||
6546 | /*ArgNames=*/{}) {} |
||
6547 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6548 | if (!isa<ParmVarDecl>(D) && !isImplicitObjectParameter(D)) { |
||
6549 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
6550 | << Attr << "parameters and implicit object parameters"; |
||
6551 | return false; |
||
6552 | } |
||
6553 | return true; |
||
6554 | } |
||
6555 | |||
6556 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6557 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6558 | << AL << St->getBeginLoc(); |
||
6559 | return false; |
||
6560 | } |
||
6561 | |||
6562 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
6563 | return LangOpts.CPlusPlus; |
||
6564 | } |
||
6565 | |||
6566 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
6567 | D->addAttr(::new (S.Context) LifetimeBoundAttr(S.Context, Attr)); |
||
6568 | return AttributeApplied; |
||
6569 | } |
||
6570 | |||
6571 | bool isParamExpr(size_t N) const override { |
||
6572 | return false; |
||
6573 | } |
||
6574 | |||
6575 | static const ParsedAttrInfoLifetimeBound Instance; |
||
6576 | }; |
||
6577 | const ParsedAttrInfoLifetimeBound ParsedAttrInfoLifetimeBound::Instance; |
||
6578 | static constexpr ParsedAttrInfo::Spelling LikelySpellings[] = { |
||
6579 | {AttributeCommonInfo::AS_CXX11, "likely"}, |
||
6580 | {AttributeCommonInfo::AS_C2x, "clang::likely"}, |
||
6581 | }; |
||
6582 | struct ParsedAttrInfoLikely final : public ParsedAttrInfo { |
||
6583 | constexpr ParsedAttrInfoLikely() : ParsedAttrInfo( |
||
6584 | /*AttrKind=*/ParsedAttr::AT_Likely, |
||
6585 | /*NumArgs=*/0, |
||
6586 | /*OptArgs=*/0, |
||
6587 | /*NumArgMembers=*/0, |
||
6588 | /*HasCustomParsing=*/0, |
||
6589 | /*AcceptsExprPack=*/0, |
||
6590 | /*IsTargetSpecific=*/0, |
||
6591 | /*IsType=*/0, |
||
6592 | /*IsStmt=*/1, |
||
6593 | /*IsKnownToGCC=*/0, |
||
6594 | /*IsSupportedByPragmaAttribute=*/0, |
||
6595 | /*Spellings=*/LikelySpellings, |
||
6596 | /*ArgNames=*/{}) {} |
||
6597 | using ParsedAttrInfo::diagMutualExclusion; |
||
6598 | |||
6599 | bool isParamExpr(size_t N) const override { |
||
6600 | return false; |
||
6601 | } |
||
6602 | |||
6603 | static const ParsedAttrInfoLikely Instance; |
||
6604 | }; |
||
6605 | const ParsedAttrInfoLikely ParsedAttrInfoLikely::Instance; |
||
6606 | static constexpr ParsedAttrInfo::Spelling LoaderUninitializedSpellings[] = { |
||
6607 | {AttributeCommonInfo::AS_GNU, "loader_uninitialized"}, |
||
6608 | {AttributeCommonInfo::AS_CXX11, "clang::loader_uninitialized"}, |
||
6609 | {AttributeCommonInfo::AS_C2x, "clang::loader_uninitialized"}, |
||
6610 | }; |
||
6611 | struct ParsedAttrInfoLoaderUninitialized final : public ParsedAttrInfo { |
||
6612 | constexpr ParsedAttrInfoLoaderUninitialized() : ParsedAttrInfo( |
||
6613 | /*AttrKind=*/ParsedAttr::AT_LoaderUninitialized, |
||
6614 | /*NumArgs=*/0, |
||
6615 | /*OptArgs=*/0, |
||
6616 | /*NumArgMembers=*/0, |
||
6617 | /*HasCustomParsing=*/0, |
||
6618 | /*AcceptsExprPack=*/0, |
||
6619 | /*IsTargetSpecific=*/0, |
||
6620 | /*IsType=*/0, |
||
6621 | /*IsStmt=*/0, |
||
6622 | /*IsKnownToGCC=*/0, |
||
6623 | /*IsSupportedByPragmaAttribute=*/1, |
||
6624 | /*Spellings=*/LoaderUninitializedSpellings, |
||
6625 | /*ArgNames=*/{}) {} |
||
6626 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6627 | if (!isGlobalVar(D)) { |
||
6628 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6629 | << Attr << "global variables"; |
||
6630 | return false; |
||
6631 | } |
||
6632 | return true; |
||
6633 | } |
||
6634 | |||
6635 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6636 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6637 | << AL << St->getBeginLoc(); |
||
6638 | return false; |
||
6639 | } |
||
6640 | |||
6641 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6642 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
6643 | } |
||
6644 | |||
6645 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
6646 | D->addAttr(::new (S.Context) LoaderUninitializedAttr(S.Context, Attr)); |
||
6647 | return AttributeApplied; |
||
6648 | } |
||
6649 | |||
6650 | bool isParamExpr(size_t N) const override { |
||
6651 | return false; |
||
6652 | } |
||
6653 | |||
6654 | static const ParsedAttrInfoLoaderUninitialized Instance; |
||
6655 | }; |
||
6656 | const ParsedAttrInfoLoaderUninitialized ParsedAttrInfoLoaderUninitialized::Instance; |
||
6657 | static constexpr ParsedAttrInfo::Spelling LockReturnedSpellings[] = { |
||
6658 | {AttributeCommonInfo::AS_GNU, "lock_returned"}, |
||
6659 | }; |
||
6660 | static constexpr const char *LockReturnedArgNames[] = { |
||
6661 | "Arg",}; |
||
6662 | struct ParsedAttrInfoLockReturned final : public ParsedAttrInfo { |
||
6663 | constexpr ParsedAttrInfoLockReturned() : ParsedAttrInfo( |
||
6664 | /*AttrKind=*/ParsedAttr::AT_LockReturned, |
||
6665 | /*NumArgs=*/1, |
||
6666 | /*OptArgs=*/0, |
||
6667 | /*NumArgMembers=*/1, |
||
6668 | /*HasCustomParsing=*/0, |
||
6669 | /*AcceptsExprPack=*/0, |
||
6670 | /*IsTargetSpecific=*/0, |
||
6671 | /*IsType=*/0, |
||
6672 | /*IsStmt=*/0, |
||
6673 | /*IsKnownToGCC=*/0, |
||
6674 | /*IsSupportedByPragmaAttribute=*/0, |
||
6675 | /*Spellings=*/LockReturnedSpellings, |
||
6676 | /*ArgNames=*/LockReturnedArgNames) {} |
||
6677 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6678 | if (!isa<FunctionDecl>(D)) { |
||
6679 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6680 | << Attr << "functions"; |
||
6681 | return false; |
||
6682 | } |
||
6683 | return true; |
||
6684 | } |
||
6685 | |||
6686 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6687 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6688 | << AL << St->getBeginLoc(); |
||
6689 | return false; |
||
6690 | } |
||
6691 | |||
6692 | bool isParamExpr(size_t N) const override { |
||
6693 | return (N == 0) || false; |
||
6694 | } |
||
6695 | |||
6696 | static const ParsedAttrInfoLockReturned Instance; |
||
6697 | }; |
||
6698 | const ParsedAttrInfoLockReturned ParsedAttrInfoLockReturned::Instance; |
||
6699 | static constexpr ParsedAttrInfo::Spelling LockableSpellings[] = { |
||
6700 | {AttributeCommonInfo::AS_GNU, "lockable"}, |
||
6701 | }; |
||
6702 | struct ParsedAttrInfoLockable final : public ParsedAttrInfo { |
||
6703 | constexpr ParsedAttrInfoLockable() : ParsedAttrInfo( |
||
6704 | /*AttrKind=*/ParsedAttr::AT_Lockable, |
||
6705 | /*NumArgs=*/0, |
||
6706 | /*OptArgs=*/0, |
||
6707 | /*NumArgMembers=*/0, |
||
6708 | /*HasCustomParsing=*/0, |
||
6709 | /*AcceptsExprPack=*/0, |
||
6710 | /*IsTargetSpecific=*/0, |
||
6711 | /*IsType=*/0, |
||
6712 | /*IsStmt=*/0, |
||
6713 | /*IsKnownToGCC=*/0, |
||
6714 | /*IsSupportedByPragmaAttribute=*/1, |
||
6715 | /*Spellings=*/LockableSpellings, |
||
6716 | /*ArgNames=*/{}) {} |
||
6717 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6718 | if (!isa<RecordDecl>(D)) { |
||
6719 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6720 | << Attr << "structs, unions, and classes"; |
||
6721 | return false; |
||
6722 | } |
||
6723 | return true; |
||
6724 | } |
||
6725 | |||
6726 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6727 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6728 | << AL << St->getBeginLoc(); |
||
6729 | return false; |
||
6730 | } |
||
6731 | |||
6732 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6733 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
6734 | } |
||
6735 | |||
6736 | bool isParamExpr(size_t N) const override { |
||
6737 | return false; |
||
6738 | } |
||
6739 | |||
6740 | static const ParsedAttrInfoLockable Instance; |
||
6741 | }; |
||
6742 | const ParsedAttrInfoLockable ParsedAttrInfoLockable::Instance; |
||
6743 | static constexpr ParsedAttrInfo::Spelling LocksExcludedSpellings[] = { |
||
6744 | {AttributeCommonInfo::AS_GNU, "locks_excluded"}, |
||
6745 | }; |
||
6746 | static constexpr const char *LocksExcludedArgNames[] = { |
||
6747 | "Args...",}; |
||
6748 | struct ParsedAttrInfoLocksExcluded final : public ParsedAttrInfo { |
||
6749 | constexpr ParsedAttrInfoLocksExcluded() : ParsedAttrInfo( |
||
6750 | /*AttrKind=*/ParsedAttr::AT_LocksExcluded, |
||
6751 | /*NumArgs=*/0, |
||
6752 | /*OptArgs=*/15, |
||
6753 | /*NumArgMembers=*/1, |
||
6754 | /*HasCustomParsing=*/0, |
||
6755 | /*AcceptsExprPack=*/0, |
||
6756 | /*IsTargetSpecific=*/0, |
||
6757 | /*IsType=*/0, |
||
6758 | /*IsStmt=*/0, |
||
6759 | /*IsKnownToGCC=*/0, |
||
6760 | /*IsSupportedByPragmaAttribute=*/0, |
||
6761 | /*Spellings=*/LocksExcludedSpellings, |
||
6762 | /*ArgNames=*/LocksExcludedArgNames) {} |
||
6763 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6764 | if (!isa<FunctionDecl>(D)) { |
||
6765 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6766 | << Attr << "functions"; |
||
6767 | return false; |
||
6768 | } |
||
6769 | return true; |
||
6770 | } |
||
6771 | |||
6772 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6773 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6774 | << AL << St->getBeginLoc(); |
||
6775 | return false; |
||
6776 | } |
||
6777 | |||
6778 | bool isParamExpr(size_t N) const override { |
||
6779 | return (N == 0) || false; |
||
6780 | } |
||
6781 | |||
6782 | static const ParsedAttrInfoLocksExcluded Instance; |
||
6783 | }; |
||
6784 | const ParsedAttrInfoLocksExcluded ParsedAttrInfoLocksExcluded::Instance; |
||
6785 | static constexpr ParsedAttrInfo::Spelling LoopHintSpellings[] = { |
||
6786 | {AttributeCommonInfo::AS_Pragma, "clang::loop"}, |
||
6787 | {AttributeCommonInfo::AS_Pragma, "unroll"}, |
||
6788 | {AttributeCommonInfo::AS_Pragma, "nounroll"}, |
||
6789 | {AttributeCommonInfo::AS_Pragma, "unroll_and_jam"}, |
||
6790 | {AttributeCommonInfo::AS_Pragma, "nounroll_and_jam"}, |
||
6791 | }; |
||
6792 | static constexpr const char *LoopHintArgNames[] = { |
||
6793 | "Option","State","Value",}; |
||
6794 | struct ParsedAttrInfoLoopHint final : public ParsedAttrInfo { |
||
6795 | constexpr ParsedAttrInfoLoopHint() : ParsedAttrInfo( |
||
6796 | /*AttrKind=*/ParsedAttr::AT_LoopHint, |
||
6797 | /*NumArgs=*/3, |
||
6798 | /*OptArgs=*/0, |
||
6799 | /*NumArgMembers=*/3, |
||
6800 | /*HasCustomParsing=*/1, |
||
6801 | /*AcceptsExprPack=*/0, |
||
6802 | /*IsTargetSpecific=*/0, |
||
6803 | /*IsType=*/0, |
||
6804 | /*IsStmt=*/0, |
||
6805 | /*IsKnownToGCC=*/0, |
||
6806 | /*IsSupportedByPragmaAttribute=*/0, |
||
6807 | /*Spellings=*/LoopHintSpellings, |
||
6808 | /*ArgNames=*/LoopHintArgNames) {} |
||
6809 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
6810 | enum Spelling { |
||
6811 | Pragma_clang_loop = 0, |
||
6812 | Pragma_unroll = 1, |
||
6813 | Pragma_nounroll = 2, |
||
6814 | Pragma_unroll_and_jam = 3, |
||
6815 | Pragma_nounroll_and_jam = 4, |
||
6816 | SpellingNotCalculated = 15 |
||
6817 | |||
6818 | }; |
||
6819 | |||
6820 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
6821 | switch (Idx) { |
||
6822 | default: llvm_unreachable("Unknown spelling list index"); |
||
6823 | case 0: return Pragma_clang_loop; |
||
6824 | case 1: return Pragma_unroll; |
||
6825 | case 2: return Pragma_nounroll; |
||
6826 | case 3: return Pragma_unroll_and_jam; |
||
6827 | case 4: return Pragma_nounroll_and_jam; |
||
6828 | } |
||
6829 | } |
||
6830 | |||
6831 | bool isParamExpr(size_t N) const override { |
||
6832 | return (N == 2) || false; |
||
6833 | } |
||
6834 | |||
6835 | static const ParsedAttrInfoLoopHint Instance; |
||
6836 | }; |
||
6837 | const ParsedAttrInfoLoopHint ParsedAttrInfoLoopHint::Instance; |
||
6838 | static constexpr ParsedAttrInfo::Spelling MIGServerRoutineSpellings[] = { |
||
6839 | {AttributeCommonInfo::AS_GNU, "mig_server_routine"}, |
||
6840 | {AttributeCommonInfo::AS_CXX11, "clang::mig_server_routine"}, |
||
6841 | {AttributeCommonInfo::AS_C2x, "clang::mig_server_routine"}, |
||
6842 | }; |
||
6843 | struct ParsedAttrInfoMIGServerRoutine final : public ParsedAttrInfo { |
||
6844 | constexpr ParsedAttrInfoMIGServerRoutine() : ParsedAttrInfo( |
||
6845 | /*AttrKind=*/ParsedAttr::AT_MIGServerRoutine, |
||
6846 | /*NumArgs=*/0, |
||
6847 | /*OptArgs=*/0, |
||
6848 | /*NumArgMembers=*/0, |
||
6849 | /*HasCustomParsing=*/0, |
||
6850 | /*AcceptsExprPack=*/0, |
||
6851 | /*IsTargetSpecific=*/0, |
||
6852 | /*IsType=*/0, |
||
6853 | /*IsStmt=*/0, |
||
6854 | /*IsKnownToGCC=*/0, |
||
6855 | /*IsSupportedByPragmaAttribute=*/1, |
||
6856 | /*Spellings=*/MIGServerRoutineSpellings, |
||
6857 | /*ArgNames=*/{}) {} |
||
6858 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6859 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<BlockDecl>(D)) { |
||
6860 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6861 | << Attr << "functions, Objective-C methods, and blocks"; |
||
6862 | return false; |
||
6863 | } |
||
6864 | return true; |
||
6865 | } |
||
6866 | |||
6867 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6868 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6869 | << AL << St->getBeginLoc(); |
||
6870 | return false; |
||
6871 | } |
||
6872 | |||
6873 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
6874 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
6875 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
6876 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_block, /*IsSupported=*/LangOpts.Blocks)); |
||
6877 | } |
||
6878 | |||
6879 | bool isParamExpr(size_t N) const override { |
||
6880 | return false; |
||
6881 | } |
||
6882 | |||
6883 | static const ParsedAttrInfoMIGServerRoutine Instance; |
||
6884 | }; |
||
6885 | const ParsedAttrInfoMIGServerRoutine ParsedAttrInfoMIGServerRoutine::Instance; |
||
6886 | static constexpr ParsedAttrInfo::Spelling MSABISpellings[] = { |
||
6887 | {AttributeCommonInfo::AS_GNU, "ms_abi"}, |
||
6888 | {AttributeCommonInfo::AS_CXX11, "gnu::ms_abi"}, |
||
6889 | {AttributeCommonInfo::AS_C2x, "gnu::ms_abi"}, |
||
6890 | }; |
||
6891 | struct ParsedAttrInfoMSABI final : public ParsedAttrInfo { |
||
6892 | constexpr ParsedAttrInfoMSABI() : ParsedAttrInfo( |
||
6893 | /*AttrKind=*/ParsedAttr::AT_MSABI, |
||
6894 | /*NumArgs=*/0, |
||
6895 | /*OptArgs=*/0, |
||
6896 | /*NumArgMembers=*/0, |
||
6897 | /*HasCustomParsing=*/0, |
||
6898 | /*AcceptsExprPack=*/0, |
||
6899 | /*IsTargetSpecific=*/0, |
||
6900 | /*IsType=*/1, |
||
6901 | /*IsStmt=*/0, |
||
6902 | /*IsKnownToGCC=*/1, |
||
6903 | /*IsSupportedByPragmaAttribute=*/0, |
||
6904 | /*Spellings=*/MSABISpellings, |
||
6905 | /*ArgNames=*/{}) {} |
||
6906 | bool isParamExpr(size_t N) const override { |
||
6907 | return false; |
||
6908 | } |
||
6909 | |||
6910 | static const ParsedAttrInfoMSABI Instance; |
||
6911 | }; |
||
6912 | const ParsedAttrInfoMSABI ParsedAttrInfoMSABI::Instance; |
||
6913 | static constexpr ParsedAttrInfo::Spelling MSAllocatorSpellings[] = { |
||
6914 | {AttributeCommonInfo::AS_Declspec, "allocator"}, |
||
6915 | }; |
||
6916 | struct ParsedAttrInfoMSAllocator final : public ParsedAttrInfo { |
||
6917 | constexpr ParsedAttrInfoMSAllocator() : ParsedAttrInfo( |
||
6918 | /*AttrKind=*/ParsedAttr::AT_MSAllocator, |
||
6919 | /*NumArgs=*/0, |
||
6920 | /*OptArgs=*/0, |
||
6921 | /*NumArgMembers=*/0, |
||
6922 | /*HasCustomParsing=*/0, |
||
6923 | /*AcceptsExprPack=*/0, |
||
6924 | /*IsTargetSpecific=*/0, |
||
6925 | /*IsType=*/0, |
||
6926 | /*IsStmt=*/0, |
||
6927 | /*IsKnownToGCC=*/0, |
||
6928 | /*IsSupportedByPragmaAttribute=*/0, |
||
6929 | /*Spellings=*/MSAllocatorSpellings, |
||
6930 | /*ArgNames=*/{}) {} |
||
6931 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
6932 | if (!isa<FunctionDecl>(D)) { |
||
6933 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
6934 | << Attr << "functions"; |
||
6935 | return false; |
||
6936 | } |
||
6937 | return true; |
||
6938 | } |
||
6939 | |||
6940 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
6941 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
6942 | << AL << St->getBeginLoc(); |
||
6943 | return false; |
||
6944 | } |
||
6945 | |||
6946 | bool isParamExpr(size_t N) const override { |
||
6947 | return false; |
||
6948 | } |
||
6949 | |||
6950 | static const ParsedAttrInfoMSAllocator Instance; |
||
6951 | }; |
||
6952 | const ParsedAttrInfoMSAllocator ParsedAttrInfoMSAllocator::Instance; |
||
6953 | static constexpr ParsedAttrInfo::Spelling MSInheritanceSpellings[] = { |
||
6954 | {AttributeCommonInfo::AS_Keyword, "__single_inheritance"}, |
||
6955 | {AttributeCommonInfo::AS_Keyword, "__multiple_inheritance"}, |
||
6956 | {AttributeCommonInfo::AS_Keyword, "__virtual_inheritance"}, |
||
6957 | {AttributeCommonInfo::AS_Keyword, "__unspecified_inheritance"}, |
||
6958 | }; |
||
6959 | struct ParsedAttrInfoMSInheritance final : public ParsedAttrInfo { |
||
6960 | constexpr ParsedAttrInfoMSInheritance() : ParsedAttrInfo( |
||
6961 | /*AttrKind=*/ParsedAttr::AT_MSInheritance, |
||
6962 | /*NumArgs=*/0, |
||
6963 | /*OptArgs=*/0, |
||
6964 | /*NumArgMembers=*/0, |
||
6965 | /*HasCustomParsing=*/0, |
||
6966 | /*AcceptsExprPack=*/0, |
||
6967 | /*IsTargetSpecific=*/0, |
||
6968 | /*IsType=*/0, |
||
6969 | /*IsStmt=*/0, |
||
6970 | /*IsKnownToGCC=*/0, |
||
6971 | /*IsSupportedByPragmaAttribute=*/0, |
||
6972 | /*Spellings=*/MSInheritanceSpellings, |
||
6973 | /*ArgNames=*/{}) {} |
||
6974 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
6975 | return LangOpts.MicrosoftExt; |
||
6976 | } |
||
6977 | |||
6978 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
6979 | enum Spelling { |
||
6980 | Keyword_single_inheritance = 0, |
||
6981 | Keyword_multiple_inheritance = 1, |
||
6982 | Keyword_virtual_inheritance = 2, |
||
6983 | Keyword_unspecified_inheritance = 3, |
||
6984 | SpellingNotCalculated = 15 |
||
6985 | |||
6986 | }; |
||
6987 | |||
6988 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
6989 | switch (Idx) { |
||
6990 | default: llvm_unreachable("Unknown spelling list index"); |
||
6991 | case 0: return Keyword_single_inheritance; |
||
6992 | case 1: return Keyword_multiple_inheritance; |
||
6993 | case 2: return Keyword_virtual_inheritance; |
||
6994 | case 3: return Keyword_unspecified_inheritance; |
||
6995 | } |
||
6996 | } |
||
6997 | |||
6998 | bool isParamExpr(size_t N) const override { |
||
6999 | return false; |
||
7000 | } |
||
7001 | |||
7002 | static const ParsedAttrInfoMSInheritance Instance; |
||
7003 | }; |
||
7004 | const ParsedAttrInfoMSInheritance ParsedAttrInfoMSInheritance::Instance; |
||
7005 | static constexpr ParsedAttrInfo::Spelling MSNoVTableSpellings[] = { |
||
7006 | {AttributeCommonInfo::AS_Declspec, "novtable"}, |
||
7007 | }; |
||
7008 | struct ParsedAttrInfoMSNoVTable final : public ParsedAttrInfo { |
||
7009 | constexpr ParsedAttrInfoMSNoVTable() : ParsedAttrInfo( |
||
7010 | /*AttrKind=*/ParsedAttr::AT_MSNoVTable, |
||
7011 | /*NumArgs=*/0, |
||
7012 | /*OptArgs=*/0, |
||
7013 | /*NumArgMembers=*/0, |
||
7014 | /*HasCustomParsing=*/0, |
||
7015 | /*AcceptsExprPack=*/0, |
||
7016 | /*IsTargetSpecific=*/1, |
||
7017 | /*IsType=*/0, |
||
7018 | /*IsStmt=*/0, |
||
7019 | /*IsKnownToGCC=*/0, |
||
7020 | /*IsSupportedByPragmaAttribute=*/0, |
||
7021 | /*Spellings=*/MSNoVTableSpellings, |
||
7022 | /*ArgNames=*/{}) {} |
||
7023 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7024 | if (!isa<CXXRecordDecl>(D)) { |
||
7025 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7026 | << Attr << "classes"; |
||
7027 | return false; |
||
7028 | } |
||
7029 | return true; |
||
7030 | } |
||
7031 | |||
7032 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7033 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7034 | << AL << St->getBeginLoc(); |
||
7035 | return false; |
||
7036 | } |
||
7037 | |||
7038 | bool existsInTarget(const TargetInfo &Target) const override { |
||
7039 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
7040 | 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().isMicrosoft() ); |
||
7041 | } |
||
7042 | |||
7043 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7044 | D->addAttr(::new (S.Context) MSNoVTableAttr(S.Context, Attr)); |
||
7045 | return AttributeApplied; |
||
7046 | } |
||
7047 | |||
7048 | bool isParamExpr(size_t N) const override { |
||
7049 | return false; |
||
7050 | } |
||
7051 | |||
7052 | static const ParsedAttrInfoMSNoVTable Instance; |
||
7053 | }; |
||
7054 | const ParsedAttrInfoMSNoVTable ParsedAttrInfoMSNoVTable::Instance; |
||
7055 | static constexpr ParsedAttrInfo::Spelling MSStructSpellings[] = { |
||
7056 | {AttributeCommonInfo::AS_GNU, "ms_struct"}, |
||
7057 | {AttributeCommonInfo::AS_CXX11, "gnu::ms_struct"}, |
||
7058 | {AttributeCommonInfo::AS_C2x, "gnu::ms_struct"}, |
||
7059 | }; |
||
7060 | struct ParsedAttrInfoMSStruct final : public ParsedAttrInfo { |
||
7061 | constexpr ParsedAttrInfoMSStruct() : ParsedAttrInfo( |
||
7062 | /*AttrKind=*/ParsedAttr::AT_MSStruct, |
||
7063 | /*NumArgs=*/0, |
||
7064 | /*OptArgs=*/0, |
||
7065 | /*NumArgMembers=*/0, |
||
7066 | /*HasCustomParsing=*/0, |
||
7067 | /*AcceptsExprPack=*/0, |
||
7068 | /*IsTargetSpecific=*/0, |
||
7069 | /*IsType=*/0, |
||
7070 | /*IsStmt=*/0, |
||
7071 | /*IsKnownToGCC=*/1, |
||
7072 | /*IsSupportedByPragmaAttribute=*/1, |
||
7073 | /*Spellings=*/MSStructSpellings, |
||
7074 | /*ArgNames=*/{}) {} |
||
7075 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7076 | if (!isa<RecordDecl>(D)) { |
||
7077 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7078 | << Attr << "structs, unions, and classes"; |
||
7079 | return false; |
||
7080 | } |
||
7081 | return true; |
||
7082 | } |
||
7083 | |||
7084 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7085 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7086 | << AL << St->getBeginLoc(); |
||
7087 | return false; |
||
7088 | } |
||
7089 | |||
7090 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7091 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
7092 | } |
||
7093 | |||
7094 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7095 | D->addAttr(::new (S.Context) MSStructAttr(S.Context, Attr)); |
||
7096 | return AttributeApplied; |
||
7097 | } |
||
7098 | |||
7099 | bool isParamExpr(size_t N) const override { |
||
7100 | return false; |
||
7101 | } |
||
7102 | |||
7103 | static const ParsedAttrInfoMSStruct Instance; |
||
7104 | }; |
||
7105 | const ParsedAttrInfoMSStruct ParsedAttrInfoMSStruct::Instance; |
||
7106 | static constexpr ParsedAttrInfo::Spelling MatrixTypeSpellings[] = { |
||
7107 | {AttributeCommonInfo::AS_GNU, "matrix_type"}, |
||
7108 | {AttributeCommonInfo::AS_CXX11, "clang::matrix_type"}, |
||
7109 | {AttributeCommonInfo::AS_C2x, "clang::matrix_type"}, |
||
7110 | }; |
||
7111 | static constexpr const char *MatrixTypeArgNames[] = { |
||
7112 | "NumRows","NumColumns",}; |
||
7113 | struct ParsedAttrInfoMatrixType final : public ParsedAttrInfo { |
||
7114 | constexpr ParsedAttrInfoMatrixType() : ParsedAttrInfo( |
||
7115 | /*AttrKind=*/ParsedAttr::AT_MatrixType, |
||
7116 | /*NumArgs=*/2, |
||
7117 | /*OptArgs=*/0, |
||
7118 | /*NumArgMembers=*/2, |
||
7119 | /*HasCustomParsing=*/0, |
||
7120 | /*AcceptsExprPack=*/0, |
||
7121 | /*IsTargetSpecific=*/0, |
||
7122 | /*IsType=*/1, |
||
7123 | /*IsStmt=*/0, |
||
7124 | /*IsKnownToGCC=*/0, |
||
7125 | /*IsSupportedByPragmaAttribute=*/0, |
||
7126 | /*Spellings=*/MatrixTypeSpellings, |
||
7127 | /*ArgNames=*/MatrixTypeArgNames) {} |
||
7128 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7129 | if (!isa<TypedefNameDecl>(D)) { |
||
7130 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7131 | << Attr << "typedefs"; |
||
7132 | return false; |
||
7133 | } |
||
7134 | return true; |
||
7135 | } |
||
7136 | |||
7137 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7138 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7139 | << AL << St->getBeginLoc(); |
||
7140 | return false; |
||
7141 | } |
||
7142 | |||
7143 | bool isParamExpr(size_t N) const override { |
||
7144 | return (N == 0) || (N == 1) || false; |
||
7145 | } |
||
7146 | |||
7147 | static const ParsedAttrInfoMatrixType Instance; |
||
7148 | }; |
||
7149 | const ParsedAttrInfoMatrixType ParsedAttrInfoMatrixType::Instance; |
||
7150 | static constexpr ParsedAttrInfo::Spelling MayAliasSpellings[] = { |
||
7151 | {AttributeCommonInfo::AS_GNU, "may_alias"}, |
||
7152 | {AttributeCommonInfo::AS_CXX11, "gnu::may_alias"}, |
||
7153 | {AttributeCommonInfo::AS_C2x, "gnu::may_alias"}, |
||
7154 | }; |
||
7155 | struct ParsedAttrInfoMayAlias final : public ParsedAttrInfo { |
||
7156 | constexpr ParsedAttrInfoMayAlias() : ParsedAttrInfo( |
||
7157 | /*AttrKind=*/ParsedAttr::AT_MayAlias, |
||
7158 | /*NumArgs=*/0, |
||
7159 | /*OptArgs=*/0, |
||
7160 | /*NumArgMembers=*/0, |
||
7161 | /*HasCustomParsing=*/0, |
||
7162 | /*AcceptsExprPack=*/0, |
||
7163 | /*IsTargetSpecific=*/0, |
||
7164 | /*IsType=*/0, |
||
7165 | /*IsStmt=*/0, |
||
7166 | /*IsKnownToGCC=*/1, |
||
7167 | /*IsSupportedByPragmaAttribute=*/0, |
||
7168 | /*Spellings=*/MayAliasSpellings, |
||
7169 | /*ArgNames=*/{}) {} |
||
7170 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7171 | D->addAttr(::new (S.Context) MayAliasAttr(S.Context, Attr)); |
||
7172 | return AttributeApplied; |
||
7173 | } |
||
7174 | |||
7175 | bool isParamExpr(size_t N) const override { |
||
7176 | return false; |
||
7177 | } |
||
7178 | |||
7179 | static const ParsedAttrInfoMayAlias Instance; |
||
7180 | }; |
||
7181 | const ParsedAttrInfoMayAlias ParsedAttrInfoMayAlias::Instance; |
||
7182 | static constexpr ParsedAttrInfo::Spelling MaybeUndefSpellings[] = { |
||
7183 | {AttributeCommonInfo::AS_GNU, "maybe_undef"}, |
||
7184 | {AttributeCommonInfo::AS_CXX11, "clang::maybe_undef"}, |
||
7185 | {AttributeCommonInfo::AS_C2x, "clang::maybe_undef"}, |
||
7186 | }; |
||
7187 | struct ParsedAttrInfoMaybeUndef final : public ParsedAttrInfo { |
||
7188 | constexpr ParsedAttrInfoMaybeUndef() : ParsedAttrInfo( |
||
7189 | /*AttrKind=*/ParsedAttr::AT_MaybeUndef, |
||
7190 | /*NumArgs=*/0, |
||
7191 | /*OptArgs=*/0, |
||
7192 | /*NumArgMembers=*/0, |
||
7193 | /*HasCustomParsing=*/0, |
||
7194 | /*AcceptsExprPack=*/0, |
||
7195 | /*IsTargetSpecific=*/0, |
||
7196 | /*IsType=*/0, |
||
7197 | /*IsStmt=*/0, |
||
7198 | /*IsKnownToGCC=*/0, |
||
7199 | /*IsSupportedByPragmaAttribute=*/1, |
||
7200 | /*Spellings=*/MaybeUndefSpellings, |
||
7201 | /*ArgNames=*/{}) {} |
||
7202 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7203 | if (!isa<ParmVarDecl>(D)) { |
||
7204 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7205 | << Attr << "parameters"; |
||
7206 | return false; |
||
7207 | } |
||
7208 | return true; |
||
7209 | } |
||
7210 | |||
7211 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7212 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7213 | << AL << St->getBeginLoc(); |
||
7214 | return false; |
||
7215 | } |
||
7216 | |||
7217 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7218 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
7219 | } |
||
7220 | |||
7221 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7222 | D->addAttr(::new (S.Context) MaybeUndefAttr(S.Context, Attr)); |
||
7223 | return AttributeApplied; |
||
7224 | } |
||
7225 | |||
7226 | bool isParamExpr(size_t N) const override { |
||
7227 | return false; |
||
7228 | } |
||
7229 | |||
7230 | static const ParsedAttrInfoMaybeUndef Instance; |
||
7231 | }; |
||
7232 | const ParsedAttrInfoMaybeUndef ParsedAttrInfoMaybeUndef::Instance; |
||
7233 | static constexpr ParsedAttrInfo::Spelling MicroMipsSpellings[] = { |
||
7234 | {AttributeCommonInfo::AS_GNU, "micromips"}, |
||
7235 | {AttributeCommonInfo::AS_CXX11, "gnu::micromips"}, |
||
7236 | {AttributeCommonInfo::AS_C2x, "gnu::micromips"}, |
||
7237 | }; |
||
7238 | struct ParsedAttrInfoMicroMips final : public ParsedAttrInfo { |
||
7239 | constexpr ParsedAttrInfoMicroMips() : ParsedAttrInfo( |
||
7240 | /*AttrKind=*/ParsedAttr::AT_MicroMips, |
||
7241 | /*NumArgs=*/0, |
||
7242 | /*OptArgs=*/0, |
||
7243 | /*NumArgMembers=*/0, |
||
7244 | /*HasCustomParsing=*/0, |
||
7245 | /*AcceptsExprPack=*/0, |
||
7246 | /*IsTargetSpecific=*/1, |
||
7247 | /*IsType=*/0, |
||
7248 | /*IsStmt=*/0, |
||
7249 | /*IsKnownToGCC=*/1, |
||
7250 | /*IsSupportedByPragmaAttribute=*/1, |
||
7251 | /*Spellings=*/MicroMipsSpellings, |
||
7252 | /*ArgNames=*/{}) {} |
||
7253 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7254 | if (!isa<FunctionDecl>(D)) { |
||
7255 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7256 | << Attr << "functions"; |
||
7257 | return false; |
||
7258 | } |
||
7259 | return true; |
||
7260 | } |
||
7261 | |||
7262 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7263 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7264 | << AL << St->getBeginLoc(); |
||
7265 | return false; |
||
7266 | } |
||
7267 | |||
7268 | using ParsedAttrInfo::diagMutualExclusion; |
||
7269 | |||
7270 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
7271 | if (const auto *A = D->getAttr<Mips16Attr>()) { |
||
7272 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
7273 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
7274 | return false; |
||
7275 | } |
||
7276 | return true; |
||
7277 | } |
||
7278 | |||
7279 | bool existsInTarget(const TargetInfo &Target) const override { |
||
7280 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
7281 | return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel); |
||
7282 | } |
||
7283 | |||
7284 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7285 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
7286 | } |
||
7287 | |||
7288 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7289 | D->addAttr(::new (S.Context) MicroMipsAttr(S.Context, Attr)); |
||
7290 | return AttributeApplied; |
||
7291 | } |
||
7292 | |||
7293 | bool isParamExpr(size_t N) const override { |
||
7294 | return false; |
||
7295 | } |
||
7296 | |||
7297 | static const ParsedAttrInfoMicroMips Instance; |
||
7298 | }; |
||
7299 | const ParsedAttrInfoMicroMips ParsedAttrInfoMicroMips::Instance; |
||
7300 | static constexpr ParsedAttrInfo::Spelling MinSizeSpellings[] = { |
||
7301 | {AttributeCommonInfo::AS_GNU, "minsize"}, |
||
7302 | {AttributeCommonInfo::AS_CXX11, "clang::minsize"}, |
||
7303 | {AttributeCommonInfo::AS_C2x, "clang::minsize"}, |
||
7304 | }; |
||
7305 | struct ParsedAttrInfoMinSize final : public ParsedAttrInfo { |
||
7306 | constexpr ParsedAttrInfoMinSize() : ParsedAttrInfo( |
||
7307 | /*AttrKind=*/ParsedAttr::AT_MinSize, |
||
7308 | /*NumArgs=*/0, |
||
7309 | /*OptArgs=*/0, |
||
7310 | /*NumArgMembers=*/0, |
||
7311 | /*HasCustomParsing=*/0, |
||
7312 | /*AcceptsExprPack=*/0, |
||
7313 | /*IsTargetSpecific=*/0, |
||
7314 | /*IsType=*/0, |
||
7315 | /*IsStmt=*/0, |
||
7316 | /*IsKnownToGCC=*/0, |
||
7317 | /*IsSupportedByPragmaAttribute=*/1, |
||
7318 | /*Spellings=*/MinSizeSpellings, |
||
7319 | /*ArgNames=*/{}) {} |
||
7320 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7321 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
7322 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7323 | << Attr << "functions and Objective-C methods"; |
||
7324 | return false; |
||
7325 | } |
||
7326 | return true; |
||
7327 | } |
||
7328 | |||
7329 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7330 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7331 | << AL << St->getBeginLoc(); |
||
7332 | return false; |
||
7333 | } |
||
7334 | |||
7335 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7336 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
7337 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
7338 | } |
||
7339 | |||
7340 | bool isParamExpr(size_t N) const override { |
||
7341 | return false; |
||
7342 | } |
||
7343 | |||
7344 | static const ParsedAttrInfoMinSize Instance; |
||
7345 | }; |
||
7346 | const ParsedAttrInfoMinSize ParsedAttrInfoMinSize::Instance; |
||
7347 | static constexpr ParsedAttrInfo::Spelling MinVectorWidthSpellings[] = { |
||
7348 | {AttributeCommonInfo::AS_GNU, "min_vector_width"}, |
||
7349 | {AttributeCommonInfo::AS_CXX11, "clang::min_vector_width"}, |
||
7350 | {AttributeCommonInfo::AS_C2x, "clang::min_vector_width"}, |
||
7351 | }; |
||
7352 | static constexpr const char *MinVectorWidthArgNames[] = { |
||
7353 | "VectorWidth",}; |
||
7354 | struct ParsedAttrInfoMinVectorWidth final : public ParsedAttrInfo { |
||
7355 | constexpr ParsedAttrInfoMinVectorWidth() : ParsedAttrInfo( |
||
7356 | /*AttrKind=*/ParsedAttr::AT_MinVectorWidth, |
||
7357 | /*NumArgs=*/1, |
||
7358 | /*OptArgs=*/0, |
||
7359 | /*NumArgMembers=*/1, |
||
7360 | /*HasCustomParsing=*/0, |
||
7361 | /*AcceptsExprPack=*/0, |
||
7362 | /*IsTargetSpecific=*/0, |
||
7363 | /*IsType=*/0, |
||
7364 | /*IsStmt=*/0, |
||
7365 | /*IsKnownToGCC=*/0, |
||
7366 | /*IsSupportedByPragmaAttribute=*/1, |
||
7367 | /*Spellings=*/MinVectorWidthSpellings, |
||
7368 | /*ArgNames=*/MinVectorWidthArgNames) {} |
||
7369 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7370 | if (!isa<FunctionDecl>(D)) { |
||
7371 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7372 | << Attr << "functions"; |
||
7373 | return false; |
||
7374 | } |
||
7375 | return true; |
||
7376 | } |
||
7377 | |||
7378 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7379 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7380 | << AL << St->getBeginLoc(); |
||
7381 | return false; |
||
7382 | } |
||
7383 | |||
7384 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7385 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
7386 | } |
||
7387 | |||
7388 | bool isParamExpr(size_t N) const override { |
||
7389 | return false; |
||
7390 | } |
||
7391 | |||
7392 | static const ParsedAttrInfoMinVectorWidth Instance; |
||
7393 | }; |
||
7394 | const ParsedAttrInfoMinVectorWidth ParsedAttrInfoMinVectorWidth::Instance; |
||
7395 | static constexpr ParsedAttrInfo::Spelling Mips16Spellings[] = { |
||
7396 | {AttributeCommonInfo::AS_GNU, "mips16"}, |
||
7397 | {AttributeCommonInfo::AS_CXX11, "gnu::mips16"}, |
||
7398 | {AttributeCommonInfo::AS_C2x, "gnu::mips16"}, |
||
7399 | }; |
||
7400 | struct ParsedAttrInfoMips16 final : public ParsedAttrInfo { |
||
7401 | constexpr ParsedAttrInfoMips16() : ParsedAttrInfo( |
||
7402 | /*AttrKind=*/ParsedAttr::AT_Mips16, |
||
7403 | /*NumArgs=*/0, |
||
7404 | /*OptArgs=*/0, |
||
7405 | /*NumArgMembers=*/0, |
||
7406 | /*HasCustomParsing=*/0, |
||
7407 | /*AcceptsExprPack=*/0, |
||
7408 | /*IsTargetSpecific=*/1, |
||
7409 | /*IsType=*/0, |
||
7410 | /*IsStmt=*/0, |
||
7411 | /*IsKnownToGCC=*/1, |
||
7412 | /*IsSupportedByPragmaAttribute=*/1, |
||
7413 | /*Spellings=*/Mips16Spellings, |
||
7414 | /*ArgNames=*/{}) {} |
||
7415 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7416 | if (!isa<FunctionDecl>(D)) { |
||
7417 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7418 | << Attr << "functions"; |
||
7419 | return false; |
||
7420 | } |
||
7421 | return true; |
||
7422 | } |
||
7423 | |||
7424 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7425 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7426 | << AL << St->getBeginLoc(); |
||
7427 | return false; |
||
7428 | } |
||
7429 | |||
7430 | using ParsedAttrInfo::diagMutualExclusion; |
||
7431 | |||
7432 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
7433 | if (const auto *A = D->getAttr<MipsInterruptAttr>()) { |
||
7434 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
7435 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
7436 | return false; |
||
7437 | } |
||
7438 | if (const auto *A = D->getAttr<MicroMipsAttr>()) { |
||
7439 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
7440 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
7441 | return false; |
||
7442 | } |
||
7443 | return true; |
||
7444 | } |
||
7445 | |||
7446 | bool existsInTarget(const TargetInfo &Target) const override { |
||
7447 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
7448 | return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel); |
||
7449 | } |
||
7450 | |||
7451 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7452 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
7453 | } |
||
7454 | |||
7455 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7456 | D->addAttr(::new (S.Context) Mips16Attr(S.Context, Attr)); |
||
7457 | return AttributeApplied; |
||
7458 | } |
||
7459 | |||
7460 | bool isParamExpr(size_t N) const override { |
||
7461 | return false; |
||
7462 | } |
||
7463 | |||
7464 | static const ParsedAttrInfoMips16 Instance; |
||
7465 | }; |
||
7466 | const ParsedAttrInfoMips16 ParsedAttrInfoMips16::Instance; |
||
7467 | static constexpr ParsedAttrInfo::Spelling MipsLongCallSpellings[] = { |
||
7468 | {AttributeCommonInfo::AS_GNU, "long_call"}, |
||
7469 | {AttributeCommonInfo::AS_CXX11, "gnu::long_call"}, |
||
7470 | {AttributeCommonInfo::AS_C2x, "gnu::long_call"}, |
||
7471 | {AttributeCommonInfo::AS_GNU, "far"}, |
||
7472 | {AttributeCommonInfo::AS_CXX11, "gnu::far"}, |
||
7473 | {AttributeCommonInfo::AS_C2x, "gnu::far"}, |
||
7474 | }; |
||
7475 | struct ParsedAttrInfoMipsLongCall final : public ParsedAttrInfo { |
||
7476 | constexpr ParsedAttrInfoMipsLongCall() : ParsedAttrInfo( |
||
7477 | /*AttrKind=*/ParsedAttr::AT_MipsLongCall, |
||
7478 | /*NumArgs=*/0, |
||
7479 | /*OptArgs=*/0, |
||
7480 | /*NumArgMembers=*/0, |
||
7481 | /*HasCustomParsing=*/0, |
||
7482 | /*AcceptsExprPack=*/0, |
||
7483 | /*IsTargetSpecific=*/1, |
||
7484 | /*IsType=*/0, |
||
7485 | /*IsStmt=*/0, |
||
7486 | /*IsKnownToGCC=*/1, |
||
7487 | /*IsSupportedByPragmaAttribute=*/1, |
||
7488 | /*Spellings=*/MipsLongCallSpellings, |
||
7489 | /*ArgNames=*/{}) {} |
||
7490 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7491 | if (!isa<FunctionDecl>(D)) { |
||
7492 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7493 | << Attr << "functions"; |
||
7494 | return false; |
||
7495 | } |
||
7496 | return true; |
||
7497 | } |
||
7498 | |||
7499 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7500 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7501 | << AL << St->getBeginLoc(); |
||
7502 | return false; |
||
7503 | } |
||
7504 | |||
7505 | using ParsedAttrInfo::diagMutualExclusion; |
||
7506 | |||
7507 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
7508 | if (const auto *A = D->getAttr<MipsShortCallAttr>()) { |
||
7509 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
7510 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
7511 | return false; |
||
7512 | } |
||
7513 | return true; |
||
7514 | } |
||
7515 | |||
7516 | bool existsInTarget(const TargetInfo &Target) const override { |
||
7517 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
7518 | return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel || T.getArch() == llvm::Triple::mips64 || T.getArch() == llvm::Triple::mips64el); |
||
7519 | } |
||
7520 | |||
7521 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
7522 | enum Spelling { |
||
7523 | GNU_long_call = 0, |
||
7524 | CXX11_gnu_long_call = 1, |
||
7525 | C2x_gnu_long_call = 2, |
||
7526 | GNU_far = 3, |
||
7527 | CXX11_gnu_far = 4, |
||
7528 | C2x_gnu_far = 5, |
||
7529 | SpellingNotCalculated = 15 |
||
7530 | |||
7531 | }; |
||
7532 | |||
7533 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
7534 | switch (Idx) { |
||
7535 | default: llvm_unreachable("Unknown spelling list index"); |
||
7536 | case 0: return GNU_long_call; |
||
7537 | case 1: return CXX11_gnu_long_call; |
||
7538 | case 2: return C2x_gnu_long_call; |
||
7539 | case 3: return GNU_far; |
||
7540 | case 4: return CXX11_gnu_far; |
||
7541 | case 5: return C2x_gnu_far; |
||
7542 | } |
||
7543 | } |
||
7544 | |||
7545 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7546 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
7547 | } |
||
7548 | |||
7549 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7550 | D->addAttr(::new (S.Context) MipsLongCallAttr(S.Context, Attr)); |
||
7551 | return AttributeApplied; |
||
7552 | } |
||
7553 | |||
7554 | bool isParamExpr(size_t N) const override { |
||
7555 | return false; |
||
7556 | } |
||
7557 | |||
7558 | static const ParsedAttrInfoMipsLongCall Instance; |
||
7559 | }; |
||
7560 | const ParsedAttrInfoMipsLongCall ParsedAttrInfoMipsLongCall::Instance; |
||
7561 | static constexpr ParsedAttrInfo::Spelling MipsShortCallSpellings[] = { |
||
7562 | {AttributeCommonInfo::AS_GNU, "short_call"}, |
||
7563 | {AttributeCommonInfo::AS_CXX11, "gnu::short_call"}, |
||
7564 | {AttributeCommonInfo::AS_C2x, "gnu::short_call"}, |
||
7565 | {AttributeCommonInfo::AS_GNU, "near"}, |
||
7566 | {AttributeCommonInfo::AS_CXX11, "gnu::near"}, |
||
7567 | {AttributeCommonInfo::AS_C2x, "gnu::near"}, |
||
7568 | }; |
||
7569 | struct ParsedAttrInfoMipsShortCall final : public ParsedAttrInfo { |
||
7570 | constexpr ParsedAttrInfoMipsShortCall() : ParsedAttrInfo( |
||
7571 | /*AttrKind=*/ParsedAttr::AT_MipsShortCall, |
||
7572 | /*NumArgs=*/0, |
||
7573 | /*OptArgs=*/0, |
||
7574 | /*NumArgMembers=*/0, |
||
7575 | /*HasCustomParsing=*/0, |
||
7576 | /*AcceptsExprPack=*/0, |
||
7577 | /*IsTargetSpecific=*/1, |
||
7578 | /*IsType=*/0, |
||
7579 | /*IsStmt=*/0, |
||
7580 | /*IsKnownToGCC=*/1, |
||
7581 | /*IsSupportedByPragmaAttribute=*/1, |
||
7582 | /*Spellings=*/MipsShortCallSpellings, |
||
7583 | /*ArgNames=*/{}) {} |
||
7584 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7585 | if (!isa<FunctionDecl>(D)) { |
||
7586 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7587 | << Attr << "functions"; |
||
7588 | return false; |
||
7589 | } |
||
7590 | return true; |
||
7591 | } |
||
7592 | |||
7593 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7594 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7595 | << AL << St->getBeginLoc(); |
||
7596 | return false; |
||
7597 | } |
||
7598 | |||
7599 | using ParsedAttrInfo::diagMutualExclusion; |
||
7600 | |||
7601 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
7602 | if (const auto *A = D->getAttr<MipsLongCallAttr>()) { |
||
7603 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
7604 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
7605 | return false; |
||
7606 | } |
||
7607 | return true; |
||
7608 | } |
||
7609 | |||
7610 | bool existsInTarget(const TargetInfo &Target) const override { |
||
7611 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
7612 | return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel || T.getArch() == llvm::Triple::mips64 || T.getArch() == llvm::Triple::mips64el); |
||
7613 | } |
||
7614 | |||
7615 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
7616 | enum Spelling { |
||
7617 | GNU_short_call = 0, |
||
7618 | CXX11_gnu_short_call = 1, |
||
7619 | C2x_gnu_short_call = 2, |
||
7620 | GNU_near = 3, |
||
7621 | CXX11_gnu_near = 4, |
||
7622 | C2x_gnu_near = 5, |
||
7623 | SpellingNotCalculated = 15 |
||
7624 | |||
7625 | }; |
||
7626 | |||
7627 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
7628 | switch (Idx) { |
||
7629 | default: llvm_unreachable("Unknown spelling list index"); |
||
7630 | case 0: return GNU_short_call; |
||
7631 | case 1: return CXX11_gnu_short_call; |
||
7632 | case 2: return C2x_gnu_short_call; |
||
7633 | case 3: return GNU_near; |
||
7634 | case 4: return CXX11_gnu_near; |
||
7635 | case 5: return C2x_gnu_near; |
||
7636 | } |
||
7637 | } |
||
7638 | |||
7639 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7640 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
7641 | } |
||
7642 | |||
7643 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7644 | D->addAttr(::new (S.Context) MipsShortCallAttr(S.Context, Attr)); |
||
7645 | return AttributeApplied; |
||
7646 | } |
||
7647 | |||
7648 | bool isParamExpr(size_t N) const override { |
||
7649 | return false; |
||
7650 | } |
||
7651 | |||
7652 | static const ParsedAttrInfoMipsShortCall Instance; |
||
7653 | }; |
||
7654 | const ParsedAttrInfoMipsShortCall ParsedAttrInfoMipsShortCall::Instance; |
||
7655 | static constexpr ParsedAttrInfo::Spelling ModeSpellings[] = { |
||
7656 | {AttributeCommonInfo::AS_GNU, "mode"}, |
||
7657 | {AttributeCommonInfo::AS_CXX11, "gnu::mode"}, |
||
7658 | {AttributeCommonInfo::AS_C2x, "gnu::mode"}, |
||
7659 | }; |
||
7660 | static constexpr const char *ModeArgNames[] = { |
||
7661 | "Mode",}; |
||
7662 | struct ParsedAttrInfoMode final : public ParsedAttrInfo { |
||
7663 | constexpr ParsedAttrInfoMode() : ParsedAttrInfo( |
||
7664 | /*AttrKind=*/ParsedAttr::AT_Mode, |
||
7665 | /*NumArgs=*/1, |
||
7666 | /*OptArgs=*/0, |
||
7667 | /*NumArgMembers=*/1, |
||
7668 | /*HasCustomParsing=*/0, |
||
7669 | /*AcceptsExprPack=*/0, |
||
7670 | /*IsTargetSpecific=*/0, |
||
7671 | /*IsType=*/0, |
||
7672 | /*IsStmt=*/0, |
||
7673 | /*IsKnownToGCC=*/1, |
||
7674 | /*IsSupportedByPragmaAttribute=*/0, |
||
7675 | /*Spellings=*/ModeSpellings, |
||
7676 | /*ArgNames=*/ModeArgNames) {} |
||
7677 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7678 | if (!isa<VarDecl>(D) && !isa<EnumDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<FieldDecl>(D)) { |
||
7679 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7680 | << Attr << "variables, enums, typedefs, and non-static data members"; |
||
7681 | return false; |
||
7682 | } |
||
7683 | return true; |
||
7684 | } |
||
7685 | |||
7686 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7687 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7688 | << AL << St->getBeginLoc(); |
||
7689 | return false; |
||
7690 | } |
||
7691 | |||
7692 | bool isParamExpr(size_t N) const override { |
||
7693 | return false; |
||
7694 | } |
||
7695 | |||
7696 | static const ParsedAttrInfoMode Instance; |
||
7697 | }; |
||
7698 | const ParsedAttrInfoMode ParsedAttrInfoMode::Instance; |
||
7699 | static constexpr ParsedAttrInfo::Spelling MustTailSpellings[] = { |
||
7700 | {AttributeCommonInfo::AS_GNU, "musttail"}, |
||
7701 | {AttributeCommonInfo::AS_CXX11, "clang::musttail"}, |
||
7702 | {AttributeCommonInfo::AS_C2x, "clang::musttail"}, |
||
7703 | }; |
||
7704 | struct ParsedAttrInfoMustTail final : public ParsedAttrInfo { |
||
7705 | constexpr ParsedAttrInfoMustTail() : ParsedAttrInfo( |
||
7706 | /*AttrKind=*/ParsedAttr::AT_MustTail, |
||
7707 | /*NumArgs=*/0, |
||
7708 | /*OptArgs=*/0, |
||
7709 | /*NumArgMembers=*/0, |
||
7710 | /*HasCustomParsing=*/0, |
||
7711 | /*AcceptsExprPack=*/0, |
||
7712 | /*IsTargetSpecific=*/0, |
||
7713 | /*IsType=*/0, |
||
7714 | /*IsStmt=*/1, |
||
7715 | /*IsKnownToGCC=*/0, |
||
7716 | /*IsSupportedByPragmaAttribute=*/0, |
||
7717 | /*Spellings=*/MustTailSpellings, |
||
7718 | /*ArgNames=*/{}) {} |
||
7719 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
7720 | S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl) |
||
7721 | << AL << D->getLocation(); |
||
7722 | return false; |
||
7723 | } |
||
7724 | |||
7725 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override { |
||
7726 | if (!isa<ReturnStmt>(St)) { |
||
7727 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7728 | << Attr << "return statements"; |
||
7729 | return false; |
||
7730 | } |
||
7731 | return true; |
||
7732 | } |
||
7733 | |||
7734 | bool isParamExpr(size_t N) const override { |
||
7735 | return false; |
||
7736 | } |
||
7737 | |||
7738 | static const ParsedAttrInfoMustTail Instance; |
||
7739 | }; |
||
7740 | const ParsedAttrInfoMustTail ParsedAttrInfoMustTail::Instance; |
||
7741 | static constexpr ParsedAttrInfo::Spelling NSConsumedSpellings[] = { |
||
7742 | {AttributeCommonInfo::AS_GNU, "ns_consumed"}, |
||
7743 | {AttributeCommonInfo::AS_CXX11, "clang::ns_consumed"}, |
||
7744 | {AttributeCommonInfo::AS_C2x, "clang::ns_consumed"}, |
||
7745 | }; |
||
7746 | struct ParsedAttrInfoNSConsumed final : public ParsedAttrInfo { |
||
7747 | constexpr ParsedAttrInfoNSConsumed() : ParsedAttrInfo( |
||
7748 | /*AttrKind=*/ParsedAttr::AT_NSConsumed, |
||
7749 | /*NumArgs=*/0, |
||
7750 | /*OptArgs=*/0, |
||
7751 | /*NumArgMembers=*/0, |
||
7752 | /*HasCustomParsing=*/0, |
||
7753 | /*AcceptsExprPack=*/0, |
||
7754 | /*IsTargetSpecific=*/0, |
||
7755 | /*IsType=*/0, |
||
7756 | /*IsStmt=*/0, |
||
7757 | /*IsKnownToGCC=*/0, |
||
7758 | /*IsSupportedByPragmaAttribute=*/1, |
||
7759 | /*Spellings=*/NSConsumedSpellings, |
||
7760 | /*ArgNames=*/{}) {} |
||
7761 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7762 | if (!isa<ParmVarDecl>(D)) { |
||
7763 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7764 | << Attr << "parameters"; |
||
7765 | return false; |
||
7766 | } |
||
7767 | return true; |
||
7768 | } |
||
7769 | |||
7770 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7771 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7772 | << AL << St->getBeginLoc(); |
||
7773 | return false; |
||
7774 | } |
||
7775 | |||
7776 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7777 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
7778 | } |
||
7779 | |||
7780 | bool isParamExpr(size_t N) const override { |
||
7781 | return false; |
||
7782 | } |
||
7783 | |||
7784 | static const ParsedAttrInfoNSConsumed Instance; |
||
7785 | }; |
||
7786 | const ParsedAttrInfoNSConsumed ParsedAttrInfoNSConsumed::Instance; |
||
7787 | static constexpr ParsedAttrInfo::Spelling NSConsumesSelfSpellings[] = { |
||
7788 | {AttributeCommonInfo::AS_GNU, "ns_consumes_self"}, |
||
7789 | {AttributeCommonInfo::AS_CXX11, "clang::ns_consumes_self"}, |
||
7790 | {AttributeCommonInfo::AS_C2x, "clang::ns_consumes_self"}, |
||
7791 | }; |
||
7792 | struct ParsedAttrInfoNSConsumesSelf final : public ParsedAttrInfo { |
||
7793 | constexpr ParsedAttrInfoNSConsumesSelf() : ParsedAttrInfo( |
||
7794 | /*AttrKind=*/ParsedAttr::AT_NSConsumesSelf, |
||
7795 | /*NumArgs=*/0, |
||
7796 | /*OptArgs=*/0, |
||
7797 | /*NumArgMembers=*/0, |
||
7798 | /*HasCustomParsing=*/0, |
||
7799 | /*AcceptsExprPack=*/0, |
||
7800 | /*IsTargetSpecific=*/0, |
||
7801 | /*IsType=*/0, |
||
7802 | /*IsStmt=*/0, |
||
7803 | /*IsKnownToGCC=*/0, |
||
7804 | /*IsSupportedByPragmaAttribute=*/1, |
||
7805 | /*Spellings=*/NSConsumesSelfSpellings, |
||
7806 | /*ArgNames=*/{}) {} |
||
7807 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7808 | if (!isa<ObjCMethodDecl>(D)) { |
||
7809 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7810 | << Attr << "Objective-C methods"; |
||
7811 | return false; |
||
7812 | } |
||
7813 | return true; |
||
7814 | } |
||
7815 | |||
7816 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7817 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7818 | << AL << St->getBeginLoc(); |
||
7819 | return false; |
||
7820 | } |
||
7821 | |||
7822 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7823 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
7824 | } |
||
7825 | |||
7826 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
7827 | D->addAttr(::new (S.Context) NSConsumesSelfAttr(S.Context, Attr)); |
||
7828 | return AttributeApplied; |
||
7829 | } |
||
7830 | |||
7831 | bool isParamExpr(size_t N) const override { |
||
7832 | return false; |
||
7833 | } |
||
7834 | |||
7835 | static const ParsedAttrInfoNSConsumesSelf Instance; |
||
7836 | }; |
||
7837 | const ParsedAttrInfoNSConsumesSelf ParsedAttrInfoNSConsumesSelf::Instance; |
||
7838 | static constexpr ParsedAttrInfo::Spelling NSErrorDomainSpellings[] = { |
||
7839 | {AttributeCommonInfo::AS_GNU, "ns_error_domain"}, |
||
7840 | }; |
||
7841 | static constexpr const char *NSErrorDomainArgNames[] = { |
||
7842 | "ErrorDomain",}; |
||
7843 | struct ParsedAttrInfoNSErrorDomain final : public ParsedAttrInfo { |
||
7844 | constexpr ParsedAttrInfoNSErrorDomain() : ParsedAttrInfo( |
||
7845 | /*AttrKind=*/ParsedAttr::AT_NSErrorDomain, |
||
7846 | /*NumArgs=*/1, |
||
7847 | /*OptArgs=*/0, |
||
7848 | /*NumArgMembers=*/1, |
||
7849 | /*HasCustomParsing=*/0, |
||
7850 | /*AcceptsExprPack=*/0, |
||
7851 | /*IsTargetSpecific=*/0, |
||
7852 | /*IsType=*/0, |
||
7853 | /*IsStmt=*/0, |
||
7854 | /*IsKnownToGCC=*/0, |
||
7855 | /*IsSupportedByPragmaAttribute=*/1, |
||
7856 | /*Spellings=*/NSErrorDomainSpellings, |
||
7857 | /*ArgNames=*/NSErrorDomainArgNames) {} |
||
7858 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7859 | if (!isa<EnumDecl>(D)) { |
||
7860 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
7861 | << Attr << "enums"; |
||
7862 | return false; |
||
7863 | } |
||
7864 | return true; |
||
7865 | } |
||
7866 | |||
7867 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7868 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7869 | << AL << St->getBeginLoc(); |
||
7870 | return false; |
||
7871 | } |
||
7872 | |||
7873 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
7874 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true)); |
||
7875 | } |
||
7876 | |||
7877 | bool isParamExpr(size_t N) const override { |
||
7878 | return false; |
||
7879 | } |
||
7880 | |||
7881 | static const ParsedAttrInfoNSErrorDomain Instance; |
||
7882 | }; |
||
7883 | const ParsedAttrInfoNSErrorDomain ParsedAttrInfoNSErrorDomain::Instance; |
||
7884 | static constexpr ParsedAttrInfo::Spelling NSReturnsAutoreleasedSpellings[] = { |
||
7885 | {AttributeCommonInfo::AS_GNU, "ns_returns_autoreleased"}, |
||
7886 | {AttributeCommonInfo::AS_CXX11, "clang::ns_returns_autoreleased"}, |
||
7887 | {AttributeCommonInfo::AS_C2x, "clang::ns_returns_autoreleased"}, |
||
7888 | }; |
||
7889 | struct ParsedAttrInfoNSReturnsAutoreleased final : public ParsedAttrInfo { |
||
7890 | constexpr ParsedAttrInfoNSReturnsAutoreleased() : ParsedAttrInfo( |
||
7891 | /*AttrKind=*/ParsedAttr::AT_NSReturnsAutoreleased, |
||
7892 | /*NumArgs=*/0, |
||
7893 | /*OptArgs=*/0, |
||
7894 | /*NumArgMembers=*/0, |
||
7895 | /*HasCustomParsing=*/0, |
||
7896 | /*AcceptsExprPack=*/0, |
||
7897 | /*IsTargetSpecific=*/0, |
||
7898 | /*IsType=*/0, |
||
7899 | /*IsStmt=*/0, |
||
7900 | /*IsKnownToGCC=*/0, |
||
7901 | /*IsSupportedByPragmaAttribute=*/0, |
||
7902 | /*Spellings=*/NSReturnsAutoreleasedSpellings, |
||
7903 | /*ArgNames=*/{}) {} |
||
7904 | bool isParamExpr(size_t N) const override { |
||
7905 | return false; |
||
7906 | } |
||
7907 | |||
7908 | static const ParsedAttrInfoNSReturnsAutoreleased Instance; |
||
7909 | }; |
||
7910 | const ParsedAttrInfoNSReturnsAutoreleased ParsedAttrInfoNSReturnsAutoreleased::Instance; |
||
7911 | static constexpr ParsedAttrInfo::Spelling NSReturnsNotRetainedSpellings[] = { |
||
7912 | {AttributeCommonInfo::AS_GNU, "ns_returns_not_retained"}, |
||
7913 | {AttributeCommonInfo::AS_CXX11, "clang::ns_returns_not_retained"}, |
||
7914 | {AttributeCommonInfo::AS_C2x, "clang::ns_returns_not_retained"}, |
||
7915 | }; |
||
7916 | struct ParsedAttrInfoNSReturnsNotRetained final : public ParsedAttrInfo { |
||
7917 | constexpr ParsedAttrInfoNSReturnsNotRetained() : ParsedAttrInfo( |
||
7918 | /*AttrKind=*/ParsedAttr::AT_NSReturnsNotRetained, |
||
7919 | /*NumArgs=*/0, |
||
7920 | /*OptArgs=*/0, |
||
7921 | /*NumArgMembers=*/0, |
||
7922 | /*HasCustomParsing=*/0, |
||
7923 | /*AcceptsExprPack=*/0, |
||
7924 | /*IsTargetSpecific=*/0, |
||
7925 | /*IsType=*/0, |
||
7926 | /*IsStmt=*/0, |
||
7927 | /*IsKnownToGCC=*/0, |
||
7928 | /*IsSupportedByPragmaAttribute=*/0, |
||
7929 | /*Spellings=*/NSReturnsNotRetainedSpellings, |
||
7930 | /*ArgNames=*/{}) {} |
||
7931 | bool isParamExpr(size_t N) const override { |
||
7932 | return false; |
||
7933 | } |
||
7934 | |||
7935 | static const ParsedAttrInfoNSReturnsNotRetained Instance; |
||
7936 | }; |
||
7937 | const ParsedAttrInfoNSReturnsNotRetained ParsedAttrInfoNSReturnsNotRetained::Instance; |
||
7938 | static constexpr ParsedAttrInfo::Spelling NSReturnsRetainedSpellings[] = { |
||
7939 | {AttributeCommonInfo::AS_GNU, "ns_returns_retained"}, |
||
7940 | {AttributeCommonInfo::AS_CXX11, "clang::ns_returns_retained"}, |
||
7941 | {AttributeCommonInfo::AS_C2x, "clang::ns_returns_retained"}, |
||
7942 | }; |
||
7943 | struct ParsedAttrInfoNSReturnsRetained final : public ParsedAttrInfo { |
||
7944 | constexpr ParsedAttrInfoNSReturnsRetained() : ParsedAttrInfo( |
||
7945 | /*AttrKind=*/ParsedAttr::AT_NSReturnsRetained, |
||
7946 | /*NumArgs=*/0, |
||
7947 | /*OptArgs=*/0, |
||
7948 | /*NumArgMembers=*/0, |
||
7949 | /*HasCustomParsing=*/0, |
||
7950 | /*AcceptsExprPack=*/0, |
||
7951 | /*IsTargetSpecific=*/0, |
||
7952 | /*IsType=*/1, |
||
7953 | /*IsStmt=*/0, |
||
7954 | /*IsKnownToGCC=*/0, |
||
7955 | /*IsSupportedByPragmaAttribute=*/0, |
||
7956 | /*Spellings=*/NSReturnsRetainedSpellings, |
||
7957 | /*ArgNames=*/{}) {} |
||
7958 | bool isParamExpr(size_t N) const override { |
||
7959 | return false; |
||
7960 | } |
||
7961 | |||
7962 | static const ParsedAttrInfoNSReturnsRetained Instance; |
||
7963 | }; |
||
7964 | const ParsedAttrInfoNSReturnsRetained ParsedAttrInfoNSReturnsRetained::Instance; |
||
7965 | static constexpr ParsedAttrInfo::Spelling NakedSpellings[] = { |
||
7966 | {AttributeCommonInfo::AS_GNU, "naked"}, |
||
7967 | {AttributeCommonInfo::AS_CXX11, "gnu::naked"}, |
||
7968 | {AttributeCommonInfo::AS_C2x, "gnu::naked"}, |
||
7969 | {AttributeCommonInfo::AS_Declspec, "naked"}, |
||
7970 | }; |
||
7971 | struct ParsedAttrInfoNaked final : public ParsedAttrInfo { |
||
7972 | constexpr ParsedAttrInfoNaked() : ParsedAttrInfo( |
||
7973 | /*AttrKind=*/ParsedAttr::AT_Naked, |
||
7974 | /*NumArgs=*/0, |
||
7975 | /*OptArgs=*/0, |
||
7976 | /*NumArgMembers=*/0, |
||
7977 | /*HasCustomParsing=*/0, |
||
7978 | /*AcceptsExprPack=*/0, |
||
7979 | /*IsTargetSpecific=*/0, |
||
7980 | /*IsType=*/0, |
||
7981 | /*IsStmt=*/0, |
||
7982 | /*IsKnownToGCC=*/1, |
||
7983 | /*IsSupportedByPragmaAttribute=*/1, |
||
7984 | /*Spellings=*/NakedSpellings, |
||
7985 | /*ArgNames=*/{}) {} |
||
7986 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
7987 | if (!isa<FunctionDecl>(D)) { |
||
7988 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
7989 | << Attr << "functions"; |
||
7990 | return false; |
||
7991 | } |
||
7992 | return true; |
||
7993 | } |
||
7994 | |||
7995 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
7996 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
7997 | << AL << St->getBeginLoc(); |
||
7998 | return false; |
||
7999 | } |
||
8000 | |||
8001 | using ParsedAttrInfo::diagMutualExclusion; |
||
8002 | |||
8003 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
8004 | if (const auto *A = D->getAttr<DisableTailCallsAttr>()) { |
||
8005 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
8006 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
8007 | return false; |
||
8008 | } |
||
8009 | return true; |
||
8010 | } |
||
8011 | |||
8012 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8013 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8014 | } |
||
8015 | |||
8016 | bool isParamExpr(size_t N) const override { |
||
8017 | return false; |
||
8018 | } |
||
8019 | |||
8020 | static const ParsedAttrInfoNaked Instance; |
||
8021 | }; |
||
8022 | const ParsedAttrInfoNaked ParsedAttrInfoNaked::Instance; |
||
8023 | static constexpr ParsedAttrInfo::Spelling NeonPolyVectorTypeSpellings[] = { |
||
8024 | {AttributeCommonInfo::AS_GNU, "neon_polyvector_type"}, |
||
8025 | {AttributeCommonInfo::AS_CXX11, "clang::neon_polyvector_type"}, |
||
8026 | {AttributeCommonInfo::AS_C2x, "clang::neon_polyvector_type"}, |
||
8027 | }; |
||
8028 | static constexpr const char *NeonPolyVectorTypeArgNames[] = { |
||
8029 | "NumElements",}; |
||
8030 | struct ParsedAttrInfoNeonPolyVectorType final : public ParsedAttrInfo { |
||
8031 | constexpr ParsedAttrInfoNeonPolyVectorType() : ParsedAttrInfo( |
||
8032 | /*AttrKind=*/ParsedAttr::AT_NeonPolyVectorType, |
||
8033 | /*NumArgs=*/1, |
||
8034 | /*OptArgs=*/0, |
||
8035 | /*NumArgMembers=*/1, |
||
8036 | /*HasCustomParsing=*/0, |
||
8037 | /*AcceptsExprPack=*/0, |
||
8038 | /*IsTargetSpecific=*/0, |
||
8039 | /*IsType=*/1, |
||
8040 | /*IsStmt=*/0, |
||
8041 | /*IsKnownToGCC=*/0, |
||
8042 | /*IsSupportedByPragmaAttribute=*/0, |
||
8043 | /*Spellings=*/NeonPolyVectorTypeSpellings, |
||
8044 | /*ArgNames=*/NeonPolyVectorTypeArgNames) {} |
||
8045 | bool isParamExpr(size_t N) const override { |
||
8046 | return false; |
||
8047 | } |
||
8048 | |||
8049 | static const ParsedAttrInfoNeonPolyVectorType Instance; |
||
8050 | }; |
||
8051 | const ParsedAttrInfoNeonPolyVectorType ParsedAttrInfoNeonPolyVectorType::Instance; |
||
8052 | static constexpr ParsedAttrInfo::Spelling NeonVectorTypeSpellings[] = { |
||
8053 | {AttributeCommonInfo::AS_GNU, "neon_vector_type"}, |
||
8054 | {AttributeCommonInfo::AS_CXX11, "clang::neon_vector_type"}, |
||
8055 | {AttributeCommonInfo::AS_C2x, "clang::neon_vector_type"}, |
||
8056 | }; |
||
8057 | static constexpr const char *NeonVectorTypeArgNames[] = { |
||
8058 | "NumElements",}; |
||
8059 | struct ParsedAttrInfoNeonVectorType final : public ParsedAttrInfo { |
||
8060 | constexpr ParsedAttrInfoNeonVectorType() : ParsedAttrInfo( |
||
8061 | /*AttrKind=*/ParsedAttr::AT_NeonVectorType, |
||
8062 | /*NumArgs=*/1, |
||
8063 | /*OptArgs=*/0, |
||
8064 | /*NumArgMembers=*/1, |
||
8065 | /*HasCustomParsing=*/0, |
||
8066 | /*AcceptsExprPack=*/0, |
||
8067 | /*IsTargetSpecific=*/0, |
||
8068 | /*IsType=*/1, |
||
8069 | /*IsStmt=*/0, |
||
8070 | /*IsKnownToGCC=*/0, |
||
8071 | /*IsSupportedByPragmaAttribute=*/0, |
||
8072 | /*Spellings=*/NeonVectorTypeSpellings, |
||
8073 | /*ArgNames=*/NeonVectorTypeArgNames) {} |
||
8074 | bool isParamExpr(size_t N) const override { |
||
8075 | return false; |
||
8076 | } |
||
8077 | |||
8078 | static const ParsedAttrInfoNeonVectorType Instance; |
||
8079 | }; |
||
8080 | const ParsedAttrInfoNeonVectorType ParsedAttrInfoNeonVectorType::Instance; |
||
8081 | static constexpr ParsedAttrInfo::Spelling NoAliasSpellings[] = { |
||
8082 | {AttributeCommonInfo::AS_Declspec, "noalias"}, |
||
8083 | }; |
||
8084 | struct ParsedAttrInfoNoAlias final : public ParsedAttrInfo { |
||
8085 | constexpr ParsedAttrInfoNoAlias() : ParsedAttrInfo( |
||
8086 | /*AttrKind=*/ParsedAttr::AT_NoAlias, |
||
8087 | /*NumArgs=*/0, |
||
8088 | /*OptArgs=*/0, |
||
8089 | /*NumArgMembers=*/0, |
||
8090 | /*HasCustomParsing=*/0, |
||
8091 | /*AcceptsExprPack=*/0, |
||
8092 | /*IsTargetSpecific=*/0, |
||
8093 | /*IsType=*/0, |
||
8094 | /*IsStmt=*/0, |
||
8095 | /*IsKnownToGCC=*/0, |
||
8096 | /*IsSupportedByPragmaAttribute=*/0, |
||
8097 | /*Spellings=*/NoAliasSpellings, |
||
8098 | /*ArgNames=*/{}) {} |
||
8099 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8100 | if (!isa<FunctionDecl>(D)) { |
||
8101 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8102 | << Attr << "functions"; |
||
8103 | return false; |
||
8104 | } |
||
8105 | return true; |
||
8106 | } |
||
8107 | |||
8108 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8109 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8110 | << AL << St->getBeginLoc(); |
||
8111 | return false; |
||
8112 | } |
||
8113 | |||
8114 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8115 | D->addAttr(::new (S.Context) NoAliasAttr(S.Context, Attr)); |
||
8116 | return AttributeApplied; |
||
8117 | } |
||
8118 | |||
8119 | bool isParamExpr(size_t N) const override { |
||
8120 | return false; |
||
8121 | } |
||
8122 | |||
8123 | static const ParsedAttrInfoNoAlias Instance; |
||
8124 | }; |
||
8125 | const ParsedAttrInfoNoAlias ParsedAttrInfoNoAlias::Instance; |
||
8126 | static constexpr ParsedAttrInfo::Spelling NoBuiltinSpellings[] = { |
||
8127 | {AttributeCommonInfo::AS_GNU, "no_builtin"}, |
||
8128 | {AttributeCommonInfo::AS_CXX11, "clang::no_builtin"}, |
||
8129 | {AttributeCommonInfo::AS_C2x, "clang::no_builtin"}, |
||
8130 | }; |
||
8131 | static constexpr const char *NoBuiltinArgNames[] = { |
||
8132 | "BuiltinNames...",}; |
||
8133 | struct ParsedAttrInfoNoBuiltin final : public ParsedAttrInfo { |
||
8134 | constexpr ParsedAttrInfoNoBuiltin() : ParsedAttrInfo( |
||
8135 | /*AttrKind=*/ParsedAttr::AT_NoBuiltin, |
||
8136 | /*NumArgs=*/0, |
||
8137 | /*OptArgs=*/15, |
||
8138 | /*NumArgMembers=*/1, |
||
8139 | /*HasCustomParsing=*/0, |
||
8140 | /*AcceptsExprPack=*/0, |
||
8141 | /*IsTargetSpecific=*/0, |
||
8142 | /*IsType=*/0, |
||
8143 | /*IsStmt=*/0, |
||
8144 | /*IsKnownToGCC=*/0, |
||
8145 | /*IsSupportedByPragmaAttribute=*/1, |
||
8146 | /*Spellings=*/NoBuiltinSpellings, |
||
8147 | /*ArgNames=*/NoBuiltinArgNames) {} |
||
8148 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8149 | if (!isa<FunctionDecl>(D)) { |
||
8150 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8151 | << Attr << "functions"; |
||
8152 | return false; |
||
8153 | } |
||
8154 | return true; |
||
8155 | } |
||
8156 | |||
8157 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8158 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8159 | << AL << St->getBeginLoc(); |
||
8160 | return false; |
||
8161 | } |
||
8162 | |||
8163 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8164 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8165 | } |
||
8166 | |||
8167 | bool isParamExpr(size_t N) const override { |
||
8168 | return false; |
||
8169 | } |
||
8170 | |||
8171 | static const ParsedAttrInfoNoBuiltin Instance; |
||
8172 | }; |
||
8173 | const ParsedAttrInfoNoBuiltin ParsedAttrInfoNoBuiltin::Instance; |
||
8174 | static constexpr ParsedAttrInfo::Spelling NoCommonSpellings[] = { |
||
8175 | {AttributeCommonInfo::AS_GNU, "nocommon"}, |
||
8176 | {AttributeCommonInfo::AS_CXX11, "gnu::nocommon"}, |
||
8177 | {AttributeCommonInfo::AS_C2x, "gnu::nocommon"}, |
||
8178 | }; |
||
8179 | struct ParsedAttrInfoNoCommon final : public ParsedAttrInfo { |
||
8180 | constexpr ParsedAttrInfoNoCommon() : ParsedAttrInfo( |
||
8181 | /*AttrKind=*/ParsedAttr::AT_NoCommon, |
||
8182 | /*NumArgs=*/0, |
||
8183 | /*OptArgs=*/0, |
||
8184 | /*NumArgMembers=*/0, |
||
8185 | /*HasCustomParsing=*/0, |
||
8186 | /*AcceptsExprPack=*/0, |
||
8187 | /*IsTargetSpecific=*/0, |
||
8188 | /*IsType=*/0, |
||
8189 | /*IsStmt=*/0, |
||
8190 | /*IsKnownToGCC=*/1, |
||
8191 | /*IsSupportedByPragmaAttribute=*/1, |
||
8192 | /*Spellings=*/NoCommonSpellings, |
||
8193 | /*ArgNames=*/{}) {} |
||
8194 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8195 | if (!isa<VarDecl>(D)) { |
||
8196 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8197 | << Attr << "variables"; |
||
8198 | return false; |
||
8199 | } |
||
8200 | return true; |
||
8201 | } |
||
8202 | |||
8203 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8204 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8205 | << AL << St->getBeginLoc(); |
||
8206 | return false; |
||
8207 | } |
||
8208 | |||
8209 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8210 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
8211 | } |
||
8212 | |||
8213 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8214 | D->addAttr(::new (S.Context) NoCommonAttr(S.Context, Attr)); |
||
8215 | return AttributeApplied; |
||
8216 | } |
||
8217 | |||
8218 | bool isParamExpr(size_t N) const override { |
||
8219 | return false; |
||
8220 | } |
||
8221 | |||
8222 | static const ParsedAttrInfoNoCommon Instance; |
||
8223 | }; |
||
8224 | const ParsedAttrInfoNoCommon ParsedAttrInfoNoCommon::Instance; |
||
8225 | static constexpr ParsedAttrInfo::Spelling NoDebugSpellings[] = { |
||
8226 | {AttributeCommonInfo::AS_GNU, "nodebug"}, |
||
8227 | {AttributeCommonInfo::AS_CXX11, "gnu::nodebug"}, |
||
8228 | {AttributeCommonInfo::AS_C2x, "gnu::nodebug"}, |
||
8229 | }; |
||
8230 | struct ParsedAttrInfoNoDebug final : public ParsedAttrInfo { |
||
8231 | constexpr ParsedAttrInfoNoDebug() : ParsedAttrInfo( |
||
8232 | /*AttrKind=*/ParsedAttr::AT_NoDebug, |
||
8233 | /*NumArgs=*/0, |
||
8234 | /*OptArgs=*/0, |
||
8235 | /*NumArgMembers=*/0, |
||
8236 | /*HasCustomParsing=*/0, |
||
8237 | /*AcceptsExprPack=*/0, |
||
8238 | /*IsTargetSpecific=*/0, |
||
8239 | /*IsType=*/0, |
||
8240 | /*IsStmt=*/0, |
||
8241 | /*IsKnownToGCC=*/1, |
||
8242 | /*IsSupportedByPragmaAttribute=*/1, |
||
8243 | /*Spellings=*/NoDebugSpellings, |
||
8244 | /*ArgNames=*/{}) {} |
||
8245 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8246 | if (!isa<TypedefNameDecl>(D) && !isFunctionLike(D) && !isa<ObjCMethodDecl>(D) && !isNonParmVar(D)) { |
||
8247 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8248 | << Attr << "typedefs, functions, function pointers, Objective-C methods, and variables"; |
||
8249 | return false; |
||
8250 | } |
||
8251 | return true; |
||
8252 | } |
||
8253 | |||
8254 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8255 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8256 | << AL << St->getBeginLoc(); |
||
8257 | return false; |
||
8258 | } |
||
8259 | |||
8260 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8261 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
8262 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true)); |
||
8263 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
8264 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_not_is_parameter, /*IsSupported=*/true)); |
||
8265 | } |
||
8266 | |||
8267 | bool isParamExpr(size_t N) const override { |
||
8268 | return false; |
||
8269 | } |
||
8270 | |||
8271 | static const ParsedAttrInfoNoDebug Instance; |
||
8272 | }; |
||
8273 | const ParsedAttrInfoNoDebug ParsedAttrInfoNoDebug::Instance; |
||
8274 | static constexpr ParsedAttrInfo::Spelling NoDerefSpellings[] = { |
||
8275 | {AttributeCommonInfo::AS_GNU, "noderef"}, |
||
8276 | {AttributeCommonInfo::AS_CXX11, "clang::noderef"}, |
||
8277 | {AttributeCommonInfo::AS_C2x, "clang::noderef"}, |
||
8278 | }; |
||
8279 | struct ParsedAttrInfoNoDeref final : public ParsedAttrInfo { |
||
8280 | constexpr ParsedAttrInfoNoDeref() : ParsedAttrInfo( |
||
8281 | /*AttrKind=*/ParsedAttr::AT_NoDeref, |
||
8282 | /*NumArgs=*/0, |
||
8283 | /*OptArgs=*/0, |
||
8284 | /*NumArgMembers=*/0, |
||
8285 | /*HasCustomParsing=*/0, |
||
8286 | /*AcceptsExprPack=*/0, |
||
8287 | /*IsTargetSpecific=*/0, |
||
8288 | /*IsType=*/1, |
||
8289 | /*IsStmt=*/0, |
||
8290 | /*IsKnownToGCC=*/0, |
||
8291 | /*IsSupportedByPragmaAttribute=*/0, |
||
8292 | /*Spellings=*/NoDerefSpellings, |
||
8293 | /*ArgNames=*/{}) {} |
||
8294 | bool isParamExpr(size_t N) const override { |
||
8295 | return false; |
||
8296 | } |
||
8297 | |||
8298 | static const ParsedAttrInfoNoDeref Instance; |
||
8299 | }; |
||
8300 | const ParsedAttrInfoNoDeref ParsedAttrInfoNoDeref::Instance; |
||
8301 | static constexpr ParsedAttrInfo::Spelling NoDestroySpellings[] = { |
||
8302 | {AttributeCommonInfo::AS_GNU, "no_destroy"}, |
||
8303 | {AttributeCommonInfo::AS_CXX11, "clang::no_destroy"}, |
||
8304 | }; |
||
8305 | struct ParsedAttrInfoNoDestroy final : public ParsedAttrInfo { |
||
8306 | constexpr ParsedAttrInfoNoDestroy() : ParsedAttrInfo( |
||
8307 | /*AttrKind=*/ParsedAttr::AT_NoDestroy, |
||
8308 | /*NumArgs=*/0, |
||
8309 | /*OptArgs=*/0, |
||
8310 | /*NumArgMembers=*/0, |
||
8311 | /*HasCustomParsing=*/0, |
||
8312 | /*AcceptsExprPack=*/0, |
||
8313 | /*IsTargetSpecific=*/0, |
||
8314 | /*IsType=*/0, |
||
8315 | /*IsStmt=*/0, |
||
8316 | /*IsKnownToGCC=*/0, |
||
8317 | /*IsSupportedByPragmaAttribute=*/1, |
||
8318 | /*Spellings=*/NoDestroySpellings, |
||
8319 | /*ArgNames=*/{}) {} |
||
8320 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8321 | if (!isa<VarDecl>(D)) { |
||
8322 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8323 | << Attr << "variables"; |
||
8324 | return false; |
||
8325 | } |
||
8326 | return true; |
||
8327 | } |
||
8328 | |||
8329 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8330 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8331 | << AL << St->getBeginLoc(); |
||
8332 | return false; |
||
8333 | } |
||
8334 | |||
8335 | using ParsedAttrInfo::diagMutualExclusion; |
||
8336 | |||
8337 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
8338 | if (const auto *A = D->getAttr<AlwaysDestroyAttr>()) { |
||
8339 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
8340 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
8341 | return false; |
||
8342 | } |
||
8343 | return true; |
||
8344 | } |
||
8345 | |||
8346 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8347 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
8348 | } |
||
8349 | |||
8350 | bool isParamExpr(size_t N) const override { |
||
8351 | return false; |
||
8352 | } |
||
8353 | |||
8354 | static const ParsedAttrInfoNoDestroy Instance; |
||
8355 | }; |
||
8356 | const ParsedAttrInfoNoDestroy ParsedAttrInfoNoDestroy::Instance; |
||
8357 | static constexpr ParsedAttrInfo::Spelling NoDuplicateSpellings[] = { |
||
8358 | {AttributeCommonInfo::AS_GNU, "noduplicate"}, |
||
8359 | {AttributeCommonInfo::AS_CXX11, "clang::noduplicate"}, |
||
8360 | {AttributeCommonInfo::AS_C2x, "clang::noduplicate"}, |
||
8361 | }; |
||
8362 | struct ParsedAttrInfoNoDuplicate final : public ParsedAttrInfo { |
||
8363 | constexpr ParsedAttrInfoNoDuplicate() : ParsedAttrInfo( |
||
8364 | /*AttrKind=*/ParsedAttr::AT_NoDuplicate, |
||
8365 | /*NumArgs=*/0, |
||
8366 | /*OptArgs=*/0, |
||
8367 | /*NumArgMembers=*/0, |
||
8368 | /*HasCustomParsing=*/0, |
||
8369 | /*AcceptsExprPack=*/0, |
||
8370 | /*IsTargetSpecific=*/0, |
||
8371 | /*IsType=*/0, |
||
8372 | /*IsStmt=*/0, |
||
8373 | /*IsKnownToGCC=*/0, |
||
8374 | /*IsSupportedByPragmaAttribute=*/1, |
||
8375 | /*Spellings=*/NoDuplicateSpellings, |
||
8376 | /*ArgNames=*/{}) {} |
||
8377 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8378 | if (!isa<FunctionDecl>(D)) { |
||
8379 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8380 | << Attr << "functions"; |
||
8381 | return false; |
||
8382 | } |
||
8383 | return true; |
||
8384 | } |
||
8385 | |||
8386 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8387 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8388 | << AL << St->getBeginLoc(); |
||
8389 | return false; |
||
8390 | } |
||
8391 | |||
8392 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8393 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8394 | } |
||
8395 | |||
8396 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8397 | D->addAttr(::new (S.Context) NoDuplicateAttr(S.Context, Attr)); |
||
8398 | return AttributeApplied; |
||
8399 | } |
||
8400 | |||
8401 | bool isParamExpr(size_t N) const override { |
||
8402 | return false; |
||
8403 | } |
||
8404 | |||
8405 | static const ParsedAttrInfoNoDuplicate Instance; |
||
8406 | }; |
||
8407 | const ParsedAttrInfoNoDuplicate ParsedAttrInfoNoDuplicate::Instance; |
||
8408 | static constexpr ParsedAttrInfo::Spelling NoEscapeSpellings[] = { |
||
8409 | {AttributeCommonInfo::AS_GNU, "noescape"}, |
||
8410 | {AttributeCommonInfo::AS_CXX11, "clang::noescape"}, |
||
8411 | {AttributeCommonInfo::AS_C2x, "clang::noescape"}, |
||
8412 | }; |
||
8413 | struct ParsedAttrInfoNoEscape final : public ParsedAttrInfo { |
||
8414 | constexpr ParsedAttrInfoNoEscape() : ParsedAttrInfo( |
||
8415 | /*AttrKind=*/ParsedAttr::AT_NoEscape, |
||
8416 | /*NumArgs=*/0, |
||
8417 | /*OptArgs=*/0, |
||
8418 | /*NumArgMembers=*/0, |
||
8419 | /*HasCustomParsing=*/0, |
||
8420 | /*AcceptsExprPack=*/0, |
||
8421 | /*IsTargetSpecific=*/0, |
||
8422 | /*IsType=*/0, |
||
8423 | /*IsStmt=*/0, |
||
8424 | /*IsKnownToGCC=*/0, |
||
8425 | /*IsSupportedByPragmaAttribute=*/1, |
||
8426 | /*Spellings=*/NoEscapeSpellings, |
||
8427 | /*ArgNames=*/{}) {} |
||
8428 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8429 | if (!isa<ParmVarDecl>(D)) { |
||
8430 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8431 | << Attr << "parameters"; |
||
8432 | return false; |
||
8433 | } |
||
8434 | return true; |
||
8435 | } |
||
8436 | |||
8437 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8438 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8439 | << AL << St->getBeginLoc(); |
||
8440 | return false; |
||
8441 | } |
||
8442 | |||
8443 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8444 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
8445 | } |
||
8446 | |||
8447 | bool isParamExpr(size_t N) const override { |
||
8448 | return false; |
||
8449 | } |
||
8450 | |||
8451 | static const ParsedAttrInfoNoEscape Instance; |
||
8452 | }; |
||
8453 | const ParsedAttrInfoNoEscape ParsedAttrInfoNoEscape::Instance; |
||
8454 | static constexpr ParsedAttrInfo::Spelling NoInlineSpellings[] = { |
||
8455 | {AttributeCommonInfo::AS_Keyword, "__noinline__"}, |
||
8456 | {AttributeCommonInfo::AS_GNU, "noinline"}, |
||
8457 | {AttributeCommonInfo::AS_CXX11, "gnu::noinline"}, |
||
8458 | {AttributeCommonInfo::AS_C2x, "gnu::noinline"}, |
||
8459 | {AttributeCommonInfo::AS_CXX11, "clang::noinline"}, |
||
8460 | {AttributeCommonInfo::AS_C2x, "clang::noinline"}, |
||
8461 | {AttributeCommonInfo::AS_Declspec, "noinline"}, |
||
8462 | }; |
||
8463 | struct ParsedAttrInfoNoInline final : public ParsedAttrInfo { |
||
8464 | constexpr ParsedAttrInfoNoInline() : ParsedAttrInfo( |
||
8465 | /*AttrKind=*/ParsedAttr::AT_NoInline, |
||
8466 | /*NumArgs=*/0, |
||
8467 | /*OptArgs=*/0, |
||
8468 | /*NumArgMembers=*/0, |
||
8469 | /*HasCustomParsing=*/0, |
||
8470 | /*AcceptsExprPack=*/0, |
||
8471 | /*IsTargetSpecific=*/0, |
||
8472 | /*IsType=*/0, |
||
8473 | /*IsStmt=*/1, |
||
8474 | /*IsKnownToGCC=*/1, |
||
8475 | /*IsSupportedByPragmaAttribute=*/1, |
||
8476 | /*Spellings=*/NoInlineSpellings, |
||
8477 | /*ArgNames=*/{}) {} |
||
8478 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8479 | if (!isa<FunctionDecl>(D)) { |
||
8480 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8481 | << Attr << "functions and statements"; |
||
8482 | return false; |
||
8483 | } |
||
8484 | return true; |
||
8485 | } |
||
8486 | |||
8487 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override { |
||
8488 | if (!isa<Stmt>(St)) { |
||
8489 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8490 | << Attr << "functions and statements"; |
||
8491 | return false; |
||
8492 | } |
||
8493 | return true; |
||
8494 | } |
||
8495 | |||
8496 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8497 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8498 | } |
||
8499 | |||
8500 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8501 | D->addAttr(::new (S.Context) NoInlineAttr(S.Context, Attr)); |
||
8502 | return AttributeApplied; |
||
8503 | } |
||
8504 | |||
8505 | bool isParamExpr(size_t N) const override { |
||
8506 | return false; |
||
8507 | } |
||
8508 | |||
8509 | static const ParsedAttrInfoNoInline Instance; |
||
8510 | }; |
||
8511 | const ParsedAttrInfoNoInline ParsedAttrInfoNoInline::Instance; |
||
8512 | static constexpr ParsedAttrInfo::Spelling NoInstrumentFunctionSpellings[] = { |
||
8513 | {AttributeCommonInfo::AS_GNU, "no_instrument_function"}, |
||
8514 | {AttributeCommonInfo::AS_CXX11, "gnu::no_instrument_function"}, |
||
8515 | {AttributeCommonInfo::AS_C2x, "gnu::no_instrument_function"}, |
||
8516 | }; |
||
8517 | struct ParsedAttrInfoNoInstrumentFunction final : public ParsedAttrInfo { |
||
8518 | constexpr ParsedAttrInfoNoInstrumentFunction() : ParsedAttrInfo( |
||
8519 | /*AttrKind=*/ParsedAttr::AT_NoInstrumentFunction, |
||
8520 | /*NumArgs=*/0, |
||
8521 | /*OptArgs=*/0, |
||
8522 | /*NumArgMembers=*/0, |
||
8523 | /*HasCustomParsing=*/0, |
||
8524 | /*AcceptsExprPack=*/0, |
||
8525 | /*IsTargetSpecific=*/0, |
||
8526 | /*IsType=*/0, |
||
8527 | /*IsStmt=*/0, |
||
8528 | /*IsKnownToGCC=*/1, |
||
8529 | /*IsSupportedByPragmaAttribute=*/1, |
||
8530 | /*Spellings=*/NoInstrumentFunctionSpellings, |
||
8531 | /*ArgNames=*/{}) {} |
||
8532 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8533 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
8534 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8535 | << Attr << "functions and Objective-C methods"; |
||
8536 | return false; |
||
8537 | } |
||
8538 | return true; |
||
8539 | } |
||
8540 | |||
8541 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8542 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8543 | << AL << St->getBeginLoc(); |
||
8544 | return false; |
||
8545 | } |
||
8546 | |||
8547 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8548 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8549 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
8550 | } |
||
8551 | |||
8552 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8553 | D->addAttr(::new (S.Context) NoInstrumentFunctionAttr(S.Context, Attr)); |
||
8554 | return AttributeApplied; |
||
8555 | } |
||
8556 | |||
8557 | bool isParamExpr(size_t N) const override { |
||
8558 | return false; |
||
8559 | } |
||
8560 | |||
8561 | static const ParsedAttrInfoNoInstrumentFunction Instance; |
||
8562 | }; |
||
8563 | const ParsedAttrInfoNoInstrumentFunction ParsedAttrInfoNoInstrumentFunction::Instance; |
||
8564 | static constexpr ParsedAttrInfo::Spelling NoMergeSpellings[] = { |
||
8565 | {AttributeCommonInfo::AS_GNU, "nomerge"}, |
||
8566 | {AttributeCommonInfo::AS_CXX11, "clang::nomerge"}, |
||
8567 | {AttributeCommonInfo::AS_C2x, "clang::nomerge"}, |
||
8568 | }; |
||
8569 | struct ParsedAttrInfoNoMerge final : public ParsedAttrInfo { |
||
8570 | constexpr ParsedAttrInfoNoMerge() : ParsedAttrInfo( |
||
8571 | /*AttrKind=*/ParsedAttr::AT_NoMerge, |
||
8572 | /*NumArgs=*/0, |
||
8573 | /*OptArgs=*/0, |
||
8574 | /*NumArgMembers=*/0, |
||
8575 | /*HasCustomParsing=*/0, |
||
8576 | /*AcceptsExprPack=*/0, |
||
8577 | /*IsTargetSpecific=*/0, |
||
8578 | /*IsType=*/0, |
||
8579 | /*IsStmt=*/1, |
||
8580 | /*IsKnownToGCC=*/0, |
||
8581 | /*IsSupportedByPragmaAttribute=*/1, |
||
8582 | /*Spellings=*/NoMergeSpellings, |
||
8583 | /*ArgNames=*/{}) {} |
||
8584 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8585 | if (!isa<FunctionDecl>(D)) { |
||
8586 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8587 | << Attr << "functions and statements"; |
||
8588 | return false; |
||
8589 | } |
||
8590 | return true; |
||
8591 | } |
||
8592 | |||
8593 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override { |
||
8594 | if (!isa<Stmt>(St)) { |
||
8595 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8596 | << Attr << "functions and statements"; |
||
8597 | return false; |
||
8598 | } |
||
8599 | return true; |
||
8600 | } |
||
8601 | |||
8602 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8603 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8604 | } |
||
8605 | |||
8606 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8607 | D->addAttr(::new (S.Context) NoMergeAttr(S.Context, Attr)); |
||
8608 | return AttributeApplied; |
||
8609 | } |
||
8610 | |||
8611 | bool isParamExpr(size_t N) const override { |
||
8612 | return false; |
||
8613 | } |
||
8614 | |||
8615 | static const ParsedAttrInfoNoMerge Instance; |
||
8616 | }; |
||
8617 | const ParsedAttrInfoNoMerge ParsedAttrInfoNoMerge::Instance; |
||
8618 | static constexpr ParsedAttrInfo::Spelling NoMicroMipsSpellings[] = { |
||
8619 | {AttributeCommonInfo::AS_GNU, "nomicromips"}, |
||
8620 | {AttributeCommonInfo::AS_CXX11, "gnu::nomicromips"}, |
||
8621 | {AttributeCommonInfo::AS_C2x, "gnu::nomicromips"}, |
||
8622 | }; |
||
8623 | struct ParsedAttrInfoNoMicroMips final : public ParsedAttrInfo { |
||
8624 | constexpr ParsedAttrInfoNoMicroMips() : ParsedAttrInfo( |
||
8625 | /*AttrKind=*/ParsedAttr::AT_NoMicroMips, |
||
8626 | /*NumArgs=*/0, |
||
8627 | /*OptArgs=*/0, |
||
8628 | /*NumArgMembers=*/0, |
||
8629 | /*HasCustomParsing=*/0, |
||
8630 | /*AcceptsExprPack=*/0, |
||
8631 | /*IsTargetSpecific=*/1, |
||
8632 | /*IsType=*/0, |
||
8633 | /*IsStmt=*/0, |
||
8634 | /*IsKnownToGCC=*/1, |
||
8635 | /*IsSupportedByPragmaAttribute=*/1, |
||
8636 | /*Spellings=*/NoMicroMipsSpellings, |
||
8637 | /*ArgNames=*/{}) {} |
||
8638 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8639 | if (!isa<FunctionDecl>(D)) { |
||
8640 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8641 | << Attr << "functions"; |
||
8642 | return false; |
||
8643 | } |
||
8644 | return true; |
||
8645 | } |
||
8646 | |||
8647 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8648 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8649 | << AL << St->getBeginLoc(); |
||
8650 | return false; |
||
8651 | } |
||
8652 | |||
8653 | bool existsInTarget(const TargetInfo &Target) const override { |
||
8654 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
8655 | return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel); |
||
8656 | } |
||
8657 | |||
8658 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8659 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8660 | } |
||
8661 | |||
8662 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8663 | D->addAttr(::new (S.Context) NoMicroMipsAttr(S.Context, Attr)); |
||
8664 | return AttributeApplied; |
||
8665 | } |
||
8666 | |||
8667 | bool isParamExpr(size_t N) const override { |
||
8668 | return false; |
||
8669 | } |
||
8670 | |||
8671 | static const ParsedAttrInfoNoMicroMips Instance; |
||
8672 | }; |
||
8673 | const ParsedAttrInfoNoMicroMips ParsedAttrInfoNoMicroMips::Instance; |
||
8674 | static constexpr ParsedAttrInfo::Spelling NoMips16Spellings[] = { |
||
8675 | {AttributeCommonInfo::AS_GNU, "nomips16"}, |
||
8676 | {AttributeCommonInfo::AS_CXX11, "gnu::nomips16"}, |
||
8677 | {AttributeCommonInfo::AS_C2x, "gnu::nomips16"}, |
||
8678 | }; |
||
8679 | struct ParsedAttrInfoNoMips16 final : public ParsedAttrInfo { |
||
8680 | constexpr ParsedAttrInfoNoMips16() : ParsedAttrInfo( |
||
8681 | /*AttrKind=*/ParsedAttr::AT_NoMips16, |
||
8682 | /*NumArgs=*/0, |
||
8683 | /*OptArgs=*/0, |
||
8684 | /*NumArgMembers=*/0, |
||
8685 | /*HasCustomParsing=*/0, |
||
8686 | /*AcceptsExprPack=*/0, |
||
8687 | /*IsTargetSpecific=*/1, |
||
8688 | /*IsType=*/0, |
||
8689 | /*IsStmt=*/0, |
||
8690 | /*IsKnownToGCC=*/1, |
||
8691 | /*IsSupportedByPragmaAttribute=*/1, |
||
8692 | /*Spellings=*/NoMips16Spellings, |
||
8693 | /*ArgNames=*/{}) {} |
||
8694 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8695 | if (!isa<FunctionDecl>(D)) { |
||
8696 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8697 | << Attr << "functions"; |
||
8698 | return false; |
||
8699 | } |
||
8700 | return true; |
||
8701 | } |
||
8702 | |||
8703 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8704 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8705 | << AL << St->getBeginLoc(); |
||
8706 | return false; |
||
8707 | } |
||
8708 | |||
8709 | bool existsInTarget(const TargetInfo &Target) const override { |
||
8710 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
8711 | return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel); |
||
8712 | } |
||
8713 | |||
8714 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8715 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8716 | } |
||
8717 | |||
8718 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8719 | D->addAttr(::new (S.Context) NoMips16Attr(S.Context, Attr)); |
||
8720 | return AttributeApplied; |
||
8721 | } |
||
8722 | |||
8723 | bool isParamExpr(size_t N) const override { |
||
8724 | return false; |
||
8725 | } |
||
8726 | |||
8727 | static const ParsedAttrInfoNoMips16 Instance; |
||
8728 | }; |
||
8729 | const ParsedAttrInfoNoMips16 ParsedAttrInfoNoMips16::Instance; |
||
8730 | static constexpr ParsedAttrInfo::Spelling NoProfileFunctionSpellings[] = { |
||
8731 | {AttributeCommonInfo::AS_GNU, "no_profile_instrument_function"}, |
||
8732 | {AttributeCommonInfo::AS_CXX11, "gnu::no_profile_instrument_function"}, |
||
8733 | {AttributeCommonInfo::AS_C2x, "gnu::no_profile_instrument_function"}, |
||
8734 | }; |
||
8735 | struct ParsedAttrInfoNoProfileFunction final : public ParsedAttrInfo { |
||
8736 | constexpr ParsedAttrInfoNoProfileFunction() : ParsedAttrInfo( |
||
8737 | /*AttrKind=*/ParsedAttr::AT_NoProfileFunction, |
||
8738 | /*NumArgs=*/0, |
||
8739 | /*OptArgs=*/0, |
||
8740 | /*NumArgMembers=*/0, |
||
8741 | /*HasCustomParsing=*/0, |
||
8742 | /*AcceptsExprPack=*/0, |
||
8743 | /*IsTargetSpecific=*/0, |
||
8744 | /*IsType=*/0, |
||
8745 | /*IsStmt=*/0, |
||
8746 | /*IsKnownToGCC=*/1, |
||
8747 | /*IsSupportedByPragmaAttribute=*/1, |
||
8748 | /*Spellings=*/NoProfileFunctionSpellings, |
||
8749 | /*ArgNames=*/{}) {} |
||
8750 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8751 | if (!isa<FunctionDecl>(D)) { |
||
8752 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8753 | << Attr << "functions"; |
||
8754 | return false; |
||
8755 | } |
||
8756 | return true; |
||
8757 | } |
||
8758 | |||
8759 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8760 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8761 | << AL << St->getBeginLoc(); |
||
8762 | return false; |
||
8763 | } |
||
8764 | |||
8765 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8766 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8767 | } |
||
8768 | |||
8769 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
8770 | D->addAttr(::new (S.Context) NoProfileFunctionAttr(S.Context, Attr)); |
||
8771 | return AttributeApplied; |
||
8772 | } |
||
8773 | |||
8774 | bool isParamExpr(size_t N) const override { |
||
8775 | return false; |
||
8776 | } |
||
8777 | |||
8778 | static const ParsedAttrInfoNoProfileFunction Instance; |
||
8779 | }; |
||
8780 | const ParsedAttrInfoNoProfileFunction ParsedAttrInfoNoProfileFunction::Instance; |
||
8781 | static constexpr ParsedAttrInfo::Spelling NoRandomizeLayoutSpellings[] = { |
||
8782 | {AttributeCommonInfo::AS_GNU, "no_randomize_layout"}, |
||
8783 | {AttributeCommonInfo::AS_CXX11, "gnu::no_randomize_layout"}, |
||
8784 | {AttributeCommonInfo::AS_C2x, "gnu::no_randomize_layout"}, |
||
8785 | }; |
||
8786 | struct ParsedAttrInfoNoRandomizeLayout final : public ParsedAttrInfo { |
||
8787 | constexpr ParsedAttrInfoNoRandomizeLayout() : ParsedAttrInfo( |
||
8788 | /*AttrKind=*/ParsedAttr::AT_NoRandomizeLayout, |
||
8789 | /*NumArgs=*/0, |
||
8790 | /*OptArgs=*/0, |
||
8791 | /*NumArgMembers=*/0, |
||
8792 | /*HasCustomParsing=*/0, |
||
8793 | /*AcceptsExprPack=*/0, |
||
8794 | /*IsTargetSpecific=*/0, |
||
8795 | /*IsType=*/0, |
||
8796 | /*IsStmt=*/0, |
||
8797 | /*IsKnownToGCC=*/1, |
||
8798 | /*IsSupportedByPragmaAttribute=*/1, |
||
8799 | /*Spellings=*/NoRandomizeLayoutSpellings, |
||
8800 | /*ArgNames=*/{}) {} |
||
8801 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8802 | if (!isa<RecordDecl>(D)) { |
||
8803 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
8804 | << Attr << "structs, unions, and classes"; |
||
8805 | return false; |
||
8806 | } |
||
8807 | return true; |
||
8808 | } |
||
8809 | |||
8810 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8811 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8812 | << AL << St->getBeginLoc(); |
||
8813 | return false; |
||
8814 | } |
||
8815 | |||
8816 | using ParsedAttrInfo::diagMutualExclusion; |
||
8817 | |||
8818 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
8819 | if (const auto *A = D->getAttr<RandomizeLayoutAttr>()) { |
||
8820 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
8821 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
8822 | return false; |
||
8823 | } |
||
8824 | return true; |
||
8825 | } |
||
8826 | |||
8827 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
8828 | return (!LangOpts.CPlusPlus); |
||
8829 | } |
||
8830 | |||
8831 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8832 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
8833 | } |
||
8834 | |||
8835 | bool isParamExpr(size_t N) const override { |
||
8836 | return false; |
||
8837 | } |
||
8838 | |||
8839 | static const ParsedAttrInfoNoRandomizeLayout Instance; |
||
8840 | }; |
||
8841 | const ParsedAttrInfoNoRandomizeLayout ParsedAttrInfoNoRandomizeLayout::Instance; |
||
8842 | static constexpr ParsedAttrInfo::Spelling NoReturnSpellings[] = { |
||
8843 | {AttributeCommonInfo::AS_GNU, "noreturn"}, |
||
8844 | {AttributeCommonInfo::AS_CXX11, "gnu::noreturn"}, |
||
8845 | {AttributeCommonInfo::AS_C2x, "gnu::noreturn"}, |
||
8846 | {AttributeCommonInfo::AS_Declspec, "noreturn"}, |
||
8847 | }; |
||
8848 | struct ParsedAttrInfoNoReturn final : public ParsedAttrInfo { |
||
8849 | constexpr ParsedAttrInfoNoReturn() : ParsedAttrInfo( |
||
8850 | /*AttrKind=*/ParsedAttr::AT_NoReturn, |
||
8851 | /*NumArgs=*/0, |
||
8852 | /*OptArgs=*/0, |
||
8853 | /*NumArgMembers=*/0, |
||
8854 | /*HasCustomParsing=*/0, |
||
8855 | /*AcceptsExprPack=*/0, |
||
8856 | /*IsTargetSpecific=*/0, |
||
8857 | /*IsType=*/0, |
||
8858 | /*IsStmt=*/0, |
||
8859 | /*IsKnownToGCC=*/1, |
||
8860 | /*IsSupportedByPragmaAttribute=*/0, |
||
8861 | /*Spellings=*/NoReturnSpellings, |
||
8862 | /*ArgNames=*/{}) {} |
||
8863 | bool isParamExpr(size_t N) const override { |
||
8864 | return false; |
||
8865 | } |
||
8866 | |||
8867 | static const ParsedAttrInfoNoReturn Instance; |
||
8868 | }; |
||
8869 | const ParsedAttrInfoNoReturn ParsedAttrInfoNoReturn::Instance; |
||
8870 | static constexpr ParsedAttrInfo::Spelling NoSanitizeSpellings[] = { |
||
8871 | {AttributeCommonInfo::AS_GNU, "no_sanitize"}, |
||
8872 | {AttributeCommonInfo::AS_CXX11, "clang::no_sanitize"}, |
||
8873 | {AttributeCommonInfo::AS_C2x, "clang::no_sanitize"}, |
||
8874 | }; |
||
8875 | static constexpr const char *NoSanitizeArgNames[] = { |
||
8876 | "Sanitizers...",}; |
||
8877 | struct ParsedAttrInfoNoSanitize final : public ParsedAttrInfo { |
||
8878 | constexpr ParsedAttrInfoNoSanitize() : ParsedAttrInfo( |
||
8879 | /*AttrKind=*/ParsedAttr::AT_NoSanitize, |
||
8880 | /*NumArgs=*/0, |
||
8881 | /*OptArgs=*/15, |
||
8882 | /*NumArgMembers=*/1, |
||
8883 | /*HasCustomParsing=*/0, |
||
8884 | /*AcceptsExprPack=*/0, |
||
8885 | /*IsTargetSpecific=*/0, |
||
8886 | /*IsType=*/0, |
||
8887 | /*IsStmt=*/0, |
||
8888 | /*IsKnownToGCC=*/0, |
||
8889 | /*IsSupportedByPragmaAttribute=*/1, |
||
8890 | /*Spellings=*/NoSanitizeSpellings, |
||
8891 | /*ArgNames=*/NoSanitizeArgNames) {} |
||
8892 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8893 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isGlobalVar(D)) { |
||
8894 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8895 | << Attr << "functions, Objective-C methods, and global variables"; |
||
8896 | return false; |
||
8897 | } |
||
8898 | return true; |
||
8899 | } |
||
8900 | |||
8901 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8902 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8903 | << AL << St->getBeginLoc(); |
||
8904 | return false; |
||
8905 | } |
||
8906 | |||
8907 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8908 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8909 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
8910 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
8911 | } |
||
8912 | |||
8913 | bool isParamExpr(size_t N) const override { |
||
8914 | return false; |
||
8915 | } |
||
8916 | |||
8917 | static const ParsedAttrInfoNoSanitize Instance; |
||
8918 | }; |
||
8919 | const ParsedAttrInfoNoSanitize ParsedAttrInfoNoSanitize::Instance; |
||
8920 | static constexpr ParsedAttrInfo::Spelling NoSanitizeSpecificSpellings[] = { |
||
8921 | {AttributeCommonInfo::AS_GNU, "no_address_safety_analysis"}, |
||
8922 | {AttributeCommonInfo::AS_CXX11, "gnu::no_address_safety_analysis"}, |
||
8923 | {AttributeCommonInfo::AS_C2x, "gnu::no_address_safety_analysis"}, |
||
8924 | {AttributeCommonInfo::AS_GNU, "no_sanitize_address"}, |
||
8925 | {AttributeCommonInfo::AS_CXX11, "gnu::no_sanitize_address"}, |
||
8926 | {AttributeCommonInfo::AS_C2x, "gnu::no_sanitize_address"}, |
||
8927 | {AttributeCommonInfo::AS_GNU, "no_sanitize_thread"}, |
||
8928 | {AttributeCommonInfo::AS_CXX11, "gnu::no_sanitize_thread"}, |
||
8929 | {AttributeCommonInfo::AS_C2x, "gnu::no_sanitize_thread"}, |
||
8930 | {AttributeCommonInfo::AS_GNU, "no_sanitize_memory"}, |
||
8931 | {AttributeCommonInfo::AS_CXX11, "clang::no_sanitize_memory"}, |
||
8932 | {AttributeCommonInfo::AS_C2x, "clang::no_sanitize_memory"}, |
||
8933 | }; |
||
8934 | struct ParsedAttrInfoNoSanitizeSpecific final : public ParsedAttrInfo { |
||
8935 | constexpr ParsedAttrInfoNoSanitizeSpecific() : ParsedAttrInfo( |
||
8936 | /*AttrKind=*/ParsedAttr::AT_NoSanitizeSpecific, |
||
8937 | /*NumArgs=*/0, |
||
8938 | /*OptArgs=*/0, |
||
8939 | /*NumArgMembers=*/0, |
||
8940 | /*HasCustomParsing=*/0, |
||
8941 | /*AcceptsExprPack=*/0, |
||
8942 | /*IsTargetSpecific=*/0, |
||
8943 | /*IsType=*/0, |
||
8944 | /*IsStmt=*/0, |
||
8945 | /*IsKnownToGCC=*/1, |
||
8946 | /*IsSupportedByPragmaAttribute=*/1, |
||
8947 | /*Spellings=*/NoSanitizeSpecificSpellings, |
||
8948 | /*ArgNames=*/{}) {} |
||
8949 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8950 | if (!isa<FunctionDecl>(D) && !isGlobalVar(D)) { |
||
8951 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8952 | << Attr << "functions and global variables"; |
||
8953 | return false; |
||
8954 | } |
||
8955 | return true; |
||
8956 | } |
||
8957 | |||
8958 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
8959 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
8960 | << AL << St->getBeginLoc(); |
||
8961 | return false; |
||
8962 | } |
||
8963 | |||
8964 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
8965 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
8966 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
8967 | } |
||
8968 | |||
8969 | bool isParamExpr(size_t N) const override { |
||
8970 | return false; |
||
8971 | } |
||
8972 | |||
8973 | static const ParsedAttrInfoNoSanitizeSpecific Instance; |
||
8974 | }; |
||
8975 | const ParsedAttrInfoNoSanitizeSpecific ParsedAttrInfoNoSanitizeSpecific::Instance; |
||
8976 | static constexpr ParsedAttrInfo::Spelling NoSpeculativeLoadHardeningSpellings[] = { |
||
8977 | {AttributeCommonInfo::AS_GNU, "no_speculative_load_hardening"}, |
||
8978 | {AttributeCommonInfo::AS_CXX11, "clang::no_speculative_load_hardening"}, |
||
8979 | {AttributeCommonInfo::AS_C2x, "clang::no_speculative_load_hardening"}, |
||
8980 | }; |
||
8981 | struct ParsedAttrInfoNoSpeculativeLoadHardening final : public ParsedAttrInfo { |
||
8982 | constexpr ParsedAttrInfoNoSpeculativeLoadHardening() : ParsedAttrInfo( |
||
8983 | /*AttrKind=*/ParsedAttr::AT_NoSpeculativeLoadHardening, |
||
8984 | /*NumArgs=*/0, |
||
8985 | /*OptArgs=*/0, |
||
8986 | /*NumArgMembers=*/0, |
||
8987 | /*HasCustomParsing=*/0, |
||
8988 | /*AcceptsExprPack=*/0, |
||
8989 | /*IsTargetSpecific=*/0, |
||
8990 | /*IsType=*/0, |
||
8991 | /*IsStmt=*/0, |
||
8992 | /*IsKnownToGCC=*/0, |
||
8993 | /*IsSupportedByPragmaAttribute=*/1, |
||
8994 | /*Spellings=*/NoSpeculativeLoadHardeningSpellings, |
||
8995 | /*ArgNames=*/{}) {} |
||
8996 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
8997 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
8998 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
8999 | << Attr << "functions and Objective-C methods"; |
||
9000 | return false; |
||
9001 | } |
||
9002 | return true; |
||
9003 | } |
||
9004 | |||
9005 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9006 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9007 | << AL << St->getBeginLoc(); |
||
9008 | return false; |
||
9009 | } |
||
9010 | |||
9011 | using ParsedAttrInfo::diagMutualExclusion; |
||
9012 | |||
9013 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
9014 | if (const auto *A = D->getAttr<SpeculativeLoadHardeningAttr>()) { |
||
9015 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
9016 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
9017 | return false; |
||
9018 | } |
||
9019 | return true; |
||
9020 | } |
||
9021 | |||
9022 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9023 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9024 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
9025 | } |
||
9026 | |||
9027 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9028 | D->addAttr(::new (S.Context) NoSpeculativeLoadHardeningAttr(S.Context, Attr)); |
||
9029 | return AttributeApplied; |
||
9030 | } |
||
9031 | |||
9032 | bool isParamExpr(size_t N) const override { |
||
9033 | return false; |
||
9034 | } |
||
9035 | |||
9036 | static const ParsedAttrInfoNoSpeculativeLoadHardening Instance; |
||
9037 | }; |
||
9038 | const ParsedAttrInfoNoSpeculativeLoadHardening ParsedAttrInfoNoSpeculativeLoadHardening::Instance; |
||
9039 | static constexpr ParsedAttrInfo::Spelling NoSplitStackSpellings[] = { |
||
9040 | {AttributeCommonInfo::AS_GNU, "no_split_stack"}, |
||
9041 | {AttributeCommonInfo::AS_CXX11, "gnu::no_split_stack"}, |
||
9042 | {AttributeCommonInfo::AS_C2x, "gnu::no_split_stack"}, |
||
9043 | }; |
||
9044 | struct ParsedAttrInfoNoSplitStack final : public ParsedAttrInfo { |
||
9045 | constexpr ParsedAttrInfoNoSplitStack() : ParsedAttrInfo( |
||
9046 | /*AttrKind=*/ParsedAttr::AT_NoSplitStack, |
||
9047 | /*NumArgs=*/0, |
||
9048 | /*OptArgs=*/0, |
||
9049 | /*NumArgMembers=*/0, |
||
9050 | /*HasCustomParsing=*/0, |
||
9051 | /*AcceptsExprPack=*/0, |
||
9052 | /*IsTargetSpecific=*/0, |
||
9053 | /*IsType=*/0, |
||
9054 | /*IsStmt=*/0, |
||
9055 | /*IsKnownToGCC=*/1, |
||
9056 | /*IsSupportedByPragmaAttribute=*/1, |
||
9057 | /*Spellings=*/NoSplitStackSpellings, |
||
9058 | /*ArgNames=*/{}) {} |
||
9059 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9060 | if (!isa<FunctionDecl>(D)) { |
||
9061 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9062 | << Attr << "functions"; |
||
9063 | return false; |
||
9064 | } |
||
9065 | return true; |
||
9066 | } |
||
9067 | |||
9068 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9069 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9070 | << AL << St->getBeginLoc(); |
||
9071 | return false; |
||
9072 | } |
||
9073 | |||
9074 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9075 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9076 | } |
||
9077 | |||
9078 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9079 | D->addAttr(::new (S.Context) NoSplitStackAttr(S.Context, Attr)); |
||
9080 | return AttributeApplied; |
||
9081 | } |
||
9082 | |||
9083 | bool isParamExpr(size_t N) const override { |
||
9084 | return false; |
||
9085 | } |
||
9086 | |||
9087 | static const ParsedAttrInfoNoSplitStack Instance; |
||
9088 | }; |
||
9089 | const ParsedAttrInfoNoSplitStack ParsedAttrInfoNoSplitStack::Instance; |
||
9090 | static constexpr ParsedAttrInfo::Spelling NoStackProtectorSpellings[] = { |
||
9091 | {AttributeCommonInfo::AS_GNU, "no_stack_protector"}, |
||
9092 | {AttributeCommonInfo::AS_CXX11, "clang::no_stack_protector"}, |
||
9093 | {AttributeCommonInfo::AS_C2x, "clang::no_stack_protector"}, |
||
9094 | {AttributeCommonInfo::AS_Declspec, "safebuffers"}, |
||
9095 | }; |
||
9096 | struct ParsedAttrInfoNoStackProtector final : public ParsedAttrInfo { |
||
9097 | constexpr ParsedAttrInfoNoStackProtector() : ParsedAttrInfo( |
||
9098 | /*AttrKind=*/ParsedAttr::AT_NoStackProtector, |
||
9099 | /*NumArgs=*/0, |
||
9100 | /*OptArgs=*/0, |
||
9101 | /*NumArgMembers=*/0, |
||
9102 | /*HasCustomParsing=*/0, |
||
9103 | /*AcceptsExprPack=*/0, |
||
9104 | /*IsTargetSpecific=*/0, |
||
9105 | /*IsType=*/0, |
||
9106 | /*IsStmt=*/0, |
||
9107 | /*IsKnownToGCC=*/0, |
||
9108 | /*IsSupportedByPragmaAttribute=*/1, |
||
9109 | /*Spellings=*/NoStackProtectorSpellings, |
||
9110 | /*ArgNames=*/{}) {} |
||
9111 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9112 | if (!isa<FunctionDecl>(D)) { |
||
9113 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9114 | << Attr << "functions"; |
||
9115 | return false; |
||
9116 | } |
||
9117 | return true; |
||
9118 | } |
||
9119 | |||
9120 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9121 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9122 | << AL << St->getBeginLoc(); |
||
9123 | return false; |
||
9124 | } |
||
9125 | |||
9126 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
9127 | enum Spelling { |
||
9128 | GNU_no_stack_protector = 0, |
||
9129 | CXX11_clang_no_stack_protector = 1, |
||
9130 | C2x_clang_no_stack_protector = 2, |
||
9131 | Declspec_safebuffers = 3, |
||
9132 | SpellingNotCalculated = 15 |
||
9133 | |||
9134 | }; |
||
9135 | |||
9136 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
9137 | switch (Idx) { |
||
9138 | default: llvm_unreachable("Unknown spelling list index"); |
||
9139 | case 0: return GNU_no_stack_protector; |
||
9140 | case 1: return CXX11_clang_no_stack_protector; |
||
9141 | case 2: return C2x_clang_no_stack_protector; |
||
9142 | case 3: return Declspec_safebuffers; |
||
9143 | } |
||
9144 | } |
||
9145 | |||
9146 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9147 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9148 | } |
||
9149 | |||
9150 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9151 | D->addAttr(::new (S.Context) NoStackProtectorAttr(S.Context, Attr)); |
||
9152 | return AttributeApplied; |
||
9153 | } |
||
9154 | |||
9155 | bool isParamExpr(size_t N) const override { |
||
9156 | return false; |
||
9157 | } |
||
9158 | |||
9159 | static const ParsedAttrInfoNoStackProtector Instance; |
||
9160 | }; |
||
9161 | const ParsedAttrInfoNoStackProtector ParsedAttrInfoNoStackProtector::Instance; |
||
9162 | static constexpr ParsedAttrInfo::Spelling NoThreadSafetyAnalysisSpellings[] = { |
||
9163 | {AttributeCommonInfo::AS_GNU, "no_thread_safety_analysis"}, |
||
9164 | {AttributeCommonInfo::AS_CXX11, "clang::no_thread_safety_analysis"}, |
||
9165 | {AttributeCommonInfo::AS_C2x, "clang::no_thread_safety_analysis"}, |
||
9166 | }; |
||
9167 | struct ParsedAttrInfoNoThreadSafetyAnalysis final : public ParsedAttrInfo { |
||
9168 | constexpr ParsedAttrInfoNoThreadSafetyAnalysis() : ParsedAttrInfo( |
||
9169 | /*AttrKind=*/ParsedAttr::AT_NoThreadSafetyAnalysis, |
||
9170 | /*NumArgs=*/0, |
||
9171 | /*OptArgs=*/0, |
||
9172 | /*NumArgMembers=*/0, |
||
9173 | /*HasCustomParsing=*/0, |
||
9174 | /*AcceptsExprPack=*/0, |
||
9175 | /*IsTargetSpecific=*/0, |
||
9176 | /*IsType=*/0, |
||
9177 | /*IsStmt=*/0, |
||
9178 | /*IsKnownToGCC=*/0, |
||
9179 | /*IsSupportedByPragmaAttribute=*/1, |
||
9180 | /*Spellings=*/NoThreadSafetyAnalysisSpellings, |
||
9181 | /*ArgNames=*/{}) {} |
||
9182 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9183 | if (!isa<FunctionDecl>(D)) { |
||
9184 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9185 | << Attr << "functions"; |
||
9186 | return false; |
||
9187 | } |
||
9188 | return true; |
||
9189 | } |
||
9190 | |||
9191 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9192 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9193 | << AL << St->getBeginLoc(); |
||
9194 | return false; |
||
9195 | } |
||
9196 | |||
9197 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9198 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9199 | } |
||
9200 | |||
9201 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9202 | D->addAttr(::new (S.Context) NoThreadSafetyAnalysisAttr(S.Context, Attr)); |
||
9203 | return AttributeApplied; |
||
9204 | } |
||
9205 | |||
9206 | bool isParamExpr(size_t N) const override { |
||
9207 | return false; |
||
9208 | } |
||
9209 | |||
9210 | static const ParsedAttrInfoNoThreadSafetyAnalysis Instance; |
||
9211 | }; |
||
9212 | const ParsedAttrInfoNoThreadSafetyAnalysis ParsedAttrInfoNoThreadSafetyAnalysis::Instance; |
||
9213 | static constexpr ParsedAttrInfo::Spelling NoThrowSpellings[] = { |
||
9214 | {AttributeCommonInfo::AS_GNU, "nothrow"}, |
||
9215 | {AttributeCommonInfo::AS_CXX11, "gnu::nothrow"}, |
||
9216 | {AttributeCommonInfo::AS_C2x, "gnu::nothrow"}, |
||
9217 | {AttributeCommonInfo::AS_Declspec, "nothrow"}, |
||
9218 | }; |
||
9219 | struct ParsedAttrInfoNoThrow final : public ParsedAttrInfo { |
||
9220 | constexpr ParsedAttrInfoNoThrow() : ParsedAttrInfo( |
||
9221 | /*AttrKind=*/ParsedAttr::AT_NoThrow, |
||
9222 | /*NumArgs=*/0, |
||
9223 | /*OptArgs=*/0, |
||
9224 | /*NumArgMembers=*/0, |
||
9225 | /*HasCustomParsing=*/0, |
||
9226 | /*AcceptsExprPack=*/0, |
||
9227 | /*IsTargetSpecific=*/0, |
||
9228 | /*IsType=*/0, |
||
9229 | /*IsStmt=*/0, |
||
9230 | /*IsKnownToGCC=*/1, |
||
9231 | /*IsSupportedByPragmaAttribute=*/1, |
||
9232 | /*Spellings=*/NoThrowSpellings, |
||
9233 | /*ArgNames=*/{}) {} |
||
9234 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9235 | if (!isFunctionLike(D)) { |
||
9236 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9237 | << Attr << "functions and function pointers"; |
||
9238 | return false; |
||
9239 | } |
||
9240 | return true; |
||
9241 | } |
||
9242 | |||
9243 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9244 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9245 | << AL << St->getBeginLoc(); |
||
9246 | return false; |
||
9247 | } |
||
9248 | |||
9249 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9250 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true)); |
||
9251 | } |
||
9252 | |||
9253 | bool isParamExpr(size_t N) const override { |
||
9254 | return false; |
||
9255 | } |
||
9256 | |||
9257 | static const ParsedAttrInfoNoThrow Instance; |
||
9258 | }; |
||
9259 | const ParsedAttrInfoNoThrow ParsedAttrInfoNoThrow::Instance; |
||
9260 | static constexpr ParsedAttrInfo::Spelling NoUniqueAddressSpellings[] = { |
||
9261 | {AttributeCommonInfo::AS_CXX11, "no_unique_address"}, |
||
9262 | }; |
||
9263 | struct ParsedAttrInfoNoUniqueAddress final : public ParsedAttrInfo { |
||
9264 | constexpr ParsedAttrInfoNoUniqueAddress() : ParsedAttrInfo( |
||
9265 | /*AttrKind=*/ParsedAttr::AT_NoUniqueAddress, |
||
9266 | /*NumArgs=*/0, |
||
9267 | /*OptArgs=*/0, |
||
9268 | /*NumArgMembers=*/0, |
||
9269 | /*HasCustomParsing=*/0, |
||
9270 | /*AcceptsExprPack=*/0, |
||
9271 | /*IsTargetSpecific=*/1, |
||
9272 | /*IsType=*/0, |
||
9273 | /*IsStmt=*/0, |
||
9274 | /*IsKnownToGCC=*/0, |
||
9275 | /*IsSupportedByPragmaAttribute=*/0, |
||
9276 | /*Spellings=*/NoUniqueAddressSpellings, |
||
9277 | /*ArgNames=*/{}) {} |
||
9278 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9279 | if (!isNonBitField(D)) { |
||
9280 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9281 | << Attr << "non-bit-field non-static data members"; |
||
9282 | return false; |
||
9283 | } |
||
9284 | return true; |
||
9285 | } |
||
9286 | |||
9287 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9288 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9289 | << AL << St->getBeginLoc(); |
||
9290 | return false; |
||
9291 | } |
||
9292 | |||
9293 | bool existsInTarget(const TargetInfo &Target) const override { |
||
9294 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
9295 | return true && ( Target.getCXXABI().isItaniumFamily() ); |
||
9296 | } |
||
9297 | |||
9298 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9299 | D->addAttr(::new (S.Context) NoUniqueAddressAttr(S.Context, Attr)); |
||
9300 | return AttributeApplied; |
||
9301 | } |
||
9302 | |||
9303 | bool isParamExpr(size_t N) const override { |
||
9304 | return false; |
||
9305 | } |
||
9306 | |||
9307 | static const ParsedAttrInfoNoUniqueAddress Instance; |
||
9308 | }; |
||
9309 | const ParsedAttrInfoNoUniqueAddress ParsedAttrInfoNoUniqueAddress::Instance; |
||
9310 | static constexpr ParsedAttrInfo::Spelling NoUwtableSpellings[] = { |
||
9311 | {AttributeCommonInfo::AS_GNU, "nouwtable"}, |
||
9312 | {AttributeCommonInfo::AS_CXX11, "clang::nouwtable"}, |
||
9313 | {AttributeCommonInfo::AS_C2x, "clang::nouwtable"}, |
||
9314 | }; |
||
9315 | struct ParsedAttrInfoNoUwtable final : public ParsedAttrInfo { |
||
9316 | constexpr ParsedAttrInfoNoUwtable() : ParsedAttrInfo( |
||
9317 | /*AttrKind=*/ParsedAttr::AT_NoUwtable, |
||
9318 | /*NumArgs=*/0, |
||
9319 | /*OptArgs=*/0, |
||
9320 | /*NumArgMembers=*/0, |
||
9321 | /*HasCustomParsing=*/0, |
||
9322 | /*AcceptsExprPack=*/0, |
||
9323 | /*IsTargetSpecific=*/0, |
||
9324 | /*IsType=*/0, |
||
9325 | /*IsStmt=*/0, |
||
9326 | /*IsKnownToGCC=*/0, |
||
9327 | /*IsSupportedByPragmaAttribute=*/1, |
||
9328 | /*Spellings=*/NoUwtableSpellings, |
||
9329 | /*ArgNames=*/{}) {} |
||
9330 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9331 | if (!isFunctionLike(D)) { |
||
9332 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9333 | << Attr << "functions and function pointers"; |
||
9334 | return false; |
||
9335 | } |
||
9336 | return true; |
||
9337 | } |
||
9338 | |||
9339 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9340 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9341 | << AL << St->getBeginLoc(); |
||
9342 | return false; |
||
9343 | } |
||
9344 | |||
9345 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9346 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true)); |
||
9347 | } |
||
9348 | |||
9349 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9350 | D->addAttr(::new (S.Context) NoUwtableAttr(S.Context, Attr)); |
||
9351 | return AttributeApplied; |
||
9352 | } |
||
9353 | |||
9354 | bool isParamExpr(size_t N) const override { |
||
9355 | return false; |
||
9356 | } |
||
9357 | |||
9358 | static const ParsedAttrInfoNoUwtable Instance; |
||
9359 | }; |
||
9360 | const ParsedAttrInfoNoUwtable ParsedAttrInfoNoUwtable::Instance; |
||
9361 | static constexpr ParsedAttrInfo::Spelling NonNullSpellings[] = { |
||
9362 | {AttributeCommonInfo::AS_GNU, "nonnull"}, |
||
9363 | {AttributeCommonInfo::AS_CXX11, "gnu::nonnull"}, |
||
9364 | {AttributeCommonInfo::AS_C2x, "gnu::nonnull"}, |
||
9365 | }; |
||
9366 | static constexpr const char *NonNullArgNames[] = { |
||
9367 | "Args...",}; |
||
9368 | struct ParsedAttrInfoNonNull final : public ParsedAttrInfo { |
||
9369 | constexpr ParsedAttrInfoNonNull() : ParsedAttrInfo( |
||
9370 | /*AttrKind=*/ParsedAttr::AT_NonNull, |
||
9371 | /*NumArgs=*/0, |
||
9372 | /*OptArgs=*/15, |
||
9373 | /*NumArgMembers=*/1, |
||
9374 | /*HasCustomParsing=*/0, |
||
9375 | /*AcceptsExprPack=*/0, |
||
9376 | /*IsTargetSpecific=*/0, |
||
9377 | /*IsType=*/0, |
||
9378 | /*IsStmt=*/0, |
||
9379 | /*IsKnownToGCC=*/1, |
||
9380 | /*IsSupportedByPragmaAttribute=*/0, |
||
9381 | /*Spellings=*/NonNullSpellings, |
||
9382 | /*ArgNames=*/NonNullArgNames) {} |
||
9383 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9384 | if (!isa<ObjCMethodDecl>(D) && !isHasFunctionProto(D) && !isa<ParmVarDecl>(D)) { |
||
9385 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9386 | << Attr << "functions, methods, and parameters"; |
||
9387 | return false; |
||
9388 | } |
||
9389 | return true; |
||
9390 | } |
||
9391 | |||
9392 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9393 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9394 | << AL << St->getBeginLoc(); |
||
9395 | return false; |
||
9396 | } |
||
9397 | |||
9398 | bool isParamExpr(size_t N) const override { |
||
9399 | return false; |
||
9400 | } |
||
9401 | |||
9402 | static const ParsedAttrInfoNonNull Instance; |
||
9403 | }; |
||
9404 | const ParsedAttrInfoNonNull ParsedAttrInfoNonNull::Instance; |
||
9405 | static constexpr ParsedAttrInfo::Spelling NotTailCalledSpellings[] = { |
||
9406 | {AttributeCommonInfo::AS_GNU, "not_tail_called"}, |
||
9407 | {AttributeCommonInfo::AS_CXX11, "clang::not_tail_called"}, |
||
9408 | {AttributeCommonInfo::AS_C2x, "clang::not_tail_called"}, |
||
9409 | }; |
||
9410 | struct ParsedAttrInfoNotTailCalled final : public ParsedAttrInfo { |
||
9411 | constexpr ParsedAttrInfoNotTailCalled() : ParsedAttrInfo( |
||
9412 | /*AttrKind=*/ParsedAttr::AT_NotTailCalled, |
||
9413 | /*NumArgs=*/0, |
||
9414 | /*OptArgs=*/0, |
||
9415 | /*NumArgMembers=*/0, |
||
9416 | /*HasCustomParsing=*/0, |
||
9417 | /*AcceptsExprPack=*/0, |
||
9418 | /*IsTargetSpecific=*/0, |
||
9419 | /*IsType=*/0, |
||
9420 | /*IsStmt=*/0, |
||
9421 | /*IsKnownToGCC=*/0, |
||
9422 | /*IsSupportedByPragmaAttribute=*/1, |
||
9423 | /*Spellings=*/NotTailCalledSpellings, |
||
9424 | /*ArgNames=*/{}) {} |
||
9425 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9426 | if (!isa<FunctionDecl>(D)) { |
||
9427 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9428 | << Attr << "functions"; |
||
9429 | return false; |
||
9430 | } |
||
9431 | return true; |
||
9432 | } |
||
9433 | |||
9434 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9435 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9436 | << AL << St->getBeginLoc(); |
||
9437 | return false; |
||
9438 | } |
||
9439 | |||
9440 | using ParsedAttrInfo::diagMutualExclusion; |
||
9441 | |||
9442 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
9443 | if (const auto *A = D->getAttr<AlwaysInlineAttr>()) { |
||
9444 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
9445 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
9446 | return false; |
||
9447 | } |
||
9448 | return true; |
||
9449 | } |
||
9450 | |||
9451 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9452 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9453 | } |
||
9454 | |||
9455 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9456 | D->addAttr(::new (S.Context) NotTailCalledAttr(S.Context, Attr)); |
||
9457 | return AttributeApplied; |
||
9458 | } |
||
9459 | |||
9460 | bool isParamExpr(size_t N) const override { |
||
9461 | return false; |
||
9462 | } |
||
9463 | |||
9464 | static const ParsedAttrInfoNotTailCalled Instance; |
||
9465 | }; |
||
9466 | const ParsedAttrInfoNotTailCalled ParsedAttrInfoNotTailCalled::Instance; |
||
9467 | static constexpr ParsedAttrInfo::Spelling OSConsumedSpellings[] = { |
||
9468 | {AttributeCommonInfo::AS_GNU, "os_consumed"}, |
||
9469 | {AttributeCommonInfo::AS_CXX11, "clang::os_consumed"}, |
||
9470 | {AttributeCommonInfo::AS_C2x, "clang::os_consumed"}, |
||
9471 | }; |
||
9472 | struct ParsedAttrInfoOSConsumed final : public ParsedAttrInfo { |
||
9473 | constexpr ParsedAttrInfoOSConsumed() : ParsedAttrInfo( |
||
9474 | /*AttrKind=*/ParsedAttr::AT_OSConsumed, |
||
9475 | /*NumArgs=*/0, |
||
9476 | /*OptArgs=*/0, |
||
9477 | /*NumArgMembers=*/0, |
||
9478 | /*HasCustomParsing=*/0, |
||
9479 | /*AcceptsExprPack=*/0, |
||
9480 | /*IsTargetSpecific=*/0, |
||
9481 | /*IsType=*/0, |
||
9482 | /*IsStmt=*/0, |
||
9483 | /*IsKnownToGCC=*/0, |
||
9484 | /*IsSupportedByPragmaAttribute=*/1, |
||
9485 | /*Spellings=*/OSConsumedSpellings, |
||
9486 | /*ArgNames=*/{}) {} |
||
9487 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9488 | if (!isa<ParmVarDecl>(D)) { |
||
9489 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9490 | << Attr << "parameters"; |
||
9491 | return false; |
||
9492 | } |
||
9493 | return true; |
||
9494 | } |
||
9495 | |||
9496 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9497 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9498 | << AL << St->getBeginLoc(); |
||
9499 | return false; |
||
9500 | } |
||
9501 | |||
9502 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9503 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
9504 | } |
||
9505 | |||
9506 | bool isParamExpr(size_t N) const override { |
||
9507 | return false; |
||
9508 | } |
||
9509 | |||
9510 | static const ParsedAttrInfoOSConsumed Instance; |
||
9511 | }; |
||
9512 | const ParsedAttrInfoOSConsumed ParsedAttrInfoOSConsumed::Instance; |
||
9513 | static constexpr ParsedAttrInfo::Spelling OSConsumesThisSpellings[] = { |
||
9514 | {AttributeCommonInfo::AS_GNU, "os_consumes_this"}, |
||
9515 | {AttributeCommonInfo::AS_CXX11, "clang::os_consumes_this"}, |
||
9516 | {AttributeCommonInfo::AS_C2x, "clang::os_consumes_this"}, |
||
9517 | }; |
||
9518 | struct ParsedAttrInfoOSConsumesThis final : public ParsedAttrInfo { |
||
9519 | constexpr ParsedAttrInfoOSConsumesThis() : ParsedAttrInfo( |
||
9520 | /*AttrKind=*/ParsedAttr::AT_OSConsumesThis, |
||
9521 | /*NumArgs=*/0, |
||
9522 | /*OptArgs=*/0, |
||
9523 | /*NumArgMembers=*/0, |
||
9524 | /*HasCustomParsing=*/0, |
||
9525 | /*AcceptsExprPack=*/0, |
||
9526 | /*IsTargetSpecific=*/0, |
||
9527 | /*IsType=*/0, |
||
9528 | /*IsStmt=*/0, |
||
9529 | /*IsKnownToGCC=*/0, |
||
9530 | /*IsSupportedByPragmaAttribute=*/0, |
||
9531 | /*Spellings=*/OSConsumesThisSpellings, |
||
9532 | /*ArgNames=*/{}) {} |
||
9533 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9534 | if (!isNonStaticCXXMethod(D)) { |
||
9535 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9536 | << Attr << "non-static member functions"; |
||
9537 | return false; |
||
9538 | } |
||
9539 | return true; |
||
9540 | } |
||
9541 | |||
9542 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9543 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9544 | << AL << St->getBeginLoc(); |
||
9545 | return false; |
||
9546 | } |
||
9547 | |||
9548 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9549 | D->addAttr(::new (S.Context) OSConsumesThisAttr(S.Context, Attr)); |
||
9550 | return AttributeApplied; |
||
9551 | } |
||
9552 | |||
9553 | bool isParamExpr(size_t N) const override { |
||
9554 | return false; |
||
9555 | } |
||
9556 | |||
9557 | static const ParsedAttrInfoOSConsumesThis Instance; |
||
9558 | }; |
||
9559 | const ParsedAttrInfoOSConsumesThis ParsedAttrInfoOSConsumesThis::Instance; |
||
9560 | static constexpr ParsedAttrInfo::Spelling OSReturnsNotRetainedSpellings[] = { |
||
9561 | {AttributeCommonInfo::AS_GNU, "os_returns_not_retained"}, |
||
9562 | {AttributeCommonInfo::AS_CXX11, "clang::os_returns_not_retained"}, |
||
9563 | {AttributeCommonInfo::AS_C2x, "clang::os_returns_not_retained"}, |
||
9564 | }; |
||
9565 | struct ParsedAttrInfoOSReturnsNotRetained final : public ParsedAttrInfo { |
||
9566 | constexpr ParsedAttrInfoOSReturnsNotRetained() : ParsedAttrInfo( |
||
9567 | /*AttrKind=*/ParsedAttr::AT_OSReturnsNotRetained, |
||
9568 | /*NumArgs=*/0, |
||
9569 | /*OptArgs=*/0, |
||
9570 | /*NumArgMembers=*/0, |
||
9571 | /*HasCustomParsing=*/0, |
||
9572 | /*AcceptsExprPack=*/0, |
||
9573 | /*IsTargetSpecific=*/0, |
||
9574 | /*IsType=*/0, |
||
9575 | /*IsStmt=*/0, |
||
9576 | /*IsKnownToGCC=*/0, |
||
9577 | /*IsSupportedByPragmaAttribute=*/1, |
||
9578 | /*Spellings=*/OSReturnsNotRetainedSpellings, |
||
9579 | /*ArgNames=*/{}) {} |
||
9580 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9581 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D) && !isa<ParmVarDecl>(D)) { |
||
9582 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9583 | << Attr << "functions, Objective-C methods, Objective-C properties, and parameters"; |
||
9584 | return false; |
||
9585 | } |
||
9586 | return true; |
||
9587 | } |
||
9588 | |||
9589 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9590 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9591 | << AL << St->getBeginLoc(); |
||
9592 | return false; |
||
9593 | } |
||
9594 | |||
9595 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9596 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9597 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
9598 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC)); |
||
9599 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
9600 | } |
||
9601 | |||
9602 | bool isParamExpr(size_t N) const override { |
||
9603 | return false; |
||
9604 | } |
||
9605 | |||
9606 | static const ParsedAttrInfoOSReturnsNotRetained Instance; |
||
9607 | }; |
||
9608 | const ParsedAttrInfoOSReturnsNotRetained ParsedAttrInfoOSReturnsNotRetained::Instance; |
||
9609 | static constexpr ParsedAttrInfo::Spelling OSReturnsRetainedSpellings[] = { |
||
9610 | {AttributeCommonInfo::AS_GNU, "os_returns_retained"}, |
||
9611 | {AttributeCommonInfo::AS_CXX11, "clang::os_returns_retained"}, |
||
9612 | {AttributeCommonInfo::AS_C2x, "clang::os_returns_retained"}, |
||
9613 | }; |
||
9614 | struct ParsedAttrInfoOSReturnsRetained final : public ParsedAttrInfo { |
||
9615 | constexpr ParsedAttrInfoOSReturnsRetained() : ParsedAttrInfo( |
||
9616 | /*AttrKind=*/ParsedAttr::AT_OSReturnsRetained, |
||
9617 | /*NumArgs=*/0, |
||
9618 | /*OptArgs=*/0, |
||
9619 | /*NumArgMembers=*/0, |
||
9620 | /*HasCustomParsing=*/0, |
||
9621 | /*AcceptsExprPack=*/0, |
||
9622 | /*IsTargetSpecific=*/0, |
||
9623 | /*IsType=*/0, |
||
9624 | /*IsStmt=*/0, |
||
9625 | /*IsKnownToGCC=*/0, |
||
9626 | /*IsSupportedByPragmaAttribute=*/1, |
||
9627 | /*Spellings=*/OSReturnsRetainedSpellings, |
||
9628 | /*ArgNames=*/{}) {} |
||
9629 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9630 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D) && !isa<ParmVarDecl>(D)) { |
||
9631 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9632 | << Attr << "functions, Objective-C methods, Objective-C properties, and parameters"; |
||
9633 | return false; |
||
9634 | } |
||
9635 | return true; |
||
9636 | } |
||
9637 | |||
9638 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9639 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9640 | << AL << St->getBeginLoc(); |
||
9641 | return false; |
||
9642 | } |
||
9643 | |||
9644 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9645 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
9646 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
9647 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC)); |
||
9648 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
9649 | } |
||
9650 | |||
9651 | bool isParamExpr(size_t N) const override { |
||
9652 | return false; |
||
9653 | } |
||
9654 | |||
9655 | static const ParsedAttrInfoOSReturnsRetained Instance; |
||
9656 | }; |
||
9657 | const ParsedAttrInfoOSReturnsRetained ParsedAttrInfoOSReturnsRetained::Instance; |
||
9658 | static constexpr ParsedAttrInfo::Spelling OSReturnsRetainedOnNonZeroSpellings[] = { |
||
9659 | {AttributeCommonInfo::AS_GNU, "os_returns_retained_on_non_zero"}, |
||
9660 | {AttributeCommonInfo::AS_CXX11, "clang::os_returns_retained_on_non_zero"}, |
||
9661 | {AttributeCommonInfo::AS_C2x, "clang::os_returns_retained_on_non_zero"}, |
||
9662 | }; |
||
9663 | struct ParsedAttrInfoOSReturnsRetainedOnNonZero final : public ParsedAttrInfo { |
||
9664 | constexpr ParsedAttrInfoOSReturnsRetainedOnNonZero() : ParsedAttrInfo( |
||
9665 | /*AttrKind=*/ParsedAttr::AT_OSReturnsRetainedOnNonZero, |
||
9666 | /*NumArgs=*/0, |
||
9667 | /*OptArgs=*/0, |
||
9668 | /*NumArgMembers=*/0, |
||
9669 | /*HasCustomParsing=*/0, |
||
9670 | /*AcceptsExprPack=*/0, |
||
9671 | /*IsTargetSpecific=*/0, |
||
9672 | /*IsType=*/0, |
||
9673 | /*IsStmt=*/0, |
||
9674 | /*IsKnownToGCC=*/0, |
||
9675 | /*IsSupportedByPragmaAttribute=*/1, |
||
9676 | /*Spellings=*/OSReturnsRetainedOnNonZeroSpellings, |
||
9677 | /*ArgNames=*/{}) {} |
||
9678 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9679 | if (!isa<ParmVarDecl>(D)) { |
||
9680 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9681 | << Attr << "parameters"; |
||
9682 | return false; |
||
9683 | } |
||
9684 | return true; |
||
9685 | } |
||
9686 | |||
9687 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9688 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9689 | << AL << St->getBeginLoc(); |
||
9690 | return false; |
||
9691 | } |
||
9692 | |||
9693 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9694 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
9695 | } |
||
9696 | |||
9697 | bool isParamExpr(size_t N) const override { |
||
9698 | return false; |
||
9699 | } |
||
9700 | |||
9701 | static const ParsedAttrInfoOSReturnsRetainedOnNonZero Instance; |
||
9702 | }; |
||
9703 | const ParsedAttrInfoOSReturnsRetainedOnNonZero ParsedAttrInfoOSReturnsRetainedOnNonZero::Instance; |
||
9704 | static constexpr ParsedAttrInfo::Spelling OSReturnsRetainedOnZeroSpellings[] = { |
||
9705 | {AttributeCommonInfo::AS_GNU, "os_returns_retained_on_zero"}, |
||
9706 | {AttributeCommonInfo::AS_CXX11, "clang::os_returns_retained_on_zero"}, |
||
9707 | {AttributeCommonInfo::AS_C2x, "clang::os_returns_retained_on_zero"}, |
||
9708 | }; |
||
9709 | struct ParsedAttrInfoOSReturnsRetainedOnZero final : public ParsedAttrInfo { |
||
9710 | constexpr ParsedAttrInfoOSReturnsRetainedOnZero() : ParsedAttrInfo( |
||
9711 | /*AttrKind=*/ParsedAttr::AT_OSReturnsRetainedOnZero, |
||
9712 | /*NumArgs=*/0, |
||
9713 | /*OptArgs=*/0, |
||
9714 | /*NumArgMembers=*/0, |
||
9715 | /*HasCustomParsing=*/0, |
||
9716 | /*AcceptsExprPack=*/0, |
||
9717 | /*IsTargetSpecific=*/0, |
||
9718 | /*IsType=*/0, |
||
9719 | /*IsStmt=*/0, |
||
9720 | /*IsKnownToGCC=*/0, |
||
9721 | /*IsSupportedByPragmaAttribute=*/1, |
||
9722 | /*Spellings=*/OSReturnsRetainedOnZeroSpellings, |
||
9723 | /*ArgNames=*/{}) {} |
||
9724 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9725 | if (!isa<ParmVarDecl>(D)) { |
||
9726 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
9727 | << Attr << "parameters"; |
||
9728 | return false; |
||
9729 | } |
||
9730 | return true; |
||
9731 | } |
||
9732 | |||
9733 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9734 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9735 | << AL << St->getBeginLoc(); |
||
9736 | return false; |
||
9737 | } |
||
9738 | |||
9739 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9740 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
9741 | } |
||
9742 | |||
9743 | bool isParamExpr(size_t N) const override { |
||
9744 | return false; |
||
9745 | } |
||
9746 | |||
9747 | static const ParsedAttrInfoOSReturnsRetainedOnZero Instance; |
||
9748 | }; |
||
9749 | const ParsedAttrInfoOSReturnsRetainedOnZero ParsedAttrInfoOSReturnsRetainedOnZero::Instance; |
||
9750 | static constexpr ParsedAttrInfo::Spelling ObjCBoxableSpellings[] = { |
||
9751 | {AttributeCommonInfo::AS_GNU, "objc_boxable"}, |
||
9752 | {AttributeCommonInfo::AS_CXX11, "clang::objc_boxable"}, |
||
9753 | {AttributeCommonInfo::AS_C2x, "clang::objc_boxable"}, |
||
9754 | }; |
||
9755 | struct ParsedAttrInfoObjCBoxable final : public ParsedAttrInfo { |
||
9756 | constexpr ParsedAttrInfoObjCBoxable() : ParsedAttrInfo( |
||
9757 | /*AttrKind=*/ParsedAttr::AT_ObjCBoxable, |
||
9758 | /*NumArgs=*/0, |
||
9759 | /*OptArgs=*/0, |
||
9760 | /*NumArgMembers=*/0, |
||
9761 | /*HasCustomParsing=*/0, |
||
9762 | /*AcceptsExprPack=*/0, |
||
9763 | /*IsTargetSpecific=*/0, |
||
9764 | /*IsType=*/0, |
||
9765 | /*IsStmt=*/0, |
||
9766 | /*IsKnownToGCC=*/0, |
||
9767 | /*IsSupportedByPragmaAttribute=*/1, |
||
9768 | /*Spellings=*/ObjCBoxableSpellings, |
||
9769 | /*ArgNames=*/{}) {} |
||
9770 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9771 | if (!isa<RecordDecl>(D)) { |
||
9772 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9773 | << Attr << "structs, unions, and classes"; |
||
9774 | return false; |
||
9775 | } |
||
9776 | return true; |
||
9777 | } |
||
9778 | |||
9779 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9780 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9781 | << AL << St->getBeginLoc(); |
||
9782 | return false; |
||
9783 | } |
||
9784 | |||
9785 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9786 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
9787 | } |
||
9788 | |||
9789 | bool isParamExpr(size_t N) const override { |
||
9790 | return false; |
||
9791 | } |
||
9792 | |||
9793 | static const ParsedAttrInfoObjCBoxable Instance; |
||
9794 | }; |
||
9795 | const ParsedAttrInfoObjCBoxable ParsedAttrInfoObjCBoxable::Instance; |
||
9796 | static constexpr ParsedAttrInfo::Spelling ObjCBridgeSpellings[] = { |
||
9797 | {AttributeCommonInfo::AS_GNU, "objc_bridge"}, |
||
9798 | {AttributeCommonInfo::AS_CXX11, "clang::objc_bridge"}, |
||
9799 | {AttributeCommonInfo::AS_C2x, "clang::objc_bridge"}, |
||
9800 | }; |
||
9801 | static constexpr const char *ObjCBridgeArgNames[] = { |
||
9802 | "BridgedType",}; |
||
9803 | struct ParsedAttrInfoObjCBridge final : public ParsedAttrInfo { |
||
9804 | constexpr ParsedAttrInfoObjCBridge() : ParsedAttrInfo( |
||
9805 | /*AttrKind=*/ParsedAttr::AT_ObjCBridge, |
||
9806 | /*NumArgs=*/1, |
||
9807 | /*OptArgs=*/0, |
||
9808 | /*NumArgMembers=*/1, |
||
9809 | /*HasCustomParsing=*/0, |
||
9810 | /*AcceptsExprPack=*/0, |
||
9811 | /*IsTargetSpecific=*/0, |
||
9812 | /*IsType=*/0, |
||
9813 | /*IsStmt=*/0, |
||
9814 | /*IsKnownToGCC=*/0, |
||
9815 | /*IsSupportedByPragmaAttribute=*/1, |
||
9816 | /*Spellings=*/ObjCBridgeSpellings, |
||
9817 | /*ArgNames=*/ObjCBridgeArgNames) {} |
||
9818 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9819 | if (!isa<RecordDecl>(D) && !isa<TypedefNameDecl>(D)) { |
||
9820 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9821 | << Attr << "structs, unions, classes, and typedefs"; |
||
9822 | return false; |
||
9823 | } |
||
9824 | return true; |
||
9825 | } |
||
9826 | |||
9827 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9828 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9829 | << AL << St->getBeginLoc(); |
||
9830 | return false; |
||
9831 | } |
||
9832 | |||
9833 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9834 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
9835 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
9836 | } |
||
9837 | |||
9838 | bool isParamExpr(size_t N) const override { |
||
9839 | return false; |
||
9840 | } |
||
9841 | |||
9842 | static const ParsedAttrInfoObjCBridge Instance; |
||
9843 | }; |
||
9844 | const ParsedAttrInfoObjCBridge ParsedAttrInfoObjCBridge::Instance; |
||
9845 | static constexpr ParsedAttrInfo::Spelling ObjCBridgeMutableSpellings[] = { |
||
9846 | {AttributeCommonInfo::AS_GNU, "objc_bridge_mutable"}, |
||
9847 | {AttributeCommonInfo::AS_CXX11, "clang::objc_bridge_mutable"}, |
||
9848 | {AttributeCommonInfo::AS_C2x, "clang::objc_bridge_mutable"}, |
||
9849 | }; |
||
9850 | static constexpr const char *ObjCBridgeMutableArgNames[] = { |
||
9851 | "BridgedType",}; |
||
9852 | struct ParsedAttrInfoObjCBridgeMutable final : public ParsedAttrInfo { |
||
9853 | constexpr ParsedAttrInfoObjCBridgeMutable() : ParsedAttrInfo( |
||
9854 | /*AttrKind=*/ParsedAttr::AT_ObjCBridgeMutable, |
||
9855 | /*NumArgs=*/1, |
||
9856 | /*OptArgs=*/0, |
||
9857 | /*NumArgMembers=*/1, |
||
9858 | /*HasCustomParsing=*/0, |
||
9859 | /*AcceptsExprPack=*/0, |
||
9860 | /*IsTargetSpecific=*/0, |
||
9861 | /*IsType=*/0, |
||
9862 | /*IsStmt=*/0, |
||
9863 | /*IsKnownToGCC=*/0, |
||
9864 | /*IsSupportedByPragmaAttribute=*/1, |
||
9865 | /*Spellings=*/ObjCBridgeMutableSpellings, |
||
9866 | /*ArgNames=*/ObjCBridgeMutableArgNames) {} |
||
9867 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9868 | if (!isa<RecordDecl>(D)) { |
||
9869 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9870 | << Attr << "structs, unions, and classes"; |
||
9871 | return false; |
||
9872 | } |
||
9873 | return true; |
||
9874 | } |
||
9875 | |||
9876 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9877 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9878 | << AL << St->getBeginLoc(); |
||
9879 | return false; |
||
9880 | } |
||
9881 | |||
9882 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9883 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
9884 | } |
||
9885 | |||
9886 | bool isParamExpr(size_t N) const override { |
||
9887 | return false; |
||
9888 | } |
||
9889 | |||
9890 | static const ParsedAttrInfoObjCBridgeMutable Instance; |
||
9891 | }; |
||
9892 | const ParsedAttrInfoObjCBridgeMutable ParsedAttrInfoObjCBridgeMutable::Instance; |
||
9893 | static constexpr ParsedAttrInfo::Spelling ObjCBridgeRelatedSpellings[] = { |
||
9894 | {AttributeCommonInfo::AS_GNU, "objc_bridge_related"}, |
||
9895 | {AttributeCommonInfo::AS_CXX11, "clang::objc_bridge_related"}, |
||
9896 | {AttributeCommonInfo::AS_C2x, "clang::objc_bridge_related"}, |
||
9897 | }; |
||
9898 | static constexpr const char *ObjCBridgeRelatedArgNames[] = { |
||
9899 | "RelatedClass","ClassMethod","InstanceMethod",}; |
||
9900 | struct ParsedAttrInfoObjCBridgeRelated final : public ParsedAttrInfo { |
||
9901 | constexpr ParsedAttrInfoObjCBridgeRelated() : ParsedAttrInfo( |
||
9902 | /*AttrKind=*/ParsedAttr::AT_ObjCBridgeRelated, |
||
9903 | /*NumArgs=*/3, |
||
9904 | /*OptArgs=*/0, |
||
9905 | /*NumArgMembers=*/3, |
||
9906 | /*HasCustomParsing=*/1, |
||
9907 | /*AcceptsExprPack=*/0, |
||
9908 | /*IsTargetSpecific=*/0, |
||
9909 | /*IsType=*/0, |
||
9910 | /*IsStmt=*/0, |
||
9911 | /*IsKnownToGCC=*/0, |
||
9912 | /*IsSupportedByPragmaAttribute=*/1, |
||
9913 | /*Spellings=*/ObjCBridgeRelatedSpellings, |
||
9914 | /*ArgNames=*/ObjCBridgeRelatedArgNames) {} |
||
9915 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9916 | if (!isa<RecordDecl>(D)) { |
||
9917 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9918 | << Attr << "structs, unions, and classes"; |
||
9919 | return false; |
||
9920 | } |
||
9921 | return true; |
||
9922 | } |
||
9923 | |||
9924 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9925 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9926 | << AL << St->getBeginLoc(); |
||
9927 | return false; |
||
9928 | } |
||
9929 | |||
9930 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9931 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
9932 | } |
||
9933 | |||
9934 | bool isParamExpr(size_t N) const override { |
||
9935 | return false; |
||
9936 | } |
||
9937 | |||
9938 | static const ParsedAttrInfoObjCBridgeRelated Instance; |
||
9939 | }; |
||
9940 | const ParsedAttrInfoObjCBridgeRelated ParsedAttrInfoObjCBridgeRelated::Instance; |
||
9941 | static constexpr ParsedAttrInfo::Spelling ObjCClassStubSpellings[] = { |
||
9942 | {AttributeCommonInfo::AS_GNU, "objc_class_stub"}, |
||
9943 | {AttributeCommonInfo::AS_CXX11, "clang::objc_class_stub"}, |
||
9944 | {AttributeCommonInfo::AS_C2x, "clang::objc_class_stub"}, |
||
9945 | }; |
||
9946 | struct ParsedAttrInfoObjCClassStub final : public ParsedAttrInfo { |
||
9947 | constexpr ParsedAttrInfoObjCClassStub() : ParsedAttrInfo( |
||
9948 | /*AttrKind=*/ParsedAttr::AT_ObjCClassStub, |
||
9949 | /*NumArgs=*/0, |
||
9950 | /*OptArgs=*/0, |
||
9951 | /*NumArgMembers=*/0, |
||
9952 | /*HasCustomParsing=*/0, |
||
9953 | /*AcceptsExprPack=*/0, |
||
9954 | /*IsTargetSpecific=*/0, |
||
9955 | /*IsType=*/0, |
||
9956 | /*IsStmt=*/0, |
||
9957 | /*IsKnownToGCC=*/0, |
||
9958 | /*IsSupportedByPragmaAttribute=*/1, |
||
9959 | /*Spellings=*/ObjCClassStubSpellings, |
||
9960 | /*ArgNames=*/{}) {} |
||
9961 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
9962 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
9963 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
9964 | << Attr << "Objective-C interfaces"; |
||
9965 | return false; |
||
9966 | } |
||
9967 | return true; |
||
9968 | } |
||
9969 | |||
9970 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
9971 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
9972 | << AL << St->getBeginLoc(); |
||
9973 | return false; |
||
9974 | } |
||
9975 | |||
9976 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
9977 | return (LangOpts.ObjCRuntime.allowsClassStubs()); |
||
9978 | } |
||
9979 | |||
9980 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
9981 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
9982 | } |
||
9983 | |||
9984 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
9985 | D->addAttr(::new (S.Context) ObjCClassStubAttr(S.Context, Attr)); |
||
9986 | return AttributeApplied; |
||
9987 | } |
||
9988 | |||
9989 | bool isParamExpr(size_t N) const override { |
||
9990 | return false; |
||
9991 | } |
||
9992 | |||
9993 | static const ParsedAttrInfoObjCClassStub Instance; |
||
9994 | }; |
||
9995 | const ParsedAttrInfoObjCClassStub ParsedAttrInfoObjCClassStub::Instance; |
||
9996 | static constexpr ParsedAttrInfo::Spelling ObjCDesignatedInitializerSpellings[] = { |
||
9997 | {AttributeCommonInfo::AS_GNU, "objc_designated_initializer"}, |
||
9998 | {AttributeCommonInfo::AS_CXX11, "clang::objc_designated_initializer"}, |
||
9999 | {AttributeCommonInfo::AS_C2x, "clang::objc_designated_initializer"}, |
||
10000 | }; |
||
10001 | struct ParsedAttrInfoObjCDesignatedInitializer final : public ParsedAttrInfo { |
||
10002 | constexpr ParsedAttrInfoObjCDesignatedInitializer() : ParsedAttrInfo( |
||
10003 | /*AttrKind=*/ParsedAttr::AT_ObjCDesignatedInitializer, |
||
10004 | /*NumArgs=*/0, |
||
10005 | /*OptArgs=*/0, |
||
10006 | /*NumArgMembers=*/0, |
||
10007 | /*HasCustomParsing=*/0, |
||
10008 | /*AcceptsExprPack=*/0, |
||
10009 | /*IsTargetSpecific=*/0, |
||
10010 | /*IsType=*/0, |
||
10011 | /*IsStmt=*/0, |
||
10012 | /*IsKnownToGCC=*/0, |
||
10013 | /*IsSupportedByPragmaAttribute=*/1, |
||
10014 | /*Spellings=*/ObjCDesignatedInitializerSpellings, |
||
10015 | /*ArgNames=*/{}) {} |
||
10016 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10017 | if (!isa<ObjCMethodDecl>(D)) { |
||
10018 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10019 | << Attr << "Objective-C methods"; |
||
10020 | return false; |
||
10021 | } |
||
10022 | return true; |
||
10023 | } |
||
10024 | |||
10025 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10026 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10027 | << AL << St->getBeginLoc(); |
||
10028 | return false; |
||
10029 | } |
||
10030 | |||
10031 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10032 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
10033 | } |
||
10034 | |||
10035 | bool isParamExpr(size_t N) const override { |
||
10036 | return false; |
||
10037 | } |
||
10038 | |||
10039 | static const ParsedAttrInfoObjCDesignatedInitializer Instance; |
||
10040 | }; |
||
10041 | const ParsedAttrInfoObjCDesignatedInitializer ParsedAttrInfoObjCDesignatedInitializer::Instance; |
||
10042 | static constexpr ParsedAttrInfo::Spelling ObjCDirectSpellings[] = { |
||
10043 | {AttributeCommonInfo::AS_GNU, "objc_direct"}, |
||
10044 | {AttributeCommonInfo::AS_CXX11, "clang::objc_direct"}, |
||
10045 | {AttributeCommonInfo::AS_C2x, "clang::objc_direct"}, |
||
10046 | }; |
||
10047 | struct ParsedAttrInfoObjCDirect final : public ParsedAttrInfo { |
||
10048 | constexpr ParsedAttrInfoObjCDirect() : ParsedAttrInfo( |
||
10049 | /*AttrKind=*/ParsedAttr::AT_ObjCDirect, |
||
10050 | /*NumArgs=*/0, |
||
10051 | /*OptArgs=*/0, |
||
10052 | /*NumArgMembers=*/0, |
||
10053 | /*HasCustomParsing=*/0, |
||
10054 | /*AcceptsExprPack=*/0, |
||
10055 | /*IsTargetSpecific=*/0, |
||
10056 | /*IsType=*/0, |
||
10057 | /*IsStmt=*/0, |
||
10058 | /*IsKnownToGCC=*/0, |
||
10059 | /*IsSupportedByPragmaAttribute=*/1, |
||
10060 | /*Spellings=*/ObjCDirectSpellings, |
||
10061 | /*ArgNames=*/{}) {} |
||
10062 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10063 | if (!isa<ObjCMethodDecl>(D)) { |
||
10064 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10065 | << Attr << "Objective-C methods"; |
||
10066 | return false; |
||
10067 | } |
||
10068 | return true; |
||
10069 | } |
||
10070 | |||
10071 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10072 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10073 | << AL << St->getBeginLoc(); |
||
10074 | return false; |
||
10075 | } |
||
10076 | |||
10077 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
10078 | return LangOpts.ObjC; |
||
10079 | } |
||
10080 | |||
10081 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10082 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
10083 | } |
||
10084 | |||
10085 | bool isParamExpr(size_t N) const override { |
||
10086 | return false; |
||
10087 | } |
||
10088 | |||
10089 | static const ParsedAttrInfoObjCDirect Instance; |
||
10090 | }; |
||
10091 | const ParsedAttrInfoObjCDirect ParsedAttrInfoObjCDirect::Instance; |
||
10092 | static constexpr ParsedAttrInfo::Spelling ObjCDirectMembersSpellings[] = { |
||
10093 | {AttributeCommonInfo::AS_GNU, "objc_direct_members"}, |
||
10094 | {AttributeCommonInfo::AS_CXX11, "clang::objc_direct_members"}, |
||
10095 | {AttributeCommonInfo::AS_C2x, "clang::objc_direct_members"}, |
||
10096 | }; |
||
10097 | struct ParsedAttrInfoObjCDirectMembers final : public ParsedAttrInfo { |
||
10098 | constexpr ParsedAttrInfoObjCDirectMembers() : ParsedAttrInfo( |
||
10099 | /*AttrKind=*/ParsedAttr::AT_ObjCDirectMembers, |
||
10100 | /*NumArgs=*/0, |
||
10101 | /*OptArgs=*/0, |
||
10102 | /*NumArgMembers=*/0, |
||
10103 | /*HasCustomParsing=*/0, |
||
10104 | /*AcceptsExprPack=*/0, |
||
10105 | /*IsTargetSpecific=*/0, |
||
10106 | /*IsType=*/0, |
||
10107 | /*IsStmt=*/0, |
||
10108 | /*IsKnownToGCC=*/0, |
||
10109 | /*IsSupportedByPragmaAttribute=*/1, |
||
10110 | /*Spellings=*/ObjCDirectMembersSpellings, |
||
10111 | /*ArgNames=*/{}) {} |
||
10112 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10113 | if (!isa<ObjCImplDecl>(D) && !isa<ObjCInterfaceDecl>(D) && !isa<ObjCCategoryDecl>(D)) { |
||
10114 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10115 | << Attr << "Objective-C implementation declarations, Objective-C interfaces, and Objective-C containers"; |
||
10116 | return false; |
||
10117 | } |
||
10118 | return true; |
||
10119 | } |
||
10120 | |||
10121 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10122 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10123 | << AL << St->getBeginLoc(); |
||
10124 | return false; |
||
10125 | } |
||
10126 | |||
10127 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
10128 | return LangOpts.ObjC; |
||
10129 | } |
||
10130 | |||
10131 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10132 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC)); |
||
10133 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10134 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC)); |
||
10135 | } |
||
10136 | |||
10137 | bool isParamExpr(size_t N) const override { |
||
10138 | return false; |
||
10139 | } |
||
10140 | |||
10141 | static const ParsedAttrInfoObjCDirectMembers Instance; |
||
10142 | }; |
||
10143 | const ParsedAttrInfoObjCDirectMembers ParsedAttrInfoObjCDirectMembers::Instance; |
||
10144 | static constexpr ParsedAttrInfo::Spelling ObjCExceptionSpellings[] = { |
||
10145 | {AttributeCommonInfo::AS_GNU, "objc_exception"}, |
||
10146 | {AttributeCommonInfo::AS_CXX11, "clang::objc_exception"}, |
||
10147 | {AttributeCommonInfo::AS_C2x, "clang::objc_exception"}, |
||
10148 | }; |
||
10149 | struct ParsedAttrInfoObjCException final : public ParsedAttrInfo { |
||
10150 | constexpr ParsedAttrInfoObjCException() : ParsedAttrInfo( |
||
10151 | /*AttrKind=*/ParsedAttr::AT_ObjCException, |
||
10152 | /*NumArgs=*/0, |
||
10153 | /*OptArgs=*/0, |
||
10154 | /*NumArgMembers=*/0, |
||
10155 | /*HasCustomParsing=*/0, |
||
10156 | /*AcceptsExprPack=*/0, |
||
10157 | /*IsTargetSpecific=*/0, |
||
10158 | /*IsType=*/0, |
||
10159 | /*IsStmt=*/0, |
||
10160 | /*IsKnownToGCC=*/0, |
||
10161 | /*IsSupportedByPragmaAttribute=*/1, |
||
10162 | /*Spellings=*/ObjCExceptionSpellings, |
||
10163 | /*ArgNames=*/{}) {} |
||
10164 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10165 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
10166 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10167 | << Attr << "Objective-C interfaces"; |
||
10168 | return false; |
||
10169 | } |
||
10170 | return true; |
||
10171 | } |
||
10172 | |||
10173 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10174 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10175 | << AL << St->getBeginLoc(); |
||
10176 | return false; |
||
10177 | } |
||
10178 | |||
10179 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10180 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10181 | } |
||
10182 | |||
10183 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10184 | D->addAttr(::new (S.Context) ObjCExceptionAttr(S.Context, Attr)); |
||
10185 | return AttributeApplied; |
||
10186 | } |
||
10187 | |||
10188 | bool isParamExpr(size_t N) const override { |
||
10189 | return false; |
||
10190 | } |
||
10191 | |||
10192 | static const ParsedAttrInfoObjCException Instance; |
||
10193 | }; |
||
10194 | const ParsedAttrInfoObjCException ParsedAttrInfoObjCException::Instance; |
||
10195 | static constexpr ParsedAttrInfo::Spelling ObjCExplicitProtocolImplSpellings[] = { |
||
10196 | {AttributeCommonInfo::AS_GNU, "objc_protocol_requires_explicit_implementation"}, |
||
10197 | {AttributeCommonInfo::AS_CXX11, "clang::objc_protocol_requires_explicit_implementation"}, |
||
10198 | {AttributeCommonInfo::AS_C2x, "clang::objc_protocol_requires_explicit_implementation"}, |
||
10199 | }; |
||
10200 | struct ParsedAttrInfoObjCExplicitProtocolImpl final : public ParsedAttrInfo { |
||
10201 | constexpr ParsedAttrInfoObjCExplicitProtocolImpl() : ParsedAttrInfo( |
||
10202 | /*AttrKind=*/ParsedAttr::AT_ObjCExplicitProtocolImpl, |
||
10203 | /*NumArgs=*/0, |
||
10204 | /*OptArgs=*/0, |
||
10205 | /*NumArgMembers=*/0, |
||
10206 | /*HasCustomParsing=*/0, |
||
10207 | /*AcceptsExprPack=*/0, |
||
10208 | /*IsTargetSpecific=*/0, |
||
10209 | /*IsType=*/0, |
||
10210 | /*IsStmt=*/0, |
||
10211 | /*IsKnownToGCC=*/0, |
||
10212 | /*IsSupportedByPragmaAttribute=*/1, |
||
10213 | /*Spellings=*/ObjCExplicitProtocolImplSpellings, |
||
10214 | /*ArgNames=*/{}) {} |
||
10215 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10216 | if (!isa<ObjCProtocolDecl>(D)) { |
||
10217 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10218 | << Attr << "Objective-C protocols"; |
||
10219 | return false; |
||
10220 | } |
||
10221 | return true; |
||
10222 | } |
||
10223 | |||
10224 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10225 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10226 | << AL << St->getBeginLoc(); |
||
10227 | return false; |
||
10228 | } |
||
10229 | |||
10230 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10231 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC)); |
||
10232 | } |
||
10233 | |||
10234 | bool isParamExpr(size_t N) const override { |
||
10235 | return false; |
||
10236 | } |
||
10237 | |||
10238 | static const ParsedAttrInfoObjCExplicitProtocolImpl Instance; |
||
10239 | }; |
||
10240 | const ParsedAttrInfoObjCExplicitProtocolImpl ParsedAttrInfoObjCExplicitProtocolImpl::Instance; |
||
10241 | static constexpr ParsedAttrInfo::Spelling ObjCExternallyRetainedSpellings[] = { |
||
10242 | {AttributeCommonInfo::AS_GNU, "objc_externally_retained"}, |
||
10243 | {AttributeCommonInfo::AS_CXX11, "clang::objc_externally_retained"}, |
||
10244 | {AttributeCommonInfo::AS_C2x, "clang::objc_externally_retained"}, |
||
10245 | }; |
||
10246 | struct ParsedAttrInfoObjCExternallyRetained final : public ParsedAttrInfo { |
||
10247 | constexpr ParsedAttrInfoObjCExternallyRetained() : ParsedAttrInfo( |
||
10248 | /*AttrKind=*/ParsedAttr::AT_ObjCExternallyRetained, |
||
10249 | /*NumArgs=*/0, |
||
10250 | /*OptArgs=*/0, |
||
10251 | /*NumArgMembers=*/0, |
||
10252 | /*HasCustomParsing=*/0, |
||
10253 | /*AcceptsExprPack=*/0, |
||
10254 | /*IsTargetSpecific=*/0, |
||
10255 | /*IsType=*/0, |
||
10256 | /*IsStmt=*/0, |
||
10257 | /*IsKnownToGCC=*/0, |
||
10258 | /*IsSupportedByPragmaAttribute=*/1, |
||
10259 | /*Spellings=*/ObjCExternallyRetainedSpellings, |
||
10260 | /*ArgNames=*/{}) {} |
||
10261 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10262 | if (!isNonParmVar(D) && !isa<FunctionDecl>(D) && !isa<BlockDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
10263 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
10264 | << Attr << "variables, functions, blocks, and Objective-C methods"; |
||
10265 | return false; |
||
10266 | } |
||
10267 | return true; |
||
10268 | } |
||
10269 | |||
10270 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10271 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10272 | << AL << St->getBeginLoc(); |
||
10273 | return false; |
||
10274 | } |
||
10275 | |||
10276 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
10277 | return LangOpts.ObjCAutoRefCount; |
||
10278 | } |
||
10279 | |||
10280 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10281 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_not_is_parameter, /*IsSupported=*/true)); |
||
10282 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
10283 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_block, /*IsSupported=*/LangOpts.Blocks)); |
||
10284 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
10285 | } |
||
10286 | |||
10287 | bool isParamExpr(size_t N) const override { |
||
10288 | return false; |
||
10289 | } |
||
10290 | |||
10291 | static const ParsedAttrInfoObjCExternallyRetained Instance; |
||
10292 | }; |
||
10293 | const ParsedAttrInfoObjCExternallyRetained ParsedAttrInfoObjCExternallyRetained::Instance; |
||
10294 | static constexpr ParsedAttrInfo::Spelling ObjCGCSpellings[] = { |
||
10295 | {AttributeCommonInfo::AS_GNU, "objc_gc"}, |
||
10296 | {AttributeCommonInfo::AS_CXX11, "clang::objc_gc"}, |
||
10297 | {AttributeCommonInfo::AS_C2x, "clang::objc_gc"}, |
||
10298 | }; |
||
10299 | static constexpr const char *ObjCGCArgNames[] = { |
||
10300 | "Kind",}; |
||
10301 | struct ParsedAttrInfoObjCGC final : public ParsedAttrInfo { |
||
10302 | constexpr ParsedAttrInfoObjCGC() : ParsedAttrInfo( |
||
10303 | /*AttrKind=*/ParsedAttr::AT_ObjCGC, |
||
10304 | /*NumArgs=*/1, |
||
10305 | /*OptArgs=*/0, |
||
10306 | /*NumArgMembers=*/1, |
||
10307 | /*HasCustomParsing=*/0, |
||
10308 | /*AcceptsExprPack=*/0, |
||
10309 | /*IsTargetSpecific=*/0, |
||
10310 | /*IsType=*/1, |
||
10311 | /*IsStmt=*/0, |
||
10312 | /*IsKnownToGCC=*/0, |
||
10313 | /*IsSupportedByPragmaAttribute=*/0, |
||
10314 | /*Spellings=*/ObjCGCSpellings, |
||
10315 | /*ArgNames=*/ObjCGCArgNames) {} |
||
10316 | bool isParamExpr(size_t N) const override { |
||
10317 | return false; |
||
10318 | } |
||
10319 | |||
10320 | static const ParsedAttrInfoObjCGC Instance; |
||
10321 | }; |
||
10322 | const ParsedAttrInfoObjCGC ParsedAttrInfoObjCGC::Instance; |
||
10323 | static constexpr ParsedAttrInfo::Spelling ObjCIndependentClassSpellings[] = { |
||
10324 | {AttributeCommonInfo::AS_GNU, "objc_independent_class"}, |
||
10325 | {AttributeCommonInfo::AS_CXX11, "clang::objc_independent_class"}, |
||
10326 | {AttributeCommonInfo::AS_C2x, "clang::objc_independent_class"}, |
||
10327 | }; |
||
10328 | struct ParsedAttrInfoObjCIndependentClass final : public ParsedAttrInfo { |
||
10329 | constexpr ParsedAttrInfoObjCIndependentClass() : ParsedAttrInfo( |
||
10330 | /*AttrKind=*/ParsedAttr::AT_ObjCIndependentClass, |
||
10331 | /*NumArgs=*/0, |
||
10332 | /*OptArgs=*/0, |
||
10333 | /*NumArgMembers=*/0, |
||
10334 | /*HasCustomParsing=*/0, |
||
10335 | /*AcceptsExprPack=*/0, |
||
10336 | /*IsTargetSpecific=*/0, |
||
10337 | /*IsType=*/0, |
||
10338 | /*IsStmt=*/0, |
||
10339 | /*IsKnownToGCC=*/0, |
||
10340 | /*IsSupportedByPragmaAttribute=*/0, |
||
10341 | /*Spellings=*/ObjCIndependentClassSpellings, |
||
10342 | /*ArgNames=*/{}) {} |
||
10343 | bool isParamExpr(size_t N) const override { |
||
10344 | return false; |
||
10345 | } |
||
10346 | |||
10347 | static const ParsedAttrInfoObjCIndependentClass Instance; |
||
10348 | }; |
||
10349 | const ParsedAttrInfoObjCIndependentClass ParsedAttrInfoObjCIndependentClass::Instance; |
||
10350 | static constexpr ParsedAttrInfo::Spelling ObjCInertUnsafeUnretainedSpellings[] = { |
||
10351 | {AttributeCommonInfo::AS_Keyword, "__unsafe_unretained"}, |
||
10352 | }; |
||
10353 | struct ParsedAttrInfoObjCInertUnsafeUnretained final : public ParsedAttrInfo { |
||
10354 | constexpr ParsedAttrInfoObjCInertUnsafeUnretained() : ParsedAttrInfo( |
||
10355 | /*AttrKind=*/ParsedAttr::AT_ObjCInertUnsafeUnretained, |
||
10356 | /*NumArgs=*/0, |
||
10357 | /*OptArgs=*/0, |
||
10358 | /*NumArgMembers=*/0, |
||
10359 | /*HasCustomParsing=*/0, |
||
10360 | /*AcceptsExprPack=*/0, |
||
10361 | /*IsTargetSpecific=*/0, |
||
10362 | /*IsType=*/1, |
||
10363 | /*IsStmt=*/0, |
||
10364 | /*IsKnownToGCC=*/0, |
||
10365 | /*IsSupportedByPragmaAttribute=*/0, |
||
10366 | /*Spellings=*/ObjCInertUnsafeUnretainedSpellings, |
||
10367 | /*ArgNames=*/{}) {} |
||
10368 | bool isParamExpr(size_t N) const override { |
||
10369 | return false; |
||
10370 | } |
||
10371 | |||
10372 | static const ParsedAttrInfoObjCInertUnsafeUnretained Instance; |
||
10373 | }; |
||
10374 | const ParsedAttrInfoObjCInertUnsafeUnretained ParsedAttrInfoObjCInertUnsafeUnretained::Instance; |
||
10375 | static constexpr ParsedAttrInfo::Spelling ObjCKindOfSpellings[] = { |
||
10376 | {AttributeCommonInfo::AS_Keyword, "__kindof"}, |
||
10377 | }; |
||
10378 | struct ParsedAttrInfoObjCKindOf final : public ParsedAttrInfo { |
||
10379 | constexpr ParsedAttrInfoObjCKindOf() : ParsedAttrInfo( |
||
10380 | /*AttrKind=*/ParsedAttr::AT_ObjCKindOf, |
||
10381 | /*NumArgs=*/0, |
||
10382 | /*OptArgs=*/0, |
||
10383 | /*NumArgMembers=*/0, |
||
10384 | /*HasCustomParsing=*/0, |
||
10385 | /*AcceptsExprPack=*/0, |
||
10386 | /*IsTargetSpecific=*/0, |
||
10387 | /*IsType=*/1, |
||
10388 | /*IsStmt=*/0, |
||
10389 | /*IsKnownToGCC=*/0, |
||
10390 | /*IsSupportedByPragmaAttribute=*/0, |
||
10391 | /*Spellings=*/ObjCKindOfSpellings, |
||
10392 | /*ArgNames=*/{}) {} |
||
10393 | bool isParamExpr(size_t N) const override { |
||
10394 | return false; |
||
10395 | } |
||
10396 | |||
10397 | static const ParsedAttrInfoObjCKindOf Instance; |
||
10398 | }; |
||
10399 | const ParsedAttrInfoObjCKindOf ParsedAttrInfoObjCKindOf::Instance; |
||
10400 | static constexpr ParsedAttrInfo::Spelling ObjCMethodFamilySpellings[] = { |
||
10401 | {AttributeCommonInfo::AS_GNU, "objc_method_family"}, |
||
10402 | {AttributeCommonInfo::AS_CXX11, "clang::objc_method_family"}, |
||
10403 | {AttributeCommonInfo::AS_C2x, "clang::objc_method_family"}, |
||
10404 | }; |
||
10405 | static constexpr const char *ObjCMethodFamilyArgNames[] = { |
||
10406 | "Family",}; |
||
10407 | struct ParsedAttrInfoObjCMethodFamily final : public ParsedAttrInfo { |
||
10408 | constexpr ParsedAttrInfoObjCMethodFamily() : ParsedAttrInfo( |
||
10409 | /*AttrKind=*/ParsedAttr::AT_ObjCMethodFamily, |
||
10410 | /*NumArgs=*/1, |
||
10411 | /*OptArgs=*/0, |
||
10412 | /*NumArgMembers=*/1, |
||
10413 | /*HasCustomParsing=*/0, |
||
10414 | /*AcceptsExprPack=*/0, |
||
10415 | /*IsTargetSpecific=*/0, |
||
10416 | /*IsType=*/0, |
||
10417 | /*IsStmt=*/0, |
||
10418 | /*IsKnownToGCC=*/0, |
||
10419 | /*IsSupportedByPragmaAttribute=*/1, |
||
10420 | /*Spellings=*/ObjCMethodFamilySpellings, |
||
10421 | /*ArgNames=*/ObjCMethodFamilyArgNames) {} |
||
10422 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10423 | if (!isa<ObjCMethodDecl>(D)) { |
||
10424 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10425 | << Attr << "Objective-C methods"; |
||
10426 | return false; |
||
10427 | } |
||
10428 | return true; |
||
10429 | } |
||
10430 | |||
10431 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10432 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10433 | << AL << St->getBeginLoc(); |
||
10434 | return false; |
||
10435 | } |
||
10436 | |||
10437 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10438 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
10439 | } |
||
10440 | |||
10441 | bool isParamExpr(size_t N) const override { |
||
10442 | return false; |
||
10443 | } |
||
10444 | |||
10445 | static const ParsedAttrInfoObjCMethodFamily Instance; |
||
10446 | }; |
||
10447 | const ParsedAttrInfoObjCMethodFamily ParsedAttrInfoObjCMethodFamily::Instance; |
||
10448 | static constexpr ParsedAttrInfo::Spelling ObjCNSObjectSpellings[] = { |
||
10449 | {AttributeCommonInfo::AS_GNU, "NSObject"}, |
||
10450 | {AttributeCommonInfo::AS_CXX11, "clang::NSObject"}, |
||
10451 | {AttributeCommonInfo::AS_C2x, "clang::NSObject"}, |
||
10452 | }; |
||
10453 | struct ParsedAttrInfoObjCNSObject final : public ParsedAttrInfo { |
||
10454 | constexpr ParsedAttrInfoObjCNSObject() : ParsedAttrInfo( |
||
10455 | /*AttrKind=*/ParsedAttr::AT_ObjCNSObject, |
||
10456 | /*NumArgs=*/0, |
||
10457 | /*OptArgs=*/0, |
||
10458 | /*NumArgMembers=*/0, |
||
10459 | /*HasCustomParsing=*/0, |
||
10460 | /*AcceptsExprPack=*/0, |
||
10461 | /*IsTargetSpecific=*/0, |
||
10462 | /*IsType=*/0, |
||
10463 | /*IsStmt=*/0, |
||
10464 | /*IsKnownToGCC=*/0, |
||
10465 | /*IsSupportedByPragmaAttribute=*/0, |
||
10466 | /*Spellings=*/ObjCNSObjectSpellings, |
||
10467 | /*ArgNames=*/{}) {} |
||
10468 | bool isParamExpr(size_t N) const override { |
||
10469 | return false; |
||
10470 | } |
||
10471 | |||
10472 | static const ParsedAttrInfoObjCNSObject Instance; |
||
10473 | }; |
||
10474 | const ParsedAttrInfoObjCNSObject ParsedAttrInfoObjCNSObject::Instance; |
||
10475 | static constexpr ParsedAttrInfo::Spelling ObjCNonLazyClassSpellings[] = { |
||
10476 | {AttributeCommonInfo::AS_GNU, "objc_nonlazy_class"}, |
||
10477 | {AttributeCommonInfo::AS_CXX11, "clang::objc_nonlazy_class"}, |
||
10478 | {AttributeCommonInfo::AS_C2x, "clang::objc_nonlazy_class"}, |
||
10479 | }; |
||
10480 | struct ParsedAttrInfoObjCNonLazyClass final : public ParsedAttrInfo { |
||
10481 | constexpr ParsedAttrInfoObjCNonLazyClass() : ParsedAttrInfo( |
||
10482 | /*AttrKind=*/ParsedAttr::AT_ObjCNonLazyClass, |
||
10483 | /*NumArgs=*/0, |
||
10484 | /*OptArgs=*/0, |
||
10485 | /*NumArgMembers=*/0, |
||
10486 | /*HasCustomParsing=*/0, |
||
10487 | /*AcceptsExprPack=*/0, |
||
10488 | /*IsTargetSpecific=*/0, |
||
10489 | /*IsType=*/0, |
||
10490 | /*IsStmt=*/0, |
||
10491 | /*IsKnownToGCC=*/0, |
||
10492 | /*IsSupportedByPragmaAttribute=*/1, |
||
10493 | /*Spellings=*/ObjCNonLazyClassSpellings, |
||
10494 | /*ArgNames=*/{}) {} |
||
10495 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10496 | if (!isa<ObjCInterfaceDecl>(D) && !isa<ObjCImplDecl>(D)) { |
||
10497 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10498 | << Attr << "Objective-C interfaces and Objective-C implementation declarations"; |
||
10499 | return false; |
||
10500 | } |
||
10501 | return true; |
||
10502 | } |
||
10503 | |||
10504 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10505 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10506 | << AL << St->getBeginLoc(); |
||
10507 | return false; |
||
10508 | } |
||
10509 | |||
10510 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
10511 | return LangOpts.ObjC; |
||
10512 | } |
||
10513 | |||
10514 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10515 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10516 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC)); |
||
10517 | } |
||
10518 | |||
10519 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10520 | D->addAttr(::new (S.Context) ObjCNonLazyClassAttr(S.Context, Attr)); |
||
10521 | return AttributeApplied; |
||
10522 | } |
||
10523 | |||
10524 | bool isParamExpr(size_t N) const override { |
||
10525 | return false; |
||
10526 | } |
||
10527 | |||
10528 | static const ParsedAttrInfoObjCNonLazyClass Instance; |
||
10529 | }; |
||
10530 | const ParsedAttrInfoObjCNonLazyClass ParsedAttrInfoObjCNonLazyClass::Instance; |
||
10531 | static constexpr ParsedAttrInfo::Spelling ObjCNonRuntimeProtocolSpellings[] = { |
||
10532 | {AttributeCommonInfo::AS_GNU, "objc_non_runtime_protocol"}, |
||
10533 | {AttributeCommonInfo::AS_CXX11, "clang::objc_non_runtime_protocol"}, |
||
10534 | {AttributeCommonInfo::AS_C2x, "clang::objc_non_runtime_protocol"}, |
||
10535 | }; |
||
10536 | struct ParsedAttrInfoObjCNonRuntimeProtocol final : public ParsedAttrInfo { |
||
10537 | constexpr ParsedAttrInfoObjCNonRuntimeProtocol() : ParsedAttrInfo( |
||
10538 | /*AttrKind=*/ParsedAttr::AT_ObjCNonRuntimeProtocol, |
||
10539 | /*NumArgs=*/0, |
||
10540 | /*OptArgs=*/0, |
||
10541 | /*NumArgMembers=*/0, |
||
10542 | /*HasCustomParsing=*/0, |
||
10543 | /*AcceptsExprPack=*/0, |
||
10544 | /*IsTargetSpecific=*/0, |
||
10545 | /*IsType=*/0, |
||
10546 | /*IsStmt=*/0, |
||
10547 | /*IsKnownToGCC=*/0, |
||
10548 | /*IsSupportedByPragmaAttribute=*/1, |
||
10549 | /*Spellings=*/ObjCNonRuntimeProtocolSpellings, |
||
10550 | /*ArgNames=*/{}) {} |
||
10551 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10552 | if (!isa<ObjCProtocolDecl>(D)) { |
||
10553 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10554 | << Attr << "Objective-C protocols"; |
||
10555 | return false; |
||
10556 | } |
||
10557 | return true; |
||
10558 | } |
||
10559 | |||
10560 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10561 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10562 | << AL << St->getBeginLoc(); |
||
10563 | return false; |
||
10564 | } |
||
10565 | |||
10566 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
10567 | return LangOpts.ObjC; |
||
10568 | } |
||
10569 | |||
10570 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10571 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC)); |
||
10572 | } |
||
10573 | |||
10574 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10575 | D->addAttr(::new (S.Context) ObjCNonRuntimeProtocolAttr(S.Context, Attr)); |
||
10576 | return AttributeApplied; |
||
10577 | } |
||
10578 | |||
10579 | bool isParamExpr(size_t N) const override { |
||
10580 | return false; |
||
10581 | } |
||
10582 | |||
10583 | static const ParsedAttrInfoObjCNonRuntimeProtocol Instance; |
||
10584 | }; |
||
10585 | const ParsedAttrInfoObjCNonRuntimeProtocol ParsedAttrInfoObjCNonRuntimeProtocol::Instance; |
||
10586 | static constexpr ParsedAttrInfo::Spelling ObjCOwnershipSpellings[] = { |
||
10587 | {AttributeCommonInfo::AS_GNU, "objc_ownership"}, |
||
10588 | {AttributeCommonInfo::AS_CXX11, "clang::objc_ownership"}, |
||
10589 | {AttributeCommonInfo::AS_C2x, "clang::objc_ownership"}, |
||
10590 | }; |
||
10591 | static constexpr const char *ObjCOwnershipArgNames[] = { |
||
10592 | "Kind",}; |
||
10593 | struct ParsedAttrInfoObjCOwnership final : public ParsedAttrInfo { |
||
10594 | constexpr ParsedAttrInfoObjCOwnership() : ParsedAttrInfo( |
||
10595 | /*AttrKind=*/ParsedAttr::AT_ObjCOwnership, |
||
10596 | /*NumArgs=*/1, |
||
10597 | /*OptArgs=*/0, |
||
10598 | /*NumArgMembers=*/1, |
||
10599 | /*HasCustomParsing=*/0, |
||
10600 | /*AcceptsExprPack=*/0, |
||
10601 | /*IsTargetSpecific=*/0, |
||
10602 | /*IsType=*/1, |
||
10603 | /*IsStmt=*/0, |
||
10604 | /*IsKnownToGCC=*/0, |
||
10605 | /*IsSupportedByPragmaAttribute=*/0, |
||
10606 | /*Spellings=*/ObjCOwnershipSpellings, |
||
10607 | /*ArgNames=*/ObjCOwnershipArgNames) {} |
||
10608 | bool isParamExpr(size_t N) const override { |
||
10609 | return false; |
||
10610 | } |
||
10611 | |||
10612 | static const ParsedAttrInfoObjCOwnership Instance; |
||
10613 | }; |
||
10614 | const ParsedAttrInfoObjCOwnership ParsedAttrInfoObjCOwnership::Instance; |
||
10615 | static constexpr ParsedAttrInfo::Spelling ObjCPreciseLifetimeSpellings[] = { |
||
10616 | {AttributeCommonInfo::AS_GNU, "objc_precise_lifetime"}, |
||
10617 | {AttributeCommonInfo::AS_CXX11, "clang::objc_precise_lifetime"}, |
||
10618 | {AttributeCommonInfo::AS_C2x, "clang::objc_precise_lifetime"}, |
||
10619 | }; |
||
10620 | struct ParsedAttrInfoObjCPreciseLifetime final : public ParsedAttrInfo { |
||
10621 | constexpr ParsedAttrInfoObjCPreciseLifetime() : ParsedAttrInfo( |
||
10622 | /*AttrKind=*/ParsedAttr::AT_ObjCPreciseLifetime, |
||
10623 | /*NumArgs=*/0, |
||
10624 | /*OptArgs=*/0, |
||
10625 | /*NumArgMembers=*/0, |
||
10626 | /*HasCustomParsing=*/0, |
||
10627 | /*AcceptsExprPack=*/0, |
||
10628 | /*IsTargetSpecific=*/0, |
||
10629 | /*IsType=*/0, |
||
10630 | /*IsStmt=*/0, |
||
10631 | /*IsKnownToGCC=*/0, |
||
10632 | /*IsSupportedByPragmaAttribute=*/1, |
||
10633 | /*Spellings=*/ObjCPreciseLifetimeSpellings, |
||
10634 | /*ArgNames=*/{}) {} |
||
10635 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10636 | if (!isa<VarDecl>(D)) { |
||
10637 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10638 | << Attr << "variables"; |
||
10639 | return false; |
||
10640 | } |
||
10641 | return true; |
||
10642 | } |
||
10643 | |||
10644 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10645 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10646 | << AL << St->getBeginLoc(); |
||
10647 | return false; |
||
10648 | } |
||
10649 | |||
10650 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10651 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
10652 | } |
||
10653 | |||
10654 | bool isParamExpr(size_t N) const override { |
||
10655 | return false; |
||
10656 | } |
||
10657 | |||
10658 | static const ParsedAttrInfoObjCPreciseLifetime Instance; |
||
10659 | }; |
||
10660 | const ParsedAttrInfoObjCPreciseLifetime ParsedAttrInfoObjCPreciseLifetime::Instance; |
||
10661 | static constexpr ParsedAttrInfo::Spelling ObjCRequiresPropertyDefsSpellings[] = { |
||
10662 | {AttributeCommonInfo::AS_GNU, "objc_requires_property_definitions"}, |
||
10663 | {AttributeCommonInfo::AS_CXX11, "clang::objc_requires_property_definitions"}, |
||
10664 | {AttributeCommonInfo::AS_C2x, "clang::objc_requires_property_definitions"}, |
||
10665 | }; |
||
10666 | struct ParsedAttrInfoObjCRequiresPropertyDefs final : public ParsedAttrInfo { |
||
10667 | constexpr ParsedAttrInfoObjCRequiresPropertyDefs() : ParsedAttrInfo( |
||
10668 | /*AttrKind=*/ParsedAttr::AT_ObjCRequiresPropertyDefs, |
||
10669 | /*NumArgs=*/0, |
||
10670 | /*OptArgs=*/0, |
||
10671 | /*NumArgMembers=*/0, |
||
10672 | /*HasCustomParsing=*/0, |
||
10673 | /*AcceptsExprPack=*/0, |
||
10674 | /*IsTargetSpecific=*/0, |
||
10675 | /*IsType=*/0, |
||
10676 | /*IsStmt=*/0, |
||
10677 | /*IsKnownToGCC=*/0, |
||
10678 | /*IsSupportedByPragmaAttribute=*/1, |
||
10679 | /*Spellings=*/ObjCRequiresPropertyDefsSpellings, |
||
10680 | /*ArgNames=*/{}) {} |
||
10681 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10682 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
10683 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10684 | << Attr << "Objective-C interfaces"; |
||
10685 | return false; |
||
10686 | } |
||
10687 | return true; |
||
10688 | } |
||
10689 | |||
10690 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10691 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10692 | << AL << St->getBeginLoc(); |
||
10693 | return false; |
||
10694 | } |
||
10695 | |||
10696 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10697 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10698 | } |
||
10699 | |||
10700 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10701 | D->addAttr(::new (S.Context) ObjCRequiresPropertyDefsAttr(S.Context, Attr)); |
||
10702 | return AttributeApplied; |
||
10703 | } |
||
10704 | |||
10705 | bool isParamExpr(size_t N) const override { |
||
10706 | return false; |
||
10707 | } |
||
10708 | |||
10709 | static const ParsedAttrInfoObjCRequiresPropertyDefs Instance; |
||
10710 | }; |
||
10711 | const ParsedAttrInfoObjCRequiresPropertyDefs ParsedAttrInfoObjCRequiresPropertyDefs::Instance; |
||
10712 | static constexpr ParsedAttrInfo::Spelling ObjCRequiresSuperSpellings[] = { |
||
10713 | {AttributeCommonInfo::AS_GNU, "objc_requires_super"}, |
||
10714 | {AttributeCommonInfo::AS_CXX11, "clang::objc_requires_super"}, |
||
10715 | {AttributeCommonInfo::AS_C2x, "clang::objc_requires_super"}, |
||
10716 | }; |
||
10717 | struct ParsedAttrInfoObjCRequiresSuper final : public ParsedAttrInfo { |
||
10718 | constexpr ParsedAttrInfoObjCRequiresSuper() : ParsedAttrInfo( |
||
10719 | /*AttrKind=*/ParsedAttr::AT_ObjCRequiresSuper, |
||
10720 | /*NumArgs=*/0, |
||
10721 | /*OptArgs=*/0, |
||
10722 | /*NumArgMembers=*/0, |
||
10723 | /*HasCustomParsing=*/0, |
||
10724 | /*AcceptsExprPack=*/0, |
||
10725 | /*IsTargetSpecific=*/0, |
||
10726 | /*IsType=*/0, |
||
10727 | /*IsStmt=*/0, |
||
10728 | /*IsKnownToGCC=*/0, |
||
10729 | /*IsSupportedByPragmaAttribute=*/1, |
||
10730 | /*Spellings=*/ObjCRequiresSuperSpellings, |
||
10731 | /*ArgNames=*/{}) {} |
||
10732 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10733 | if (!isa<ObjCMethodDecl>(D)) { |
||
10734 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10735 | << Attr << "Objective-C methods"; |
||
10736 | return false; |
||
10737 | } |
||
10738 | return true; |
||
10739 | } |
||
10740 | |||
10741 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10742 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10743 | << AL << St->getBeginLoc(); |
||
10744 | return false; |
||
10745 | } |
||
10746 | |||
10747 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10748 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
10749 | } |
||
10750 | |||
10751 | bool isParamExpr(size_t N) const override { |
||
10752 | return false; |
||
10753 | } |
||
10754 | |||
10755 | static const ParsedAttrInfoObjCRequiresSuper Instance; |
||
10756 | }; |
||
10757 | const ParsedAttrInfoObjCRequiresSuper ParsedAttrInfoObjCRequiresSuper::Instance; |
||
10758 | static constexpr ParsedAttrInfo::Spelling ObjCReturnsInnerPointerSpellings[] = { |
||
10759 | {AttributeCommonInfo::AS_GNU, "objc_returns_inner_pointer"}, |
||
10760 | {AttributeCommonInfo::AS_CXX11, "clang::objc_returns_inner_pointer"}, |
||
10761 | {AttributeCommonInfo::AS_C2x, "clang::objc_returns_inner_pointer"}, |
||
10762 | }; |
||
10763 | struct ParsedAttrInfoObjCReturnsInnerPointer final : public ParsedAttrInfo { |
||
10764 | constexpr ParsedAttrInfoObjCReturnsInnerPointer() : ParsedAttrInfo( |
||
10765 | /*AttrKind=*/ParsedAttr::AT_ObjCReturnsInnerPointer, |
||
10766 | /*NumArgs=*/0, |
||
10767 | /*OptArgs=*/0, |
||
10768 | /*NumArgMembers=*/0, |
||
10769 | /*HasCustomParsing=*/0, |
||
10770 | /*AcceptsExprPack=*/0, |
||
10771 | /*IsTargetSpecific=*/0, |
||
10772 | /*IsType=*/0, |
||
10773 | /*IsStmt=*/0, |
||
10774 | /*IsKnownToGCC=*/0, |
||
10775 | /*IsSupportedByPragmaAttribute=*/1, |
||
10776 | /*Spellings=*/ObjCReturnsInnerPointerSpellings, |
||
10777 | /*ArgNames=*/{}) {} |
||
10778 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10779 | if (!isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D)) { |
||
10780 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10781 | << Attr << "Objective-C methods and Objective-C properties"; |
||
10782 | return false; |
||
10783 | } |
||
10784 | return true; |
||
10785 | } |
||
10786 | |||
10787 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10788 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10789 | << AL << St->getBeginLoc(); |
||
10790 | return false; |
||
10791 | } |
||
10792 | |||
10793 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10794 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
10795 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC)); |
||
10796 | } |
||
10797 | |||
10798 | bool isParamExpr(size_t N) const override { |
||
10799 | return false; |
||
10800 | } |
||
10801 | |||
10802 | static const ParsedAttrInfoObjCReturnsInnerPointer Instance; |
||
10803 | }; |
||
10804 | const ParsedAttrInfoObjCReturnsInnerPointer ParsedAttrInfoObjCReturnsInnerPointer::Instance; |
||
10805 | static constexpr ParsedAttrInfo::Spelling ObjCRootClassSpellings[] = { |
||
10806 | {AttributeCommonInfo::AS_GNU, "objc_root_class"}, |
||
10807 | {AttributeCommonInfo::AS_CXX11, "clang::objc_root_class"}, |
||
10808 | {AttributeCommonInfo::AS_C2x, "clang::objc_root_class"}, |
||
10809 | }; |
||
10810 | struct ParsedAttrInfoObjCRootClass final : public ParsedAttrInfo { |
||
10811 | constexpr ParsedAttrInfoObjCRootClass() : ParsedAttrInfo( |
||
10812 | /*AttrKind=*/ParsedAttr::AT_ObjCRootClass, |
||
10813 | /*NumArgs=*/0, |
||
10814 | /*OptArgs=*/0, |
||
10815 | /*NumArgMembers=*/0, |
||
10816 | /*HasCustomParsing=*/0, |
||
10817 | /*AcceptsExprPack=*/0, |
||
10818 | /*IsTargetSpecific=*/0, |
||
10819 | /*IsType=*/0, |
||
10820 | /*IsStmt=*/0, |
||
10821 | /*IsKnownToGCC=*/0, |
||
10822 | /*IsSupportedByPragmaAttribute=*/1, |
||
10823 | /*Spellings=*/ObjCRootClassSpellings, |
||
10824 | /*ArgNames=*/{}) {} |
||
10825 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10826 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
10827 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10828 | << Attr << "Objective-C interfaces"; |
||
10829 | return false; |
||
10830 | } |
||
10831 | return true; |
||
10832 | } |
||
10833 | |||
10834 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10835 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10836 | << AL << St->getBeginLoc(); |
||
10837 | return false; |
||
10838 | } |
||
10839 | |||
10840 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10841 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10842 | } |
||
10843 | |||
10844 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10845 | D->addAttr(::new (S.Context) ObjCRootClassAttr(S.Context, Attr)); |
||
10846 | return AttributeApplied; |
||
10847 | } |
||
10848 | |||
10849 | bool isParamExpr(size_t N) const override { |
||
10850 | return false; |
||
10851 | } |
||
10852 | |||
10853 | static const ParsedAttrInfoObjCRootClass Instance; |
||
10854 | }; |
||
10855 | const ParsedAttrInfoObjCRootClass ParsedAttrInfoObjCRootClass::Instance; |
||
10856 | static constexpr ParsedAttrInfo::Spelling ObjCRuntimeNameSpellings[] = { |
||
10857 | {AttributeCommonInfo::AS_GNU, "objc_runtime_name"}, |
||
10858 | {AttributeCommonInfo::AS_CXX11, "clang::objc_runtime_name"}, |
||
10859 | {AttributeCommonInfo::AS_C2x, "clang::objc_runtime_name"}, |
||
10860 | }; |
||
10861 | static constexpr const char *ObjCRuntimeNameArgNames[] = { |
||
10862 | "MetadataName",}; |
||
10863 | struct ParsedAttrInfoObjCRuntimeName final : public ParsedAttrInfo { |
||
10864 | constexpr ParsedAttrInfoObjCRuntimeName() : ParsedAttrInfo( |
||
10865 | /*AttrKind=*/ParsedAttr::AT_ObjCRuntimeName, |
||
10866 | /*NumArgs=*/1, |
||
10867 | /*OptArgs=*/0, |
||
10868 | /*NumArgMembers=*/1, |
||
10869 | /*HasCustomParsing=*/0, |
||
10870 | /*AcceptsExprPack=*/0, |
||
10871 | /*IsTargetSpecific=*/0, |
||
10872 | /*IsType=*/0, |
||
10873 | /*IsStmt=*/0, |
||
10874 | /*IsKnownToGCC=*/0, |
||
10875 | /*IsSupportedByPragmaAttribute=*/1, |
||
10876 | /*Spellings=*/ObjCRuntimeNameSpellings, |
||
10877 | /*ArgNames=*/ObjCRuntimeNameArgNames) {} |
||
10878 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10879 | if (!isa<ObjCInterfaceDecl>(D) && !isa<ObjCProtocolDecl>(D)) { |
||
10880 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10881 | << Attr << "Objective-C interfaces and Objective-C protocols"; |
||
10882 | return false; |
||
10883 | } |
||
10884 | return true; |
||
10885 | } |
||
10886 | |||
10887 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10888 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10889 | << AL << St->getBeginLoc(); |
||
10890 | return false; |
||
10891 | } |
||
10892 | |||
10893 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10894 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10895 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC)); |
||
10896 | } |
||
10897 | |||
10898 | bool isParamExpr(size_t N) const override { |
||
10899 | return false; |
||
10900 | } |
||
10901 | |||
10902 | static const ParsedAttrInfoObjCRuntimeName Instance; |
||
10903 | }; |
||
10904 | const ParsedAttrInfoObjCRuntimeName ParsedAttrInfoObjCRuntimeName::Instance; |
||
10905 | static constexpr ParsedAttrInfo::Spelling ObjCRuntimeVisibleSpellings[] = { |
||
10906 | {AttributeCommonInfo::AS_GNU, "objc_runtime_visible"}, |
||
10907 | {AttributeCommonInfo::AS_CXX11, "clang::objc_runtime_visible"}, |
||
10908 | {AttributeCommonInfo::AS_C2x, "clang::objc_runtime_visible"}, |
||
10909 | }; |
||
10910 | struct ParsedAttrInfoObjCRuntimeVisible final : public ParsedAttrInfo { |
||
10911 | constexpr ParsedAttrInfoObjCRuntimeVisible() : ParsedAttrInfo( |
||
10912 | /*AttrKind=*/ParsedAttr::AT_ObjCRuntimeVisible, |
||
10913 | /*NumArgs=*/0, |
||
10914 | /*OptArgs=*/0, |
||
10915 | /*NumArgMembers=*/0, |
||
10916 | /*HasCustomParsing=*/0, |
||
10917 | /*AcceptsExprPack=*/0, |
||
10918 | /*IsTargetSpecific=*/0, |
||
10919 | /*IsType=*/0, |
||
10920 | /*IsStmt=*/0, |
||
10921 | /*IsKnownToGCC=*/0, |
||
10922 | /*IsSupportedByPragmaAttribute=*/1, |
||
10923 | /*Spellings=*/ObjCRuntimeVisibleSpellings, |
||
10924 | /*ArgNames=*/{}) {} |
||
10925 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10926 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
10927 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10928 | << Attr << "Objective-C interfaces"; |
||
10929 | return false; |
||
10930 | } |
||
10931 | return true; |
||
10932 | } |
||
10933 | |||
10934 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10935 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10936 | << AL << St->getBeginLoc(); |
||
10937 | return false; |
||
10938 | } |
||
10939 | |||
10940 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10941 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10942 | } |
||
10943 | |||
10944 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10945 | D->addAttr(::new (S.Context) ObjCRuntimeVisibleAttr(S.Context, Attr)); |
||
10946 | return AttributeApplied; |
||
10947 | } |
||
10948 | |||
10949 | bool isParamExpr(size_t N) const override { |
||
10950 | return false; |
||
10951 | } |
||
10952 | |||
10953 | static const ParsedAttrInfoObjCRuntimeVisible Instance; |
||
10954 | }; |
||
10955 | const ParsedAttrInfoObjCRuntimeVisible ParsedAttrInfoObjCRuntimeVisible::Instance; |
||
10956 | static constexpr ParsedAttrInfo::Spelling ObjCSubclassingRestrictedSpellings[] = { |
||
10957 | {AttributeCommonInfo::AS_GNU, "objc_subclassing_restricted"}, |
||
10958 | {AttributeCommonInfo::AS_CXX11, "clang::objc_subclassing_restricted"}, |
||
10959 | {AttributeCommonInfo::AS_C2x, "clang::objc_subclassing_restricted"}, |
||
10960 | }; |
||
10961 | struct ParsedAttrInfoObjCSubclassingRestricted final : public ParsedAttrInfo { |
||
10962 | constexpr ParsedAttrInfoObjCSubclassingRestricted() : ParsedAttrInfo( |
||
10963 | /*AttrKind=*/ParsedAttr::AT_ObjCSubclassingRestricted, |
||
10964 | /*NumArgs=*/0, |
||
10965 | /*OptArgs=*/0, |
||
10966 | /*NumArgMembers=*/0, |
||
10967 | /*HasCustomParsing=*/0, |
||
10968 | /*AcceptsExprPack=*/0, |
||
10969 | /*IsTargetSpecific=*/0, |
||
10970 | /*IsType=*/0, |
||
10971 | /*IsStmt=*/0, |
||
10972 | /*IsKnownToGCC=*/0, |
||
10973 | /*IsSupportedByPragmaAttribute=*/1, |
||
10974 | /*Spellings=*/ObjCSubclassingRestrictedSpellings, |
||
10975 | /*ArgNames=*/{}) {} |
||
10976 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
10977 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
10978 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
10979 | << Attr << "Objective-C interfaces"; |
||
10980 | return false; |
||
10981 | } |
||
10982 | return true; |
||
10983 | } |
||
10984 | |||
10985 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
10986 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
10987 | << AL << St->getBeginLoc(); |
||
10988 | return false; |
||
10989 | } |
||
10990 | |||
10991 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
10992 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
10993 | } |
||
10994 | |||
10995 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
10996 | D->addAttr(::new (S.Context) ObjCSubclassingRestrictedAttr(S.Context, Attr)); |
||
10997 | return AttributeApplied; |
||
10998 | } |
||
10999 | |||
11000 | bool isParamExpr(size_t N) const override { |
||
11001 | return false; |
||
11002 | } |
||
11003 | |||
11004 | static const ParsedAttrInfoObjCSubclassingRestricted Instance; |
||
11005 | }; |
||
11006 | const ParsedAttrInfoObjCSubclassingRestricted ParsedAttrInfoObjCSubclassingRestricted::Instance; |
||
11007 | static constexpr ParsedAttrInfo::Spelling OpenCLAccessSpellings[] = { |
||
11008 | {AttributeCommonInfo::AS_Keyword, "__read_only"}, |
||
11009 | {AttributeCommonInfo::AS_Keyword, "read_only"}, |
||
11010 | {AttributeCommonInfo::AS_Keyword, "__write_only"}, |
||
11011 | {AttributeCommonInfo::AS_Keyword, "write_only"}, |
||
11012 | {AttributeCommonInfo::AS_Keyword, "__read_write"}, |
||
11013 | {AttributeCommonInfo::AS_Keyword, "read_write"}, |
||
11014 | }; |
||
11015 | struct ParsedAttrInfoOpenCLAccess final : public ParsedAttrInfo { |
||
11016 | constexpr ParsedAttrInfoOpenCLAccess() : ParsedAttrInfo( |
||
11017 | /*AttrKind=*/ParsedAttr::AT_OpenCLAccess, |
||
11018 | /*NumArgs=*/0, |
||
11019 | /*OptArgs=*/0, |
||
11020 | /*NumArgMembers=*/0, |
||
11021 | /*HasCustomParsing=*/0, |
||
11022 | /*AcceptsExprPack=*/0, |
||
11023 | /*IsTargetSpecific=*/0, |
||
11024 | /*IsType=*/0, |
||
11025 | /*IsStmt=*/0, |
||
11026 | /*IsKnownToGCC=*/0, |
||
11027 | /*IsSupportedByPragmaAttribute=*/0, |
||
11028 | /*Spellings=*/OpenCLAccessSpellings, |
||
11029 | /*ArgNames=*/{}) {} |
||
11030 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11031 | if (!isa<ParmVarDecl>(D) && !isa<TypedefNameDecl>(D)) { |
||
11032 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
11033 | << Attr << "parameters and typedefs"; |
||
11034 | return false; |
||
11035 | } |
||
11036 | return true; |
||
11037 | } |
||
11038 | |||
11039 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11040 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11041 | << AL << St->getBeginLoc(); |
||
11042 | return false; |
||
11043 | } |
||
11044 | |||
11045 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11046 | enum Spelling { |
||
11047 | Keyword_read_only = 0, |
||
11048 | Keyword_write_only = 2, |
||
11049 | Keyword_read_write = 4, |
||
11050 | SpellingNotCalculated = 15 |
||
11051 | |||
11052 | }; |
||
11053 | |||
11054 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11055 | switch (Idx) { |
||
11056 | default: llvm_unreachable("Unknown spelling list index"); |
||
11057 | case 0: return Keyword_read_only; |
||
11058 | case 1: return Keyword_read_only; |
||
11059 | case 2: return Keyword_write_only; |
||
11060 | case 3: return Keyword_write_only; |
||
11061 | case 4: return Keyword_read_write; |
||
11062 | case 5: return Keyword_read_write; |
||
11063 | } |
||
11064 | } |
||
11065 | |||
11066 | bool isParamExpr(size_t N) const override { |
||
11067 | return false; |
||
11068 | } |
||
11069 | |||
11070 | static const ParsedAttrInfoOpenCLAccess Instance; |
||
11071 | }; |
||
11072 | const ParsedAttrInfoOpenCLAccess ParsedAttrInfoOpenCLAccess::Instance; |
||
11073 | static constexpr ParsedAttrInfo::Spelling OpenCLConstantAddressSpaceSpellings[] = { |
||
11074 | {AttributeCommonInfo::AS_Keyword, "__constant"}, |
||
11075 | {AttributeCommonInfo::AS_Keyword, "constant"}, |
||
11076 | {AttributeCommonInfo::AS_GNU, "opencl_constant"}, |
||
11077 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_constant"}, |
||
11078 | {AttributeCommonInfo::AS_C2x, "clang::opencl_constant"}, |
||
11079 | }; |
||
11080 | struct ParsedAttrInfoOpenCLConstantAddressSpace final : public ParsedAttrInfo { |
||
11081 | constexpr ParsedAttrInfoOpenCLConstantAddressSpace() : ParsedAttrInfo( |
||
11082 | /*AttrKind=*/ParsedAttr::AT_OpenCLConstantAddressSpace, |
||
11083 | /*NumArgs=*/0, |
||
11084 | /*OptArgs=*/0, |
||
11085 | /*NumArgMembers=*/0, |
||
11086 | /*HasCustomParsing=*/0, |
||
11087 | /*AcceptsExprPack=*/0, |
||
11088 | /*IsTargetSpecific=*/0, |
||
11089 | /*IsType=*/1, |
||
11090 | /*IsStmt=*/0, |
||
11091 | /*IsKnownToGCC=*/0, |
||
11092 | /*IsSupportedByPragmaAttribute=*/0, |
||
11093 | /*Spellings=*/OpenCLConstantAddressSpaceSpellings, |
||
11094 | /*ArgNames=*/{}) {} |
||
11095 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11096 | enum Spelling { |
||
11097 | Keyword_constant = 0, |
||
11098 | GNU_opencl_constant = 2, |
||
11099 | CXX11_clang_opencl_constant = 3, |
||
11100 | C2x_clang_opencl_constant = 4, |
||
11101 | SpellingNotCalculated = 15 |
||
11102 | |||
11103 | }; |
||
11104 | |||
11105 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11106 | switch (Idx) { |
||
11107 | default: llvm_unreachable("Unknown spelling list index"); |
||
11108 | case 0: return Keyword_constant; |
||
11109 | case 1: return Keyword_constant; |
||
11110 | case 2: return GNU_opencl_constant; |
||
11111 | case 3: return CXX11_clang_opencl_constant; |
||
11112 | case 4: return C2x_clang_opencl_constant; |
||
11113 | } |
||
11114 | } |
||
11115 | |||
11116 | bool isParamExpr(size_t N) const override { |
||
11117 | return false; |
||
11118 | } |
||
11119 | |||
11120 | static const ParsedAttrInfoOpenCLConstantAddressSpace Instance; |
||
11121 | }; |
||
11122 | const ParsedAttrInfoOpenCLConstantAddressSpace ParsedAttrInfoOpenCLConstantAddressSpace::Instance; |
||
11123 | static constexpr ParsedAttrInfo::Spelling OpenCLGenericAddressSpaceSpellings[] = { |
||
11124 | {AttributeCommonInfo::AS_Keyword, "__generic"}, |
||
11125 | {AttributeCommonInfo::AS_Keyword, "generic"}, |
||
11126 | {AttributeCommonInfo::AS_GNU, "opencl_generic"}, |
||
11127 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_generic"}, |
||
11128 | {AttributeCommonInfo::AS_C2x, "clang::opencl_generic"}, |
||
11129 | }; |
||
11130 | struct ParsedAttrInfoOpenCLGenericAddressSpace final : public ParsedAttrInfo { |
||
11131 | constexpr ParsedAttrInfoOpenCLGenericAddressSpace() : ParsedAttrInfo( |
||
11132 | /*AttrKind=*/ParsedAttr::AT_OpenCLGenericAddressSpace, |
||
11133 | /*NumArgs=*/0, |
||
11134 | /*OptArgs=*/0, |
||
11135 | /*NumArgMembers=*/0, |
||
11136 | /*HasCustomParsing=*/0, |
||
11137 | /*AcceptsExprPack=*/0, |
||
11138 | /*IsTargetSpecific=*/0, |
||
11139 | /*IsType=*/1, |
||
11140 | /*IsStmt=*/0, |
||
11141 | /*IsKnownToGCC=*/0, |
||
11142 | /*IsSupportedByPragmaAttribute=*/0, |
||
11143 | /*Spellings=*/OpenCLGenericAddressSpaceSpellings, |
||
11144 | /*ArgNames=*/{}) {} |
||
11145 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11146 | enum Spelling { |
||
11147 | Keyword_generic = 0, |
||
11148 | GNU_opencl_generic = 2, |
||
11149 | CXX11_clang_opencl_generic = 3, |
||
11150 | C2x_clang_opencl_generic = 4, |
||
11151 | SpellingNotCalculated = 15 |
||
11152 | |||
11153 | }; |
||
11154 | |||
11155 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11156 | switch (Idx) { |
||
11157 | default: llvm_unreachable("Unknown spelling list index"); |
||
11158 | case 0: return Keyword_generic; |
||
11159 | case 1: return Keyword_generic; |
||
11160 | case 2: return GNU_opencl_generic; |
||
11161 | case 3: return CXX11_clang_opencl_generic; |
||
11162 | case 4: return C2x_clang_opencl_generic; |
||
11163 | } |
||
11164 | } |
||
11165 | |||
11166 | bool isParamExpr(size_t N) const override { |
||
11167 | return false; |
||
11168 | } |
||
11169 | |||
11170 | static const ParsedAttrInfoOpenCLGenericAddressSpace Instance; |
||
11171 | }; |
||
11172 | const ParsedAttrInfoOpenCLGenericAddressSpace ParsedAttrInfoOpenCLGenericAddressSpace::Instance; |
||
11173 | static constexpr ParsedAttrInfo::Spelling OpenCLGlobalAddressSpaceSpellings[] = { |
||
11174 | {AttributeCommonInfo::AS_Keyword, "__global"}, |
||
11175 | {AttributeCommonInfo::AS_Keyword, "global"}, |
||
11176 | {AttributeCommonInfo::AS_GNU, "opencl_global"}, |
||
11177 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_global"}, |
||
11178 | {AttributeCommonInfo::AS_C2x, "clang::opencl_global"}, |
||
11179 | }; |
||
11180 | struct ParsedAttrInfoOpenCLGlobalAddressSpace final : public ParsedAttrInfo { |
||
11181 | constexpr ParsedAttrInfoOpenCLGlobalAddressSpace() : ParsedAttrInfo( |
||
11182 | /*AttrKind=*/ParsedAttr::AT_OpenCLGlobalAddressSpace, |
||
11183 | /*NumArgs=*/0, |
||
11184 | /*OptArgs=*/0, |
||
11185 | /*NumArgMembers=*/0, |
||
11186 | /*HasCustomParsing=*/0, |
||
11187 | /*AcceptsExprPack=*/0, |
||
11188 | /*IsTargetSpecific=*/0, |
||
11189 | /*IsType=*/1, |
||
11190 | /*IsStmt=*/0, |
||
11191 | /*IsKnownToGCC=*/0, |
||
11192 | /*IsSupportedByPragmaAttribute=*/0, |
||
11193 | /*Spellings=*/OpenCLGlobalAddressSpaceSpellings, |
||
11194 | /*ArgNames=*/{}) {} |
||
11195 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11196 | enum Spelling { |
||
11197 | Keyword_global = 0, |
||
11198 | GNU_opencl_global = 2, |
||
11199 | CXX11_clang_opencl_global = 3, |
||
11200 | C2x_clang_opencl_global = 4, |
||
11201 | SpellingNotCalculated = 15 |
||
11202 | |||
11203 | }; |
||
11204 | |||
11205 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11206 | switch (Idx) { |
||
11207 | default: llvm_unreachable("Unknown spelling list index"); |
||
11208 | case 0: return Keyword_global; |
||
11209 | case 1: return Keyword_global; |
||
11210 | case 2: return GNU_opencl_global; |
||
11211 | case 3: return CXX11_clang_opencl_global; |
||
11212 | case 4: return C2x_clang_opencl_global; |
||
11213 | } |
||
11214 | } |
||
11215 | |||
11216 | bool isParamExpr(size_t N) const override { |
||
11217 | return false; |
||
11218 | } |
||
11219 | |||
11220 | static const ParsedAttrInfoOpenCLGlobalAddressSpace Instance; |
||
11221 | }; |
||
11222 | const ParsedAttrInfoOpenCLGlobalAddressSpace ParsedAttrInfoOpenCLGlobalAddressSpace::Instance; |
||
11223 | static constexpr ParsedAttrInfo::Spelling OpenCLGlobalDeviceAddressSpaceSpellings[] = { |
||
11224 | {AttributeCommonInfo::AS_GNU, "opencl_global_device"}, |
||
11225 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_global_device"}, |
||
11226 | {AttributeCommonInfo::AS_C2x, "clang::opencl_global_device"}, |
||
11227 | }; |
||
11228 | struct ParsedAttrInfoOpenCLGlobalDeviceAddressSpace final : public ParsedAttrInfo { |
||
11229 | constexpr ParsedAttrInfoOpenCLGlobalDeviceAddressSpace() : ParsedAttrInfo( |
||
11230 | /*AttrKind=*/ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace, |
||
11231 | /*NumArgs=*/0, |
||
11232 | /*OptArgs=*/0, |
||
11233 | /*NumArgMembers=*/0, |
||
11234 | /*HasCustomParsing=*/0, |
||
11235 | /*AcceptsExprPack=*/0, |
||
11236 | /*IsTargetSpecific=*/0, |
||
11237 | /*IsType=*/1, |
||
11238 | /*IsStmt=*/0, |
||
11239 | /*IsKnownToGCC=*/0, |
||
11240 | /*IsSupportedByPragmaAttribute=*/0, |
||
11241 | /*Spellings=*/OpenCLGlobalDeviceAddressSpaceSpellings, |
||
11242 | /*ArgNames=*/{}) {} |
||
11243 | bool isParamExpr(size_t N) const override { |
||
11244 | return false; |
||
11245 | } |
||
11246 | |||
11247 | static const ParsedAttrInfoOpenCLGlobalDeviceAddressSpace Instance; |
||
11248 | }; |
||
11249 | const ParsedAttrInfoOpenCLGlobalDeviceAddressSpace ParsedAttrInfoOpenCLGlobalDeviceAddressSpace::Instance; |
||
11250 | static constexpr ParsedAttrInfo::Spelling OpenCLGlobalHostAddressSpaceSpellings[] = { |
||
11251 | {AttributeCommonInfo::AS_GNU, "opencl_global_host"}, |
||
11252 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_global_host"}, |
||
11253 | {AttributeCommonInfo::AS_C2x, "clang::opencl_global_host"}, |
||
11254 | }; |
||
11255 | struct ParsedAttrInfoOpenCLGlobalHostAddressSpace final : public ParsedAttrInfo { |
||
11256 | constexpr ParsedAttrInfoOpenCLGlobalHostAddressSpace() : ParsedAttrInfo( |
||
11257 | /*AttrKind=*/ParsedAttr::AT_OpenCLGlobalHostAddressSpace, |
||
11258 | /*NumArgs=*/0, |
||
11259 | /*OptArgs=*/0, |
||
11260 | /*NumArgMembers=*/0, |
||
11261 | /*HasCustomParsing=*/0, |
||
11262 | /*AcceptsExprPack=*/0, |
||
11263 | /*IsTargetSpecific=*/0, |
||
11264 | /*IsType=*/1, |
||
11265 | /*IsStmt=*/0, |
||
11266 | /*IsKnownToGCC=*/0, |
||
11267 | /*IsSupportedByPragmaAttribute=*/0, |
||
11268 | /*Spellings=*/OpenCLGlobalHostAddressSpaceSpellings, |
||
11269 | /*ArgNames=*/{}) {} |
||
11270 | bool isParamExpr(size_t N) const override { |
||
11271 | return false; |
||
11272 | } |
||
11273 | |||
11274 | static const ParsedAttrInfoOpenCLGlobalHostAddressSpace Instance; |
||
11275 | }; |
||
11276 | const ParsedAttrInfoOpenCLGlobalHostAddressSpace ParsedAttrInfoOpenCLGlobalHostAddressSpace::Instance; |
||
11277 | static constexpr ParsedAttrInfo::Spelling OpenCLIntelReqdSubGroupSizeSpellings[] = { |
||
11278 | {AttributeCommonInfo::AS_GNU, "intel_reqd_sub_group_size"}, |
||
11279 | }; |
||
11280 | static constexpr const char *OpenCLIntelReqdSubGroupSizeArgNames[] = { |
||
11281 | "SubGroupSize",}; |
||
11282 | struct ParsedAttrInfoOpenCLIntelReqdSubGroupSize final : public ParsedAttrInfo { |
||
11283 | constexpr ParsedAttrInfoOpenCLIntelReqdSubGroupSize() : ParsedAttrInfo( |
||
11284 | /*AttrKind=*/ParsedAttr::AT_OpenCLIntelReqdSubGroupSize, |
||
11285 | /*NumArgs=*/1, |
||
11286 | /*OptArgs=*/0, |
||
11287 | /*NumArgMembers=*/1, |
||
11288 | /*HasCustomParsing=*/0, |
||
11289 | /*AcceptsExprPack=*/0, |
||
11290 | /*IsTargetSpecific=*/0, |
||
11291 | /*IsType=*/0, |
||
11292 | /*IsStmt=*/0, |
||
11293 | /*IsKnownToGCC=*/0, |
||
11294 | /*IsSupportedByPragmaAttribute=*/1, |
||
11295 | /*Spellings=*/OpenCLIntelReqdSubGroupSizeSpellings, |
||
11296 | /*ArgNames=*/OpenCLIntelReqdSubGroupSizeArgNames) {} |
||
11297 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11298 | if (!isa<FunctionDecl>(D)) { |
||
11299 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
11300 | << Attr << "functions"; |
||
11301 | return false; |
||
11302 | } |
||
11303 | return true; |
||
11304 | } |
||
11305 | |||
11306 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11307 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11308 | << AL << St->getBeginLoc(); |
||
11309 | return false; |
||
11310 | } |
||
11311 | |||
11312 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11313 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
11314 | } |
||
11315 | |||
11316 | bool isParamExpr(size_t N) const override { |
||
11317 | return false; |
||
11318 | } |
||
11319 | |||
11320 | static const ParsedAttrInfoOpenCLIntelReqdSubGroupSize Instance; |
||
11321 | }; |
||
11322 | const ParsedAttrInfoOpenCLIntelReqdSubGroupSize ParsedAttrInfoOpenCLIntelReqdSubGroupSize::Instance; |
||
11323 | static constexpr ParsedAttrInfo::Spelling OpenCLKernelSpellings[] = { |
||
11324 | {AttributeCommonInfo::AS_Keyword, "__kernel"}, |
||
11325 | {AttributeCommonInfo::AS_Keyword, "kernel"}, |
||
11326 | }; |
||
11327 | struct ParsedAttrInfoOpenCLKernel final : public ParsedAttrInfo { |
||
11328 | constexpr ParsedAttrInfoOpenCLKernel() : ParsedAttrInfo( |
||
11329 | /*AttrKind=*/ParsedAttr::AT_OpenCLKernel, |
||
11330 | /*NumArgs=*/0, |
||
11331 | /*OptArgs=*/0, |
||
11332 | /*NumArgMembers=*/0, |
||
11333 | /*HasCustomParsing=*/0, |
||
11334 | /*AcceptsExprPack=*/0, |
||
11335 | /*IsTargetSpecific=*/0, |
||
11336 | /*IsType=*/0, |
||
11337 | /*IsStmt=*/0, |
||
11338 | /*IsKnownToGCC=*/0, |
||
11339 | /*IsSupportedByPragmaAttribute=*/0, |
||
11340 | /*Spellings=*/OpenCLKernelSpellings, |
||
11341 | /*ArgNames=*/{}) {} |
||
11342 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11343 | if (!isa<FunctionDecl>(D)) { |
||
11344 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
11345 | << Attr << "functions"; |
||
11346 | return false; |
||
11347 | } |
||
11348 | return true; |
||
11349 | } |
||
11350 | |||
11351 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11352 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11353 | << AL << St->getBeginLoc(); |
||
11354 | return false; |
||
11355 | } |
||
11356 | |||
11357 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
11358 | D->addAttr(::new (S.Context) OpenCLKernelAttr(S.Context, Attr)); |
||
11359 | return AttributeApplied; |
||
11360 | } |
||
11361 | |||
11362 | bool isParamExpr(size_t N) const override { |
||
11363 | return false; |
||
11364 | } |
||
11365 | |||
11366 | static const ParsedAttrInfoOpenCLKernel Instance; |
||
11367 | }; |
||
11368 | const ParsedAttrInfoOpenCLKernel ParsedAttrInfoOpenCLKernel::Instance; |
||
11369 | static constexpr ParsedAttrInfo::Spelling OpenCLLocalAddressSpaceSpellings[] = { |
||
11370 | {AttributeCommonInfo::AS_Keyword, "__local"}, |
||
11371 | {AttributeCommonInfo::AS_Keyword, "local"}, |
||
11372 | {AttributeCommonInfo::AS_GNU, "opencl_local"}, |
||
11373 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_local"}, |
||
11374 | {AttributeCommonInfo::AS_C2x, "clang::opencl_local"}, |
||
11375 | }; |
||
11376 | struct ParsedAttrInfoOpenCLLocalAddressSpace final : public ParsedAttrInfo { |
||
11377 | constexpr ParsedAttrInfoOpenCLLocalAddressSpace() : ParsedAttrInfo( |
||
11378 | /*AttrKind=*/ParsedAttr::AT_OpenCLLocalAddressSpace, |
||
11379 | /*NumArgs=*/0, |
||
11380 | /*OptArgs=*/0, |
||
11381 | /*NumArgMembers=*/0, |
||
11382 | /*HasCustomParsing=*/0, |
||
11383 | /*AcceptsExprPack=*/0, |
||
11384 | /*IsTargetSpecific=*/0, |
||
11385 | /*IsType=*/1, |
||
11386 | /*IsStmt=*/0, |
||
11387 | /*IsKnownToGCC=*/0, |
||
11388 | /*IsSupportedByPragmaAttribute=*/0, |
||
11389 | /*Spellings=*/OpenCLLocalAddressSpaceSpellings, |
||
11390 | /*ArgNames=*/{}) {} |
||
11391 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11392 | enum Spelling { |
||
11393 | Keyword_local = 0, |
||
11394 | GNU_opencl_local = 2, |
||
11395 | CXX11_clang_opencl_local = 3, |
||
11396 | C2x_clang_opencl_local = 4, |
||
11397 | SpellingNotCalculated = 15 |
||
11398 | |||
11399 | }; |
||
11400 | |||
11401 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11402 | switch (Idx) { |
||
11403 | default: llvm_unreachable("Unknown spelling list index"); |
||
11404 | case 0: return Keyword_local; |
||
11405 | case 1: return Keyword_local; |
||
11406 | case 2: return GNU_opencl_local; |
||
11407 | case 3: return CXX11_clang_opencl_local; |
||
11408 | case 4: return C2x_clang_opencl_local; |
||
11409 | } |
||
11410 | } |
||
11411 | |||
11412 | bool isParamExpr(size_t N) const override { |
||
11413 | return false; |
||
11414 | } |
||
11415 | |||
11416 | static const ParsedAttrInfoOpenCLLocalAddressSpace Instance; |
||
11417 | }; |
||
11418 | const ParsedAttrInfoOpenCLLocalAddressSpace ParsedAttrInfoOpenCLLocalAddressSpace::Instance; |
||
11419 | static constexpr ParsedAttrInfo::Spelling OpenCLNoSVMSpellings[] = { |
||
11420 | {AttributeCommonInfo::AS_GNU, "nosvm"}, |
||
11421 | }; |
||
11422 | struct ParsedAttrInfoOpenCLNoSVM final : public ParsedAttrInfo { |
||
11423 | constexpr ParsedAttrInfoOpenCLNoSVM() : ParsedAttrInfo( |
||
11424 | /*AttrKind=*/ParsedAttr::AT_OpenCLNoSVM, |
||
11425 | /*NumArgs=*/0, |
||
11426 | /*OptArgs=*/0, |
||
11427 | /*NumArgMembers=*/0, |
||
11428 | /*HasCustomParsing=*/0, |
||
11429 | /*AcceptsExprPack=*/0, |
||
11430 | /*IsTargetSpecific=*/0, |
||
11431 | /*IsType=*/0, |
||
11432 | /*IsStmt=*/0, |
||
11433 | /*IsKnownToGCC=*/0, |
||
11434 | /*IsSupportedByPragmaAttribute=*/1, |
||
11435 | /*Spellings=*/OpenCLNoSVMSpellings, |
||
11436 | /*ArgNames=*/{}) {} |
||
11437 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11438 | if (!isa<VarDecl>(D)) { |
||
11439 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11440 | << Attr << "variables"; |
||
11441 | return false; |
||
11442 | } |
||
11443 | return true; |
||
11444 | } |
||
11445 | |||
11446 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11447 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11448 | << AL << St->getBeginLoc(); |
||
11449 | return false; |
||
11450 | } |
||
11451 | |||
11452 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
11453 | return LangOpts.OpenCL; |
||
11454 | } |
||
11455 | |||
11456 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11457 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
11458 | } |
||
11459 | |||
11460 | bool isParamExpr(size_t N) const override { |
||
11461 | return false; |
||
11462 | } |
||
11463 | |||
11464 | static const ParsedAttrInfoOpenCLNoSVM Instance; |
||
11465 | }; |
||
11466 | const ParsedAttrInfoOpenCLNoSVM ParsedAttrInfoOpenCLNoSVM::Instance; |
||
11467 | static constexpr ParsedAttrInfo::Spelling OpenCLPrivateAddressSpaceSpellings[] = { |
||
11468 | {AttributeCommonInfo::AS_Keyword, "__private"}, |
||
11469 | {AttributeCommonInfo::AS_Keyword, "private"}, |
||
11470 | {AttributeCommonInfo::AS_GNU, "opencl_private"}, |
||
11471 | {AttributeCommonInfo::AS_CXX11, "clang::opencl_private"}, |
||
11472 | {AttributeCommonInfo::AS_C2x, "clang::opencl_private"}, |
||
11473 | }; |
||
11474 | struct ParsedAttrInfoOpenCLPrivateAddressSpace final : public ParsedAttrInfo { |
||
11475 | constexpr ParsedAttrInfoOpenCLPrivateAddressSpace() : ParsedAttrInfo( |
||
11476 | /*AttrKind=*/ParsedAttr::AT_OpenCLPrivateAddressSpace, |
||
11477 | /*NumArgs=*/0, |
||
11478 | /*OptArgs=*/0, |
||
11479 | /*NumArgMembers=*/0, |
||
11480 | /*HasCustomParsing=*/0, |
||
11481 | /*AcceptsExprPack=*/0, |
||
11482 | /*IsTargetSpecific=*/0, |
||
11483 | /*IsType=*/1, |
||
11484 | /*IsStmt=*/0, |
||
11485 | /*IsKnownToGCC=*/0, |
||
11486 | /*IsSupportedByPragmaAttribute=*/0, |
||
11487 | /*Spellings=*/OpenCLPrivateAddressSpaceSpellings, |
||
11488 | /*ArgNames=*/{}) {} |
||
11489 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11490 | enum Spelling { |
||
11491 | Keyword_private = 0, |
||
11492 | GNU_opencl_private = 2, |
||
11493 | CXX11_clang_opencl_private = 3, |
||
11494 | C2x_clang_opencl_private = 4, |
||
11495 | SpellingNotCalculated = 15 |
||
11496 | |||
11497 | }; |
||
11498 | |||
11499 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11500 | switch (Idx) { |
||
11501 | default: llvm_unreachable("Unknown spelling list index"); |
||
11502 | case 0: return Keyword_private; |
||
11503 | case 1: return Keyword_private; |
||
11504 | case 2: return GNU_opencl_private; |
||
11505 | case 3: return CXX11_clang_opencl_private; |
||
11506 | case 4: return C2x_clang_opencl_private; |
||
11507 | } |
||
11508 | } |
||
11509 | |||
11510 | bool isParamExpr(size_t N) const override { |
||
11511 | return false; |
||
11512 | } |
||
11513 | |||
11514 | static const ParsedAttrInfoOpenCLPrivateAddressSpace Instance; |
||
11515 | }; |
||
11516 | const ParsedAttrInfoOpenCLPrivateAddressSpace ParsedAttrInfoOpenCLPrivateAddressSpace::Instance; |
||
11517 | static constexpr ParsedAttrInfo::Spelling OpenCLUnrollHintSpellings[] = { |
||
11518 | {AttributeCommonInfo::AS_GNU, "opencl_unroll_hint"}, |
||
11519 | }; |
||
11520 | static constexpr const char *OpenCLUnrollHintArgNames[] = { |
||
11521 | "UnrollHint",}; |
||
11522 | struct ParsedAttrInfoOpenCLUnrollHint final : public ParsedAttrInfo { |
||
11523 | constexpr ParsedAttrInfoOpenCLUnrollHint() : ParsedAttrInfo( |
||
11524 | /*AttrKind=*/ParsedAttr::AT_OpenCLUnrollHint, |
||
11525 | /*NumArgs=*/0, |
||
11526 | /*OptArgs=*/1, |
||
11527 | /*NumArgMembers=*/1, |
||
11528 | /*HasCustomParsing=*/0, |
||
11529 | /*AcceptsExprPack=*/0, |
||
11530 | /*IsTargetSpecific=*/0, |
||
11531 | /*IsType=*/0, |
||
11532 | /*IsStmt=*/1, |
||
11533 | /*IsKnownToGCC=*/0, |
||
11534 | /*IsSupportedByPragmaAttribute=*/0, |
||
11535 | /*Spellings=*/OpenCLUnrollHintSpellings, |
||
11536 | /*ArgNames=*/OpenCLUnrollHintArgNames) {} |
||
11537 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
11538 | S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl) |
||
11539 | << AL << D->getLocation(); |
||
11540 | return false; |
||
11541 | } |
||
11542 | |||
11543 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override { |
||
11544 | if (!isa<ForStmt>(St) && !isa<CXXForRangeStmt>(St) && !isa<WhileStmt>(St) && !isa<DoStmt>(St)) { |
||
11545 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
11546 | << Attr << "'for', 'while', and 'do' statements"; |
||
11547 | return false; |
||
11548 | } |
||
11549 | return true; |
||
11550 | } |
||
11551 | |||
11552 | bool isParamExpr(size_t N) const override { |
||
11553 | return false; |
||
11554 | } |
||
11555 | |||
11556 | static const ParsedAttrInfoOpenCLUnrollHint Instance; |
||
11557 | }; |
||
11558 | const ParsedAttrInfoOpenCLUnrollHint ParsedAttrInfoOpenCLUnrollHint::Instance; |
||
11559 | static constexpr ParsedAttrInfo::Spelling OptimizeNoneSpellings[] = { |
||
11560 | {AttributeCommonInfo::AS_GNU, "optnone"}, |
||
11561 | {AttributeCommonInfo::AS_CXX11, "clang::optnone"}, |
||
11562 | {AttributeCommonInfo::AS_C2x, "clang::optnone"}, |
||
11563 | }; |
||
11564 | struct ParsedAttrInfoOptimizeNone final : public ParsedAttrInfo { |
||
11565 | constexpr ParsedAttrInfoOptimizeNone() : ParsedAttrInfo( |
||
11566 | /*AttrKind=*/ParsedAttr::AT_OptimizeNone, |
||
11567 | /*NumArgs=*/0, |
||
11568 | /*OptArgs=*/0, |
||
11569 | /*NumArgMembers=*/0, |
||
11570 | /*HasCustomParsing=*/0, |
||
11571 | /*AcceptsExprPack=*/0, |
||
11572 | /*IsTargetSpecific=*/0, |
||
11573 | /*IsType=*/0, |
||
11574 | /*IsStmt=*/0, |
||
11575 | /*IsKnownToGCC=*/0, |
||
11576 | /*IsSupportedByPragmaAttribute=*/1, |
||
11577 | /*Spellings=*/OptimizeNoneSpellings, |
||
11578 | /*ArgNames=*/{}) {} |
||
11579 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11580 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
11581 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11582 | << Attr << "functions and Objective-C methods"; |
||
11583 | return false; |
||
11584 | } |
||
11585 | return true; |
||
11586 | } |
||
11587 | |||
11588 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11589 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11590 | << AL << St->getBeginLoc(); |
||
11591 | return false; |
||
11592 | } |
||
11593 | |||
11594 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11595 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
11596 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
11597 | } |
||
11598 | |||
11599 | bool isParamExpr(size_t N) const override { |
||
11600 | return false; |
||
11601 | } |
||
11602 | |||
11603 | static const ParsedAttrInfoOptimizeNone Instance; |
||
11604 | }; |
||
11605 | const ParsedAttrInfoOptimizeNone ParsedAttrInfoOptimizeNone::Instance; |
||
11606 | static constexpr ParsedAttrInfo::Spelling OverloadableSpellings[] = { |
||
11607 | {AttributeCommonInfo::AS_GNU, "overloadable"}, |
||
11608 | {AttributeCommonInfo::AS_CXX11, "clang::overloadable"}, |
||
11609 | {AttributeCommonInfo::AS_C2x, "clang::overloadable"}, |
||
11610 | }; |
||
11611 | struct ParsedAttrInfoOverloadable final : public ParsedAttrInfo { |
||
11612 | constexpr ParsedAttrInfoOverloadable() : ParsedAttrInfo( |
||
11613 | /*AttrKind=*/ParsedAttr::AT_Overloadable, |
||
11614 | /*NumArgs=*/0, |
||
11615 | /*OptArgs=*/0, |
||
11616 | /*NumArgMembers=*/0, |
||
11617 | /*HasCustomParsing=*/0, |
||
11618 | /*AcceptsExprPack=*/0, |
||
11619 | /*IsTargetSpecific=*/0, |
||
11620 | /*IsType=*/0, |
||
11621 | /*IsStmt=*/0, |
||
11622 | /*IsKnownToGCC=*/0, |
||
11623 | /*IsSupportedByPragmaAttribute=*/1, |
||
11624 | /*Spellings=*/OverloadableSpellings, |
||
11625 | /*ArgNames=*/{}) {} |
||
11626 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11627 | if (!isa<FunctionDecl>(D)) { |
||
11628 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
11629 | << Attr << "functions"; |
||
11630 | return false; |
||
11631 | } |
||
11632 | return true; |
||
11633 | } |
||
11634 | |||
11635 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11636 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11637 | << AL << St->getBeginLoc(); |
||
11638 | return false; |
||
11639 | } |
||
11640 | |||
11641 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11642 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
11643 | } |
||
11644 | |||
11645 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
11646 | D->addAttr(::new (S.Context) OverloadableAttr(S.Context, Attr)); |
||
11647 | return AttributeApplied; |
||
11648 | } |
||
11649 | |||
11650 | bool isParamExpr(size_t N) const override { |
||
11651 | return false; |
||
11652 | } |
||
11653 | |||
11654 | static const ParsedAttrInfoOverloadable Instance; |
||
11655 | }; |
||
11656 | const ParsedAttrInfoOverloadable ParsedAttrInfoOverloadable::Instance; |
||
11657 | static constexpr ParsedAttrInfo::Spelling OwnerSpellings[] = { |
||
11658 | {AttributeCommonInfo::AS_CXX11, "gsl::Owner"}, |
||
11659 | }; |
||
11660 | static constexpr const char *OwnerArgNames[] = { |
||
11661 | "DerefType",}; |
||
11662 | struct ParsedAttrInfoOwner final : public ParsedAttrInfo { |
||
11663 | constexpr ParsedAttrInfoOwner() : ParsedAttrInfo( |
||
11664 | /*AttrKind=*/ParsedAttr::AT_Owner, |
||
11665 | /*NumArgs=*/0, |
||
11666 | /*OptArgs=*/1, |
||
11667 | /*NumArgMembers=*/1, |
||
11668 | /*HasCustomParsing=*/0, |
||
11669 | /*AcceptsExprPack=*/0, |
||
11670 | /*IsTargetSpecific=*/0, |
||
11671 | /*IsType=*/0, |
||
11672 | /*IsStmt=*/0, |
||
11673 | /*IsKnownToGCC=*/0, |
||
11674 | /*IsSupportedByPragmaAttribute=*/1, |
||
11675 | /*Spellings=*/OwnerSpellings, |
||
11676 | /*ArgNames=*/OwnerArgNames) {} |
||
11677 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11678 | if (!isStruct(D)) { |
||
11679 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11680 | << Attr << "structs"; |
||
11681 | return false; |
||
11682 | } |
||
11683 | return true; |
||
11684 | } |
||
11685 | |||
11686 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11687 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11688 | << AL << St->getBeginLoc(); |
||
11689 | return false; |
||
11690 | } |
||
11691 | |||
11692 | using ParsedAttrInfo::diagMutualExclusion; |
||
11693 | |||
11694 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
11695 | if (const auto *A = D->getAttr<PointerAttr>()) { |
||
11696 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
11697 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
11698 | return false; |
||
11699 | } |
||
11700 | return true; |
||
11701 | } |
||
11702 | |||
11703 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11704 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true)); |
||
11705 | } |
||
11706 | |||
11707 | bool isParamExpr(size_t N) const override { |
||
11708 | return false; |
||
11709 | } |
||
11710 | |||
11711 | static const ParsedAttrInfoOwner Instance; |
||
11712 | }; |
||
11713 | const ParsedAttrInfoOwner ParsedAttrInfoOwner::Instance; |
||
11714 | static constexpr ParsedAttrInfo::Spelling OwnershipSpellings[] = { |
||
11715 | {AttributeCommonInfo::AS_GNU, "ownership_holds"}, |
||
11716 | {AttributeCommonInfo::AS_CXX11, "clang::ownership_holds"}, |
||
11717 | {AttributeCommonInfo::AS_C2x, "clang::ownership_holds"}, |
||
11718 | {AttributeCommonInfo::AS_GNU, "ownership_returns"}, |
||
11719 | {AttributeCommonInfo::AS_CXX11, "clang::ownership_returns"}, |
||
11720 | {AttributeCommonInfo::AS_C2x, "clang::ownership_returns"}, |
||
11721 | {AttributeCommonInfo::AS_GNU, "ownership_takes"}, |
||
11722 | {AttributeCommonInfo::AS_CXX11, "clang::ownership_takes"}, |
||
11723 | {AttributeCommonInfo::AS_C2x, "clang::ownership_takes"}, |
||
11724 | }; |
||
11725 | static constexpr const char *OwnershipArgNames[] = { |
||
11726 | "Module","Args...",}; |
||
11727 | struct ParsedAttrInfoOwnership final : public ParsedAttrInfo { |
||
11728 | constexpr ParsedAttrInfoOwnership() : ParsedAttrInfo( |
||
11729 | /*AttrKind=*/ParsedAttr::AT_Ownership, |
||
11730 | /*NumArgs=*/1, |
||
11731 | /*OptArgs=*/15, |
||
11732 | /*NumArgMembers=*/2, |
||
11733 | /*HasCustomParsing=*/0, |
||
11734 | /*AcceptsExprPack=*/0, |
||
11735 | /*IsTargetSpecific=*/0, |
||
11736 | /*IsType=*/0, |
||
11737 | /*IsStmt=*/0, |
||
11738 | /*IsKnownToGCC=*/0, |
||
11739 | /*IsSupportedByPragmaAttribute=*/0, |
||
11740 | /*Spellings=*/OwnershipSpellings, |
||
11741 | /*ArgNames=*/OwnershipArgNames) {} |
||
11742 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11743 | if (!isHasFunctionProto(D)) { |
||
11744 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11745 | << Attr << "non-K&R-style functions"; |
||
11746 | return false; |
||
11747 | } |
||
11748 | return true; |
||
11749 | } |
||
11750 | |||
11751 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11752 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11753 | << AL << St->getBeginLoc(); |
||
11754 | return false; |
||
11755 | } |
||
11756 | |||
11757 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11758 | enum Spelling { |
||
11759 | GNU_ownership_holds = 0, |
||
11760 | CXX11_clang_ownership_holds = 1, |
||
11761 | C2x_clang_ownership_holds = 2, |
||
11762 | GNU_ownership_returns = 3, |
||
11763 | CXX11_clang_ownership_returns = 4, |
||
11764 | C2x_clang_ownership_returns = 5, |
||
11765 | GNU_ownership_takes = 6, |
||
11766 | CXX11_clang_ownership_takes = 7, |
||
11767 | C2x_clang_ownership_takes = 8, |
||
11768 | SpellingNotCalculated = 15 |
||
11769 | |||
11770 | }; |
||
11771 | |||
11772 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11773 | switch (Idx) { |
||
11774 | default: llvm_unreachable("Unknown spelling list index"); |
||
11775 | case 0: return GNU_ownership_holds; |
||
11776 | case 1: return CXX11_clang_ownership_holds; |
||
11777 | case 2: return C2x_clang_ownership_holds; |
||
11778 | case 3: return GNU_ownership_returns; |
||
11779 | case 4: return CXX11_clang_ownership_returns; |
||
11780 | case 5: return C2x_clang_ownership_returns; |
||
11781 | case 6: return GNU_ownership_takes; |
||
11782 | case 7: return CXX11_clang_ownership_takes; |
||
11783 | case 8: return C2x_clang_ownership_takes; |
||
11784 | } |
||
11785 | } |
||
11786 | |||
11787 | bool isParamExpr(size_t N) const override { |
||
11788 | return false; |
||
11789 | } |
||
11790 | |||
11791 | static const ParsedAttrInfoOwnership Instance; |
||
11792 | }; |
||
11793 | const ParsedAttrInfoOwnership ParsedAttrInfoOwnership::Instance; |
||
11794 | static constexpr ParsedAttrInfo::Spelling PackedSpellings[] = { |
||
11795 | {AttributeCommonInfo::AS_GNU, "packed"}, |
||
11796 | {AttributeCommonInfo::AS_CXX11, "gnu::packed"}, |
||
11797 | {AttributeCommonInfo::AS_C2x, "gnu::packed"}, |
||
11798 | }; |
||
11799 | struct ParsedAttrInfoPacked final : public ParsedAttrInfo { |
||
11800 | constexpr ParsedAttrInfoPacked() : ParsedAttrInfo( |
||
11801 | /*AttrKind=*/ParsedAttr::AT_Packed, |
||
11802 | /*NumArgs=*/0, |
||
11803 | /*OptArgs=*/0, |
||
11804 | /*NumArgMembers=*/0, |
||
11805 | /*HasCustomParsing=*/0, |
||
11806 | /*AcceptsExprPack=*/0, |
||
11807 | /*IsTargetSpecific=*/0, |
||
11808 | /*IsType=*/0, |
||
11809 | /*IsStmt=*/0, |
||
11810 | /*IsKnownToGCC=*/1, |
||
11811 | /*IsSupportedByPragmaAttribute=*/0, |
||
11812 | /*Spellings=*/PackedSpellings, |
||
11813 | /*ArgNames=*/{}) {} |
||
11814 | bool isParamExpr(size_t N) const override { |
||
11815 | return false; |
||
11816 | } |
||
11817 | |||
11818 | static const ParsedAttrInfoPacked Instance; |
||
11819 | }; |
||
11820 | const ParsedAttrInfoPacked ParsedAttrInfoPacked::Instance; |
||
11821 | static constexpr ParsedAttrInfo::Spelling ParamTypestateSpellings[] = { |
||
11822 | {AttributeCommonInfo::AS_GNU, "param_typestate"}, |
||
11823 | {AttributeCommonInfo::AS_CXX11, "clang::param_typestate"}, |
||
11824 | }; |
||
11825 | static constexpr const char *ParamTypestateArgNames[] = { |
||
11826 | "ParamState",}; |
||
11827 | struct ParsedAttrInfoParamTypestate final : public ParsedAttrInfo { |
||
11828 | constexpr ParsedAttrInfoParamTypestate() : ParsedAttrInfo( |
||
11829 | /*AttrKind=*/ParsedAttr::AT_ParamTypestate, |
||
11830 | /*NumArgs=*/1, |
||
11831 | /*OptArgs=*/0, |
||
11832 | /*NumArgMembers=*/1, |
||
11833 | /*HasCustomParsing=*/0, |
||
11834 | /*AcceptsExprPack=*/0, |
||
11835 | /*IsTargetSpecific=*/0, |
||
11836 | /*IsType=*/0, |
||
11837 | /*IsStmt=*/0, |
||
11838 | /*IsKnownToGCC=*/0, |
||
11839 | /*IsSupportedByPragmaAttribute=*/1, |
||
11840 | /*Spellings=*/ParamTypestateSpellings, |
||
11841 | /*ArgNames=*/ParamTypestateArgNames) {} |
||
11842 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11843 | if (!isa<ParmVarDecl>(D)) { |
||
11844 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11845 | << Attr << "parameters"; |
||
11846 | return false; |
||
11847 | } |
||
11848 | return true; |
||
11849 | } |
||
11850 | |||
11851 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11852 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11853 | << AL << St->getBeginLoc(); |
||
11854 | return false; |
||
11855 | } |
||
11856 | |||
11857 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11858 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
11859 | } |
||
11860 | |||
11861 | bool isParamExpr(size_t N) const override { |
||
11862 | return false; |
||
11863 | } |
||
11864 | |||
11865 | static const ParsedAttrInfoParamTypestate Instance; |
||
11866 | }; |
||
11867 | const ParsedAttrInfoParamTypestate ParsedAttrInfoParamTypestate::Instance; |
||
11868 | static constexpr ParsedAttrInfo::Spelling PascalSpellings[] = { |
||
11869 | {AttributeCommonInfo::AS_GNU, "pascal"}, |
||
11870 | {AttributeCommonInfo::AS_CXX11, "clang::pascal"}, |
||
11871 | {AttributeCommonInfo::AS_C2x, "clang::pascal"}, |
||
11872 | {AttributeCommonInfo::AS_Keyword, "__pascal"}, |
||
11873 | {AttributeCommonInfo::AS_Keyword, "_pascal"}, |
||
11874 | }; |
||
11875 | struct ParsedAttrInfoPascal final : public ParsedAttrInfo { |
||
11876 | constexpr ParsedAttrInfoPascal() : ParsedAttrInfo( |
||
11877 | /*AttrKind=*/ParsedAttr::AT_Pascal, |
||
11878 | /*NumArgs=*/0, |
||
11879 | /*OptArgs=*/0, |
||
11880 | /*NumArgMembers=*/0, |
||
11881 | /*HasCustomParsing=*/0, |
||
11882 | /*AcceptsExprPack=*/0, |
||
11883 | /*IsTargetSpecific=*/0, |
||
11884 | /*IsType=*/1, |
||
11885 | /*IsStmt=*/0, |
||
11886 | /*IsKnownToGCC=*/0, |
||
11887 | /*IsSupportedByPragmaAttribute=*/0, |
||
11888 | /*Spellings=*/PascalSpellings, |
||
11889 | /*ArgNames=*/{}) {} |
||
11890 | bool isParamExpr(size_t N) const override { |
||
11891 | return false; |
||
11892 | } |
||
11893 | |||
11894 | static const ParsedAttrInfoPascal Instance; |
||
11895 | }; |
||
11896 | const ParsedAttrInfoPascal ParsedAttrInfoPascal::Instance; |
||
11897 | static constexpr ParsedAttrInfo::Spelling PassObjectSizeSpellings[] = { |
||
11898 | {AttributeCommonInfo::AS_GNU, "pass_object_size"}, |
||
11899 | {AttributeCommonInfo::AS_CXX11, "clang::pass_object_size"}, |
||
11900 | {AttributeCommonInfo::AS_C2x, "clang::pass_object_size"}, |
||
11901 | {AttributeCommonInfo::AS_GNU, "pass_dynamic_object_size"}, |
||
11902 | {AttributeCommonInfo::AS_CXX11, "clang::pass_dynamic_object_size"}, |
||
11903 | {AttributeCommonInfo::AS_C2x, "clang::pass_dynamic_object_size"}, |
||
11904 | }; |
||
11905 | static constexpr const char *PassObjectSizeArgNames[] = { |
||
11906 | "Type",}; |
||
11907 | struct ParsedAttrInfoPassObjectSize final : public ParsedAttrInfo { |
||
11908 | constexpr ParsedAttrInfoPassObjectSize() : ParsedAttrInfo( |
||
11909 | /*AttrKind=*/ParsedAttr::AT_PassObjectSize, |
||
11910 | /*NumArgs=*/1, |
||
11911 | /*OptArgs=*/0, |
||
11912 | /*NumArgMembers=*/1, |
||
11913 | /*HasCustomParsing=*/0, |
||
11914 | /*AcceptsExprPack=*/0, |
||
11915 | /*IsTargetSpecific=*/0, |
||
11916 | /*IsType=*/0, |
||
11917 | /*IsStmt=*/0, |
||
11918 | /*IsKnownToGCC=*/0, |
||
11919 | /*IsSupportedByPragmaAttribute=*/1, |
||
11920 | /*Spellings=*/PassObjectSizeSpellings, |
||
11921 | /*ArgNames=*/PassObjectSizeArgNames) {} |
||
11922 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11923 | if (!isa<ParmVarDecl>(D)) { |
||
11924 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11925 | << Attr << "parameters"; |
||
11926 | return false; |
||
11927 | } |
||
11928 | return true; |
||
11929 | } |
||
11930 | |||
11931 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
11932 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
11933 | << AL << St->getBeginLoc(); |
||
11934 | return false; |
||
11935 | } |
||
11936 | |||
11937 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
11938 | enum Spelling { |
||
11939 | GNU_pass_object_size = 0, |
||
11940 | CXX11_clang_pass_object_size = 1, |
||
11941 | C2x_clang_pass_object_size = 2, |
||
11942 | GNU_pass_dynamic_object_size = 3, |
||
11943 | CXX11_clang_pass_dynamic_object_size = 4, |
||
11944 | C2x_clang_pass_dynamic_object_size = 5, |
||
11945 | SpellingNotCalculated = 15 |
||
11946 | |||
11947 | }; |
||
11948 | |||
11949 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
11950 | switch (Idx) { |
||
11951 | default: llvm_unreachable("Unknown spelling list index"); |
||
11952 | case 0: return GNU_pass_object_size; |
||
11953 | case 1: return CXX11_clang_pass_object_size; |
||
11954 | case 2: return C2x_clang_pass_object_size; |
||
11955 | case 3: return GNU_pass_dynamic_object_size; |
||
11956 | case 4: return CXX11_clang_pass_dynamic_object_size; |
||
11957 | case 5: return C2x_clang_pass_dynamic_object_size; |
||
11958 | } |
||
11959 | } |
||
11960 | |||
11961 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
11962 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
11963 | } |
||
11964 | |||
11965 | bool isParamExpr(size_t N) const override { |
||
11966 | return false; |
||
11967 | } |
||
11968 | |||
11969 | static const ParsedAttrInfoPassObjectSize Instance; |
||
11970 | }; |
||
11971 | const ParsedAttrInfoPassObjectSize ParsedAttrInfoPassObjectSize::Instance; |
||
11972 | static constexpr ParsedAttrInfo::Spelling PatchableFunctionEntrySpellings[] = { |
||
11973 | {AttributeCommonInfo::AS_GNU, "patchable_function_entry"}, |
||
11974 | {AttributeCommonInfo::AS_CXX11, "gnu::patchable_function_entry"}, |
||
11975 | {AttributeCommonInfo::AS_C2x, "gnu::patchable_function_entry"}, |
||
11976 | }; |
||
11977 | static constexpr const char *PatchableFunctionEntryArgNames[] = { |
||
11978 | "Count","Offset",}; |
||
11979 | struct ParsedAttrInfoPatchableFunctionEntry final : public ParsedAttrInfo { |
||
11980 | constexpr ParsedAttrInfoPatchableFunctionEntry() : ParsedAttrInfo( |
||
11981 | /*AttrKind=*/ParsedAttr::AT_PatchableFunctionEntry, |
||
11982 | /*NumArgs=*/1, |
||
11983 | /*OptArgs=*/1, |
||
11984 | /*NumArgMembers=*/2, |
||
11985 | /*HasCustomParsing=*/0, |
||
11986 | /*AcceptsExprPack=*/0, |
||
11987 | /*IsTargetSpecific=*/1, |
||
11988 | /*IsType=*/0, |
||
11989 | /*IsStmt=*/0, |
||
11990 | /*IsKnownToGCC=*/1, |
||
11991 | /*IsSupportedByPragmaAttribute=*/1, |
||
11992 | /*Spellings=*/PatchableFunctionEntrySpellings, |
||
11993 | /*ArgNames=*/PatchableFunctionEntryArgNames) {} |
||
11994 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
11995 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
11996 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
11997 | << Attr << "functions and Objective-C methods"; |
||
11998 | return false; |
||
11999 | } |
||
12000 | return true; |
||
12001 | } |
||
12002 | |||
12003 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12004 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12005 | << AL << St->getBeginLoc(); |
||
12006 | return false; |
||
12007 | } |
||
12008 | |||
12009 | bool existsInTarget(const TargetInfo &Target) const override { |
||
12010 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
12011 | return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::riscv32 || T.getArch() == llvm::Triple::riscv64 || T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64); |
||
12012 | } |
||
12013 | |||
12014 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12015 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
12016 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
12017 | } |
||
12018 | |||
12019 | bool isParamExpr(size_t N) const override { |
||
12020 | return false; |
||
12021 | } |
||
12022 | |||
12023 | static const ParsedAttrInfoPatchableFunctionEntry Instance; |
||
12024 | }; |
||
12025 | const ParsedAttrInfoPatchableFunctionEntry ParsedAttrInfoPatchableFunctionEntry::Instance; |
||
12026 | static constexpr ParsedAttrInfo::Spelling PcsSpellings[] = { |
||
12027 | {AttributeCommonInfo::AS_GNU, "pcs"}, |
||
12028 | {AttributeCommonInfo::AS_CXX11, "gnu::pcs"}, |
||
12029 | {AttributeCommonInfo::AS_C2x, "gnu::pcs"}, |
||
12030 | }; |
||
12031 | static constexpr const char *PcsArgNames[] = { |
||
12032 | "PCS",}; |
||
12033 | struct ParsedAttrInfoPcs final : public ParsedAttrInfo { |
||
12034 | constexpr ParsedAttrInfoPcs() : ParsedAttrInfo( |
||
12035 | /*AttrKind=*/ParsedAttr::AT_Pcs, |
||
12036 | /*NumArgs=*/1, |
||
12037 | /*OptArgs=*/0, |
||
12038 | /*NumArgMembers=*/1, |
||
12039 | /*HasCustomParsing=*/0, |
||
12040 | /*AcceptsExprPack=*/0, |
||
12041 | /*IsTargetSpecific=*/0, |
||
12042 | /*IsType=*/1, |
||
12043 | /*IsStmt=*/0, |
||
12044 | /*IsKnownToGCC=*/1, |
||
12045 | /*IsSupportedByPragmaAttribute=*/0, |
||
12046 | /*Spellings=*/PcsSpellings, |
||
12047 | /*ArgNames=*/PcsArgNames) {} |
||
12048 | bool isParamExpr(size_t N) const override { |
||
12049 | return false; |
||
12050 | } |
||
12051 | |||
12052 | static const ParsedAttrInfoPcs Instance; |
||
12053 | }; |
||
12054 | const ParsedAttrInfoPcs ParsedAttrInfoPcs::Instance; |
||
12055 | static constexpr ParsedAttrInfo::Spelling PointerSpellings[] = { |
||
12056 | {AttributeCommonInfo::AS_CXX11, "gsl::Pointer"}, |
||
12057 | }; |
||
12058 | static constexpr const char *PointerArgNames[] = { |
||
12059 | "DerefType",}; |
||
12060 | struct ParsedAttrInfoPointer final : public ParsedAttrInfo { |
||
12061 | constexpr ParsedAttrInfoPointer() : ParsedAttrInfo( |
||
12062 | /*AttrKind=*/ParsedAttr::AT_Pointer, |
||
12063 | /*NumArgs=*/0, |
||
12064 | /*OptArgs=*/1, |
||
12065 | /*NumArgMembers=*/1, |
||
12066 | /*HasCustomParsing=*/0, |
||
12067 | /*AcceptsExprPack=*/0, |
||
12068 | /*IsTargetSpecific=*/0, |
||
12069 | /*IsType=*/0, |
||
12070 | /*IsStmt=*/0, |
||
12071 | /*IsKnownToGCC=*/0, |
||
12072 | /*IsSupportedByPragmaAttribute=*/1, |
||
12073 | /*Spellings=*/PointerSpellings, |
||
12074 | /*ArgNames=*/PointerArgNames) {} |
||
12075 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12076 | if (!isStruct(D)) { |
||
12077 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12078 | << Attr << "structs"; |
||
12079 | return false; |
||
12080 | } |
||
12081 | return true; |
||
12082 | } |
||
12083 | |||
12084 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12085 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12086 | << AL << St->getBeginLoc(); |
||
12087 | return false; |
||
12088 | } |
||
12089 | |||
12090 | using ParsedAttrInfo::diagMutualExclusion; |
||
12091 | |||
12092 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
12093 | if (const auto *A = D->getAttr<OwnerAttr>()) { |
||
12094 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
12095 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
12096 | return false; |
||
12097 | } |
||
12098 | return true; |
||
12099 | } |
||
12100 | |||
12101 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12102 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true)); |
||
12103 | } |
||
12104 | |||
12105 | bool isParamExpr(size_t N) const override { |
||
12106 | return false; |
||
12107 | } |
||
12108 | |||
12109 | static const ParsedAttrInfoPointer Instance; |
||
12110 | }; |
||
12111 | const ParsedAttrInfoPointer ParsedAttrInfoPointer::Instance; |
||
12112 | static constexpr const char *PragmaClangBSSSectionArgNames[] = { |
||
12113 | "Name",}; |
||
12114 | struct ParsedAttrInfoPragmaClangBSSSection final : public ParsedAttrInfo { |
||
12115 | constexpr ParsedAttrInfoPragmaClangBSSSection() : ParsedAttrInfo( |
||
12116 | /*AttrKind=*/ParsedAttr::AT_PragmaClangBSSSection, |
||
12117 | /*NumArgs=*/1, |
||
12118 | /*OptArgs=*/0, |
||
12119 | /*NumArgMembers=*/1, |
||
12120 | /*HasCustomParsing=*/0, |
||
12121 | /*AcceptsExprPack=*/0, |
||
12122 | /*IsTargetSpecific=*/0, |
||
12123 | /*IsType=*/0, |
||
12124 | /*IsStmt=*/0, |
||
12125 | /*IsKnownToGCC=*/0, |
||
12126 | /*IsSupportedByPragmaAttribute=*/0, |
||
12127 | /*Spellings=*/{}, |
||
12128 | /*ArgNames=*/PragmaClangBSSSectionArgNames) {} |
||
12129 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12130 | if (!isGlobalVar(D)) { |
||
12131 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12132 | << Attr << "global variables"; |
||
12133 | return false; |
||
12134 | } |
||
12135 | return true; |
||
12136 | } |
||
12137 | |||
12138 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12139 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12140 | << AL << St->getBeginLoc(); |
||
12141 | return false; |
||
12142 | } |
||
12143 | |||
12144 | bool isParamExpr(size_t N) const override { |
||
12145 | return false; |
||
12146 | } |
||
12147 | |||
12148 | static const ParsedAttrInfoPragmaClangBSSSection Instance; |
||
12149 | }; |
||
12150 | const ParsedAttrInfoPragmaClangBSSSection ParsedAttrInfoPragmaClangBSSSection::Instance; |
||
12151 | static constexpr const char *PragmaClangDataSectionArgNames[] = { |
||
12152 | "Name",}; |
||
12153 | struct ParsedAttrInfoPragmaClangDataSection final : public ParsedAttrInfo { |
||
12154 | constexpr ParsedAttrInfoPragmaClangDataSection() : ParsedAttrInfo( |
||
12155 | /*AttrKind=*/ParsedAttr::AT_PragmaClangDataSection, |
||
12156 | /*NumArgs=*/1, |
||
12157 | /*OptArgs=*/0, |
||
12158 | /*NumArgMembers=*/1, |
||
12159 | /*HasCustomParsing=*/0, |
||
12160 | /*AcceptsExprPack=*/0, |
||
12161 | /*IsTargetSpecific=*/0, |
||
12162 | /*IsType=*/0, |
||
12163 | /*IsStmt=*/0, |
||
12164 | /*IsKnownToGCC=*/0, |
||
12165 | /*IsSupportedByPragmaAttribute=*/0, |
||
12166 | /*Spellings=*/{}, |
||
12167 | /*ArgNames=*/PragmaClangDataSectionArgNames) {} |
||
12168 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12169 | if (!isGlobalVar(D)) { |
||
12170 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12171 | << Attr << "global variables"; |
||
12172 | return false; |
||
12173 | } |
||
12174 | return true; |
||
12175 | } |
||
12176 | |||
12177 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12178 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12179 | << AL << St->getBeginLoc(); |
||
12180 | return false; |
||
12181 | } |
||
12182 | |||
12183 | bool isParamExpr(size_t N) const override { |
||
12184 | return false; |
||
12185 | } |
||
12186 | |||
12187 | static const ParsedAttrInfoPragmaClangDataSection Instance; |
||
12188 | }; |
||
12189 | const ParsedAttrInfoPragmaClangDataSection ParsedAttrInfoPragmaClangDataSection::Instance; |
||
12190 | static constexpr const char *PragmaClangRelroSectionArgNames[] = { |
||
12191 | "Name",}; |
||
12192 | struct ParsedAttrInfoPragmaClangRelroSection final : public ParsedAttrInfo { |
||
12193 | constexpr ParsedAttrInfoPragmaClangRelroSection() : ParsedAttrInfo( |
||
12194 | /*AttrKind=*/ParsedAttr::AT_PragmaClangRelroSection, |
||
12195 | /*NumArgs=*/1, |
||
12196 | /*OptArgs=*/0, |
||
12197 | /*NumArgMembers=*/1, |
||
12198 | /*HasCustomParsing=*/0, |
||
12199 | /*AcceptsExprPack=*/0, |
||
12200 | /*IsTargetSpecific=*/0, |
||
12201 | /*IsType=*/0, |
||
12202 | /*IsStmt=*/0, |
||
12203 | /*IsKnownToGCC=*/0, |
||
12204 | /*IsSupportedByPragmaAttribute=*/0, |
||
12205 | /*Spellings=*/{}, |
||
12206 | /*ArgNames=*/PragmaClangRelroSectionArgNames) {} |
||
12207 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12208 | if (!isGlobalVar(D)) { |
||
12209 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12210 | << Attr << "global variables"; |
||
12211 | return false; |
||
12212 | } |
||
12213 | return true; |
||
12214 | } |
||
12215 | |||
12216 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12217 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12218 | << AL << St->getBeginLoc(); |
||
12219 | return false; |
||
12220 | } |
||
12221 | |||
12222 | bool isParamExpr(size_t N) const override { |
||
12223 | return false; |
||
12224 | } |
||
12225 | |||
12226 | static const ParsedAttrInfoPragmaClangRelroSection Instance; |
||
12227 | }; |
||
12228 | const ParsedAttrInfoPragmaClangRelroSection ParsedAttrInfoPragmaClangRelroSection::Instance; |
||
12229 | static constexpr const char *PragmaClangRodataSectionArgNames[] = { |
||
12230 | "Name",}; |
||
12231 | struct ParsedAttrInfoPragmaClangRodataSection final : public ParsedAttrInfo { |
||
12232 | constexpr ParsedAttrInfoPragmaClangRodataSection() : ParsedAttrInfo( |
||
12233 | /*AttrKind=*/ParsedAttr::AT_PragmaClangRodataSection, |
||
12234 | /*NumArgs=*/1, |
||
12235 | /*OptArgs=*/0, |
||
12236 | /*NumArgMembers=*/1, |
||
12237 | /*HasCustomParsing=*/0, |
||
12238 | /*AcceptsExprPack=*/0, |
||
12239 | /*IsTargetSpecific=*/0, |
||
12240 | /*IsType=*/0, |
||
12241 | /*IsStmt=*/0, |
||
12242 | /*IsKnownToGCC=*/0, |
||
12243 | /*IsSupportedByPragmaAttribute=*/0, |
||
12244 | /*Spellings=*/{}, |
||
12245 | /*ArgNames=*/PragmaClangRodataSectionArgNames) {} |
||
12246 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12247 | if (!isGlobalVar(D)) { |
||
12248 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12249 | << Attr << "global variables"; |
||
12250 | return false; |
||
12251 | } |
||
12252 | return true; |
||
12253 | } |
||
12254 | |||
12255 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12256 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12257 | << AL << St->getBeginLoc(); |
||
12258 | return false; |
||
12259 | } |
||
12260 | |||
12261 | bool isParamExpr(size_t N) const override { |
||
12262 | return false; |
||
12263 | } |
||
12264 | |||
12265 | static const ParsedAttrInfoPragmaClangRodataSection Instance; |
||
12266 | }; |
||
12267 | const ParsedAttrInfoPragmaClangRodataSection ParsedAttrInfoPragmaClangRodataSection::Instance; |
||
12268 | static constexpr const char *PragmaClangTextSectionArgNames[] = { |
||
12269 | "Name",}; |
||
12270 | struct ParsedAttrInfoPragmaClangTextSection final : public ParsedAttrInfo { |
||
12271 | constexpr ParsedAttrInfoPragmaClangTextSection() : ParsedAttrInfo( |
||
12272 | /*AttrKind=*/ParsedAttr::AT_PragmaClangTextSection, |
||
12273 | /*NumArgs=*/1, |
||
12274 | /*OptArgs=*/0, |
||
12275 | /*NumArgMembers=*/1, |
||
12276 | /*HasCustomParsing=*/0, |
||
12277 | /*AcceptsExprPack=*/0, |
||
12278 | /*IsTargetSpecific=*/0, |
||
12279 | /*IsType=*/0, |
||
12280 | /*IsStmt=*/0, |
||
12281 | /*IsKnownToGCC=*/0, |
||
12282 | /*IsSupportedByPragmaAttribute=*/0, |
||
12283 | /*Spellings=*/{}, |
||
12284 | /*ArgNames=*/PragmaClangTextSectionArgNames) {} |
||
12285 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12286 | if (!isa<FunctionDecl>(D)) { |
||
12287 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12288 | << Attr << "functions"; |
||
12289 | return false; |
||
12290 | } |
||
12291 | return true; |
||
12292 | } |
||
12293 | |||
12294 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12295 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12296 | << AL << St->getBeginLoc(); |
||
12297 | return false; |
||
12298 | } |
||
12299 | |||
12300 | bool isParamExpr(size_t N) const override { |
||
12301 | return false; |
||
12302 | } |
||
12303 | |||
12304 | static const ParsedAttrInfoPragmaClangTextSection Instance; |
||
12305 | }; |
||
12306 | const ParsedAttrInfoPragmaClangTextSection ParsedAttrInfoPragmaClangTextSection::Instance; |
||
12307 | static constexpr ParsedAttrInfo::Spelling PreferredNameSpellings[] = { |
||
12308 | {AttributeCommonInfo::AS_GNU, "preferred_name"}, |
||
12309 | {AttributeCommonInfo::AS_CXX11, "clang::preferred_name"}, |
||
12310 | }; |
||
12311 | static constexpr const char *PreferredNameArgNames[] = { |
||
12312 | "TypedefType",}; |
||
12313 | struct ParsedAttrInfoPreferredName final : public ParsedAttrInfo { |
||
12314 | constexpr ParsedAttrInfoPreferredName() : ParsedAttrInfo( |
||
12315 | /*AttrKind=*/ParsedAttr::AT_PreferredName, |
||
12316 | /*NumArgs=*/1, |
||
12317 | /*OptArgs=*/0, |
||
12318 | /*NumArgMembers=*/1, |
||
12319 | /*HasCustomParsing=*/0, |
||
12320 | /*AcceptsExprPack=*/0, |
||
12321 | /*IsTargetSpecific=*/0, |
||
12322 | /*IsType=*/0, |
||
12323 | /*IsStmt=*/0, |
||
12324 | /*IsKnownToGCC=*/0, |
||
12325 | /*IsSupportedByPragmaAttribute=*/0, |
||
12326 | /*Spellings=*/PreferredNameSpellings, |
||
12327 | /*ArgNames=*/PreferredNameArgNames) {} |
||
12328 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12329 | if (!isClassTmpl(D)) { |
||
12330 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12331 | << Attr << "class templates"; |
||
12332 | return false; |
||
12333 | } |
||
12334 | return true; |
||
12335 | } |
||
12336 | |||
12337 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12338 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12339 | << AL << St->getBeginLoc(); |
||
12340 | return false; |
||
12341 | } |
||
12342 | |||
12343 | bool isParamExpr(size_t N) const override { |
||
12344 | return false; |
||
12345 | } |
||
12346 | |||
12347 | static const ParsedAttrInfoPreferredName Instance; |
||
12348 | }; |
||
12349 | const ParsedAttrInfoPreferredName ParsedAttrInfoPreferredName::Instance; |
||
12350 | static constexpr ParsedAttrInfo::Spelling PreserveAllSpellings[] = { |
||
12351 | {AttributeCommonInfo::AS_GNU, "preserve_all"}, |
||
12352 | {AttributeCommonInfo::AS_CXX11, "clang::preserve_all"}, |
||
12353 | {AttributeCommonInfo::AS_C2x, "clang::preserve_all"}, |
||
12354 | }; |
||
12355 | struct ParsedAttrInfoPreserveAll final : public ParsedAttrInfo { |
||
12356 | constexpr ParsedAttrInfoPreserveAll() : ParsedAttrInfo( |
||
12357 | /*AttrKind=*/ParsedAttr::AT_PreserveAll, |
||
12358 | /*NumArgs=*/0, |
||
12359 | /*OptArgs=*/0, |
||
12360 | /*NumArgMembers=*/0, |
||
12361 | /*HasCustomParsing=*/0, |
||
12362 | /*AcceptsExprPack=*/0, |
||
12363 | /*IsTargetSpecific=*/0, |
||
12364 | /*IsType=*/1, |
||
12365 | /*IsStmt=*/0, |
||
12366 | /*IsKnownToGCC=*/0, |
||
12367 | /*IsSupportedByPragmaAttribute=*/0, |
||
12368 | /*Spellings=*/PreserveAllSpellings, |
||
12369 | /*ArgNames=*/{}) {} |
||
12370 | bool isParamExpr(size_t N) const override { |
||
12371 | return false; |
||
12372 | } |
||
12373 | |||
12374 | static const ParsedAttrInfoPreserveAll Instance; |
||
12375 | }; |
||
12376 | const ParsedAttrInfoPreserveAll ParsedAttrInfoPreserveAll::Instance; |
||
12377 | static constexpr ParsedAttrInfo::Spelling PreserveMostSpellings[] = { |
||
12378 | {AttributeCommonInfo::AS_GNU, "preserve_most"}, |
||
12379 | {AttributeCommonInfo::AS_CXX11, "clang::preserve_most"}, |
||
12380 | {AttributeCommonInfo::AS_C2x, "clang::preserve_most"}, |
||
12381 | }; |
||
12382 | struct ParsedAttrInfoPreserveMost final : public ParsedAttrInfo { |
||
12383 | constexpr ParsedAttrInfoPreserveMost() : ParsedAttrInfo( |
||
12384 | /*AttrKind=*/ParsedAttr::AT_PreserveMost, |
||
12385 | /*NumArgs=*/0, |
||
12386 | /*OptArgs=*/0, |
||
12387 | /*NumArgMembers=*/0, |
||
12388 | /*HasCustomParsing=*/0, |
||
12389 | /*AcceptsExprPack=*/0, |
||
12390 | /*IsTargetSpecific=*/0, |
||
12391 | /*IsType=*/1, |
||
12392 | /*IsStmt=*/0, |
||
12393 | /*IsKnownToGCC=*/0, |
||
12394 | /*IsSupportedByPragmaAttribute=*/0, |
||
12395 | /*Spellings=*/PreserveMostSpellings, |
||
12396 | /*ArgNames=*/{}) {} |
||
12397 | bool isParamExpr(size_t N) const override { |
||
12398 | return false; |
||
12399 | } |
||
12400 | |||
12401 | static const ParsedAttrInfoPreserveMost Instance; |
||
12402 | }; |
||
12403 | const ParsedAttrInfoPreserveMost ParsedAttrInfoPreserveMost::Instance; |
||
12404 | static constexpr ParsedAttrInfo::Spelling PtGuardedBySpellings[] = { |
||
12405 | {AttributeCommonInfo::AS_GNU, "pt_guarded_by"}, |
||
12406 | }; |
||
12407 | static constexpr const char *PtGuardedByArgNames[] = { |
||
12408 | "Arg",}; |
||
12409 | struct ParsedAttrInfoPtGuardedBy final : public ParsedAttrInfo { |
||
12410 | constexpr ParsedAttrInfoPtGuardedBy() : ParsedAttrInfo( |
||
12411 | /*AttrKind=*/ParsedAttr::AT_PtGuardedBy, |
||
12412 | /*NumArgs=*/1, |
||
12413 | /*OptArgs=*/0, |
||
12414 | /*NumArgMembers=*/1, |
||
12415 | /*HasCustomParsing=*/0, |
||
12416 | /*AcceptsExprPack=*/0, |
||
12417 | /*IsTargetSpecific=*/0, |
||
12418 | /*IsType=*/0, |
||
12419 | /*IsStmt=*/0, |
||
12420 | /*IsKnownToGCC=*/0, |
||
12421 | /*IsSupportedByPragmaAttribute=*/0, |
||
12422 | /*Spellings=*/PtGuardedBySpellings, |
||
12423 | /*ArgNames=*/PtGuardedByArgNames) {} |
||
12424 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12425 | if (!isa<FieldDecl>(D) && !isSharedVar(D)) { |
||
12426 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12427 | << Attr << "non-static data members and global variables"; |
||
12428 | return false; |
||
12429 | } |
||
12430 | return true; |
||
12431 | } |
||
12432 | |||
12433 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12434 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12435 | << AL << St->getBeginLoc(); |
||
12436 | return false; |
||
12437 | } |
||
12438 | |||
12439 | bool isParamExpr(size_t N) const override { |
||
12440 | return (N == 0) || false; |
||
12441 | } |
||
12442 | |||
12443 | static const ParsedAttrInfoPtGuardedBy Instance; |
||
12444 | }; |
||
12445 | const ParsedAttrInfoPtGuardedBy ParsedAttrInfoPtGuardedBy::Instance; |
||
12446 | static constexpr ParsedAttrInfo::Spelling PtGuardedVarSpellings[] = { |
||
12447 | {AttributeCommonInfo::AS_GNU, "pt_guarded_var"}, |
||
12448 | {AttributeCommonInfo::AS_CXX11, "clang::pt_guarded_var"}, |
||
12449 | }; |
||
12450 | struct ParsedAttrInfoPtGuardedVar final : public ParsedAttrInfo { |
||
12451 | constexpr ParsedAttrInfoPtGuardedVar() : ParsedAttrInfo( |
||
12452 | /*AttrKind=*/ParsedAttr::AT_PtGuardedVar, |
||
12453 | /*NumArgs=*/0, |
||
12454 | /*OptArgs=*/0, |
||
12455 | /*NumArgMembers=*/0, |
||
12456 | /*HasCustomParsing=*/0, |
||
12457 | /*AcceptsExprPack=*/0, |
||
12458 | /*IsTargetSpecific=*/0, |
||
12459 | /*IsType=*/0, |
||
12460 | /*IsStmt=*/0, |
||
12461 | /*IsKnownToGCC=*/0, |
||
12462 | /*IsSupportedByPragmaAttribute=*/0, |
||
12463 | /*Spellings=*/PtGuardedVarSpellings, |
||
12464 | /*ArgNames=*/{}) {} |
||
12465 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12466 | if (!isa<FieldDecl>(D) && !isSharedVar(D)) { |
||
12467 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12468 | << Attr << "non-static data members and global variables"; |
||
12469 | return false; |
||
12470 | } |
||
12471 | return true; |
||
12472 | } |
||
12473 | |||
12474 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12475 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12476 | << AL << St->getBeginLoc(); |
||
12477 | return false; |
||
12478 | } |
||
12479 | |||
12480 | bool isParamExpr(size_t N) const override { |
||
12481 | return false; |
||
12482 | } |
||
12483 | |||
12484 | static const ParsedAttrInfoPtGuardedVar Instance; |
||
12485 | }; |
||
12486 | const ParsedAttrInfoPtGuardedVar ParsedAttrInfoPtGuardedVar::Instance; |
||
12487 | static constexpr ParsedAttrInfo::Spelling Ptr32Spellings[] = { |
||
12488 | {AttributeCommonInfo::AS_Keyword, "__ptr32"}, |
||
12489 | }; |
||
12490 | struct ParsedAttrInfoPtr32 final : public ParsedAttrInfo { |
||
12491 | constexpr ParsedAttrInfoPtr32() : ParsedAttrInfo( |
||
12492 | /*AttrKind=*/ParsedAttr::AT_Ptr32, |
||
12493 | /*NumArgs=*/0, |
||
12494 | /*OptArgs=*/0, |
||
12495 | /*NumArgMembers=*/0, |
||
12496 | /*HasCustomParsing=*/0, |
||
12497 | /*AcceptsExprPack=*/0, |
||
12498 | /*IsTargetSpecific=*/0, |
||
12499 | /*IsType=*/1, |
||
12500 | /*IsStmt=*/0, |
||
12501 | /*IsKnownToGCC=*/0, |
||
12502 | /*IsSupportedByPragmaAttribute=*/0, |
||
12503 | /*Spellings=*/Ptr32Spellings, |
||
12504 | /*ArgNames=*/{}) {} |
||
12505 | bool isParamExpr(size_t N) const override { |
||
12506 | return false; |
||
12507 | } |
||
12508 | |||
12509 | static const ParsedAttrInfoPtr32 Instance; |
||
12510 | }; |
||
12511 | const ParsedAttrInfoPtr32 ParsedAttrInfoPtr32::Instance; |
||
12512 | static constexpr ParsedAttrInfo::Spelling Ptr64Spellings[] = { |
||
12513 | {AttributeCommonInfo::AS_Keyword, "__ptr64"}, |
||
12514 | }; |
||
12515 | struct ParsedAttrInfoPtr64 final : public ParsedAttrInfo { |
||
12516 | constexpr ParsedAttrInfoPtr64() : ParsedAttrInfo( |
||
12517 | /*AttrKind=*/ParsedAttr::AT_Ptr64, |
||
12518 | /*NumArgs=*/0, |
||
12519 | /*OptArgs=*/0, |
||
12520 | /*NumArgMembers=*/0, |
||
12521 | /*HasCustomParsing=*/0, |
||
12522 | /*AcceptsExprPack=*/0, |
||
12523 | /*IsTargetSpecific=*/0, |
||
12524 | /*IsType=*/1, |
||
12525 | /*IsStmt=*/0, |
||
12526 | /*IsKnownToGCC=*/0, |
||
12527 | /*IsSupportedByPragmaAttribute=*/0, |
||
12528 | /*Spellings=*/Ptr64Spellings, |
||
12529 | /*ArgNames=*/{}) {} |
||
12530 | bool isParamExpr(size_t N) const override { |
||
12531 | return false; |
||
12532 | } |
||
12533 | |||
12534 | static const ParsedAttrInfoPtr64 Instance; |
||
12535 | }; |
||
12536 | const ParsedAttrInfoPtr64 ParsedAttrInfoPtr64::Instance; |
||
12537 | static constexpr ParsedAttrInfo::Spelling PureSpellings[] = { |
||
12538 | {AttributeCommonInfo::AS_GNU, "pure"}, |
||
12539 | {AttributeCommonInfo::AS_CXX11, "gnu::pure"}, |
||
12540 | {AttributeCommonInfo::AS_C2x, "gnu::pure"}, |
||
12541 | }; |
||
12542 | struct ParsedAttrInfoPure final : public ParsedAttrInfo { |
||
12543 | constexpr ParsedAttrInfoPure() : ParsedAttrInfo( |
||
12544 | /*AttrKind=*/ParsedAttr::AT_Pure, |
||
12545 | /*NumArgs=*/0, |
||
12546 | /*OptArgs=*/0, |
||
12547 | /*NumArgMembers=*/0, |
||
12548 | /*HasCustomParsing=*/0, |
||
12549 | /*AcceptsExprPack=*/0, |
||
12550 | /*IsTargetSpecific=*/0, |
||
12551 | /*IsType=*/0, |
||
12552 | /*IsStmt=*/0, |
||
12553 | /*IsKnownToGCC=*/1, |
||
12554 | /*IsSupportedByPragmaAttribute=*/0, |
||
12555 | /*Spellings=*/PureSpellings, |
||
12556 | /*ArgNames=*/{}) {} |
||
12557 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
12558 | D->addAttr(::new (S.Context) PureAttr(S.Context, Attr)); |
||
12559 | return AttributeApplied; |
||
12560 | } |
||
12561 | |||
12562 | bool isParamExpr(size_t N) const override { |
||
12563 | return false; |
||
12564 | } |
||
12565 | |||
12566 | static const ParsedAttrInfoPure Instance; |
||
12567 | }; |
||
12568 | const ParsedAttrInfoPure ParsedAttrInfoPure::Instance; |
||
12569 | static constexpr ParsedAttrInfo::Spelling RandomizeLayoutSpellings[] = { |
||
12570 | {AttributeCommonInfo::AS_GNU, "randomize_layout"}, |
||
12571 | {AttributeCommonInfo::AS_CXX11, "gnu::randomize_layout"}, |
||
12572 | {AttributeCommonInfo::AS_C2x, "gnu::randomize_layout"}, |
||
12573 | }; |
||
12574 | struct ParsedAttrInfoRandomizeLayout final : public ParsedAttrInfo { |
||
12575 | constexpr ParsedAttrInfoRandomizeLayout() : ParsedAttrInfo( |
||
12576 | /*AttrKind=*/ParsedAttr::AT_RandomizeLayout, |
||
12577 | /*NumArgs=*/0, |
||
12578 | /*OptArgs=*/0, |
||
12579 | /*NumArgMembers=*/0, |
||
12580 | /*HasCustomParsing=*/0, |
||
12581 | /*AcceptsExprPack=*/0, |
||
12582 | /*IsTargetSpecific=*/0, |
||
12583 | /*IsType=*/0, |
||
12584 | /*IsStmt=*/0, |
||
12585 | /*IsKnownToGCC=*/1, |
||
12586 | /*IsSupportedByPragmaAttribute=*/1, |
||
12587 | /*Spellings=*/RandomizeLayoutSpellings, |
||
12588 | /*ArgNames=*/{}) {} |
||
12589 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12590 | if (!isa<RecordDecl>(D)) { |
||
12591 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12592 | << Attr << "structs, unions, and classes"; |
||
12593 | return false; |
||
12594 | } |
||
12595 | return true; |
||
12596 | } |
||
12597 | |||
12598 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12599 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12600 | << AL << St->getBeginLoc(); |
||
12601 | return false; |
||
12602 | } |
||
12603 | |||
12604 | using ParsedAttrInfo::diagMutualExclusion; |
||
12605 | |||
12606 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
12607 | if (const auto *A = D->getAttr<NoRandomizeLayoutAttr>()) { |
||
12608 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
12609 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
12610 | return false; |
||
12611 | } |
||
12612 | return true; |
||
12613 | } |
||
12614 | |||
12615 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
12616 | return (!LangOpts.CPlusPlus); |
||
12617 | } |
||
12618 | |||
12619 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12620 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
12621 | } |
||
12622 | |||
12623 | bool isParamExpr(size_t N) const override { |
||
12624 | return false; |
||
12625 | } |
||
12626 | |||
12627 | static const ParsedAttrInfoRandomizeLayout Instance; |
||
12628 | }; |
||
12629 | const ParsedAttrInfoRandomizeLayout ParsedAttrInfoRandomizeLayout::Instance; |
||
12630 | static constexpr ParsedAttrInfo::Spelling ReadOnlyPlacementSpellings[] = { |
||
12631 | {AttributeCommonInfo::AS_GNU, "enforce_read_only_placement"}, |
||
12632 | {AttributeCommonInfo::AS_CXX11, "clang::enforce_read_only_placement"}, |
||
12633 | {AttributeCommonInfo::AS_C2x, "clang::enforce_read_only_placement"}, |
||
12634 | }; |
||
12635 | struct ParsedAttrInfoReadOnlyPlacement final : public ParsedAttrInfo { |
||
12636 | constexpr ParsedAttrInfoReadOnlyPlacement() : ParsedAttrInfo( |
||
12637 | /*AttrKind=*/ParsedAttr::AT_ReadOnlyPlacement, |
||
12638 | /*NumArgs=*/0, |
||
12639 | /*OptArgs=*/0, |
||
12640 | /*NumArgMembers=*/0, |
||
12641 | /*HasCustomParsing=*/0, |
||
12642 | /*AcceptsExprPack=*/0, |
||
12643 | /*IsTargetSpecific=*/0, |
||
12644 | /*IsType=*/0, |
||
12645 | /*IsStmt=*/0, |
||
12646 | /*IsKnownToGCC=*/0, |
||
12647 | /*IsSupportedByPragmaAttribute=*/1, |
||
12648 | /*Spellings=*/ReadOnlyPlacementSpellings, |
||
12649 | /*ArgNames=*/{}) {} |
||
12650 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12651 | if (!isa<RecordDecl>(D)) { |
||
12652 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12653 | << Attr << "structs, unions, and classes"; |
||
12654 | return false; |
||
12655 | } |
||
12656 | return true; |
||
12657 | } |
||
12658 | |||
12659 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12660 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12661 | << AL << St->getBeginLoc(); |
||
12662 | return false; |
||
12663 | } |
||
12664 | |||
12665 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12666 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
12667 | } |
||
12668 | |||
12669 | bool isParamExpr(size_t N) const override { |
||
12670 | return false; |
||
12671 | } |
||
12672 | |||
12673 | static const ParsedAttrInfoReadOnlyPlacement Instance; |
||
12674 | }; |
||
12675 | const ParsedAttrInfoReadOnlyPlacement ParsedAttrInfoReadOnlyPlacement::Instance; |
||
12676 | static constexpr ParsedAttrInfo::Spelling RegCallSpellings[] = { |
||
12677 | {AttributeCommonInfo::AS_GNU, "regcall"}, |
||
12678 | {AttributeCommonInfo::AS_CXX11, "gnu::regcall"}, |
||
12679 | {AttributeCommonInfo::AS_C2x, "gnu::regcall"}, |
||
12680 | {AttributeCommonInfo::AS_Keyword, "__regcall"}, |
||
12681 | }; |
||
12682 | struct ParsedAttrInfoRegCall final : public ParsedAttrInfo { |
||
12683 | constexpr ParsedAttrInfoRegCall() : ParsedAttrInfo( |
||
12684 | /*AttrKind=*/ParsedAttr::AT_RegCall, |
||
12685 | /*NumArgs=*/0, |
||
12686 | /*OptArgs=*/0, |
||
12687 | /*NumArgMembers=*/0, |
||
12688 | /*HasCustomParsing=*/0, |
||
12689 | /*AcceptsExprPack=*/0, |
||
12690 | /*IsTargetSpecific=*/0, |
||
12691 | /*IsType=*/1, |
||
12692 | /*IsStmt=*/0, |
||
12693 | /*IsKnownToGCC=*/1, |
||
12694 | /*IsSupportedByPragmaAttribute=*/0, |
||
12695 | /*Spellings=*/RegCallSpellings, |
||
12696 | /*ArgNames=*/{}) {} |
||
12697 | bool isParamExpr(size_t N) const override { |
||
12698 | return false; |
||
12699 | } |
||
12700 | |||
12701 | static const ParsedAttrInfoRegCall Instance; |
||
12702 | }; |
||
12703 | const ParsedAttrInfoRegCall ParsedAttrInfoRegCall::Instance; |
||
12704 | static constexpr ParsedAttrInfo::Spelling RegparmSpellings[] = { |
||
12705 | {AttributeCommonInfo::AS_GNU, "regparm"}, |
||
12706 | {AttributeCommonInfo::AS_CXX11, "gnu::regparm"}, |
||
12707 | {AttributeCommonInfo::AS_C2x, "gnu::regparm"}, |
||
12708 | }; |
||
12709 | static constexpr const char *RegparmArgNames[] = { |
||
12710 | "NumParams",}; |
||
12711 | struct ParsedAttrInfoRegparm final : public ParsedAttrInfo { |
||
12712 | constexpr ParsedAttrInfoRegparm() : ParsedAttrInfo( |
||
12713 | /*AttrKind=*/ParsedAttr::AT_Regparm, |
||
12714 | /*NumArgs=*/1, |
||
12715 | /*OptArgs=*/0, |
||
12716 | /*NumArgMembers=*/1, |
||
12717 | /*HasCustomParsing=*/0, |
||
12718 | /*AcceptsExprPack=*/0, |
||
12719 | /*IsTargetSpecific=*/0, |
||
12720 | /*IsType=*/1, |
||
12721 | /*IsStmt=*/0, |
||
12722 | /*IsKnownToGCC=*/1, |
||
12723 | /*IsSupportedByPragmaAttribute=*/0, |
||
12724 | /*Spellings=*/RegparmSpellings, |
||
12725 | /*ArgNames=*/RegparmArgNames) {} |
||
12726 | bool isParamExpr(size_t N) const override { |
||
12727 | return false; |
||
12728 | } |
||
12729 | |||
12730 | static const ParsedAttrInfoRegparm Instance; |
||
12731 | }; |
||
12732 | const ParsedAttrInfoRegparm ParsedAttrInfoRegparm::Instance; |
||
12733 | static constexpr ParsedAttrInfo::Spelling ReinitializesSpellings[] = { |
||
12734 | {AttributeCommonInfo::AS_GNU, "reinitializes"}, |
||
12735 | {AttributeCommonInfo::AS_CXX11, "clang::reinitializes"}, |
||
12736 | }; |
||
12737 | struct ParsedAttrInfoReinitializes final : public ParsedAttrInfo { |
||
12738 | constexpr ParsedAttrInfoReinitializes() : ParsedAttrInfo( |
||
12739 | /*AttrKind=*/ParsedAttr::AT_Reinitializes, |
||
12740 | /*NumArgs=*/0, |
||
12741 | /*OptArgs=*/0, |
||
12742 | /*NumArgMembers=*/0, |
||
12743 | /*HasCustomParsing=*/0, |
||
12744 | /*AcceptsExprPack=*/0, |
||
12745 | /*IsTargetSpecific=*/0, |
||
12746 | /*IsType=*/0, |
||
12747 | /*IsStmt=*/0, |
||
12748 | /*IsKnownToGCC=*/0, |
||
12749 | /*IsSupportedByPragmaAttribute=*/0, |
||
12750 | /*Spellings=*/ReinitializesSpellings, |
||
12751 | /*ArgNames=*/{}) {} |
||
12752 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12753 | if (!isNonStaticNonConstCXXMethod(D)) { |
||
12754 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12755 | << Attr << "non-static non-const member functions"; |
||
12756 | return false; |
||
12757 | } |
||
12758 | return true; |
||
12759 | } |
||
12760 | |||
12761 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12762 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12763 | << AL << St->getBeginLoc(); |
||
12764 | return false; |
||
12765 | } |
||
12766 | |||
12767 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
12768 | D->addAttr(::new (S.Context) ReinitializesAttr(S.Context, Attr)); |
||
12769 | return AttributeApplied; |
||
12770 | } |
||
12771 | |||
12772 | bool isParamExpr(size_t N) const override { |
||
12773 | return false; |
||
12774 | } |
||
12775 | |||
12776 | static const ParsedAttrInfoReinitializes Instance; |
||
12777 | }; |
||
12778 | const ParsedAttrInfoReinitializes ParsedAttrInfoReinitializes::Instance; |
||
12779 | static constexpr ParsedAttrInfo::Spelling ReleaseCapabilitySpellings[] = { |
||
12780 | {AttributeCommonInfo::AS_GNU, "release_capability"}, |
||
12781 | {AttributeCommonInfo::AS_CXX11, "clang::release_capability"}, |
||
12782 | {AttributeCommonInfo::AS_GNU, "release_shared_capability"}, |
||
12783 | {AttributeCommonInfo::AS_CXX11, "clang::release_shared_capability"}, |
||
12784 | {AttributeCommonInfo::AS_GNU, "release_generic_capability"}, |
||
12785 | {AttributeCommonInfo::AS_CXX11, "clang::release_generic_capability"}, |
||
12786 | {AttributeCommonInfo::AS_GNU, "unlock_function"}, |
||
12787 | {AttributeCommonInfo::AS_CXX11, "clang::unlock_function"}, |
||
12788 | }; |
||
12789 | static constexpr const char *ReleaseCapabilityArgNames[] = { |
||
12790 | "Args...",}; |
||
12791 | struct ParsedAttrInfoReleaseCapability final : public ParsedAttrInfo { |
||
12792 | constexpr ParsedAttrInfoReleaseCapability() : ParsedAttrInfo( |
||
12793 | /*AttrKind=*/ParsedAttr::AT_ReleaseCapability, |
||
12794 | /*NumArgs=*/0, |
||
12795 | /*OptArgs=*/15, |
||
12796 | /*NumArgMembers=*/1, |
||
12797 | /*HasCustomParsing=*/0, |
||
12798 | /*AcceptsExprPack=*/0, |
||
12799 | /*IsTargetSpecific=*/0, |
||
12800 | /*IsType=*/0, |
||
12801 | /*IsStmt=*/0, |
||
12802 | /*IsKnownToGCC=*/0, |
||
12803 | /*IsSupportedByPragmaAttribute=*/0, |
||
12804 | /*Spellings=*/ReleaseCapabilitySpellings, |
||
12805 | /*ArgNames=*/ReleaseCapabilityArgNames) {} |
||
12806 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12807 | if (!isa<FunctionDecl>(D)) { |
||
12808 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12809 | << Attr << "functions"; |
||
12810 | return false; |
||
12811 | } |
||
12812 | return true; |
||
12813 | } |
||
12814 | |||
12815 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12816 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12817 | << AL << St->getBeginLoc(); |
||
12818 | return false; |
||
12819 | } |
||
12820 | |||
12821 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
12822 | enum Spelling { |
||
12823 | GNU_release_capability = 0, |
||
12824 | CXX11_clang_release_capability = 1, |
||
12825 | GNU_release_shared_capability = 2, |
||
12826 | CXX11_clang_release_shared_capability = 3, |
||
12827 | GNU_release_generic_capability = 4, |
||
12828 | CXX11_clang_release_generic_capability = 5, |
||
12829 | GNU_unlock_function = 6, |
||
12830 | CXX11_clang_unlock_function = 7, |
||
12831 | SpellingNotCalculated = 15 |
||
12832 | |||
12833 | }; |
||
12834 | |||
12835 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
12836 | switch (Idx) { |
||
12837 | default: llvm_unreachable("Unknown spelling list index"); |
||
12838 | case 0: return GNU_release_capability; |
||
12839 | case 1: return CXX11_clang_release_capability; |
||
12840 | case 2: return GNU_release_shared_capability; |
||
12841 | case 3: return CXX11_clang_release_shared_capability; |
||
12842 | case 4: return GNU_release_generic_capability; |
||
12843 | case 5: return CXX11_clang_release_generic_capability; |
||
12844 | case 6: return GNU_unlock_function; |
||
12845 | case 7: return CXX11_clang_unlock_function; |
||
12846 | } |
||
12847 | } |
||
12848 | |||
12849 | bool isParamExpr(size_t N) const override { |
||
12850 | return (N == 0) || false; |
||
12851 | } |
||
12852 | |||
12853 | static const ParsedAttrInfoReleaseCapability Instance; |
||
12854 | }; |
||
12855 | const ParsedAttrInfoReleaseCapability ParsedAttrInfoReleaseCapability::Instance; |
||
12856 | static constexpr ParsedAttrInfo::Spelling ReleaseHandleSpellings[] = { |
||
12857 | {AttributeCommonInfo::AS_GNU, "release_handle"}, |
||
12858 | {AttributeCommonInfo::AS_CXX11, "clang::release_handle"}, |
||
12859 | {AttributeCommonInfo::AS_C2x, "clang::release_handle"}, |
||
12860 | }; |
||
12861 | static constexpr const char *ReleaseHandleArgNames[] = { |
||
12862 | "HandleType",}; |
||
12863 | struct ParsedAttrInfoReleaseHandle final : public ParsedAttrInfo { |
||
12864 | constexpr ParsedAttrInfoReleaseHandle() : ParsedAttrInfo( |
||
12865 | /*AttrKind=*/ParsedAttr::AT_ReleaseHandle, |
||
12866 | /*NumArgs=*/1, |
||
12867 | /*OptArgs=*/0, |
||
12868 | /*NumArgMembers=*/1, |
||
12869 | /*HasCustomParsing=*/0, |
||
12870 | /*AcceptsExprPack=*/0, |
||
12871 | /*IsTargetSpecific=*/0, |
||
12872 | /*IsType=*/0, |
||
12873 | /*IsStmt=*/0, |
||
12874 | /*IsKnownToGCC=*/0, |
||
12875 | /*IsSupportedByPragmaAttribute=*/1, |
||
12876 | /*Spellings=*/ReleaseHandleSpellings, |
||
12877 | /*ArgNames=*/ReleaseHandleArgNames) {} |
||
12878 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12879 | if (!isa<ParmVarDecl>(D)) { |
||
12880 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12881 | << Attr << "parameters"; |
||
12882 | return false; |
||
12883 | } |
||
12884 | return true; |
||
12885 | } |
||
12886 | |||
12887 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12888 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12889 | << AL << St->getBeginLoc(); |
||
12890 | return false; |
||
12891 | } |
||
12892 | |||
12893 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12894 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
12895 | } |
||
12896 | |||
12897 | bool isParamExpr(size_t N) const override { |
||
12898 | return false; |
||
12899 | } |
||
12900 | |||
12901 | static const ParsedAttrInfoReleaseHandle Instance; |
||
12902 | }; |
||
12903 | const ParsedAttrInfoReleaseHandle ParsedAttrInfoReleaseHandle::Instance; |
||
12904 | static constexpr ParsedAttrInfo::Spelling RenderScriptKernelSpellings[] = { |
||
12905 | {AttributeCommonInfo::AS_GNU, "kernel"}, |
||
12906 | }; |
||
12907 | struct ParsedAttrInfoRenderScriptKernel final : public ParsedAttrInfo { |
||
12908 | constexpr ParsedAttrInfoRenderScriptKernel() : ParsedAttrInfo( |
||
12909 | /*AttrKind=*/ParsedAttr::AT_RenderScriptKernel, |
||
12910 | /*NumArgs=*/0, |
||
12911 | /*OptArgs=*/0, |
||
12912 | /*NumArgMembers=*/0, |
||
12913 | /*HasCustomParsing=*/0, |
||
12914 | /*AcceptsExprPack=*/0, |
||
12915 | /*IsTargetSpecific=*/0, |
||
12916 | /*IsType=*/0, |
||
12917 | /*IsStmt=*/0, |
||
12918 | /*IsKnownToGCC=*/0, |
||
12919 | /*IsSupportedByPragmaAttribute=*/1, |
||
12920 | /*Spellings=*/RenderScriptKernelSpellings, |
||
12921 | /*ArgNames=*/{}) {} |
||
12922 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12923 | if (!isa<FunctionDecl>(D)) { |
||
12924 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
12925 | << Attr << "functions"; |
||
12926 | return false; |
||
12927 | } |
||
12928 | return true; |
||
12929 | } |
||
12930 | |||
12931 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12932 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12933 | << AL << St->getBeginLoc(); |
||
12934 | return false; |
||
12935 | } |
||
12936 | |||
12937 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
12938 | return LangOpts.RenderScript; |
||
12939 | } |
||
12940 | |||
12941 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12942 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
12943 | } |
||
12944 | |||
12945 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
12946 | D->addAttr(::new (S.Context) RenderScriptKernelAttr(S.Context, Attr)); |
||
12947 | return AttributeApplied; |
||
12948 | } |
||
12949 | |||
12950 | bool isParamExpr(size_t N) const override { |
||
12951 | return false; |
||
12952 | } |
||
12953 | |||
12954 | static const ParsedAttrInfoRenderScriptKernel Instance; |
||
12955 | }; |
||
12956 | const ParsedAttrInfoRenderScriptKernel ParsedAttrInfoRenderScriptKernel::Instance; |
||
12957 | static constexpr ParsedAttrInfo::Spelling ReqdWorkGroupSizeSpellings[] = { |
||
12958 | {AttributeCommonInfo::AS_GNU, "reqd_work_group_size"}, |
||
12959 | }; |
||
12960 | static constexpr const char *ReqdWorkGroupSizeArgNames[] = { |
||
12961 | "XDim","YDim","ZDim",}; |
||
12962 | struct ParsedAttrInfoReqdWorkGroupSize final : public ParsedAttrInfo { |
||
12963 | constexpr ParsedAttrInfoReqdWorkGroupSize() : ParsedAttrInfo( |
||
12964 | /*AttrKind=*/ParsedAttr::AT_ReqdWorkGroupSize, |
||
12965 | /*NumArgs=*/3, |
||
12966 | /*OptArgs=*/0, |
||
12967 | /*NumArgMembers=*/3, |
||
12968 | /*HasCustomParsing=*/0, |
||
12969 | /*AcceptsExprPack=*/0, |
||
12970 | /*IsTargetSpecific=*/0, |
||
12971 | /*IsType=*/0, |
||
12972 | /*IsStmt=*/0, |
||
12973 | /*IsKnownToGCC=*/0, |
||
12974 | /*IsSupportedByPragmaAttribute=*/1, |
||
12975 | /*Spellings=*/ReqdWorkGroupSizeSpellings, |
||
12976 | /*ArgNames=*/ReqdWorkGroupSizeArgNames) {} |
||
12977 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
12978 | if (!isa<FunctionDecl>(D)) { |
||
12979 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
12980 | << Attr << "functions"; |
||
12981 | return false; |
||
12982 | } |
||
12983 | return true; |
||
12984 | } |
||
12985 | |||
12986 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
12987 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
12988 | << AL << St->getBeginLoc(); |
||
12989 | return false; |
||
12990 | } |
||
12991 | |||
12992 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
12993 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
12994 | } |
||
12995 | |||
12996 | bool isParamExpr(size_t N) const override { |
||
12997 | return false; |
||
12998 | } |
||
12999 | |||
13000 | static const ParsedAttrInfoReqdWorkGroupSize Instance; |
||
13001 | }; |
||
13002 | const ParsedAttrInfoReqdWorkGroupSize ParsedAttrInfoReqdWorkGroupSize::Instance; |
||
13003 | static constexpr ParsedAttrInfo::Spelling RequiresCapabilitySpellings[] = { |
||
13004 | {AttributeCommonInfo::AS_GNU, "requires_capability"}, |
||
13005 | {AttributeCommonInfo::AS_CXX11, "clang::requires_capability"}, |
||
13006 | {AttributeCommonInfo::AS_GNU, "exclusive_locks_required"}, |
||
13007 | {AttributeCommonInfo::AS_CXX11, "clang::exclusive_locks_required"}, |
||
13008 | {AttributeCommonInfo::AS_GNU, "requires_shared_capability"}, |
||
13009 | {AttributeCommonInfo::AS_CXX11, "clang::requires_shared_capability"}, |
||
13010 | {AttributeCommonInfo::AS_GNU, "shared_locks_required"}, |
||
13011 | {AttributeCommonInfo::AS_CXX11, "clang::shared_locks_required"}, |
||
13012 | }; |
||
13013 | static constexpr const char *RequiresCapabilityArgNames[] = { |
||
13014 | "Args...",}; |
||
13015 | struct ParsedAttrInfoRequiresCapability final : public ParsedAttrInfo { |
||
13016 | constexpr ParsedAttrInfoRequiresCapability() : ParsedAttrInfo( |
||
13017 | /*AttrKind=*/ParsedAttr::AT_RequiresCapability, |
||
13018 | /*NumArgs=*/0, |
||
13019 | /*OptArgs=*/15, |
||
13020 | /*NumArgMembers=*/1, |
||
13021 | /*HasCustomParsing=*/0, |
||
13022 | /*AcceptsExprPack=*/0, |
||
13023 | /*IsTargetSpecific=*/0, |
||
13024 | /*IsType=*/0, |
||
13025 | /*IsStmt=*/0, |
||
13026 | /*IsKnownToGCC=*/0, |
||
13027 | /*IsSupportedByPragmaAttribute=*/0, |
||
13028 | /*Spellings=*/RequiresCapabilitySpellings, |
||
13029 | /*ArgNames=*/RequiresCapabilityArgNames) {} |
||
13030 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13031 | if (!isa<FunctionDecl>(D)) { |
||
13032 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13033 | << Attr << "functions"; |
||
13034 | return false; |
||
13035 | } |
||
13036 | return true; |
||
13037 | } |
||
13038 | |||
13039 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13040 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13041 | << AL << St->getBeginLoc(); |
||
13042 | return false; |
||
13043 | } |
||
13044 | |||
13045 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
13046 | enum Spelling { |
||
13047 | GNU_requires_capability = 0, |
||
13048 | CXX11_clang_requires_capability = 1, |
||
13049 | GNU_exclusive_locks_required = 2, |
||
13050 | CXX11_clang_exclusive_locks_required = 3, |
||
13051 | GNU_requires_shared_capability = 4, |
||
13052 | CXX11_clang_requires_shared_capability = 5, |
||
13053 | GNU_shared_locks_required = 6, |
||
13054 | CXX11_clang_shared_locks_required = 7, |
||
13055 | SpellingNotCalculated = 15 |
||
13056 | |||
13057 | }; |
||
13058 | |||
13059 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
13060 | switch (Idx) { |
||
13061 | default: llvm_unreachable("Unknown spelling list index"); |
||
13062 | case 0: return GNU_requires_capability; |
||
13063 | case 1: return CXX11_clang_requires_capability; |
||
13064 | case 2: return GNU_exclusive_locks_required; |
||
13065 | case 3: return CXX11_clang_exclusive_locks_required; |
||
13066 | case 4: return GNU_requires_shared_capability; |
||
13067 | case 5: return CXX11_clang_requires_shared_capability; |
||
13068 | case 6: return GNU_shared_locks_required; |
||
13069 | case 7: return CXX11_clang_shared_locks_required; |
||
13070 | } |
||
13071 | } |
||
13072 | |||
13073 | bool isParamExpr(size_t N) const override { |
||
13074 | return (N == 0) || false; |
||
13075 | } |
||
13076 | |||
13077 | static const ParsedAttrInfoRequiresCapability Instance; |
||
13078 | }; |
||
13079 | const ParsedAttrInfoRequiresCapability ParsedAttrInfoRequiresCapability::Instance; |
||
13080 | static constexpr ParsedAttrInfo::Spelling RestrictSpellings[] = { |
||
13081 | {AttributeCommonInfo::AS_Declspec, "restrict"}, |
||
13082 | {AttributeCommonInfo::AS_GNU, "malloc"}, |
||
13083 | {AttributeCommonInfo::AS_CXX11, "gnu::malloc"}, |
||
13084 | {AttributeCommonInfo::AS_C2x, "gnu::malloc"}, |
||
13085 | }; |
||
13086 | struct ParsedAttrInfoRestrict final : public ParsedAttrInfo { |
||
13087 | constexpr ParsedAttrInfoRestrict() : ParsedAttrInfo( |
||
13088 | /*AttrKind=*/ParsedAttr::AT_Restrict, |
||
13089 | /*NumArgs=*/0, |
||
13090 | /*OptArgs=*/0, |
||
13091 | /*NumArgMembers=*/0, |
||
13092 | /*HasCustomParsing=*/0, |
||
13093 | /*AcceptsExprPack=*/0, |
||
13094 | /*IsTargetSpecific=*/0, |
||
13095 | /*IsType=*/0, |
||
13096 | /*IsStmt=*/0, |
||
13097 | /*IsKnownToGCC=*/1, |
||
13098 | /*IsSupportedByPragmaAttribute=*/1, |
||
13099 | /*Spellings=*/RestrictSpellings, |
||
13100 | /*ArgNames=*/{}) {} |
||
13101 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13102 | if (!isa<FunctionDecl>(D)) { |
||
13103 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13104 | << Attr << "functions"; |
||
13105 | return false; |
||
13106 | } |
||
13107 | return true; |
||
13108 | } |
||
13109 | |||
13110 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13111 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13112 | << AL << St->getBeginLoc(); |
||
13113 | return false; |
||
13114 | } |
||
13115 | |||
13116 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
13117 | enum Spelling { |
||
13118 | Declspec_restrict = 0, |
||
13119 | GNU_malloc = 1, |
||
13120 | CXX11_gnu_malloc = 2, |
||
13121 | C2x_gnu_malloc = 3, |
||
13122 | SpellingNotCalculated = 15 |
||
13123 | |||
13124 | }; |
||
13125 | |||
13126 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
13127 | switch (Idx) { |
||
13128 | default: llvm_unreachable("Unknown spelling list index"); |
||
13129 | case 0: return Declspec_restrict; |
||
13130 | case 1: return GNU_malloc; |
||
13131 | case 2: return CXX11_gnu_malloc; |
||
13132 | case 3: return C2x_gnu_malloc; |
||
13133 | } |
||
13134 | } |
||
13135 | |||
13136 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13137 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
13138 | } |
||
13139 | |||
13140 | bool isParamExpr(size_t N) const override { |
||
13141 | return false; |
||
13142 | } |
||
13143 | |||
13144 | static const ParsedAttrInfoRestrict Instance; |
||
13145 | }; |
||
13146 | const ParsedAttrInfoRestrict ParsedAttrInfoRestrict::Instance; |
||
13147 | static constexpr ParsedAttrInfo::Spelling RetainSpellings[] = { |
||
13148 | {AttributeCommonInfo::AS_GNU, "retain"}, |
||
13149 | {AttributeCommonInfo::AS_CXX11, "gnu::retain"}, |
||
13150 | {AttributeCommonInfo::AS_C2x, "gnu::retain"}, |
||
13151 | }; |
||
13152 | struct ParsedAttrInfoRetain final : public ParsedAttrInfo { |
||
13153 | constexpr ParsedAttrInfoRetain() : ParsedAttrInfo( |
||
13154 | /*AttrKind=*/ParsedAttr::AT_Retain, |
||
13155 | /*NumArgs=*/0, |
||
13156 | /*OptArgs=*/0, |
||
13157 | /*NumArgMembers=*/0, |
||
13158 | /*HasCustomParsing=*/0, |
||
13159 | /*AcceptsExprPack=*/0, |
||
13160 | /*IsTargetSpecific=*/0, |
||
13161 | /*IsType=*/0, |
||
13162 | /*IsStmt=*/0, |
||
13163 | /*IsKnownToGCC=*/1, |
||
13164 | /*IsSupportedByPragmaAttribute=*/0, |
||
13165 | /*Spellings=*/RetainSpellings, |
||
13166 | /*ArgNames=*/{}) {} |
||
13167 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13168 | if (!isNonLocalVar(D) && !isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
13169 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13170 | << Attr << "variables with non-local storage, functions, and Objective-C methods"; |
||
13171 | return false; |
||
13172 | } |
||
13173 | return true; |
||
13174 | } |
||
13175 | |||
13176 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13177 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13178 | << AL << St->getBeginLoc(); |
||
13179 | return false; |
||
13180 | } |
||
13181 | |||
13182 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13183 | D->addAttr(::new (S.Context) RetainAttr(S.Context, Attr)); |
||
13184 | return AttributeApplied; |
||
13185 | } |
||
13186 | |||
13187 | bool isParamExpr(size_t N) const override { |
||
13188 | return false; |
||
13189 | } |
||
13190 | |||
13191 | static const ParsedAttrInfoRetain Instance; |
||
13192 | }; |
||
13193 | const ParsedAttrInfoRetain ParsedAttrInfoRetain::Instance; |
||
13194 | static constexpr ParsedAttrInfo::Spelling ReturnTypestateSpellings[] = { |
||
13195 | {AttributeCommonInfo::AS_GNU, "return_typestate"}, |
||
13196 | {AttributeCommonInfo::AS_CXX11, "clang::return_typestate"}, |
||
13197 | }; |
||
13198 | static constexpr const char *ReturnTypestateArgNames[] = { |
||
13199 | "State",}; |
||
13200 | struct ParsedAttrInfoReturnTypestate final : public ParsedAttrInfo { |
||
13201 | constexpr ParsedAttrInfoReturnTypestate() : ParsedAttrInfo( |
||
13202 | /*AttrKind=*/ParsedAttr::AT_ReturnTypestate, |
||
13203 | /*NumArgs=*/1, |
||
13204 | /*OptArgs=*/0, |
||
13205 | /*NumArgMembers=*/1, |
||
13206 | /*HasCustomParsing=*/0, |
||
13207 | /*AcceptsExprPack=*/0, |
||
13208 | /*IsTargetSpecific=*/0, |
||
13209 | /*IsType=*/0, |
||
13210 | /*IsStmt=*/0, |
||
13211 | /*IsKnownToGCC=*/0, |
||
13212 | /*IsSupportedByPragmaAttribute=*/1, |
||
13213 | /*Spellings=*/ReturnTypestateSpellings, |
||
13214 | /*ArgNames=*/ReturnTypestateArgNames) {} |
||
13215 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13216 | if (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D)) { |
||
13217 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13218 | << Attr << "functions and parameters"; |
||
13219 | return false; |
||
13220 | } |
||
13221 | return true; |
||
13222 | } |
||
13223 | |||
13224 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13225 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13226 | << AL << St->getBeginLoc(); |
||
13227 | return false; |
||
13228 | } |
||
13229 | |||
13230 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13231 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
13232 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
13233 | } |
||
13234 | |||
13235 | bool isParamExpr(size_t N) const override { |
||
13236 | return false; |
||
13237 | } |
||
13238 | |||
13239 | static const ParsedAttrInfoReturnTypestate Instance; |
||
13240 | }; |
||
13241 | const ParsedAttrInfoReturnTypestate ParsedAttrInfoReturnTypestate::Instance; |
||
13242 | static constexpr ParsedAttrInfo::Spelling ReturnsNonNullSpellings[] = { |
||
13243 | {AttributeCommonInfo::AS_GNU, "returns_nonnull"}, |
||
13244 | {AttributeCommonInfo::AS_CXX11, "gnu::returns_nonnull"}, |
||
13245 | {AttributeCommonInfo::AS_C2x, "gnu::returns_nonnull"}, |
||
13246 | }; |
||
13247 | struct ParsedAttrInfoReturnsNonNull final : public ParsedAttrInfo { |
||
13248 | constexpr ParsedAttrInfoReturnsNonNull() : ParsedAttrInfo( |
||
13249 | /*AttrKind=*/ParsedAttr::AT_ReturnsNonNull, |
||
13250 | /*NumArgs=*/0, |
||
13251 | /*OptArgs=*/0, |
||
13252 | /*NumArgMembers=*/0, |
||
13253 | /*HasCustomParsing=*/0, |
||
13254 | /*AcceptsExprPack=*/0, |
||
13255 | /*IsTargetSpecific=*/0, |
||
13256 | /*IsType=*/0, |
||
13257 | /*IsStmt=*/0, |
||
13258 | /*IsKnownToGCC=*/1, |
||
13259 | /*IsSupportedByPragmaAttribute=*/1, |
||
13260 | /*Spellings=*/ReturnsNonNullSpellings, |
||
13261 | /*ArgNames=*/{}) {} |
||
13262 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13263 | if (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) { |
||
13264 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13265 | << Attr << "Objective-C methods and functions"; |
||
13266 | return false; |
||
13267 | } |
||
13268 | return true; |
||
13269 | } |
||
13270 | |||
13271 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13272 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13273 | << AL << St->getBeginLoc(); |
||
13274 | return false; |
||
13275 | } |
||
13276 | |||
13277 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13278 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
13279 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
13280 | } |
||
13281 | |||
13282 | bool isParamExpr(size_t N) const override { |
||
13283 | return false; |
||
13284 | } |
||
13285 | |||
13286 | static const ParsedAttrInfoReturnsNonNull Instance; |
||
13287 | }; |
||
13288 | const ParsedAttrInfoReturnsNonNull ParsedAttrInfoReturnsNonNull::Instance; |
||
13289 | static constexpr ParsedAttrInfo::Spelling ReturnsTwiceSpellings[] = { |
||
13290 | {AttributeCommonInfo::AS_GNU, "returns_twice"}, |
||
13291 | {AttributeCommonInfo::AS_CXX11, "gnu::returns_twice"}, |
||
13292 | {AttributeCommonInfo::AS_C2x, "gnu::returns_twice"}, |
||
13293 | }; |
||
13294 | struct ParsedAttrInfoReturnsTwice final : public ParsedAttrInfo { |
||
13295 | constexpr ParsedAttrInfoReturnsTwice() : ParsedAttrInfo( |
||
13296 | /*AttrKind=*/ParsedAttr::AT_ReturnsTwice, |
||
13297 | /*NumArgs=*/0, |
||
13298 | /*OptArgs=*/0, |
||
13299 | /*NumArgMembers=*/0, |
||
13300 | /*HasCustomParsing=*/0, |
||
13301 | /*AcceptsExprPack=*/0, |
||
13302 | /*IsTargetSpecific=*/0, |
||
13303 | /*IsType=*/0, |
||
13304 | /*IsStmt=*/0, |
||
13305 | /*IsKnownToGCC=*/1, |
||
13306 | /*IsSupportedByPragmaAttribute=*/1, |
||
13307 | /*Spellings=*/ReturnsTwiceSpellings, |
||
13308 | /*ArgNames=*/{}) {} |
||
13309 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13310 | if (!isa<FunctionDecl>(D)) { |
||
13311 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13312 | << Attr << "functions"; |
||
13313 | return false; |
||
13314 | } |
||
13315 | return true; |
||
13316 | } |
||
13317 | |||
13318 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13319 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13320 | << AL << St->getBeginLoc(); |
||
13321 | return false; |
||
13322 | } |
||
13323 | |||
13324 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13325 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
13326 | } |
||
13327 | |||
13328 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13329 | D->addAttr(::new (S.Context) ReturnsTwiceAttr(S.Context, Attr)); |
||
13330 | return AttributeApplied; |
||
13331 | } |
||
13332 | |||
13333 | bool isParamExpr(size_t N) const override { |
||
13334 | return false; |
||
13335 | } |
||
13336 | |||
13337 | static const ParsedAttrInfoReturnsTwice Instance; |
||
13338 | }; |
||
13339 | const ParsedAttrInfoReturnsTwice ParsedAttrInfoReturnsTwice::Instance; |
||
13340 | static constexpr ParsedAttrInfo::Spelling SPtrSpellings[] = { |
||
13341 | {AttributeCommonInfo::AS_Keyword, "__sptr"}, |
||
13342 | }; |
||
13343 | struct ParsedAttrInfoSPtr final : public ParsedAttrInfo { |
||
13344 | constexpr ParsedAttrInfoSPtr() : ParsedAttrInfo( |
||
13345 | /*AttrKind=*/ParsedAttr::AT_SPtr, |
||
13346 | /*NumArgs=*/0, |
||
13347 | /*OptArgs=*/0, |
||
13348 | /*NumArgMembers=*/0, |
||
13349 | /*HasCustomParsing=*/0, |
||
13350 | /*AcceptsExprPack=*/0, |
||
13351 | /*IsTargetSpecific=*/0, |
||
13352 | /*IsType=*/1, |
||
13353 | /*IsStmt=*/0, |
||
13354 | /*IsKnownToGCC=*/0, |
||
13355 | /*IsSupportedByPragmaAttribute=*/0, |
||
13356 | /*Spellings=*/SPtrSpellings, |
||
13357 | /*ArgNames=*/{}) {} |
||
13358 | bool isParamExpr(size_t N) const override { |
||
13359 | return false; |
||
13360 | } |
||
13361 | |||
13362 | static const ParsedAttrInfoSPtr Instance; |
||
13363 | }; |
||
13364 | const ParsedAttrInfoSPtr ParsedAttrInfoSPtr::Instance; |
||
13365 | static constexpr ParsedAttrInfo::Spelling SYCLKernelSpellings[] = { |
||
13366 | {AttributeCommonInfo::AS_GNU, "sycl_kernel"}, |
||
13367 | {AttributeCommonInfo::AS_CXX11, "clang::sycl_kernel"}, |
||
13368 | {AttributeCommonInfo::AS_C2x, "clang::sycl_kernel"}, |
||
13369 | }; |
||
13370 | struct ParsedAttrInfoSYCLKernel final : public ParsedAttrInfo { |
||
13371 | constexpr ParsedAttrInfoSYCLKernel() : ParsedAttrInfo( |
||
13372 | /*AttrKind=*/ParsedAttr::AT_SYCLKernel, |
||
13373 | /*NumArgs=*/0, |
||
13374 | /*OptArgs=*/0, |
||
13375 | /*NumArgMembers=*/0, |
||
13376 | /*HasCustomParsing=*/0, |
||
13377 | /*AcceptsExprPack=*/0, |
||
13378 | /*IsTargetSpecific=*/0, |
||
13379 | /*IsType=*/0, |
||
13380 | /*IsStmt=*/0, |
||
13381 | /*IsKnownToGCC=*/0, |
||
13382 | /*IsSupportedByPragmaAttribute=*/0, |
||
13383 | /*Spellings=*/SYCLKernelSpellings, |
||
13384 | /*ArgNames=*/{}) {} |
||
13385 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13386 | if (!isFunctionTmpl(D)) { |
||
13387 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13388 | << Attr << "function templates"; |
||
13389 | return false; |
||
13390 | } |
||
13391 | return true; |
||
13392 | } |
||
13393 | |||
13394 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13395 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13396 | << AL << St->getBeginLoc(); |
||
13397 | return false; |
||
13398 | } |
||
13399 | |||
13400 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
13401 | return LangOpts.SYCLIsDevice; |
||
13402 | } |
||
13403 | |||
13404 | bool isParamExpr(size_t N) const override { |
||
13405 | return false; |
||
13406 | } |
||
13407 | |||
13408 | static const ParsedAttrInfoSYCLKernel Instance; |
||
13409 | }; |
||
13410 | const ParsedAttrInfoSYCLKernel ParsedAttrInfoSYCLKernel::Instance; |
||
13411 | static constexpr ParsedAttrInfo::Spelling SYCLSpecialClassSpellings[] = { |
||
13412 | {AttributeCommonInfo::AS_GNU, "sycl_special_class"}, |
||
13413 | {AttributeCommonInfo::AS_CXX11, "clang::sycl_special_class"}, |
||
13414 | {AttributeCommonInfo::AS_C2x, "clang::sycl_special_class"}, |
||
13415 | }; |
||
13416 | struct ParsedAttrInfoSYCLSpecialClass final : public ParsedAttrInfo { |
||
13417 | constexpr ParsedAttrInfoSYCLSpecialClass() : ParsedAttrInfo( |
||
13418 | /*AttrKind=*/ParsedAttr::AT_SYCLSpecialClass, |
||
13419 | /*NumArgs=*/0, |
||
13420 | /*OptArgs=*/0, |
||
13421 | /*NumArgMembers=*/0, |
||
13422 | /*HasCustomParsing=*/0, |
||
13423 | /*AcceptsExprPack=*/0, |
||
13424 | /*IsTargetSpecific=*/0, |
||
13425 | /*IsType=*/0, |
||
13426 | /*IsStmt=*/0, |
||
13427 | /*IsKnownToGCC=*/0, |
||
13428 | /*IsSupportedByPragmaAttribute=*/1, |
||
13429 | /*Spellings=*/SYCLSpecialClassSpellings, |
||
13430 | /*ArgNames=*/{}) {} |
||
13431 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13432 | if (!isa<CXXRecordDecl>(D)) { |
||
13433 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13434 | << Attr << "classes"; |
||
13435 | return false; |
||
13436 | } |
||
13437 | return true; |
||
13438 | } |
||
13439 | |||
13440 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13441 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13442 | << AL << St->getBeginLoc(); |
||
13443 | return false; |
||
13444 | } |
||
13445 | |||
13446 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
13447 | return LangOpts.SYCLIsDevice; |
||
13448 | } |
||
13449 | |||
13450 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13451 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
13452 | } |
||
13453 | |||
13454 | bool isParamExpr(size_t N) const override { |
||
13455 | return false; |
||
13456 | } |
||
13457 | |||
13458 | static const ParsedAttrInfoSYCLSpecialClass Instance; |
||
13459 | }; |
||
13460 | const ParsedAttrInfoSYCLSpecialClass ParsedAttrInfoSYCLSpecialClass::Instance; |
||
13461 | static constexpr ParsedAttrInfo::Spelling ScopedLockableSpellings[] = { |
||
13462 | {AttributeCommonInfo::AS_GNU, "scoped_lockable"}, |
||
13463 | {AttributeCommonInfo::AS_CXX11, "clang::scoped_lockable"}, |
||
13464 | }; |
||
13465 | struct ParsedAttrInfoScopedLockable final : public ParsedAttrInfo { |
||
13466 | constexpr ParsedAttrInfoScopedLockable() : ParsedAttrInfo( |
||
13467 | /*AttrKind=*/ParsedAttr::AT_ScopedLockable, |
||
13468 | /*NumArgs=*/0, |
||
13469 | /*OptArgs=*/0, |
||
13470 | /*NumArgMembers=*/0, |
||
13471 | /*HasCustomParsing=*/0, |
||
13472 | /*AcceptsExprPack=*/0, |
||
13473 | /*IsTargetSpecific=*/0, |
||
13474 | /*IsType=*/0, |
||
13475 | /*IsStmt=*/0, |
||
13476 | /*IsKnownToGCC=*/0, |
||
13477 | /*IsSupportedByPragmaAttribute=*/1, |
||
13478 | /*Spellings=*/ScopedLockableSpellings, |
||
13479 | /*ArgNames=*/{}) {} |
||
13480 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13481 | if (!isa<RecordDecl>(D)) { |
||
13482 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13483 | << Attr << "structs, unions, and classes"; |
||
13484 | return false; |
||
13485 | } |
||
13486 | return true; |
||
13487 | } |
||
13488 | |||
13489 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13490 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13491 | << AL << St->getBeginLoc(); |
||
13492 | return false; |
||
13493 | } |
||
13494 | |||
13495 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13496 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
13497 | } |
||
13498 | |||
13499 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13500 | D->addAttr(::new (S.Context) ScopedLockableAttr(S.Context, Attr)); |
||
13501 | return AttributeApplied; |
||
13502 | } |
||
13503 | |||
13504 | bool isParamExpr(size_t N) const override { |
||
13505 | return false; |
||
13506 | } |
||
13507 | |||
13508 | static const ParsedAttrInfoScopedLockable Instance; |
||
13509 | }; |
||
13510 | const ParsedAttrInfoScopedLockable ParsedAttrInfoScopedLockable::Instance; |
||
13511 | static constexpr ParsedAttrInfo::Spelling SectionSpellings[] = { |
||
13512 | {AttributeCommonInfo::AS_GNU, "section"}, |
||
13513 | {AttributeCommonInfo::AS_CXX11, "gnu::section"}, |
||
13514 | {AttributeCommonInfo::AS_C2x, "gnu::section"}, |
||
13515 | {AttributeCommonInfo::AS_Declspec, "allocate"}, |
||
13516 | }; |
||
13517 | static constexpr const char *SectionArgNames[] = { |
||
13518 | "Name",}; |
||
13519 | struct ParsedAttrInfoSection final : public ParsedAttrInfo { |
||
13520 | constexpr ParsedAttrInfoSection() : ParsedAttrInfo( |
||
13521 | /*AttrKind=*/ParsedAttr::AT_Section, |
||
13522 | /*NumArgs=*/1, |
||
13523 | /*OptArgs=*/0, |
||
13524 | /*NumArgMembers=*/1, |
||
13525 | /*HasCustomParsing=*/0, |
||
13526 | /*AcceptsExprPack=*/0, |
||
13527 | /*IsTargetSpecific=*/0, |
||
13528 | /*IsType=*/0, |
||
13529 | /*IsStmt=*/0, |
||
13530 | /*IsKnownToGCC=*/1, |
||
13531 | /*IsSupportedByPragmaAttribute=*/1, |
||
13532 | /*Spellings=*/SectionSpellings, |
||
13533 | /*ArgNames=*/SectionArgNames) {} |
||
13534 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13535 | if (!isa<FunctionDecl>(D) && !isGlobalVar(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D)) { |
||
13536 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
13537 | << Attr << "functions, global variables, Objective-C methods, and Objective-C properties"; |
||
13538 | return false; |
||
13539 | } |
||
13540 | return true; |
||
13541 | } |
||
13542 | |||
13543 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13544 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13545 | << AL << St->getBeginLoc(); |
||
13546 | return false; |
||
13547 | } |
||
13548 | |||
13549 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
13550 | enum Spelling { |
||
13551 | GNU_section = 0, |
||
13552 | CXX11_gnu_section = 1, |
||
13553 | C2x_gnu_section = 2, |
||
13554 | Declspec_allocate = 3, |
||
13555 | SpellingNotCalculated = 15 |
||
13556 | |||
13557 | }; |
||
13558 | |||
13559 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
13560 | switch (Idx) { |
||
13561 | default: llvm_unreachable("Unknown spelling list index"); |
||
13562 | case 0: return GNU_section; |
||
13563 | case 1: return CXX11_gnu_section; |
||
13564 | case 2: return C2x_gnu_section; |
||
13565 | case 3: return Declspec_allocate; |
||
13566 | } |
||
13567 | } |
||
13568 | |||
13569 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13570 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
13571 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true)); |
||
13572 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
13573 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC)); |
||
13574 | } |
||
13575 | |||
13576 | bool isParamExpr(size_t N) const override { |
||
13577 | return false; |
||
13578 | } |
||
13579 | |||
13580 | static const ParsedAttrInfoSection Instance; |
||
13581 | }; |
||
13582 | const ParsedAttrInfoSection ParsedAttrInfoSection::Instance; |
||
13583 | static constexpr ParsedAttrInfo::Spelling SelectAnySpellings[] = { |
||
13584 | {AttributeCommonInfo::AS_Declspec, "selectany"}, |
||
13585 | {AttributeCommonInfo::AS_GNU, "selectany"}, |
||
13586 | {AttributeCommonInfo::AS_CXX11, "gnu::selectany"}, |
||
13587 | {AttributeCommonInfo::AS_C2x, "gnu::selectany"}, |
||
13588 | }; |
||
13589 | struct ParsedAttrInfoSelectAny final : public ParsedAttrInfo { |
||
13590 | constexpr ParsedAttrInfoSelectAny() : ParsedAttrInfo( |
||
13591 | /*AttrKind=*/ParsedAttr::AT_SelectAny, |
||
13592 | /*NumArgs=*/0, |
||
13593 | /*OptArgs=*/0, |
||
13594 | /*NumArgMembers=*/0, |
||
13595 | /*HasCustomParsing=*/0, |
||
13596 | /*AcceptsExprPack=*/0, |
||
13597 | /*IsTargetSpecific=*/0, |
||
13598 | /*IsType=*/0, |
||
13599 | /*IsStmt=*/0, |
||
13600 | /*IsKnownToGCC=*/1, |
||
13601 | /*IsSupportedByPragmaAttribute=*/0, |
||
13602 | /*Spellings=*/SelectAnySpellings, |
||
13603 | /*ArgNames=*/{}) {} |
||
13604 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13605 | D->addAttr(::new (S.Context) SelectAnyAttr(S.Context, Attr)); |
||
13606 | return AttributeApplied; |
||
13607 | } |
||
13608 | |||
13609 | bool isParamExpr(size_t N) const override { |
||
13610 | return false; |
||
13611 | } |
||
13612 | |||
13613 | static const ParsedAttrInfoSelectAny Instance; |
||
13614 | }; |
||
13615 | const ParsedAttrInfoSelectAny ParsedAttrInfoSelectAny::Instance; |
||
13616 | static constexpr ParsedAttrInfo::Spelling SentinelSpellings[] = { |
||
13617 | {AttributeCommonInfo::AS_GNU, "sentinel"}, |
||
13618 | {AttributeCommonInfo::AS_CXX11, "gnu::sentinel"}, |
||
13619 | {AttributeCommonInfo::AS_C2x, "gnu::sentinel"}, |
||
13620 | }; |
||
13621 | static constexpr const char *SentinelArgNames[] = { |
||
13622 | "Sentinel","NullPos",}; |
||
13623 | struct ParsedAttrInfoSentinel final : public ParsedAttrInfo { |
||
13624 | constexpr ParsedAttrInfoSentinel() : ParsedAttrInfo( |
||
13625 | /*AttrKind=*/ParsedAttr::AT_Sentinel, |
||
13626 | /*NumArgs=*/0, |
||
13627 | /*OptArgs=*/2, |
||
13628 | /*NumArgMembers=*/2, |
||
13629 | /*HasCustomParsing=*/0, |
||
13630 | /*AcceptsExprPack=*/0, |
||
13631 | /*IsTargetSpecific=*/0, |
||
13632 | /*IsType=*/0, |
||
13633 | /*IsStmt=*/0, |
||
13634 | /*IsKnownToGCC=*/1, |
||
13635 | /*IsSupportedByPragmaAttribute=*/0, |
||
13636 | /*Spellings=*/SentinelSpellings, |
||
13637 | /*ArgNames=*/SentinelArgNames) {} |
||
13638 | bool isParamExpr(size_t N) const override { |
||
13639 | return false; |
||
13640 | } |
||
13641 | |||
13642 | static const ParsedAttrInfoSentinel Instance; |
||
13643 | }; |
||
13644 | const ParsedAttrInfoSentinel ParsedAttrInfoSentinel::Instance; |
||
13645 | static constexpr ParsedAttrInfo::Spelling SetTypestateSpellings[] = { |
||
13646 | {AttributeCommonInfo::AS_GNU, "set_typestate"}, |
||
13647 | {AttributeCommonInfo::AS_CXX11, "clang::set_typestate"}, |
||
13648 | }; |
||
13649 | static constexpr const char *SetTypestateArgNames[] = { |
||
13650 | "NewState",}; |
||
13651 | struct ParsedAttrInfoSetTypestate final : public ParsedAttrInfo { |
||
13652 | constexpr ParsedAttrInfoSetTypestate() : ParsedAttrInfo( |
||
13653 | /*AttrKind=*/ParsedAttr::AT_SetTypestate, |
||
13654 | /*NumArgs=*/1, |
||
13655 | /*OptArgs=*/0, |
||
13656 | /*NumArgMembers=*/1, |
||
13657 | /*HasCustomParsing=*/0, |
||
13658 | /*AcceptsExprPack=*/0, |
||
13659 | /*IsTargetSpecific=*/0, |
||
13660 | /*IsType=*/0, |
||
13661 | /*IsStmt=*/0, |
||
13662 | /*IsKnownToGCC=*/0, |
||
13663 | /*IsSupportedByPragmaAttribute=*/1, |
||
13664 | /*Spellings=*/SetTypestateSpellings, |
||
13665 | /*ArgNames=*/SetTypestateArgNames) {} |
||
13666 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13667 | if (!isa<CXXMethodDecl>(D)) { |
||
13668 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13669 | << Attr << "functions"; |
||
13670 | return false; |
||
13671 | } |
||
13672 | return true; |
||
13673 | } |
||
13674 | |||
13675 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13676 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13677 | << AL << St->getBeginLoc(); |
||
13678 | return false; |
||
13679 | } |
||
13680 | |||
13681 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13682 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus)); |
||
13683 | } |
||
13684 | |||
13685 | bool isParamExpr(size_t N) const override { |
||
13686 | return false; |
||
13687 | } |
||
13688 | |||
13689 | static const ParsedAttrInfoSetTypestate Instance; |
||
13690 | }; |
||
13691 | const ParsedAttrInfoSetTypestate ParsedAttrInfoSetTypestate::Instance; |
||
13692 | static constexpr ParsedAttrInfo::Spelling SharedTrylockFunctionSpellings[] = { |
||
13693 | {AttributeCommonInfo::AS_GNU, "shared_trylock_function"}, |
||
13694 | }; |
||
13695 | static constexpr const char *SharedTrylockFunctionArgNames[] = { |
||
13696 | "SuccessValue","Args...",}; |
||
13697 | struct ParsedAttrInfoSharedTrylockFunction final : public ParsedAttrInfo { |
||
13698 | constexpr ParsedAttrInfoSharedTrylockFunction() : ParsedAttrInfo( |
||
13699 | /*AttrKind=*/ParsedAttr::AT_SharedTrylockFunction, |
||
13700 | /*NumArgs=*/1, |
||
13701 | /*OptArgs=*/15, |
||
13702 | /*NumArgMembers=*/2, |
||
13703 | /*HasCustomParsing=*/0, |
||
13704 | /*AcceptsExprPack=*/0, |
||
13705 | /*IsTargetSpecific=*/0, |
||
13706 | /*IsType=*/0, |
||
13707 | /*IsStmt=*/0, |
||
13708 | /*IsKnownToGCC=*/0, |
||
13709 | /*IsSupportedByPragmaAttribute=*/0, |
||
13710 | /*Spellings=*/SharedTrylockFunctionSpellings, |
||
13711 | /*ArgNames=*/SharedTrylockFunctionArgNames) {} |
||
13712 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13713 | if (!isa<FunctionDecl>(D)) { |
||
13714 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13715 | << Attr << "functions"; |
||
13716 | return false; |
||
13717 | } |
||
13718 | return true; |
||
13719 | } |
||
13720 | |||
13721 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13722 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13723 | << AL << St->getBeginLoc(); |
||
13724 | return false; |
||
13725 | } |
||
13726 | |||
13727 | bool isParamExpr(size_t N) const override { |
||
13728 | return (N == 0) || (N == 1) || false; |
||
13729 | } |
||
13730 | |||
13731 | static const ParsedAttrInfoSharedTrylockFunction Instance; |
||
13732 | }; |
||
13733 | const ParsedAttrInfoSharedTrylockFunction ParsedAttrInfoSharedTrylockFunction::Instance; |
||
13734 | static constexpr ParsedAttrInfo::Spelling SpeculativeLoadHardeningSpellings[] = { |
||
13735 | {AttributeCommonInfo::AS_GNU, "speculative_load_hardening"}, |
||
13736 | {AttributeCommonInfo::AS_CXX11, "clang::speculative_load_hardening"}, |
||
13737 | {AttributeCommonInfo::AS_C2x, "clang::speculative_load_hardening"}, |
||
13738 | }; |
||
13739 | struct ParsedAttrInfoSpeculativeLoadHardening final : public ParsedAttrInfo { |
||
13740 | constexpr ParsedAttrInfoSpeculativeLoadHardening() : ParsedAttrInfo( |
||
13741 | /*AttrKind=*/ParsedAttr::AT_SpeculativeLoadHardening, |
||
13742 | /*NumArgs=*/0, |
||
13743 | /*OptArgs=*/0, |
||
13744 | /*NumArgMembers=*/0, |
||
13745 | /*HasCustomParsing=*/0, |
||
13746 | /*AcceptsExprPack=*/0, |
||
13747 | /*IsTargetSpecific=*/0, |
||
13748 | /*IsType=*/0, |
||
13749 | /*IsStmt=*/0, |
||
13750 | /*IsKnownToGCC=*/0, |
||
13751 | /*IsSupportedByPragmaAttribute=*/1, |
||
13752 | /*Spellings=*/SpeculativeLoadHardeningSpellings, |
||
13753 | /*ArgNames=*/{}) {} |
||
13754 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13755 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
13756 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
13757 | << Attr << "functions and Objective-C methods"; |
||
13758 | return false; |
||
13759 | } |
||
13760 | return true; |
||
13761 | } |
||
13762 | |||
13763 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13764 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13765 | << AL << St->getBeginLoc(); |
||
13766 | return false; |
||
13767 | } |
||
13768 | |||
13769 | using ParsedAttrInfo::diagMutualExclusion; |
||
13770 | |||
13771 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
13772 | if (const auto *A = D->getAttr<NoSpeculativeLoadHardeningAttr>()) { |
||
13773 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
13774 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
13775 | return false; |
||
13776 | } |
||
13777 | return true; |
||
13778 | } |
||
13779 | |||
13780 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13781 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
13782 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
13783 | } |
||
13784 | |||
13785 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13786 | D->addAttr(::new (S.Context) SpeculativeLoadHardeningAttr(S.Context, Attr)); |
||
13787 | return AttributeApplied; |
||
13788 | } |
||
13789 | |||
13790 | bool isParamExpr(size_t N) const override { |
||
13791 | return false; |
||
13792 | } |
||
13793 | |||
13794 | static const ParsedAttrInfoSpeculativeLoadHardening Instance; |
||
13795 | }; |
||
13796 | const ParsedAttrInfoSpeculativeLoadHardening ParsedAttrInfoSpeculativeLoadHardening::Instance; |
||
13797 | static constexpr ParsedAttrInfo::Spelling StandaloneDebugSpellings[] = { |
||
13798 | {AttributeCommonInfo::AS_GNU, "standalone_debug"}, |
||
13799 | {AttributeCommonInfo::AS_CXX11, "clang::standalone_debug"}, |
||
13800 | }; |
||
13801 | struct ParsedAttrInfoStandaloneDebug final : public ParsedAttrInfo { |
||
13802 | constexpr ParsedAttrInfoStandaloneDebug() : ParsedAttrInfo( |
||
13803 | /*AttrKind=*/ParsedAttr::AT_StandaloneDebug, |
||
13804 | /*NumArgs=*/0, |
||
13805 | /*OptArgs=*/0, |
||
13806 | /*NumArgMembers=*/0, |
||
13807 | /*HasCustomParsing=*/0, |
||
13808 | /*AcceptsExprPack=*/0, |
||
13809 | /*IsTargetSpecific=*/0, |
||
13810 | /*IsType=*/0, |
||
13811 | /*IsStmt=*/0, |
||
13812 | /*IsKnownToGCC=*/0, |
||
13813 | /*IsSupportedByPragmaAttribute=*/1, |
||
13814 | /*Spellings=*/StandaloneDebugSpellings, |
||
13815 | /*ArgNames=*/{}) {} |
||
13816 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13817 | if (!isa<CXXRecordDecl>(D)) { |
||
13818 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13819 | << Attr << "classes"; |
||
13820 | return false; |
||
13821 | } |
||
13822 | return true; |
||
13823 | } |
||
13824 | |||
13825 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13826 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13827 | << AL << St->getBeginLoc(); |
||
13828 | return false; |
||
13829 | } |
||
13830 | |||
13831 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
13832 | return LangOpts.CPlusPlus; |
||
13833 | } |
||
13834 | |||
13835 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
13836 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
13837 | } |
||
13838 | |||
13839 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13840 | D->addAttr(::new (S.Context) StandaloneDebugAttr(S.Context, Attr)); |
||
13841 | return AttributeApplied; |
||
13842 | } |
||
13843 | |||
13844 | bool isParamExpr(size_t N) const override { |
||
13845 | return false; |
||
13846 | } |
||
13847 | |||
13848 | static const ParsedAttrInfoStandaloneDebug Instance; |
||
13849 | }; |
||
13850 | const ParsedAttrInfoStandaloneDebug ParsedAttrInfoStandaloneDebug::Instance; |
||
13851 | static constexpr ParsedAttrInfo::Spelling StdCallSpellings[] = { |
||
13852 | {AttributeCommonInfo::AS_GNU, "stdcall"}, |
||
13853 | {AttributeCommonInfo::AS_CXX11, "gnu::stdcall"}, |
||
13854 | {AttributeCommonInfo::AS_C2x, "gnu::stdcall"}, |
||
13855 | {AttributeCommonInfo::AS_Keyword, "__stdcall"}, |
||
13856 | {AttributeCommonInfo::AS_Keyword, "_stdcall"}, |
||
13857 | }; |
||
13858 | struct ParsedAttrInfoStdCall final : public ParsedAttrInfo { |
||
13859 | constexpr ParsedAttrInfoStdCall() : ParsedAttrInfo( |
||
13860 | /*AttrKind=*/ParsedAttr::AT_StdCall, |
||
13861 | /*NumArgs=*/0, |
||
13862 | /*OptArgs=*/0, |
||
13863 | /*NumArgMembers=*/0, |
||
13864 | /*HasCustomParsing=*/0, |
||
13865 | /*AcceptsExprPack=*/0, |
||
13866 | /*IsTargetSpecific=*/0, |
||
13867 | /*IsType=*/1, |
||
13868 | /*IsStmt=*/0, |
||
13869 | /*IsKnownToGCC=*/1, |
||
13870 | /*IsSupportedByPragmaAttribute=*/0, |
||
13871 | /*Spellings=*/StdCallSpellings, |
||
13872 | /*ArgNames=*/{}) {} |
||
13873 | bool isParamExpr(size_t N) const override { |
||
13874 | return false; |
||
13875 | } |
||
13876 | |||
13877 | static const ParsedAttrInfoStdCall Instance; |
||
13878 | }; |
||
13879 | const ParsedAttrInfoStdCall ParsedAttrInfoStdCall::Instance; |
||
13880 | struct ParsedAttrInfoStrictFP final : public ParsedAttrInfo { |
||
13881 | constexpr ParsedAttrInfoStrictFP() : ParsedAttrInfo( |
||
13882 | /*AttrKind=*/ParsedAttr::AT_StrictFP, |
||
13883 | /*NumArgs=*/0, |
||
13884 | /*OptArgs=*/0, |
||
13885 | /*NumArgMembers=*/0, |
||
13886 | /*HasCustomParsing=*/0, |
||
13887 | /*AcceptsExprPack=*/0, |
||
13888 | /*IsTargetSpecific=*/0, |
||
13889 | /*IsType=*/0, |
||
13890 | /*IsStmt=*/0, |
||
13891 | /*IsKnownToGCC=*/0, |
||
13892 | /*IsSupportedByPragmaAttribute=*/0, |
||
13893 | /*Spellings=*/{}, |
||
13894 | /*ArgNames=*/{}) {} |
||
13895 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13896 | if (!isa<FunctionDecl>(D)) { |
||
13897 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13898 | << Attr << "functions"; |
||
13899 | return false; |
||
13900 | } |
||
13901 | return true; |
||
13902 | } |
||
13903 | |||
13904 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13905 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13906 | << AL << St->getBeginLoc(); |
||
13907 | return false; |
||
13908 | } |
||
13909 | |||
13910 | bool isParamExpr(size_t N) const override { |
||
13911 | return false; |
||
13912 | } |
||
13913 | |||
13914 | static const ParsedAttrInfoStrictFP Instance; |
||
13915 | }; |
||
13916 | const ParsedAttrInfoStrictFP ParsedAttrInfoStrictFP::Instance; |
||
13917 | static constexpr ParsedAttrInfo::Spelling StrictGuardStackCheckSpellings[] = { |
||
13918 | {AttributeCommonInfo::AS_Declspec, "strict_gs_check"}, |
||
13919 | }; |
||
13920 | struct ParsedAttrInfoStrictGuardStackCheck final : public ParsedAttrInfo { |
||
13921 | constexpr ParsedAttrInfoStrictGuardStackCheck() : ParsedAttrInfo( |
||
13922 | /*AttrKind=*/ParsedAttr::AT_StrictGuardStackCheck, |
||
13923 | /*NumArgs=*/0, |
||
13924 | /*OptArgs=*/0, |
||
13925 | /*NumArgMembers=*/0, |
||
13926 | /*HasCustomParsing=*/0, |
||
13927 | /*AcceptsExprPack=*/0, |
||
13928 | /*IsTargetSpecific=*/0, |
||
13929 | /*IsType=*/0, |
||
13930 | /*IsStmt=*/0, |
||
13931 | /*IsKnownToGCC=*/0, |
||
13932 | /*IsSupportedByPragmaAttribute=*/0, |
||
13933 | /*Spellings=*/StrictGuardStackCheckSpellings, |
||
13934 | /*ArgNames=*/{}) {} |
||
13935 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
13936 | if (!isa<FunctionDecl>(D)) { |
||
13937 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
13938 | << Attr << "functions"; |
||
13939 | return false; |
||
13940 | } |
||
13941 | return true; |
||
13942 | } |
||
13943 | |||
13944 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
13945 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
13946 | << AL << St->getBeginLoc(); |
||
13947 | return false; |
||
13948 | } |
||
13949 | |||
13950 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
13951 | D->addAttr(::new (S.Context) StrictGuardStackCheckAttr(S.Context, Attr)); |
||
13952 | return AttributeApplied; |
||
13953 | } |
||
13954 | |||
13955 | bool isParamExpr(size_t N) const override { |
||
13956 | return false; |
||
13957 | } |
||
13958 | |||
13959 | static const ParsedAttrInfoStrictGuardStackCheck Instance; |
||
13960 | }; |
||
13961 | const ParsedAttrInfoStrictGuardStackCheck ParsedAttrInfoStrictGuardStackCheck::Instance; |
||
13962 | static constexpr ParsedAttrInfo::Spelling SuppressSpellings[] = { |
||
13963 | {AttributeCommonInfo::AS_CXX11, "gsl::suppress"}, |
||
13964 | }; |
||
13965 | static constexpr const char *SuppressArgNames[] = { |
||
13966 | "DiagnosticIdentifiers...",}; |
||
13967 | struct ParsedAttrInfoSuppress final : public ParsedAttrInfo { |
||
13968 | constexpr ParsedAttrInfoSuppress() : ParsedAttrInfo( |
||
13969 | /*AttrKind=*/ParsedAttr::AT_Suppress, |
||
13970 | /*NumArgs=*/0, |
||
13971 | /*OptArgs=*/15, |
||
13972 | /*NumArgMembers=*/1, |
||
13973 | /*HasCustomParsing=*/0, |
||
13974 | /*AcceptsExprPack=*/0, |
||
13975 | /*IsTargetSpecific=*/0, |
||
13976 | /*IsType=*/0, |
||
13977 | /*IsStmt=*/1, |
||
13978 | /*IsKnownToGCC=*/0, |
||
13979 | /*IsSupportedByPragmaAttribute=*/0, |
||
13980 | /*Spellings=*/SuppressSpellings, |
||
13981 | /*ArgNames=*/SuppressArgNames) {} |
||
13982 | bool isParamExpr(size_t N) const override { |
||
13983 | return false; |
||
13984 | } |
||
13985 | |||
13986 | static const ParsedAttrInfoSuppress Instance; |
||
13987 | }; |
||
13988 | const ParsedAttrInfoSuppress ParsedAttrInfoSuppress::Instance; |
||
13989 | static constexpr ParsedAttrInfo::Spelling SwiftAsyncSpellings[] = { |
||
13990 | {AttributeCommonInfo::AS_GNU, "swift_async"}, |
||
13991 | {AttributeCommonInfo::AS_CXX11, "clang::swift_async"}, |
||
13992 | {AttributeCommonInfo::AS_C2x, "clang::swift_async"}, |
||
13993 | }; |
||
13994 | static constexpr const char *SwiftAsyncArgNames[] = { |
||
13995 | "Kind","CompletionHandlerIndex",}; |
||
13996 | struct ParsedAttrInfoSwiftAsync final : public ParsedAttrInfo { |
||
13997 | constexpr ParsedAttrInfoSwiftAsync() : ParsedAttrInfo( |
||
13998 | /*AttrKind=*/ParsedAttr::AT_SwiftAsync, |
||
13999 | /*NumArgs=*/1, |
||
14000 | /*OptArgs=*/1, |
||
14001 | /*NumArgMembers=*/2, |
||
14002 | /*HasCustomParsing=*/0, |
||
14003 | /*AcceptsExprPack=*/0, |
||
14004 | /*IsTargetSpecific=*/0, |
||
14005 | /*IsType=*/0, |
||
14006 | /*IsStmt=*/0, |
||
14007 | /*IsKnownToGCC=*/0, |
||
14008 | /*IsSupportedByPragmaAttribute=*/1, |
||
14009 | /*Spellings=*/SwiftAsyncSpellings, |
||
14010 | /*ArgNames=*/SwiftAsyncArgNames) {} |
||
14011 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14012 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
14013 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
14014 | << Attr << "functions and Objective-C methods"; |
||
14015 | return false; |
||
14016 | } |
||
14017 | return true; |
||
14018 | } |
||
14019 | |||
14020 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14021 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14022 | << AL << St->getBeginLoc(); |
||
14023 | return false; |
||
14024 | } |
||
14025 | |||
14026 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14027 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14028 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
14029 | } |
||
14030 | |||
14031 | bool isParamExpr(size_t N) const override { |
||
14032 | return false; |
||
14033 | } |
||
14034 | |||
14035 | static const ParsedAttrInfoSwiftAsync Instance; |
||
14036 | }; |
||
14037 | const ParsedAttrInfoSwiftAsync ParsedAttrInfoSwiftAsync::Instance; |
||
14038 | static constexpr ParsedAttrInfo::Spelling SwiftAsyncCallSpellings[] = { |
||
14039 | {AttributeCommonInfo::AS_GNU, "swiftasynccall"}, |
||
14040 | {AttributeCommonInfo::AS_CXX11, "clang::swiftasynccall"}, |
||
14041 | {AttributeCommonInfo::AS_C2x, "clang::swiftasynccall"}, |
||
14042 | }; |
||
14043 | struct ParsedAttrInfoSwiftAsyncCall final : public ParsedAttrInfo { |
||
14044 | constexpr ParsedAttrInfoSwiftAsyncCall() : ParsedAttrInfo( |
||
14045 | /*AttrKind=*/ParsedAttr::AT_SwiftAsyncCall, |
||
14046 | /*NumArgs=*/0, |
||
14047 | /*OptArgs=*/0, |
||
14048 | /*NumArgMembers=*/0, |
||
14049 | /*HasCustomParsing=*/0, |
||
14050 | /*AcceptsExprPack=*/0, |
||
14051 | /*IsTargetSpecific=*/0, |
||
14052 | /*IsType=*/1, |
||
14053 | /*IsStmt=*/0, |
||
14054 | /*IsKnownToGCC=*/0, |
||
14055 | /*IsSupportedByPragmaAttribute=*/0, |
||
14056 | /*Spellings=*/SwiftAsyncCallSpellings, |
||
14057 | /*ArgNames=*/{}) {} |
||
14058 | bool isParamExpr(size_t N) const override { |
||
14059 | return false; |
||
14060 | } |
||
14061 | |||
14062 | static const ParsedAttrInfoSwiftAsyncCall Instance; |
||
14063 | }; |
||
14064 | const ParsedAttrInfoSwiftAsyncCall ParsedAttrInfoSwiftAsyncCall::Instance; |
||
14065 | static constexpr ParsedAttrInfo::Spelling SwiftAsyncContextSpellings[] = { |
||
14066 | {AttributeCommonInfo::AS_GNU, "swift_async_context"}, |
||
14067 | {AttributeCommonInfo::AS_CXX11, "clang::swift_async_context"}, |
||
14068 | {AttributeCommonInfo::AS_C2x, "clang::swift_async_context"}, |
||
14069 | }; |
||
14070 | struct ParsedAttrInfoSwiftAsyncContext final : public ParsedAttrInfo { |
||
14071 | constexpr ParsedAttrInfoSwiftAsyncContext() : ParsedAttrInfo( |
||
14072 | /*AttrKind=*/ParsedAttr::AT_SwiftAsyncContext, |
||
14073 | /*NumArgs=*/0, |
||
14074 | /*OptArgs=*/0, |
||
14075 | /*NumArgMembers=*/0, |
||
14076 | /*HasCustomParsing=*/0, |
||
14077 | /*AcceptsExprPack=*/0, |
||
14078 | /*IsTargetSpecific=*/0, |
||
14079 | /*IsType=*/0, |
||
14080 | /*IsStmt=*/0, |
||
14081 | /*IsKnownToGCC=*/0, |
||
14082 | /*IsSupportedByPragmaAttribute=*/1, |
||
14083 | /*Spellings=*/SwiftAsyncContextSpellings, |
||
14084 | /*ArgNames=*/{}) {} |
||
14085 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14086 | if (!isa<ParmVarDecl>(D)) { |
||
14087 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
14088 | << Attr << "parameters"; |
||
14089 | return false; |
||
14090 | } |
||
14091 | return true; |
||
14092 | } |
||
14093 | |||
14094 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14095 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14096 | << AL << St->getBeginLoc(); |
||
14097 | return false; |
||
14098 | } |
||
14099 | |||
14100 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14101 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
14102 | } |
||
14103 | |||
14104 | bool isParamExpr(size_t N) const override { |
||
14105 | return false; |
||
14106 | } |
||
14107 | |||
14108 | static const ParsedAttrInfoSwiftAsyncContext Instance; |
||
14109 | }; |
||
14110 | const ParsedAttrInfoSwiftAsyncContext ParsedAttrInfoSwiftAsyncContext::Instance; |
||
14111 | static constexpr ParsedAttrInfo::Spelling SwiftAsyncErrorSpellings[] = { |
||
14112 | {AttributeCommonInfo::AS_GNU, "swift_async_error"}, |
||
14113 | {AttributeCommonInfo::AS_CXX11, "clang::swift_async_error"}, |
||
14114 | {AttributeCommonInfo::AS_C2x, "clang::swift_async_error"}, |
||
14115 | }; |
||
14116 | static constexpr const char *SwiftAsyncErrorArgNames[] = { |
||
14117 | "Convention","HandlerParamIdx",}; |
||
14118 | struct ParsedAttrInfoSwiftAsyncError final : public ParsedAttrInfo { |
||
14119 | constexpr ParsedAttrInfoSwiftAsyncError() : ParsedAttrInfo( |
||
14120 | /*AttrKind=*/ParsedAttr::AT_SwiftAsyncError, |
||
14121 | /*NumArgs=*/1, |
||
14122 | /*OptArgs=*/1, |
||
14123 | /*NumArgMembers=*/2, |
||
14124 | /*HasCustomParsing=*/0, |
||
14125 | /*AcceptsExprPack=*/0, |
||
14126 | /*IsTargetSpecific=*/0, |
||
14127 | /*IsType=*/0, |
||
14128 | /*IsStmt=*/0, |
||
14129 | /*IsKnownToGCC=*/0, |
||
14130 | /*IsSupportedByPragmaAttribute=*/1, |
||
14131 | /*Spellings=*/SwiftAsyncErrorSpellings, |
||
14132 | /*ArgNames=*/SwiftAsyncErrorArgNames) {} |
||
14133 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14134 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
14135 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
14136 | << Attr << "functions and Objective-C methods"; |
||
14137 | return false; |
||
14138 | } |
||
14139 | return true; |
||
14140 | } |
||
14141 | |||
14142 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14143 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14144 | << AL << St->getBeginLoc(); |
||
14145 | return false; |
||
14146 | } |
||
14147 | |||
14148 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14149 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14150 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
14151 | } |
||
14152 | |||
14153 | bool isParamExpr(size_t N) const override { |
||
14154 | return false; |
||
14155 | } |
||
14156 | |||
14157 | static const ParsedAttrInfoSwiftAsyncError Instance; |
||
14158 | }; |
||
14159 | const ParsedAttrInfoSwiftAsyncError ParsedAttrInfoSwiftAsyncError::Instance; |
||
14160 | static constexpr ParsedAttrInfo::Spelling SwiftAsyncNameSpellings[] = { |
||
14161 | {AttributeCommonInfo::AS_GNU, "swift_async_name"}, |
||
14162 | }; |
||
14163 | static constexpr const char *SwiftAsyncNameArgNames[] = { |
||
14164 | "Name",}; |
||
14165 | struct ParsedAttrInfoSwiftAsyncName final : public ParsedAttrInfo { |
||
14166 | constexpr ParsedAttrInfoSwiftAsyncName() : ParsedAttrInfo( |
||
14167 | /*AttrKind=*/ParsedAttr::AT_SwiftAsyncName, |
||
14168 | /*NumArgs=*/1, |
||
14169 | /*OptArgs=*/0, |
||
14170 | /*NumArgMembers=*/1, |
||
14171 | /*HasCustomParsing=*/0, |
||
14172 | /*AcceptsExprPack=*/0, |
||
14173 | /*IsTargetSpecific=*/0, |
||
14174 | /*IsType=*/0, |
||
14175 | /*IsStmt=*/0, |
||
14176 | /*IsKnownToGCC=*/0, |
||
14177 | /*IsSupportedByPragmaAttribute=*/1, |
||
14178 | /*Spellings=*/SwiftAsyncNameSpellings, |
||
14179 | /*ArgNames=*/SwiftAsyncNameArgNames) {} |
||
14180 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14181 | if (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) { |
||
14182 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14183 | << Attr << "Objective-C methods and functions"; |
||
14184 | return false; |
||
14185 | } |
||
14186 | return true; |
||
14187 | } |
||
14188 | |||
14189 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14190 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14191 | << AL << St->getBeginLoc(); |
||
14192 | return false; |
||
14193 | } |
||
14194 | |||
14195 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14196 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
14197 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14198 | } |
||
14199 | |||
14200 | bool isParamExpr(size_t N) const override { |
||
14201 | return false; |
||
14202 | } |
||
14203 | |||
14204 | static const ParsedAttrInfoSwiftAsyncName Instance; |
||
14205 | }; |
||
14206 | const ParsedAttrInfoSwiftAsyncName ParsedAttrInfoSwiftAsyncName::Instance; |
||
14207 | static constexpr ParsedAttrInfo::Spelling SwiftAttrSpellings[] = { |
||
14208 | {AttributeCommonInfo::AS_GNU, "swift_attr"}, |
||
14209 | }; |
||
14210 | static constexpr const char *SwiftAttrArgNames[] = { |
||
14211 | "Attribute",}; |
||
14212 | struct ParsedAttrInfoSwiftAttr final : public ParsedAttrInfo { |
||
14213 | constexpr ParsedAttrInfoSwiftAttr() : ParsedAttrInfo( |
||
14214 | /*AttrKind=*/ParsedAttr::AT_SwiftAttr, |
||
14215 | /*NumArgs=*/1, |
||
14216 | /*OptArgs=*/0, |
||
14217 | /*NumArgMembers=*/1, |
||
14218 | /*HasCustomParsing=*/0, |
||
14219 | /*AcceptsExprPack=*/0, |
||
14220 | /*IsTargetSpecific=*/0, |
||
14221 | /*IsType=*/0, |
||
14222 | /*IsStmt=*/0, |
||
14223 | /*IsKnownToGCC=*/0, |
||
14224 | /*IsSupportedByPragmaAttribute=*/1, |
||
14225 | /*Spellings=*/SwiftAttrSpellings, |
||
14226 | /*ArgNames=*/SwiftAttrArgNames) {} |
||
14227 | bool isParamExpr(size_t N) const override { |
||
14228 | return false; |
||
14229 | } |
||
14230 | |||
14231 | static const ParsedAttrInfoSwiftAttr Instance; |
||
14232 | }; |
||
14233 | const ParsedAttrInfoSwiftAttr ParsedAttrInfoSwiftAttr::Instance; |
||
14234 | static constexpr ParsedAttrInfo::Spelling SwiftBridgeSpellings[] = { |
||
14235 | {AttributeCommonInfo::AS_GNU, "swift_bridge"}, |
||
14236 | }; |
||
14237 | static constexpr const char *SwiftBridgeArgNames[] = { |
||
14238 | "SwiftType",}; |
||
14239 | struct ParsedAttrInfoSwiftBridge final : public ParsedAttrInfo { |
||
14240 | constexpr ParsedAttrInfoSwiftBridge() : ParsedAttrInfo( |
||
14241 | /*AttrKind=*/ParsedAttr::AT_SwiftBridge, |
||
14242 | /*NumArgs=*/1, |
||
14243 | /*OptArgs=*/0, |
||
14244 | /*NumArgMembers=*/1, |
||
14245 | /*HasCustomParsing=*/0, |
||
14246 | /*AcceptsExprPack=*/0, |
||
14247 | /*IsTargetSpecific=*/0, |
||
14248 | /*IsType=*/0, |
||
14249 | /*IsStmt=*/0, |
||
14250 | /*IsKnownToGCC=*/0, |
||
14251 | /*IsSupportedByPragmaAttribute=*/0, |
||
14252 | /*Spellings=*/SwiftBridgeSpellings, |
||
14253 | /*ArgNames=*/SwiftBridgeArgNames) {} |
||
14254 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14255 | if (!isa<TagDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<ObjCInterfaceDecl>(D) && !isa<ObjCProtocolDecl>(D)) { |
||
14256 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14257 | << Attr << "tag types, typedefs, Objective-C interfaces, and Objective-C protocols"; |
||
14258 | return false; |
||
14259 | } |
||
14260 | return true; |
||
14261 | } |
||
14262 | |||
14263 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14264 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14265 | << AL << St->getBeginLoc(); |
||
14266 | return false; |
||
14267 | } |
||
14268 | |||
14269 | bool isParamExpr(size_t N) const override { |
||
14270 | return false; |
||
14271 | } |
||
14272 | |||
14273 | static const ParsedAttrInfoSwiftBridge Instance; |
||
14274 | }; |
||
14275 | const ParsedAttrInfoSwiftBridge ParsedAttrInfoSwiftBridge::Instance; |
||
14276 | static constexpr ParsedAttrInfo::Spelling SwiftBridgedTypedefSpellings[] = { |
||
14277 | {AttributeCommonInfo::AS_GNU, "swift_bridged_typedef"}, |
||
14278 | }; |
||
14279 | struct ParsedAttrInfoSwiftBridgedTypedef final : public ParsedAttrInfo { |
||
14280 | constexpr ParsedAttrInfoSwiftBridgedTypedef() : ParsedAttrInfo( |
||
14281 | /*AttrKind=*/ParsedAttr::AT_SwiftBridgedTypedef, |
||
14282 | /*NumArgs=*/0, |
||
14283 | /*OptArgs=*/0, |
||
14284 | /*NumArgMembers=*/0, |
||
14285 | /*HasCustomParsing=*/0, |
||
14286 | /*AcceptsExprPack=*/0, |
||
14287 | /*IsTargetSpecific=*/0, |
||
14288 | /*IsType=*/0, |
||
14289 | /*IsStmt=*/0, |
||
14290 | /*IsKnownToGCC=*/0, |
||
14291 | /*IsSupportedByPragmaAttribute=*/1, |
||
14292 | /*Spellings=*/SwiftBridgedTypedefSpellings, |
||
14293 | /*ArgNames=*/{}) {} |
||
14294 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14295 | if (!isa<TypedefNameDecl>(D)) { |
||
14296 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14297 | << Attr << "typedefs"; |
||
14298 | return false; |
||
14299 | } |
||
14300 | return true; |
||
14301 | } |
||
14302 | |||
14303 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14304 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14305 | << AL << St->getBeginLoc(); |
||
14306 | return false; |
||
14307 | } |
||
14308 | |||
14309 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14310 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
14311 | } |
||
14312 | |||
14313 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
14314 | D->addAttr(::new (S.Context) SwiftBridgedTypedefAttr(S.Context, Attr)); |
||
14315 | return AttributeApplied; |
||
14316 | } |
||
14317 | |||
14318 | bool isParamExpr(size_t N) const override { |
||
14319 | return false; |
||
14320 | } |
||
14321 | |||
14322 | static const ParsedAttrInfoSwiftBridgedTypedef Instance; |
||
14323 | }; |
||
14324 | const ParsedAttrInfoSwiftBridgedTypedef ParsedAttrInfoSwiftBridgedTypedef::Instance; |
||
14325 | static constexpr ParsedAttrInfo::Spelling SwiftCallSpellings[] = { |
||
14326 | {AttributeCommonInfo::AS_GNU, "swiftcall"}, |
||
14327 | {AttributeCommonInfo::AS_CXX11, "clang::swiftcall"}, |
||
14328 | {AttributeCommonInfo::AS_C2x, "clang::swiftcall"}, |
||
14329 | }; |
||
14330 | struct ParsedAttrInfoSwiftCall final : public ParsedAttrInfo { |
||
14331 | constexpr ParsedAttrInfoSwiftCall() : ParsedAttrInfo( |
||
14332 | /*AttrKind=*/ParsedAttr::AT_SwiftCall, |
||
14333 | /*NumArgs=*/0, |
||
14334 | /*OptArgs=*/0, |
||
14335 | /*NumArgMembers=*/0, |
||
14336 | /*HasCustomParsing=*/0, |
||
14337 | /*AcceptsExprPack=*/0, |
||
14338 | /*IsTargetSpecific=*/0, |
||
14339 | /*IsType=*/1, |
||
14340 | /*IsStmt=*/0, |
||
14341 | /*IsKnownToGCC=*/0, |
||
14342 | /*IsSupportedByPragmaAttribute=*/0, |
||
14343 | /*Spellings=*/SwiftCallSpellings, |
||
14344 | /*ArgNames=*/{}) {} |
||
14345 | bool isParamExpr(size_t N) const override { |
||
14346 | return false; |
||
14347 | } |
||
14348 | |||
14349 | static const ParsedAttrInfoSwiftCall Instance; |
||
14350 | }; |
||
14351 | const ParsedAttrInfoSwiftCall ParsedAttrInfoSwiftCall::Instance; |
||
14352 | static constexpr ParsedAttrInfo::Spelling SwiftContextSpellings[] = { |
||
14353 | {AttributeCommonInfo::AS_GNU, "swift_context"}, |
||
14354 | {AttributeCommonInfo::AS_CXX11, "clang::swift_context"}, |
||
14355 | {AttributeCommonInfo::AS_C2x, "clang::swift_context"}, |
||
14356 | }; |
||
14357 | struct ParsedAttrInfoSwiftContext final : public ParsedAttrInfo { |
||
14358 | constexpr ParsedAttrInfoSwiftContext() : ParsedAttrInfo( |
||
14359 | /*AttrKind=*/ParsedAttr::AT_SwiftContext, |
||
14360 | /*NumArgs=*/0, |
||
14361 | /*OptArgs=*/0, |
||
14362 | /*NumArgMembers=*/0, |
||
14363 | /*HasCustomParsing=*/0, |
||
14364 | /*AcceptsExprPack=*/0, |
||
14365 | /*IsTargetSpecific=*/0, |
||
14366 | /*IsType=*/0, |
||
14367 | /*IsStmt=*/0, |
||
14368 | /*IsKnownToGCC=*/0, |
||
14369 | /*IsSupportedByPragmaAttribute=*/1, |
||
14370 | /*Spellings=*/SwiftContextSpellings, |
||
14371 | /*ArgNames=*/{}) {} |
||
14372 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14373 | if (!isa<ParmVarDecl>(D)) { |
||
14374 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
14375 | << Attr << "parameters"; |
||
14376 | return false; |
||
14377 | } |
||
14378 | return true; |
||
14379 | } |
||
14380 | |||
14381 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14382 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14383 | << AL << St->getBeginLoc(); |
||
14384 | return false; |
||
14385 | } |
||
14386 | |||
14387 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14388 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
14389 | } |
||
14390 | |||
14391 | bool isParamExpr(size_t N) const override { |
||
14392 | return false; |
||
14393 | } |
||
14394 | |||
14395 | static const ParsedAttrInfoSwiftContext Instance; |
||
14396 | }; |
||
14397 | const ParsedAttrInfoSwiftContext ParsedAttrInfoSwiftContext::Instance; |
||
14398 | static constexpr ParsedAttrInfo::Spelling SwiftErrorSpellings[] = { |
||
14399 | {AttributeCommonInfo::AS_GNU, "swift_error"}, |
||
14400 | }; |
||
14401 | static constexpr const char *SwiftErrorArgNames[] = { |
||
14402 | "Convention",}; |
||
14403 | struct ParsedAttrInfoSwiftError final : public ParsedAttrInfo { |
||
14404 | constexpr ParsedAttrInfoSwiftError() : ParsedAttrInfo( |
||
14405 | /*AttrKind=*/ParsedAttr::AT_SwiftError, |
||
14406 | /*NumArgs=*/1, |
||
14407 | /*OptArgs=*/0, |
||
14408 | /*NumArgMembers=*/1, |
||
14409 | /*HasCustomParsing=*/0, |
||
14410 | /*AcceptsExprPack=*/0, |
||
14411 | /*IsTargetSpecific=*/0, |
||
14412 | /*IsType=*/0, |
||
14413 | /*IsStmt=*/0, |
||
14414 | /*IsKnownToGCC=*/0, |
||
14415 | /*IsSupportedByPragmaAttribute=*/1, |
||
14416 | /*Spellings=*/SwiftErrorSpellings, |
||
14417 | /*ArgNames=*/SwiftErrorArgNames) {} |
||
14418 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14419 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
14420 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14421 | << Attr << "functions and Objective-C methods"; |
||
14422 | return false; |
||
14423 | } |
||
14424 | return true; |
||
14425 | } |
||
14426 | |||
14427 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14428 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14429 | << AL << St->getBeginLoc(); |
||
14430 | return false; |
||
14431 | } |
||
14432 | |||
14433 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14434 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14435 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
14436 | } |
||
14437 | |||
14438 | bool isParamExpr(size_t N) const override { |
||
14439 | return false; |
||
14440 | } |
||
14441 | |||
14442 | static const ParsedAttrInfoSwiftError Instance; |
||
14443 | }; |
||
14444 | const ParsedAttrInfoSwiftError ParsedAttrInfoSwiftError::Instance; |
||
14445 | static constexpr ParsedAttrInfo::Spelling SwiftErrorResultSpellings[] = { |
||
14446 | {AttributeCommonInfo::AS_GNU, "swift_error_result"}, |
||
14447 | {AttributeCommonInfo::AS_CXX11, "clang::swift_error_result"}, |
||
14448 | {AttributeCommonInfo::AS_C2x, "clang::swift_error_result"}, |
||
14449 | }; |
||
14450 | struct ParsedAttrInfoSwiftErrorResult final : public ParsedAttrInfo { |
||
14451 | constexpr ParsedAttrInfoSwiftErrorResult() : ParsedAttrInfo( |
||
14452 | /*AttrKind=*/ParsedAttr::AT_SwiftErrorResult, |
||
14453 | /*NumArgs=*/0, |
||
14454 | /*OptArgs=*/0, |
||
14455 | /*NumArgMembers=*/0, |
||
14456 | /*HasCustomParsing=*/0, |
||
14457 | /*AcceptsExprPack=*/0, |
||
14458 | /*IsTargetSpecific=*/0, |
||
14459 | /*IsType=*/0, |
||
14460 | /*IsStmt=*/0, |
||
14461 | /*IsKnownToGCC=*/0, |
||
14462 | /*IsSupportedByPragmaAttribute=*/1, |
||
14463 | /*Spellings=*/SwiftErrorResultSpellings, |
||
14464 | /*ArgNames=*/{}) {} |
||
14465 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14466 | if (!isa<ParmVarDecl>(D)) { |
||
14467 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
14468 | << Attr << "parameters"; |
||
14469 | return false; |
||
14470 | } |
||
14471 | return true; |
||
14472 | } |
||
14473 | |||
14474 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14475 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14476 | << AL << St->getBeginLoc(); |
||
14477 | return false; |
||
14478 | } |
||
14479 | |||
14480 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14481 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
14482 | } |
||
14483 | |||
14484 | bool isParamExpr(size_t N) const override { |
||
14485 | return false; |
||
14486 | } |
||
14487 | |||
14488 | static const ParsedAttrInfoSwiftErrorResult Instance; |
||
14489 | }; |
||
14490 | const ParsedAttrInfoSwiftErrorResult ParsedAttrInfoSwiftErrorResult::Instance; |
||
14491 | static constexpr ParsedAttrInfo::Spelling SwiftIndirectResultSpellings[] = { |
||
14492 | {AttributeCommonInfo::AS_GNU, "swift_indirect_result"}, |
||
14493 | {AttributeCommonInfo::AS_CXX11, "clang::swift_indirect_result"}, |
||
14494 | {AttributeCommonInfo::AS_C2x, "clang::swift_indirect_result"}, |
||
14495 | }; |
||
14496 | struct ParsedAttrInfoSwiftIndirectResult final : public ParsedAttrInfo { |
||
14497 | constexpr ParsedAttrInfoSwiftIndirectResult() : ParsedAttrInfo( |
||
14498 | /*AttrKind=*/ParsedAttr::AT_SwiftIndirectResult, |
||
14499 | /*NumArgs=*/0, |
||
14500 | /*OptArgs=*/0, |
||
14501 | /*NumArgMembers=*/0, |
||
14502 | /*HasCustomParsing=*/0, |
||
14503 | /*AcceptsExprPack=*/0, |
||
14504 | /*IsTargetSpecific=*/0, |
||
14505 | /*IsType=*/0, |
||
14506 | /*IsStmt=*/0, |
||
14507 | /*IsKnownToGCC=*/0, |
||
14508 | /*IsSupportedByPragmaAttribute=*/1, |
||
14509 | /*Spellings=*/SwiftIndirectResultSpellings, |
||
14510 | /*ArgNames=*/{}) {} |
||
14511 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14512 | if (!isa<ParmVarDecl>(D)) { |
||
14513 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
14514 | << Attr << "parameters"; |
||
14515 | return false; |
||
14516 | } |
||
14517 | return true; |
||
14518 | } |
||
14519 | |||
14520 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14521 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14522 | << AL << St->getBeginLoc(); |
||
14523 | return false; |
||
14524 | } |
||
14525 | |||
14526 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14527 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
14528 | } |
||
14529 | |||
14530 | bool isParamExpr(size_t N) const override { |
||
14531 | return false; |
||
14532 | } |
||
14533 | |||
14534 | static const ParsedAttrInfoSwiftIndirectResult Instance; |
||
14535 | }; |
||
14536 | const ParsedAttrInfoSwiftIndirectResult ParsedAttrInfoSwiftIndirectResult::Instance; |
||
14537 | static constexpr ParsedAttrInfo::Spelling SwiftNameSpellings[] = { |
||
14538 | {AttributeCommonInfo::AS_GNU, "swift_name"}, |
||
14539 | }; |
||
14540 | static constexpr const char *SwiftNameArgNames[] = { |
||
14541 | "Name",}; |
||
14542 | struct ParsedAttrInfoSwiftName final : public ParsedAttrInfo { |
||
14543 | constexpr ParsedAttrInfoSwiftName() : ParsedAttrInfo( |
||
14544 | /*AttrKind=*/ParsedAttr::AT_SwiftName, |
||
14545 | /*NumArgs=*/1, |
||
14546 | /*OptArgs=*/0, |
||
14547 | /*NumArgMembers=*/1, |
||
14548 | /*HasCustomParsing=*/0, |
||
14549 | /*AcceptsExprPack=*/0, |
||
14550 | /*IsTargetSpecific=*/0, |
||
14551 | /*IsType=*/0, |
||
14552 | /*IsStmt=*/0, |
||
14553 | /*IsKnownToGCC=*/0, |
||
14554 | /*IsSupportedByPragmaAttribute=*/0, |
||
14555 | /*Spellings=*/SwiftNameSpellings, |
||
14556 | /*ArgNames=*/SwiftNameArgNames) {} |
||
14557 | bool isParamExpr(size_t N) const override { |
||
14558 | return false; |
||
14559 | } |
||
14560 | |||
14561 | static const ParsedAttrInfoSwiftName Instance; |
||
14562 | }; |
||
14563 | const ParsedAttrInfoSwiftName ParsedAttrInfoSwiftName::Instance; |
||
14564 | static constexpr ParsedAttrInfo::Spelling SwiftNewTypeSpellings[] = { |
||
14565 | {AttributeCommonInfo::AS_GNU, "swift_newtype"}, |
||
14566 | {AttributeCommonInfo::AS_GNU, "swift_wrapper"}, |
||
14567 | }; |
||
14568 | static constexpr const char *SwiftNewTypeArgNames[] = { |
||
14569 | "NewtypeKind",}; |
||
14570 | struct ParsedAttrInfoSwiftNewType final : public ParsedAttrInfo { |
||
14571 | constexpr ParsedAttrInfoSwiftNewType() : ParsedAttrInfo( |
||
14572 | /*AttrKind=*/ParsedAttr::AT_SwiftNewType, |
||
14573 | /*NumArgs=*/1, |
||
14574 | /*OptArgs=*/0, |
||
14575 | /*NumArgMembers=*/1, |
||
14576 | /*HasCustomParsing=*/1, |
||
14577 | /*AcceptsExprPack=*/0, |
||
14578 | /*IsTargetSpecific=*/0, |
||
14579 | /*IsType=*/0, |
||
14580 | /*IsStmt=*/0, |
||
14581 | /*IsKnownToGCC=*/0, |
||
14582 | /*IsSupportedByPragmaAttribute=*/1, |
||
14583 | /*Spellings=*/SwiftNewTypeSpellings, |
||
14584 | /*ArgNames=*/SwiftNewTypeArgNames) {} |
||
14585 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14586 | if (!isa<TypedefNameDecl>(D)) { |
||
14587 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14588 | << Attr << "typedefs"; |
||
14589 | return false; |
||
14590 | } |
||
14591 | return true; |
||
14592 | } |
||
14593 | |||
14594 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14595 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14596 | << AL << St->getBeginLoc(); |
||
14597 | return false; |
||
14598 | } |
||
14599 | |||
14600 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
14601 | enum Spelling { |
||
14602 | GNU_swift_newtype = 0, |
||
14603 | GNU_swift_wrapper = 1, |
||
14604 | SpellingNotCalculated = 15 |
||
14605 | |||
14606 | }; |
||
14607 | |||
14608 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
14609 | switch (Idx) { |
||
14610 | default: llvm_unreachable("Unknown spelling list index"); |
||
14611 | case 0: return GNU_swift_newtype; |
||
14612 | case 1: return GNU_swift_wrapper; |
||
14613 | } |
||
14614 | } |
||
14615 | |||
14616 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14617 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
14618 | } |
||
14619 | |||
14620 | bool isParamExpr(size_t N) const override { |
||
14621 | return false; |
||
14622 | } |
||
14623 | |||
14624 | static const ParsedAttrInfoSwiftNewType Instance; |
||
14625 | }; |
||
14626 | const ParsedAttrInfoSwiftNewType ParsedAttrInfoSwiftNewType::Instance; |
||
14627 | static constexpr ParsedAttrInfo::Spelling SwiftObjCMembersSpellings[] = { |
||
14628 | {AttributeCommonInfo::AS_GNU, "swift_objc_members"}, |
||
14629 | }; |
||
14630 | struct ParsedAttrInfoSwiftObjCMembers final : public ParsedAttrInfo { |
||
14631 | constexpr ParsedAttrInfoSwiftObjCMembers() : ParsedAttrInfo( |
||
14632 | /*AttrKind=*/ParsedAttr::AT_SwiftObjCMembers, |
||
14633 | /*NumArgs=*/0, |
||
14634 | /*OptArgs=*/0, |
||
14635 | /*NumArgMembers=*/0, |
||
14636 | /*HasCustomParsing=*/0, |
||
14637 | /*AcceptsExprPack=*/0, |
||
14638 | /*IsTargetSpecific=*/0, |
||
14639 | /*IsType=*/0, |
||
14640 | /*IsStmt=*/0, |
||
14641 | /*IsKnownToGCC=*/0, |
||
14642 | /*IsSupportedByPragmaAttribute=*/1, |
||
14643 | /*Spellings=*/SwiftObjCMembersSpellings, |
||
14644 | /*ArgNames=*/{}) {} |
||
14645 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14646 | if (!isa<ObjCInterfaceDecl>(D)) { |
||
14647 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14648 | << Attr << "Objective-C interfaces"; |
||
14649 | return false; |
||
14650 | } |
||
14651 | return true; |
||
14652 | } |
||
14653 | |||
14654 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14655 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14656 | << AL << St->getBeginLoc(); |
||
14657 | return false; |
||
14658 | } |
||
14659 | |||
14660 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14661 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC)); |
||
14662 | } |
||
14663 | |||
14664 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
14665 | D->addAttr(::new (S.Context) SwiftObjCMembersAttr(S.Context, Attr)); |
||
14666 | return AttributeApplied; |
||
14667 | } |
||
14668 | |||
14669 | bool isParamExpr(size_t N) const override { |
||
14670 | return false; |
||
14671 | } |
||
14672 | |||
14673 | static const ParsedAttrInfoSwiftObjCMembers Instance; |
||
14674 | }; |
||
14675 | const ParsedAttrInfoSwiftObjCMembers ParsedAttrInfoSwiftObjCMembers::Instance; |
||
14676 | static constexpr ParsedAttrInfo::Spelling SwiftPrivateSpellings[] = { |
||
14677 | {AttributeCommonInfo::AS_GNU, "swift_private"}, |
||
14678 | }; |
||
14679 | struct ParsedAttrInfoSwiftPrivate final : public ParsedAttrInfo { |
||
14680 | constexpr ParsedAttrInfoSwiftPrivate() : ParsedAttrInfo( |
||
14681 | /*AttrKind=*/ParsedAttr::AT_SwiftPrivate, |
||
14682 | /*NumArgs=*/0, |
||
14683 | /*OptArgs=*/0, |
||
14684 | /*NumArgMembers=*/0, |
||
14685 | /*HasCustomParsing=*/0, |
||
14686 | /*AcceptsExprPack=*/0, |
||
14687 | /*IsTargetSpecific=*/0, |
||
14688 | /*IsType=*/0, |
||
14689 | /*IsStmt=*/0, |
||
14690 | /*IsKnownToGCC=*/0, |
||
14691 | /*IsSupportedByPragmaAttribute=*/0, |
||
14692 | /*Spellings=*/SwiftPrivateSpellings, |
||
14693 | /*ArgNames=*/{}) {} |
||
14694 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
14695 | D->addAttr(::new (S.Context) SwiftPrivateAttr(S.Context, Attr)); |
||
14696 | return AttributeApplied; |
||
14697 | } |
||
14698 | |||
14699 | bool isParamExpr(size_t N) const override { |
||
14700 | return false; |
||
14701 | } |
||
14702 | |||
14703 | static const ParsedAttrInfoSwiftPrivate Instance; |
||
14704 | }; |
||
14705 | const ParsedAttrInfoSwiftPrivate ParsedAttrInfoSwiftPrivate::Instance; |
||
14706 | static constexpr ParsedAttrInfo::Spelling SysVABISpellings[] = { |
||
14707 | {AttributeCommonInfo::AS_GNU, "sysv_abi"}, |
||
14708 | {AttributeCommonInfo::AS_CXX11, "gnu::sysv_abi"}, |
||
14709 | {AttributeCommonInfo::AS_C2x, "gnu::sysv_abi"}, |
||
14710 | }; |
||
14711 | struct ParsedAttrInfoSysVABI final : public ParsedAttrInfo { |
||
14712 | constexpr ParsedAttrInfoSysVABI() : ParsedAttrInfo( |
||
14713 | /*AttrKind=*/ParsedAttr::AT_SysVABI, |
||
14714 | /*NumArgs=*/0, |
||
14715 | /*OptArgs=*/0, |
||
14716 | /*NumArgMembers=*/0, |
||
14717 | /*HasCustomParsing=*/0, |
||
14718 | /*AcceptsExprPack=*/0, |
||
14719 | /*IsTargetSpecific=*/0, |
||
14720 | /*IsType=*/1, |
||
14721 | /*IsStmt=*/0, |
||
14722 | /*IsKnownToGCC=*/1, |
||
14723 | /*IsSupportedByPragmaAttribute=*/0, |
||
14724 | /*Spellings=*/SysVABISpellings, |
||
14725 | /*ArgNames=*/{}) {} |
||
14726 | bool isParamExpr(size_t N) const override { |
||
14727 | return false; |
||
14728 | } |
||
14729 | |||
14730 | static const ParsedAttrInfoSysVABI Instance; |
||
14731 | }; |
||
14732 | const ParsedAttrInfoSysVABI ParsedAttrInfoSysVABI::Instance; |
||
14733 | static constexpr ParsedAttrInfo::Spelling TLSModelSpellings[] = { |
||
14734 | {AttributeCommonInfo::AS_GNU, "tls_model"}, |
||
14735 | {AttributeCommonInfo::AS_CXX11, "gnu::tls_model"}, |
||
14736 | {AttributeCommonInfo::AS_C2x, "gnu::tls_model"}, |
||
14737 | }; |
||
14738 | static constexpr const char *TLSModelArgNames[] = { |
||
14739 | "Model",}; |
||
14740 | struct ParsedAttrInfoTLSModel final : public ParsedAttrInfo { |
||
14741 | constexpr ParsedAttrInfoTLSModel() : ParsedAttrInfo( |
||
14742 | /*AttrKind=*/ParsedAttr::AT_TLSModel, |
||
14743 | /*NumArgs=*/1, |
||
14744 | /*OptArgs=*/0, |
||
14745 | /*NumArgMembers=*/1, |
||
14746 | /*HasCustomParsing=*/0, |
||
14747 | /*AcceptsExprPack=*/0, |
||
14748 | /*IsTargetSpecific=*/0, |
||
14749 | /*IsType=*/0, |
||
14750 | /*IsStmt=*/0, |
||
14751 | /*IsKnownToGCC=*/1, |
||
14752 | /*IsSupportedByPragmaAttribute=*/1, |
||
14753 | /*Spellings=*/TLSModelSpellings, |
||
14754 | /*ArgNames=*/TLSModelArgNames) {} |
||
14755 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14756 | if (!isTLSVar(D)) { |
||
14757 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14758 | << Attr << "thread-local variables"; |
||
14759 | return false; |
||
14760 | } |
||
14761 | return true; |
||
14762 | } |
||
14763 | |||
14764 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14765 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14766 | << AL << St->getBeginLoc(); |
||
14767 | return false; |
||
14768 | } |
||
14769 | |||
14770 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14771 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_thread_local, /*IsSupported=*/true)); |
||
14772 | } |
||
14773 | |||
14774 | bool isParamExpr(size_t N) const override { |
||
14775 | return false; |
||
14776 | } |
||
14777 | |||
14778 | static const ParsedAttrInfoTLSModel Instance; |
||
14779 | }; |
||
14780 | const ParsedAttrInfoTLSModel ParsedAttrInfoTLSModel::Instance; |
||
14781 | static constexpr ParsedAttrInfo::Spelling TargetSpellings[] = { |
||
14782 | {AttributeCommonInfo::AS_GNU, "target"}, |
||
14783 | {AttributeCommonInfo::AS_CXX11, "gnu::target"}, |
||
14784 | {AttributeCommonInfo::AS_C2x, "gnu::target"}, |
||
14785 | }; |
||
14786 | static constexpr const char *TargetArgNames[] = { |
||
14787 | "featuresStr",}; |
||
14788 | struct ParsedAttrInfoTarget final : public ParsedAttrInfo { |
||
14789 | constexpr ParsedAttrInfoTarget() : ParsedAttrInfo( |
||
14790 | /*AttrKind=*/ParsedAttr::AT_Target, |
||
14791 | /*NumArgs=*/1, |
||
14792 | /*OptArgs=*/0, |
||
14793 | /*NumArgMembers=*/1, |
||
14794 | /*HasCustomParsing=*/0, |
||
14795 | /*AcceptsExprPack=*/0, |
||
14796 | /*IsTargetSpecific=*/0, |
||
14797 | /*IsType=*/0, |
||
14798 | /*IsStmt=*/0, |
||
14799 | /*IsKnownToGCC=*/1, |
||
14800 | /*IsSupportedByPragmaAttribute=*/1, |
||
14801 | /*Spellings=*/TargetSpellings, |
||
14802 | /*ArgNames=*/TargetArgNames) {} |
||
14803 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14804 | if (!isa<FunctionDecl>(D)) { |
||
14805 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14806 | << Attr << "functions"; |
||
14807 | return false; |
||
14808 | } |
||
14809 | return true; |
||
14810 | } |
||
14811 | |||
14812 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14813 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14814 | << AL << St->getBeginLoc(); |
||
14815 | return false; |
||
14816 | } |
||
14817 | |||
14818 | using ParsedAttrInfo::diagMutualExclusion; |
||
14819 | |||
14820 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
14821 | if (const auto *A = D->getAttr<TargetClonesAttr>()) { |
||
14822 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14823 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14824 | return false; |
||
14825 | } |
||
14826 | if (const auto *A = D->getAttr<TargetVersionAttr>()) { |
||
14827 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14828 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14829 | return false; |
||
14830 | } |
||
14831 | if (const auto *A = D->getAttr<CPUDispatchAttr>()) { |
||
14832 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14833 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14834 | return false; |
||
14835 | } |
||
14836 | if (const auto *A = D->getAttr<CPUSpecificAttr>()) { |
||
14837 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14838 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14839 | return false; |
||
14840 | } |
||
14841 | return true; |
||
14842 | } |
||
14843 | |||
14844 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14845 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14846 | } |
||
14847 | |||
14848 | bool isParamExpr(size_t N) const override { |
||
14849 | return false; |
||
14850 | } |
||
14851 | |||
14852 | static const ParsedAttrInfoTarget Instance; |
||
14853 | }; |
||
14854 | const ParsedAttrInfoTarget ParsedAttrInfoTarget::Instance; |
||
14855 | static constexpr ParsedAttrInfo::Spelling TargetClonesSpellings[] = { |
||
14856 | {AttributeCommonInfo::AS_GNU, "target_clones"}, |
||
14857 | {AttributeCommonInfo::AS_CXX11, "gnu::target_clones"}, |
||
14858 | {AttributeCommonInfo::AS_C2x, "gnu::target_clones"}, |
||
14859 | }; |
||
14860 | static constexpr const char *TargetClonesArgNames[] = { |
||
14861 | "featuresStrs...",}; |
||
14862 | struct ParsedAttrInfoTargetClones final : public ParsedAttrInfo { |
||
14863 | constexpr ParsedAttrInfoTargetClones() : ParsedAttrInfo( |
||
14864 | /*AttrKind=*/ParsedAttr::AT_TargetClones, |
||
14865 | /*NumArgs=*/0, |
||
14866 | /*OptArgs=*/15, |
||
14867 | /*NumArgMembers=*/1, |
||
14868 | /*HasCustomParsing=*/0, |
||
14869 | /*AcceptsExprPack=*/0, |
||
14870 | /*IsTargetSpecific=*/0, |
||
14871 | /*IsType=*/0, |
||
14872 | /*IsStmt=*/0, |
||
14873 | /*IsKnownToGCC=*/1, |
||
14874 | /*IsSupportedByPragmaAttribute=*/1, |
||
14875 | /*Spellings=*/TargetClonesSpellings, |
||
14876 | /*ArgNames=*/TargetClonesArgNames) {} |
||
14877 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14878 | if (!isa<FunctionDecl>(D)) { |
||
14879 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14880 | << Attr << "functions"; |
||
14881 | return false; |
||
14882 | } |
||
14883 | return true; |
||
14884 | } |
||
14885 | |||
14886 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14887 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14888 | << AL << St->getBeginLoc(); |
||
14889 | return false; |
||
14890 | } |
||
14891 | |||
14892 | using ParsedAttrInfo::diagMutualExclusion; |
||
14893 | |||
14894 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
14895 | if (const auto *A = D->getAttr<TargetVersionAttr>()) { |
||
14896 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14897 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14898 | return false; |
||
14899 | } |
||
14900 | if (const auto *A = D->getAttr<TargetAttr>()) { |
||
14901 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14902 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14903 | return false; |
||
14904 | } |
||
14905 | if (const auto *A = D->getAttr<CPUDispatchAttr>()) { |
||
14906 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14907 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14908 | return false; |
||
14909 | } |
||
14910 | if (const auto *A = D->getAttr<CPUSpecificAttr>()) { |
||
14911 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14912 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14913 | return false; |
||
14914 | } |
||
14915 | return true; |
||
14916 | } |
||
14917 | |||
14918 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14919 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14920 | } |
||
14921 | |||
14922 | bool isParamExpr(size_t N) const override { |
||
14923 | return false; |
||
14924 | } |
||
14925 | |||
14926 | static const ParsedAttrInfoTargetClones Instance; |
||
14927 | }; |
||
14928 | const ParsedAttrInfoTargetClones ParsedAttrInfoTargetClones::Instance; |
||
14929 | static constexpr ParsedAttrInfo::Spelling TargetVersionSpellings[] = { |
||
14930 | {AttributeCommonInfo::AS_GNU, "target_version"}, |
||
14931 | {AttributeCommonInfo::AS_CXX11, "gnu::target_version"}, |
||
14932 | {AttributeCommonInfo::AS_C2x, "gnu::target_version"}, |
||
14933 | }; |
||
14934 | static constexpr const char *TargetVersionArgNames[] = { |
||
14935 | "NamesStr",}; |
||
14936 | struct ParsedAttrInfoTargetVersion final : public ParsedAttrInfo { |
||
14937 | constexpr ParsedAttrInfoTargetVersion() : ParsedAttrInfo( |
||
14938 | /*AttrKind=*/ParsedAttr::AT_TargetVersion, |
||
14939 | /*NumArgs=*/1, |
||
14940 | /*OptArgs=*/0, |
||
14941 | /*NumArgMembers=*/1, |
||
14942 | /*HasCustomParsing=*/0, |
||
14943 | /*AcceptsExprPack=*/0, |
||
14944 | /*IsTargetSpecific=*/0, |
||
14945 | /*IsType=*/0, |
||
14946 | /*IsStmt=*/0, |
||
14947 | /*IsKnownToGCC=*/1, |
||
14948 | /*IsSupportedByPragmaAttribute=*/1, |
||
14949 | /*Spellings=*/TargetVersionSpellings, |
||
14950 | /*ArgNames=*/TargetVersionArgNames) {} |
||
14951 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
14952 | if (!isa<FunctionDecl>(D)) { |
||
14953 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
14954 | << Attr << "functions"; |
||
14955 | return false; |
||
14956 | } |
||
14957 | return true; |
||
14958 | } |
||
14959 | |||
14960 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
14961 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
14962 | << AL << St->getBeginLoc(); |
||
14963 | return false; |
||
14964 | } |
||
14965 | |||
14966 | using ParsedAttrInfo::diagMutualExclusion; |
||
14967 | |||
14968 | bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override { |
||
14969 | if (const auto *A = D->getAttr<TargetClonesAttr>()) { |
||
14970 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14971 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14972 | return false; |
||
14973 | } |
||
14974 | if (const auto *A = D->getAttr<TargetAttr>()) { |
||
14975 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14976 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14977 | return false; |
||
14978 | } |
||
14979 | if (const auto *A = D->getAttr<CPUDispatchAttr>()) { |
||
14980 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14981 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14982 | return false; |
||
14983 | } |
||
14984 | if (const auto *A = D->getAttr<CPUSpecificAttr>()) { |
||
14985 | S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A; |
||
14986 | S.Diag(A->getLocation(), diag::note_conflicting_attribute); |
||
14987 | return false; |
||
14988 | } |
||
14989 | return true; |
||
14990 | } |
||
14991 | |||
14992 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
14993 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
14994 | } |
||
14995 | |||
14996 | bool isParamExpr(size_t N) const override { |
||
14997 | return false; |
||
14998 | } |
||
14999 | |||
15000 | static const ParsedAttrInfoTargetVersion Instance; |
||
15001 | }; |
||
15002 | const ParsedAttrInfoTargetVersion ParsedAttrInfoTargetVersion::Instance; |
||
15003 | static constexpr ParsedAttrInfo::Spelling TestTypestateSpellings[] = { |
||
15004 | {AttributeCommonInfo::AS_GNU, "test_typestate"}, |
||
15005 | {AttributeCommonInfo::AS_CXX11, "clang::test_typestate"}, |
||
15006 | }; |
||
15007 | static constexpr const char *TestTypestateArgNames[] = { |
||
15008 | "TestState",}; |
||
15009 | struct ParsedAttrInfoTestTypestate final : public ParsedAttrInfo { |
||
15010 | constexpr ParsedAttrInfoTestTypestate() : ParsedAttrInfo( |
||
15011 | /*AttrKind=*/ParsedAttr::AT_TestTypestate, |
||
15012 | /*NumArgs=*/1, |
||
15013 | /*OptArgs=*/0, |
||
15014 | /*NumArgMembers=*/1, |
||
15015 | /*HasCustomParsing=*/0, |
||
15016 | /*AcceptsExprPack=*/0, |
||
15017 | /*IsTargetSpecific=*/0, |
||
15018 | /*IsType=*/0, |
||
15019 | /*IsStmt=*/0, |
||
15020 | /*IsKnownToGCC=*/0, |
||
15021 | /*IsSupportedByPragmaAttribute=*/1, |
||
15022 | /*Spellings=*/TestTypestateSpellings, |
||
15023 | /*ArgNames=*/TestTypestateArgNames) {} |
||
15024 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15025 | if (!isa<CXXMethodDecl>(D)) { |
||
15026 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15027 | << Attr << "functions"; |
||
15028 | return false; |
||
15029 | } |
||
15030 | return true; |
||
15031 | } |
||
15032 | |||
15033 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15034 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15035 | << AL << St->getBeginLoc(); |
||
15036 | return false; |
||
15037 | } |
||
15038 | |||
15039 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
15040 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus)); |
||
15041 | } |
||
15042 | |||
15043 | bool isParamExpr(size_t N) const override { |
||
15044 | return false; |
||
15045 | } |
||
15046 | |||
15047 | static const ParsedAttrInfoTestTypestate Instance; |
||
15048 | }; |
||
15049 | const ParsedAttrInfoTestTypestate ParsedAttrInfoTestTypestate::Instance; |
||
15050 | static constexpr ParsedAttrInfo::Spelling ThisCallSpellings[] = { |
||
15051 | {AttributeCommonInfo::AS_GNU, "thiscall"}, |
||
15052 | {AttributeCommonInfo::AS_CXX11, "gnu::thiscall"}, |
||
15053 | {AttributeCommonInfo::AS_C2x, "gnu::thiscall"}, |
||
15054 | {AttributeCommonInfo::AS_Keyword, "__thiscall"}, |
||
15055 | {AttributeCommonInfo::AS_Keyword, "_thiscall"}, |
||
15056 | }; |
||
15057 | struct ParsedAttrInfoThisCall final : public ParsedAttrInfo { |
||
15058 | constexpr ParsedAttrInfoThisCall() : ParsedAttrInfo( |
||
15059 | /*AttrKind=*/ParsedAttr::AT_ThisCall, |
||
15060 | /*NumArgs=*/0, |
||
15061 | /*OptArgs=*/0, |
||
15062 | /*NumArgMembers=*/0, |
||
15063 | /*HasCustomParsing=*/0, |
||
15064 | /*AcceptsExprPack=*/0, |
||
15065 | /*IsTargetSpecific=*/0, |
||
15066 | /*IsType=*/1, |
||
15067 | /*IsStmt=*/0, |
||
15068 | /*IsKnownToGCC=*/1, |
||
15069 | /*IsSupportedByPragmaAttribute=*/0, |
||
15070 | /*Spellings=*/ThisCallSpellings, |
||
15071 | /*ArgNames=*/{}) {} |
||
15072 | bool isParamExpr(size_t N) const override { |
||
15073 | return false; |
||
15074 | } |
||
15075 | |||
15076 | static const ParsedAttrInfoThisCall Instance; |
||
15077 | }; |
||
15078 | const ParsedAttrInfoThisCall ParsedAttrInfoThisCall::Instance; |
||
15079 | static constexpr ParsedAttrInfo::Spelling ThreadSpellings[] = { |
||
15080 | {AttributeCommonInfo::AS_Declspec, "thread"}, |
||
15081 | }; |
||
15082 | struct ParsedAttrInfoThread final : public ParsedAttrInfo { |
||
15083 | constexpr ParsedAttrInfoThread() : ParsedAttrInfo( |
||
15084 | /*AttrKind=*/ParsedAttr::AT_Thread, |
||
15085 | /*NumArgs=*/0, |
||
15086 | /*OptArgs=*/0, |
||
15087 | /*NumArgMembers=*/0, |
||
15088 | /*HasCustomParsing=*/0, |
||
15089 | /*AcceptsExprPack=*/0, |
||
15090 | /*IsTargetSpecific=*/0, |
||
15091 | /*IsType=*/0, |
||
15092 | /*IsStmt=*/0, |
||
15093 | /*IsKnownToGCC=*/0, |
||
15094 | /*IsSupportedByPragmaAttribute=*/0, |
||
15095 | /*Spellings=*/ThreadSpellings, |
||
15096 | /*ArgNames=*/{}) {} |
||
15097 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15098 | if (!isa<VarDecl>(D)) { |
||
15099 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15100 | << Attr << "variables"; |
||
15101 | return false; |
||
15102 | } |
||
15103 | return true; |
||
15104 | } |
||
15105 | |||
15106 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15107 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15108 | << AL << St->getBeginLoc(); |
||
15109 | return false; |
||
15110 | } |
||
15111 | |||
15112 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
15113 | return LangOpts.MicrosoftExt; |
||
15114 | } |
||
15115 | |||
15116 | bool isParamExpr(size_t N) const override { |
||
15117 | return false; |
||
15118 | } |
||
15119 | |||
15120 | static const ParsedAttrInfoThread Instance; |
||
15121 | }; |
||
15122 | const ParsedAttrInfoThread ParsedAttrInfoThread::Instance; |
||
15123 | static constexpr ParsedAttrInfo::Spelling TransparentUnionSpellings[] = { |
||
15124 | {AttributeCommonInfo::AS_GNU, "transparent_union"}, |
||
15125 | {AttributeCommonInfo::AS_CXX11, "gnu::transparent_union"}, |
||
15126 | {AttributeCommonInfo::AS_C2x, "gnu::transparent_union"}, |
||
15127 | }; |
||
15128 | struct ParsedAttrInfoTransparentUnion final : public ParsedAttrInfo { |
||
15129 | constexpr ParsedAttrInfoTransparentUnion() : ParsedAttrInfo( |
||
15130 | /*AttrKind=*/ParsedAttr::AT_TransparentUnion, |
||
15131 | /*NumArgs=*/0, |
||
15132 | /*OptArgs=*/0, |
||
15133 | /*NumArgMembers=*/0, |
||
15134 | /*HasCustomParsing=*/0, |
||
15135 | /*AcceptsExprPack=*/0, |
||
15136 | /*IsTargetSpecific=*/0, |
||
15137 | /*IsType=*/0, |
||
15138 | /*IsStmt=*/0, |
||
15139 | /*IsKnownToGCC=*/1, |
||
15140 | /*IsSupportedByPragmaAttribute=*/0, |
||
15141 | /*Spellings=*/TransparentUnionSpellings, |
||
15142 | /*ArgNames=*/{}) {} |
||
15143 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
15144 | return (!LangOpts.CPlusPlus); |
||
15145 | } |
||
15146 | |||
15147 | bool isParamExpr(size_t N) const override { |
||
15148 | return false; |
||
15149 | } |
||
15150 | |||
15151 | static const ParsedAttrInfoTransparentUnion Instance; |
||
15152 | }; |
||
15153 | const ParsedAttrInfoTransparentUnion ParsedAttrInfoTransparentUnion::Instance; |
||
15154 | static constexpr ParsedAttrInfo::Spelling TrivialABISpellings[] = { |
||
15155 | {AttributeCommonInfo::AS_GNU, "trivial_abi"}, |
||
15156 | {AttributeCommonInfo::AS_CXX11, "clang::trivial_abi"}, |
||
15157 | }; |
||
15158 | struct ParsedAttrInfoTrivialABI final : public ParsedAttrInfo { |
||
15159 | constexpr ParsedAttrInfoTrivialABI() : ParsedAttrInfo( |
||
15160 | /*AttrKind=*/ParsedAttr::AT_TrivialABI, |
||
15161 | /*NumArgs=*/0, |
||
15162 | /*OptArgs=*/0, |
||
15163 | /*NumArgMembers=*/0, |
||
15164 | /*HasCustomParsing=*/0, |
||
15165 | /*AcceptsExprPack=*/0, |
||
15166 | /*IsTargetSpecific=*/0, |
||
15167 | /*IsType=*/0, |
||
15168 | /*IsStmt=*/0, |
||
15169 | /*IsKnownToGCC=*/0, |
||
15170 | /*IsSupportedByPragmaAttribute=*/1, |
||
15171 | /*Spellings=*/TrivialABISpellings, |
||
15172 | /*ArgNames=*/{}) {} |
||
15173 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15174 | if (!isa<CXXRecordDecl>(D)) { |
||
15175 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15176 | << Attr << "classes"; |
||
15177 | return false; |
||
15178 | } |
||
15179 | return true; |
||
15180 | } |
||
15181 | |||
15182 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15183 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15184 | << AL << St->getBeginLoc(); |
||
15185 | return false; |
||
15186 | } |
||
15187 | |||
15188 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
15189 | return LangOpts.CPlusPlus; |
||
15190 | } |
||
15191 | |||
15192 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
15193 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
15194 | } |
||
15195 | |||
15196 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
15197 | D->addAttr(::new (S.Context) TrivialABIAttr(S.Context, Attr)); |
||
15198 | return AttributeApplied; |
||
15199 | } |
||
15200 | |||
15201 | bool isParamExpr(size_t N) const override { |
||
15202 | return false; |
||
15203 | } |
||
15204 | |||
15205 | static const ParsedAttrInfoTrivialABI Instance; |
||
15206 | }; |
||
15207 | const ParsedAttrInfoTrivialABI ParsedAttrInfoTrivialABI::Instance; |
||
15208 | static constexpr ParsedAttrInfo::Spelling TryAcquireCapabilitySpellings[] = { |
||
15209 | {AttributeCommonInfo::AS_GNU, "try_acquire_capability"}, |
||
15210 | {AttributeCommonInfo::AS_CXX11, "clang::try_acquire_capability"}, |
||
15211 | {AttributeCommonInfo::AS_GNU, "try_acquire_shared_capability"}, |
||
15212 | {AttributeCommonInfo::AS_CXX11, "clang::try_acquire_shared_capability"}, |
||
15213 | }; |
||
15214 | static constexpr const char *TryAcquireCapabilityArgNames[] = { |
||
15215 | "SuccessValue","Args...",}; |
||
15216 | struct ParsedAttrInfoTryAcquireCapability final : public ParsedAttrInfo { |
||
15217 | constexpr ParsedAttrInfoTryAcquireCapability() : ParsedAttrInfo( |
||
15218 | /*AttrKind=*/ParsedAttr::AT_TryAcquireCapability, |
||
15219 | /*NumArgs=*/1, |
||
15220 | /*OptArgs=*/15, |
||
15221 | /*NumArgMembers=*/2, |
||
15222 | /*HasCustomParsing=*/0, |
||
15223 | /*AcceptsExprPack=*/0, |
||
15224 | /*IsTargetSpecific=*/0, |
||
15225 | /*IsType=*/0, |
||
15226 | /*IsStmt=*/0, |
||
15227 | /*IsKnownToGCC=*/0, |
||
15228 | /*IsSupportedByPragmaAttribute=*/0, |
||
15229 | /*Spellings=*/TryAcquireCapabilitySpellings, |
||
15230 | /*ArgNames=*/TryAcquireCapabilityArgNames) {} |
||
15231 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15232 | if (!isa<FunctionDecl>(D)) { |
||
15233 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
15234 | << Attr << "functions"; |
||
15235 | return false; |
||
15236 | } |
||
15237 | return true; |
||
15238 | } |
||
15239 | |||
15240 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15241 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15242 | << AL << St->getBeginLoc(); |
||
15243 | return false; |
||
15244 | } |
||
15245 | |||
15246 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
15247 | enum Spelling { |
||
15248 | GNU_try_acquire_capability = 0, |
||
15249 | CXX11_clang_try_acquire_capability = 1, |
||
15250 | GNU_try_acquire_shared_capability = 2, |
||
15251 | CXX11_clang_try_acquire_shared_capability = 3, |
||
15252 | SpellingNotCalculated = 15 |
||
15253 | |||
15254 | }; |
||
15255 | |||
15256 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
15257 | switch (Idx) { |
||
15258 | default: llvm_unreachable("Unknown spelling list index"); |
||
15259 | case 0: return GNU_try_acquire_capability; |
||
15260 | case 1: return CXX11_clang_try_acquire_capability; |
||
15261 | case 2: return GNU_try_acquire_shared_capability; |
||
15262 | case 3: return CXX11_clang_try_acquire_shared_capability; |
||
15263 | } |
||
15264 | } |
||
15265 | |||
15266 | bool isParamExpr(size_t N) const override { |
||
15267 | return (N == 0) || (N == 1) || false; |
||
15268 | } |
||
15269 | |||
15270 | static const ParsedAttrInfoTryAcquireCapability Instance; |
||
15271 | }; |
||
15272 | const ParsedAttrInfoTryAcquireCapability ParsedAttrInfoTryAcquireCapability::Instance; |
||
15273 | static constexpr ParsedAttrInfo::Spelling TypeNonNullSpellings[] = { |
||
15274 | {AttributeCommonInfo::AS_Keyword, "_Nonnull"}, |
||
15275 | }; |
||
15276 | struct ParsedAttrInfoTypeNonNull final : public ParsedAttrInfo { |
||
15277 | constexpr ParsedAttrInfoTypeNonNull() : ParsedAttrInfo( |
||
15278 | /*AttrKind=*/ParsedAttr::AT_TypeNonNull, |
||
15279 | /*NumArgs=*/0, |
||
15280 | /*OptArgs=*/0, |
||
15281 | /*NumArgMembers=*/0, |
||
15282 | /*HasCustomParsing=*/0, |
||
15283 | /*AcceptsExprPack=*/0, |
||
15284 | /*IsTargetSpecific=*/0, |
||
15285 | /*IsType=*/1, |
||
15286 | /*IsStmt=*/0, |
||
15287 | /*IsKnownToGCC=*/0, |
||
15288 | /*IsSupportedByPragmaAttribute=*/0, |
||
15289 | /*Spellings=*/TypeNonNullSpellings, |
||
15290 | /*ArgNames=*/{}) {} |
||
15291 | bool isParamExpr(size_t N) const override { |
||
15292 | return false; |
||
15293 | } |
||
15294 | |||
15295 | static const ParsedAttrInfoTypeNonNull Instance; |
||
15296 | }; |
||
15297 | const ParsedAttrInfoTypeNonNull ParsedAttrInfoTypeNonNull::Instance; |
||
15298 | static constexpr ParsedAttrInfo::Spelling TypeNullUnspecifiedSpellings[] = { |
||
15299 | {AttributeCommonInfo::AS_Keyword, "_Null_unspecified"}, |
||
15300 | }; |
||
15301 | struct ParsedAttrInfoTypeNullUnspecified final : public ParsedAttrInfo { |
||
15302 | constexpr ParsedAttrInfoTypeNullUnspecified() : ParsedAttrInfo( |
||
15303 | /*AttrKind=*/ParsedAttr::AT_TypeNullUnspecified, |
||
15304 | /*NumArgs=*/0, |
||
15305 | /*OptArgs=*/0, |
||
15306 | /*NumArgMembers=*/0, |
||
15307 | /*HasCustomParsing=*/0, |
||
15308 | /*AcceptsExprPack=*/0, |
||
15309 | /*IsTargetSpecific=*/0, |
||
15310 | /*IsType=*/1, |
||
15311 | /*IsStmt=*/0, |
||
15312 | /*IsKnownToGCC=*/0, |
||
15313 | /*IsSupportedByPragmaAttribute=*/0, |
||
15314 | /*Spellings=*/TypeNullUnspecifiedSpellings, |
||
15315 | /*ArgNames=*/{}) {} |
||
15316 | bool isParamExpr(size_t N) const override { |
||
15317 | return false; |
||
15318 | } |
||
15319 | |||
15320 | static const ParsedAttrInfoTypeNullUnspecified Instance; |
||
15321 | }; |
||
15322 | const ParsedAttrInfoTypeNullUnspecified ParsedAttrInfoTypeNullUnspecified::Instance; |
||
15323 | static constexpr ParsedAttrInfo::Spelling TypeNullableSpellings[] = { |
||
15324 | {AttributeCommonInfo::AS_Keyword, "_Nullable"}, |
||
15325 | }; |
||
15326 | struct ParsedAttrInfoTypeNullable final : public ParsedAttrInfo { |
||
15327 | constexpr ParsedAttrInfoTypeNullable() : ParsedAttrInfo( |
||
15328 | /*AttrKind=*/ParsedAttr::AT_TypeNullable, |
||
15329 | /*NumArgs=*/0, |
||
15330 | /*OptArgs=*/0, |
||
15331 | /*NumArgMembers=*/0, |
||
15332 | /*HasCustomParsing=*/0, |
||
15333 | /*AcceptsExprPack=*/0, |
||
15334 | /*IsTargetSpecific=*/0, |
||
15335 | /*IsType=*/1, |
||
15336 | /*IsStmt=*/0, |
||
15337 | /*IsKnownToGCC=*/0, |
||
15338 | /*IsSupportedByPragmaAttribute=*/0, |
||
15339 | /*Spellings=*/TypeNullableSpellings, |
||
15340 | /*ArgNames=*/{}) {} |
||
15341 | bool isParamExpr(size_t N) const override { |
||
15342 | return false; |
||
15343 | } |
||
15344 | |||
15345 | static const ParsedAttrInfoTypeNullable Instance; |
||
15346 | }; |
||
15347 | const ParsedAttrInfoTypeNullable ParsedAttrInfoTypeNullable::Instance; |
||
15348 | static constexpr ParsedAttrInfo::Spelling TypeNullableResultSpellings[] = { |
||
15349 | {AttributeCommonInfo::AS_Keyword, "_Nullable_result"}, |
||
15350 | }; |
||
15351 | struct ParsedAttrInfoTypeNullableResult final : public ParsedAttrInfo { |
||
15352 | constexpr ParsedAttrInfoTypeNullableResult() : ParsedAttrInfo( |
||
15353 | /*AttrKind=*/ParsedAttr::AT_TypeNullableResult, |
||
15354 | /*NumArgs=*/0, |
||
15355 | /*OptArgs=*/0, |
||
15356 | /*NumArgMembers=*/0, |
||
15357 | /*HasCustomParsing=*/0, |
||
15358 | /*AcceptsExprPack=*/0, |
||
15359 | /*IsTargetSpecific=*/0, |
||
15360 | /*IsType=*/1, |
||
15361 | /*IsStmt=*/0, |
||
15362 | /*IsKnownToGCC=*/0, |
||
15363 | /*IsSupportedByPragmaAttribute=*/0, |
||
15364 | /*Spellings=*/TypeNullableResultSpellings, |
||
15365 | /*ArgNames=*/{}) {} |
||
15366 | bool isParamExpr(size_t N) const override { |
||
15367 | return false; |
||
15368 | } |
||
15369 | |||
15370 | static const ParsedAttrInfoTypeNullableResult Instance; |
||
15371 | }; |
||
15372 | const ParsedAttrInfoTypeNullableResult ParsedAttrInfoTypeNullableResult::Instance; |
||
15373 | static constexpr ParsedAttrInfo::Spelling TypeTagForDatatypeSpellings[] = { |
||
15374 | {AttributeCommonInfo::AS_GNU, "type_tag_for_datatype"}, |
||
15375 | {AttributeCommonInfo::AS_CXX11, "clang::type_tag_for_datatype"}, |
||
15376 | {AttributeCommonInfo::AS_C2x, "clang::type_tag_for_datatype"}, |
||
15377 | }; |
||
15378 | static constexpr const char *TypeTagForDatatypeArgNames[] = { |
||
15379 | "ArgumentKind","MatchingCType","LayoutCompatible","MustBeNull",}; |
||
15380 | struct ParsedAttrInfoTypeTagForDatatype final : public ParsedAttrInfo { |
||
15381 | constexpr ParsedAttrInfoTypeTagForDatatype() : ParsedAttrInfo( |
||
15382 | /*AttrKind=*/ParsedAttr::AT_TypeTagForDatatype, |
||
15383 | /*NumArgs=*/4, |
||
15384 | /*OptArgs=*/0, |
||
15385 | /*NumArgMembers=*/4, |
||
15386 | /*HasCustomParsing=*/1, |
||
15387 | /*AcceptsExprPack=*/0, |
||
15388 | /*IsTargetSpecific=*/0, |
||
15389 | /*IsType=*/0, |
||
15390 | /*IsStmt=*/0, |
||
15391 | /*IsKnownToGCC=*/0, |
||
15392 | /*IsSupportedByPragmaAttribute=*/0, |
||
15393 | /*Spellings=*/TypeTagForDatatypeSpellings, |
||
15394 | /*ArgNames=*/TypeTagForDatatypeArgNames) {} |
||
15395 | bool isParamExpr(size_t N) const override { |
||
15396 | return false; |
||
15397 | } |
||
15398 | |||
15399 | static const ParsedAttrInfoTypeTagForDatatype Instance; |
||
15400 | }; |
||
15401 | const ParsedAttrInfoTypeTagForDatatype ParsedAttrInfoTypeTagForDatatype::Instance; |
||
15402 | static constexpr ParsedAttrInfo::Spelling TypeVisibilitySpellings[] = { |
||
15403 | {AttributeCommonInfo::AS_GNU, "type_visibility"}, |
||
15404 | {AttributeCommonInfo::AS_CXX11, "clang::type_visibility"}, |
||
15405 | {AttributeCommonInfo::AS_C2x, "clang::type_visibility"}, |
||
15406 | }; |
||
15407 | static constexpr const char *TypeVisibilityArgNames[] = { |
||
15408 | "Visibility",}; |
||
15409 | struct ParsedAttrInfoTypeVisibility final : public ParsedAttrInfo { |
||
15410 | constexpr ParsedAttrInfoTypeVisibility() : ParsedAttrInfo( |
||
15411 | /*AttrKind=*/ParsedAttr::AT_TypeVisibility, |
||
15412 | /*NumArgs=*/1, |
||
15413 | /*OptArgs=*/0, |
||
15414 | /*NumArgMembers=*/1, |
||
15415 | /*HasCustomParsing=*/0, |
||
15416 | /*AcceptsExprPack=*/0, |
||
15417 | /*IsTargetSpecific=*/0, |
||
15418 | /*IsType=*/0, |
||
15419 | /*IsStmt=*/0, |
||
15420 | /*IsKnownToGCC=*/0, |
||
15421 | /*IsSupportedByPragmaAttribute=*/0, |
||
15422 | /*Spellings=*/TypeVisibilitySpellings, |
||
15423 | /*ArgNames=*/TypeVisibilityArgNames) {} |
||
15424 | bool isParamExpr(size_t N) const override { |
||
15425 | return false; |
||
15426 | } |
||
15427 | |||
15428 | static const ParsedAttrInfoTypeVisibility Instance; |
||
15429 | }; |
||
15430 | const ParsedAttrInfoTypeVisibility ParsedAttrInfoTypeVisibility::Instance; |
||
15431 | static constexpr ParsedAttrInfo::Spelling UPtrSpellings[] = { |
||
15432 | {AttributeCommonInfo::AS_Keyword, "__uptr"}, |
||
15433 | }; |
||
15434 | struct ParsedAttrInfoUPtr final : public ParsedAttrInfo { |
||
15435 | constexpr ParsedAttrInfoUPtr() : ParsedAttrInfo( |
||
15436 | /*AttrKind=*/ParsedAttr::AT_UPtr, |
||
15437 | /*NumArgs=*/0, |
||
15438 | /*OptArgs=*/0, |
||
15439 | /*NumArgMembers=*/0, |
||
15440 | /*HasCustomParsing=*/0, |
||
15441 | /*AcceptsExprPack=*/0, |
||
15442 | /*IsTargetSpecific=*/0, |
||
15443 | /*IsType=*/1, |
||
15444 | /*IsStmt=*/0, |
||
15445 | /*IsKnownToGCC=*/0, |
||
15446 | /*IsSupportedByPragmaAttribute=*/0, |
||
15447 | /*Spellings=*/UPtrSpellings, |
||
15448 | /*ArgNames=*/{}) {} |
||
15449 | bool isParamExpr(size_t N) const override { |
||
15450 | return false; |
||
15451 | } |
||
15452 | |||
15453 | static const ParsedAttrInfoUPtr Instance; |
||
15454 | }; |
||
15455 | const ParsedAttrInfoUPtr ParsedAttrInfoUPtr::Instance; |
||
15456 | static constexpr ParsedAttrInfo::Spelling UnavailableSpellings[] = { |
||
15457 | {AttributeCommonInfo::AS_GNU, "unavailable"}, |
||
15458 | {AttributeCommonInfo::AS_CXX11, "clang::unavailable"}, |
||
15459 | {AttributeCommonInfo::AS_C2x, "clang::unavailable"}, |
||
15460 | }; |
||
15461 | static constexpr const char *UnavailableArgNames[] = { |
||
15462 | "Message",}; |
||
15463 | struct ParsedAttrInfoUnavailable final : public ParsedAttrInfo { |
||
15464 | constexpr ParsedAttrInfoUnavailable() : ParsedAttrInfo( |
||
15465 | /*AttrKind=*/ParsedAttr::AT_Unavailable, |
||
15466 | /*NumArgs=*/0, |
||
15467 | /*OptArgs=*/1, |
||
15468 | /*NumArgMembers=*/1, |
||
15469 | /*HasCustomParsing=*/0, |
||
15470 | /*AcceptsExprPack=*/0, |
||
15471 | /*IsTargetSpecific=*/0, |
||
15472 | /*IsType=*/0, |
||
15473 | /*IsStmt=*/0, |
||
15474 | /*IsKnownToGCC=*/0, |
||
15475 | /*IsSupportedByPragmaAttribute=*/0, |
||
15476 | /*Spellings=*/UnavailableSpellings, |
||
15477 | /*ArgNames=*/UnavailableArgNames) {} |
||
15478 | bool isParamExpr(size_t N) const override { |
||
15479 | return false; |
||
15480 | } |
||
15481 | |||
15482 | static const ParsedAttrInfoUnavailable Instance; |
||
15483 | }; |
||
15484 | const ParsedAttrInfoUnavailable ParsedAttrInfoUnavailable::Instance; |
||
15485 | static constexpr ParsedAttrInfo::Spelling UninitializedSpellings[] = { |
||
15486 | {AttributeCommonInfo::AS_GNU, "uninitialized"}, |
||
15487 | {AttributeCommonInfo::AS_CXX11, "clang::uninitialized"}, |
||
15488 | }; |
||
15489 | struct ParsedAttrInfoUninitialized final : public ParsedAttrInfo { |
||
15490 | constexpr ParsedAttrInfoUninitialized() : ParsedAttrInfo( |
||
15491 | /*AttrKind=*/ParsedAttr::AT_Uninitialized, |
||
15492 | /*NumArgs=*/0, |
||
15493 | /*OptArgs=*/0, |
||
15494 | /*NumArgMembers=*/0, |
||
15495 | /*HasCustomParsing=*/0, |
||
15496 | /*AcceptsExprPack=*/0, |
||
15497 | /*IsTargetSpecific=*/0, |
||
15498 | /*IsType=*/0, |
||
15499 | /*IsStmt=*/0, |
||
15500 | /*IsKnownToGCC=*/0, |
||
15501 | /*IsSupportedByPragmaAttribute=*/1, |
||
15502 | /*Spellings=*/UninitializedSpellings, |
||
15503 | /*ArgNames=*/{}) {} |
||
15504 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15505 | if (!isLocalVar(D)) { |
||
15506 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15507 | << Attr << "local variables"; |
||
15508 | return false; |
||
15509 | } |
||
15510 | return true; |
||
15511 | } |
||
15512 | |||
15513 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15514 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15515 | << AL << St->getBeginLoc(); |
||
15516 | return false; |
||
15517 | } |
||
15518 | |||
15519 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
15520 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_local, /*IsSupported=*/true)); |
||
15521 | } |
||
15522 | |||
15523 | bool isParamExpr(size_t N) const override { |
||
15524 | return false; |
||
15525 | } |
||
15526 | |||
15527 | static const ParsedAttrInfoUninitialized Instance; |
||
15528 | }; |
||
15529 | const ParsedAttrInfoUninitialized ParsedAttrInfoUninitialized::Instance; |
||
15530 | static constexpr ParsedAttrInfo::Spelling UnlikelySpellings[] = { |
||
15531 | {AttributeCommonInfo::AS_CXX11, "unlikely"}, |
||
15532 | {AttributeCommonInfo::AS_C2x, "clang::unlikely"}, |
||
15533 | }; |
||
15534 | struct ParsedAttrInfoUnlikely final : public ParsedAttrInfo { |
||
15535 | constexpr ParsedAttrInfoUnlikely() : ParsedAttrInfo( |
||
15536 | /*AttrKind=*/ParsedAttr::AT_Unlikely, |
||
15537 | /*NumArgs=*/0, |
||
15538 | /*OptArgs=*/0, |
||
15539 | /*NumArgMembers=*/0, |
||
15540 | /*HasCustomParsing=*/0, |
||
15541 | /*AcceptsExprPack=*/0, |
||
15542 | /*IsTargetSpecific=*/0, |
||
15543 | /*IsType=*/0, |
||
15544 | /*IsStmt=*/1, |
||
15545 | /*IsKnownToGCC=*/0, |
||
15546 | /*IsSupportedByPragmaAttribute=*/0, |
||
15547 | /*Spellings=*/UnlikelySpellings, |
||
15548 | /*ArgNames=*/{}) {} |
||
15549 | using ParsedAttrInfo::diagMutualExclusion; |
||
15550 | |||
15551 | bool isParamExpr(size_t N) const override { |
||
15552 | return false; |
||
15553 | } |
||
15554 | |||
15555 | static const ParsedAttrInfoUnlikely Instance; |
||
15556 | }; |
||
15557 | const ParsedAttrInfoUnlikely ParsedAttrInfoUnlikely::Instance; |
||
15558 | static constexpr ParsedAttrInfo::Spelling UnusedSpellings[] = { |
||
15559 | {AttributeCommonInfo::AS_CXX11, "maybe_unused"}, |
||
15560 | {AttributeCommonInfo::AS_GNU, "unused"}, |
||
15561 | {AttributeCommonInfo::AS_CXX11, "gnu::unused"}, |
||
15562 | {AttributeCommonInfo::AS_C2x, "gnu::unused"}, |
||
15563 | {AttributeCommonInfo::AS_C2x, "maybe_unused"}, |
||
15564 | }; |
||
15565 | struct ParsedAttrInfoUnused final : public ParsedAttrInfo { |
||
15566 | constexpr ParsedAttrInfoUnused() : ParsedAttrInfo( |
||
15567 | /*AttrKind=*/ParsedAttr::AT_Unused, |
||
15568 | /*NumArgs=*/0, |
||
15569 | /*OptArgs=*/0, |
||
15570 | /*NumArgMembers=*/0, |
||
15571 | /*HasCustomParsing=*/0, |
||
15572 | /*AcceptsExprPack=*/0, |
||
15573 | /*IsTargetSpecific=*/0, |
||
15574 | /*IsType=*/0, |
||
15575 | /*IsStmt=*/0, |
||
15576 | /*IsKnownToGCC=*/1, |
||
15577 | /*IsSupportedByPragmaAttribute=*/0, |
||
15578 | /*Spellings=*/UnusedSpellings, |
||
15579 | /*ArgNames=*/{}) {} |
||
15580 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15581 | if (!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)) { |
||
15582 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15583 | << Attr << "variables, non-static data members, types, enums, enumerators, labels, non-static data members, Objective-C methods, functions, and function pointers"; |
||
15584 | return false; |
||
15585 | } |
||
15586 | return true; |
||
15587 | } |
||
15588 | |||
15589 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15590 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15591 | << AL << St->getBeginLoc(); |
||
15592 | return false; |
||
15593 | } |
||
15594 | |||
15595 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
15596 | enum Spelling { |
||
15597 | CXX11_maybe_unused = 0, |
||
15598 | GNU_unused = 1, |
||
15599 | CXX11_gnu_unused = 2, |
||
15600 | C2x_gnu_unused = 3, |
||
15601 | C2x_maybe_unused = 4, |
||
15602 | SpellingNotCalculated = 15 |
||
15603 | |||
15604 | }; |
||
15605 | |||
15606 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
15607 | switch (Idx) { |
||
15608 | default: llvm_unreachable("Unknown spelling list index"); |
||
15609 | case 0: return CXX11_maybe_unused; |
||
15610 | case 1: return GNU_unused; |
||
15611 | case 2: return CXX11_gnu_unused; |
||
15612 | case 3: return C2x_gnu_unused; |
||
15613 | case 4: return C2x_maybe_unused; |
||
15614 | } |
||
15615 | } |
||
15616 | |||
15617 | bool isParamExpr(size_t N) const override { |
||
15618 | return false; |
||
15619 | } |
||
15620 | |||
15621 | static const ParsedAttrInfoUnused Instance; |
||
15622 | }; |
||
15623 | const ParsedAttrInfoUnused ParsedAttrInfoUnused::Instance; |
||
15624 | static constexpr ParsedAttrInfo::Spelling UseHandleSpellings[] = { |
||
15625 | {AttributeCommonInfo::AS_GNU, "use_handle"}, |
||
15626 | {AttributeCommonInfo::AS_CXX11, "clang::use_handle"}, |
||
15627 | {AttributeCommonInfo::AS_C2x, "clang::use_handle"}, |
||
15628 | }; |
||
15629 | static constexpr const char *UseHandleArgNames[] = { |
||
15630 | "HandleType",}; |
||
15631 | struct ParsedAttrInfoUseHandle final : public ParsedAttrInfo { |
||
15632 | constexpr ParsedAttrInfoUseHandle() : ParsedAttrInfo( |
||
15633 | /*AttrKind=*/ParsedAttr::AT_UseHandle, |
||
15634 | /*NumArgs=*/1, |
||
15635 | /*OptArgs=*/0, |
||
15636 | /*NumArgMembers=*/1, |
||
15637 | /*HasCustomParsing=*/0, |
||
15638 | /*AcceptsExprPack=*/0, |
||
15639 | /*IsTargetSpecific=*/0, |
||
15640 | /*IsType=*/0, |
||
15641 | /*IsStmt=*/0, |
||
15642 | /*IsKnownToGCC=*/0, |
||
15643 | /*IsSupportedByPragmaAttribute=*/1, |
||
15644 | /*Spellings=*/UseHandleSpellings, |
||
15645 | /*ArgNames=*/UseHandleArgNames) {} |
||
15646 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15647 | if (!isa<ParmVarDecl>(D)) { |
||
15648 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15649 | << Attr << "parameters"; |
||
15650 | return false; |
||
15651 | } |
||
15652 | return true; |
||
15653 | } |
||
15654 | |||
15655 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15656 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15657 | << AL << St->getBeginLoc(); |
||
15658 | return false; |
||
15659 | } |
||
15660 | |||
15661 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
15662 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true)); |
||
15663 | } |
||
15664 | |||
15665 | bool isParamExpr(size_t N) const override { |
||
15666 | return false; |
||
15667 | } |
||
15668 | |||
15669 | static const ParsedAttrInfoUseHandle Instance; |
||
15670 | }; |
||
15671 | const ParsedAttrInfoUseHandle ParsedAttrInfoUseHandle::Instance; |
||
15672 | static constexpr ParsedAttrInfo::Spelling UsedSpellings[] = { |
||
15673 | {AttributeCommonInfo::AS_GNU, "used"}, |
||
15674 | {AttributeCommonInfo::AS_CXX11, "gnu::used"}, |
||
15675 | {AttributeCommonInfo::AS_C2x, "gnu::used"}, |
||
15676 | }; |
||
15677 | struct ParsedAttrInfoUsed final : public ParsedAttrInfo { |
||
15678 | constexpr ParsedAttrInfoUsed() : ParsedAttrInfo( |
||
15679 | /*AttrKind=*/ParsedAttr::AT_Used, |
||
15680 | /*NumArgs=*/0, |
||
15681 | /*OptArgs=*/0, |
||
15682 | /*NumArgMembers=*/0, |
||
15683 | /*HasCustomParsing=*/0, |
||
15684 | /*AcceptsExprPack=*/0, |
||
15685 | /*IsTargetSpecific=*/0, |
||
15686 | /*IsType=*/0, |
||
15687 | /*IsStmt=*/0, |
||
15688 | /*IsKnownToGCC=*/1, |
||
15689 | /*IsSupportedByPragmaAttribute=*/0, |
||
15690 | /*Spellings=*/UsedSpellings, |
||
15691 | /*ArgNames=*/{}) {} |
||
15692 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15693 | if (!isNonLocalVar(D) && !isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
15694 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15695 | << Attr << "variables with non-local storage, functions, and Objective-C methods"; |
||
15696 | return false; |
||
15697 | } |
||
15698 | return true; |
||
15699 | } |
||
15700 | |||
15701 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15702 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15703 | << AL << St->getBeginLoc(); |
||
15704 | return false; |
||
15705 | } |
||
15706 | |||
15707 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
15708 | D->addAttr(::new (S.Context) UsedAttr(S.Context, Attr)); |
||
15709 | return AttributeApplied; |
||
15710 | } |
||
15711 | |||
15712 | bool isParamExpr(size_t N) const override { |
||
15713 | return false; |
||
15714 | } |
||
15715 | |||
15716 | static const ParsedAttrInfoUsed Instance; |
||
15717 | }; |
||
15718 | const ParsedAttrInfoUsed ParsedAttrInfoUsed::Instance; |
||
15719 | static constexpr ParsedAttrInfo::Spelling UsingIfExistsSpellings[] = { |
||
15720 | {AttributeCommonInfo::AS_GNU, "using_if_exists"}, |
||
15721 | {AttributeCommonInfo::AS_CXX11, "clang::using_if_exists"}, |
||
15722 | }; |
||
15723 | struct ParsedAttrInfoUsingIfExists final : public ParsedAttrInfo { |
||
15724 | constexpr ParsedAttrInfoUsingIfExists() : ParsedAttrInfo( |
||
15725 | /*AttrKind=*/ParsedAttr::AT_UsingIfExists, |
||
15726 | /*NumArgs=*/0, |
||
15727 | /*OptArgs=*/0, |
||
15728 | /*NumArgMembers=*/0, |
||
15729 | /*HasCustomParsing=*/0, |
||
15730 | /*AcceptsExprPack=*/0, |
||
15731 | /*IsTargetSpecific=*/0, |
||
15732 | /*IsType=*/0, |
||
15733 | /*IsStmt=*/0, |
||
15734 | /*IsKnownToGCC=*/0, |
||
15735 | /*IsSupportedByPragmaAttribute=*/0, |
||
15736 | /*Spellings=*/UsingIfExistsSpellings, |
||
15737 | /*ArgNames=*/{}) {} |
||
15738 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15739 | if (!isa<UsingDecl>(D) && !isa<UnresolvedUsingTypenameDecl>(D) && !isa<UnresolvedUsingValueDecl>(D)) { |
||
15740 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
15741 | << Attr << "named declarations, types, and value declarations"; |
||
15742 | return false; |
||
15743 | } |
||
15744 | return true; |
||
15745 | } |
||
15746 | |||
15747 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15748 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15749 | << AL << St->getBeginLoc(); |
||
15750 | return false; |
||
15751 | } |
||
15752 | |||
15753 | bool isParamExpr(size_t N) const override { |
||
15754 | return false; |
||
15755 | } |
||
15756 | |||
15757 | static const ParsedAttrInfoUsingIfExists Instance; |
||
15758 | }; |
||
15759 | const ParsedAttrInfoUsingIfExists ParsedAttrInfoUsingIfExists::Instance; |
||
15760 | static constexpr ParsedAttrInfo::Spelling UuidSpellings[] = { |
||
15761 | {AttributeCommonInfo::AS_Declspec, "uuid"}, |
||
15762 | {AttributeCommonInfo::AS_Microsoft, "uuid"}, |
||
15763 | }; |
||
15764 | static constexpr const char *UuidArgNames[] = { |
||
15765 | "Guid",}; |
||
15766 | struct ParsedAttrInfoUuid final : public ParsedAttrInfo { |
||
15767 | constexpr ParsedAttrInfoUuid() : ParsedAttrInfo( |
||
15768 | /*AttrKind=*/ParsedAttr::AT_Uuid, |
||
15769 | /*NumArgs=*/1, |
||
15770 | /*OptArgs=*/0, |
||
15771 | /*NumArgMembers=*/1, |
||
15772 | /*HasCustomParsing=*/0, |
||
15773 | /*AcceptsExprPack=*/0, |
||
15774 | /*IsTargetSpecific=*/0, |
||
15775 | /*IsType=*/0, |
||
15776 | /*IsStmt=*/0, |
||
15777 | /*IsKnownToGCC=*/0, |
||
15778 | /*IsSupportedByPragmaAttribute=*/0, |
||
15779 | /*Spellings=*/UuidSpellings, |
||
15780 | /*ArgNames=*/UuidArgNames) {} |
||
15781 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15782 | if (!isa<RecordDecl>(D) && !isa<EnumDecl>(D)) { |
||
15783 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
15784 | << Attr << "structs, unions, classes, and enums"; |
||
15785 | return false; |
||
15786 | } |
||
15787 | return true; |
||
15788 | } |
||
15789 | |||
15790 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15791 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15792 | << AL << St->getBeginLoc(); |
||
15793 | return false; |
||
15794 | } |
||
15795 | |||
15796 | bool acceptsLangOpts(const LangOptions &LangOpts) const override { |
||
15797 | return LangOpts.MicrosoftExt || LangOpts.Borland; |
||
15798 | } |
||
15799 | |||
15800 | bool isParamExpr(size_t N) const override { |
||
15801 | return false; |
||
15802 | } |
||
15803 | |||
15804 | static const ParsedAttrInfoUuid Instance; |
||
15805 | }; |
||
15806 | const ParsedAttrInfoUuid ParsedAttrInfoUuid::Instance; |
||
15807 | static constexpr ParsedAttrInfo::Spelling VecReturnSpellings[] = { |
||
15808 | {AttributeCommonInfo::AS_GNU, "vecreturn"}, |
||
15809 | {AttributeCommonInfo::AS_CXX11, "clang::vecreturn"}, |
||
15810 | }; |
||
15811 | struct ParsedAttrInfoVecReturn final : public ParsedAttrInfo { |
||
15812 | constexpr ParsedAttrInfoVecReturn() : ParsedAttrInfo( |
||
15813 | /*AttrKind=*/ParsedAttr::AT_VecReturn, |
||
15814 | /*NumArgs=*/0, |
||
15815 | /*OptArgs=*/0, |
||
15816 | /*NumArgMembers=*/0, |
||
15817 | /*HasCustomParsing=*/0, |
||
15818 | /*AcceptsExprPack=*/0, |
||
15819 | /*IsTargetSpecific=*/0, |
||
15820 | /*IsType=*/0, |
||
15821 | /*IsStmt=*/0, |
||
15822 | /*IsKnownToGCC=*/0, |
||
15823 | /*IsSupportedByPragmaAttribute=*/1, |
||
15824 | /*Spellings=*/VecReturnSpellings, |
||
15825 | /*ArgNames=*/{}) {} |
||
15826 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15827 | if (!isa<CXXRecordDecl>(D)) { |
||
15828 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
15829 | << Attr << "classes"; |
||
15830 | return false; |
||
15831 | } |
||
15832 | return true; |
||
15833 | } |
||
15834 | |||
15835 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15836 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15837 | << AL << St->getBeginLoc(); |
||
15838 | return false; |
||
15839 | } |
||
15840 | |||
15841 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
15842 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
15843 | } |
||
15844 | |||
15845 | bool isParamExpr(size_t N) const override { |
||
15846 | return false; |
||
15847 | } |
||
15848 | |||
15849 | static const ParsedAttrInfoVecReturn Instance; |
||
15850 | }; |
||
15851 | const ParsedAttrInfoVecReturn ParsedAttrInfoVecReturn::Instance; |
||
15852 | static constexpr ParsedAttrInfo::Spelling VecTypeHintSpellings[] = { |
||
15853 | {AttributeCommonInfo::AS_GNU, "vec_type_hint"}, |
||
15854 | }; |
||
15855 | static constexpr const char *VecTypeHintArgNames[] = { |
||
15856 | "TypeHint",}; |
||
15857 | struct ParsedAttrInfoVecTypeHint final : public ParsedAttrInfo { |
||
15858 | constexpr ParsedAttrInfoVecTypeHint() : ParsedAttrInfo( |
||
15859 | /*AttrKind=*/ParsedAttr::AT_VecTypeHint, |
||
15860 | /*NumArgs=*/1, |
||
15861 | /*OptArgs=*/0, |
||
15862 | /*NumArgMembers=*/1, |
||
15863 | /*HasCustomParsing=*/0, |
||
15864 | /*AcceptsExprPack=*/0, |
||
15865 | /*IsTargetSpecific=*/0, |
||
15866 | /*IsType=*/0, |
||
15867 | /*IsStmt=*/0, |
||
15868 | /*IsKnownToGCC=*/0, |
||
15869 | /*IsSupportedByPragmaAttribute=*/1, |
||
15870 | /*Spellings=*/VecTypeHintSpellings, |
||
15871 | /*ArgNames=*/VecTypeHintArgNames) {} |
||
15872 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
15873 | if (!isa<FunctionDecl>(D)) { |
||
15874 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
15875 | << Attr << "functions"; |
||
15876 | return false; |
||
15877 | } |
||
15878 | return true; |
||
15879 | } |
||
15880 | |||
15881 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
15882 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
15883 | << AL << St->getBeginLoc(); |
||
15884 | return false; |
||
15885 | } |
||
15886 | |||
15887 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
15888 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
15889 | } |
||
15890 | |||
15891 | bool isParamExpr(size_t N) const override { |
||
15892 | return false; |
||
15893 | } |
||
15894 | |||
15895 | static const ParsedAttrInfoVecTypeHint Instance; |
||
15896 | }; |
||
15897 | const ParsedAttrInfoVecTypeHint ParsedAttrInfoVecTypeHint::Instance; |
||
15898 | static constexpr ParsedAttrInfo::Spelling VectorCallSpellings[] = { |
||
15899 | {AttributeCommonInfo::AS_GNU, "vectorcall"}, |
||
15900 | {AttributeCommonInfo::AS_CXX11, "clang::vectorcall"}, |
||
15901 | {AttributeCommonInfo::AS_C2x, "clang::vectorcall"}, |
||
15902 | {AttributeCommonInfo::AS_Keyword, "__vectorcall"}, |
||
15903 | {AttributeCommonInfo::AS_Keyword, "_vectorcall"}, |
||
15904 | }; |
||
15905 | struct ParsedAttrInfoVectorCall final : public ParsedAttrInfo { |
||
15906 | constexpr ParsedAttrInfoVectorCall() : ParsedAttrInfo( |
||
15907 | /*AttrKind=*/ParsedAttr::AT_VectorCall, |
||
15908 | /*NumArgs=*/0, |
||
15909 | /*OptArgs=*/0, |
||
15910 | /*NumArgMembers=*/0, |
||
15911 | /*HasCustomParsing=*/0, |
||
15912 | /*AcceptsExprPack=*/0, |
||
15913 | /*IsTargetSpecific=*/0, |
||
15914 | /*IsType=*/1, |
||
15915 | /*IsStmt=*/0, |
||
15916 | /*IsKnownToGCC=*/0, |
||
15917 | /*IsSupportedByPragmaAttribute=*/0, |
||
15918 | /*Spellings=*/VectorCallSpellings, |
||
15919 | /*ArgNames=*/{}) {} |
||
15920 | bool isParamExpr(size_t N) const override { |
||
15921 | return false; |
||
15922 | } |
||
15923 | |||
15924 | static const ParsedAttrInfoVectorCall Instance; |
||
15925 | }; |
||
15926 | const ParsedAttrInfoVectorCall ParsedAttrInfoVectorCall::Instance; |
||
15927 | static constexpr ParsedAttrInfo::Spelling VectorSizeSpellings[] = { |
||
15928 | {AttributeCommonInfo::AS_GNU, "vector_size"}, |
||
15929 | {AttributeCommonInfo::AS_CXX11, "gnu::vector_size"}, |
||
15930 | {AttributeCommonInfo::AS_C2x, "gnu::vector_size"}, |
||
15931 | }; |
||
15932 | static constexpr const char *VectorSizeArgNames[] = { |
||
15933 | "NumBytes",}; |
||
15934 | struct ParsedAttrInfoVectorSize final : public ParsedAttrInfo { |
||
15935 | constexpr ParsedAttrInfoVectorSize() : ParsedAttrInfo( |
||
15936 | /*AttrKind=*/ParsedAttr::AT_VectorSize, |
||
15937 | /*NumArgs=*/1, |
||
15938 | /*OptArgs=*/0, |
||
15939 | /*NumArgMembers=*/1, |
||
15940 | /*HasCustomParsing=*/0, |
||
15941 | /*AcceptsExprPack=*/0, |
||
15942 | /*IsTargetSpecific=*/0, |
||
15943 | /*IsType=*/1, |
||
15944 | /*IsStmt=*/0, |
||
15945 | /*IsKnownToGCC=*/1, |
||
15946 | /*IsSupportedByPragmaAttribute=*/0, |
||
15947 | /*Spellings=*/VectorSizeSpellings, |
||
15948 | /*ArgNames=*/VectorSizeArgNames) {} |
||
15949 | bool isParamExpr(size_t N) const override { |
||
15950 | return (N == 0) || false; |
||
15951 | } |
||
15952 | |||
15953 | static const ParsedAttrInfoVectorSize Instance; |
||
15954 | }; |
||
15955 | const ParsedAttrInfoVectorSize ParsedAttrInfoVectorSize::Instance; |
||
15956 | static constexpr ParsedAttrInfo::Spelling VisibilitySpellings[] = { |
||
15957 | {AttributeCommonInfo::AS_GNU, "visibility"}, |
||
15958 | {AttributeCommonInfo::AS_CXX11, "gnu::visibility"}, |
||
15959 | {AttributeCommonInfo::AS_C2x, "gnu::visibility"}, |
||
15960 | }; |
||
15961 | static constexpr const char *VisibilityArgNames[] = { |
||
15962 | "Visibility",}; |
||
15963 | struct ParsedAttrInfoVisibility final : public ParsedAttrInfo { |
||
15964 | constexpr ParsedAttrInfoVisibility() : ParsedAttrInfo( |
||
15965 | /*AttrKind=*/ParsedAttr::AT_Visibility, |
||
15966 | /*NumArgs=*/1, |
||
15967 | /*OptArgs=*/0, |
||
15968 | /*NumArgMembers=*/1, |
||
15969 | /*HasCustomParsing=*/0, |
||
15970 | /*AcceptsExprPack=*/0, |
||
15971 | /*IsTargetSpecific=*/0, |
||
15972 | /*IsType=*/0, |
||
15973 | /*IsStmt=*/0, |
||
15974 | /*IsKnownToGCC=*/1, |
||
15975 | /*IsSupportedByPragmaAttribute=*/0, |
||
15976 | /*Spellings=*/VisibilitySpellings, |
||
15977 | /*ArgNames=*/VisibilityArgNames) {} |
||
15978 | bool isParamExpr(size_t N) const override { |
||
15979 | return false; |
||
15980 | } |
||
15981 | |||
15982 | static const ParsedAttrInfoVisibility Instance; |
||
15983 | }; |
||
15984 | const ParsedAttrInfoVisibility ParsedAttrInfoVisibility::Instance; |
||
15985 | static constexpr ParsedAttrInfo::Spelling WarnUnusedSpellings[] = { |
||
15986 | {AttributeCommonInfo::AS_GNU, "warn_unused"}, |
||
15987 | {AttributeCommonInfo::AS_CXX11, "gnu::warn_unused"}, |
||
15988 | {AttributeCommonInfo::AS_C2x, "gnu::warn_unused"}, |
||
15989 | }; |
||
15990 | struct ParsedAttrInfoWarnUnused final : public ParsedAttrInfo { |
||
15991 | constexpr ParsedAttrInfoWarnUnused() : ParsedAttrInfo( |
||
15992 | /*AttrKind=*/ParsedAttr::AT_WarnUnused, |
||
15993 | /*NumArgs=*/0, |
||
15994 | /*OptArgs=*/0, |
||
15995 | /*NumArgMembers=*/0, |
||
15996 | /*HasCustomParsing=*/0, |
||
15997 | /*AcceptsExprPack=*/0, |
||
15998 | /*IsTargetSpecific=*/0, |
||
15999 | /*IsType=*/0, |
||
16000 | /*IsStmt=*/0, |
||
16001 | /*IsKnownToGCC=*/1, |
||
16002 | /*IsSupportedByPragmaAttribute=*/1, |
||
16003 | /*Spellings=*/WarnUnusedSpellings, |
||
16004 | /*ArgNames=*/{}) {} |
||
16005 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16006 | if (!isa<RecordDecl>(D)) { |
||
16007 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
16008 | << Attr << "structs, unions, and classes"; |
||
16009 | return false; |
||
16010 | } |
||
16011 | return true; |
||
16012 | } |
||
16013 | |||
16014 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16015 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16016 | << AL << St->getBeginLoc(); |
||
16017 | return false; |
||
16018 | } |
||
16019 | |||
16020 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16021 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
16022 | } |
||
16023 | |||
16024 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
16025 | D->addAttr(::new (S.Context) WarnUnusedAttr(S.Context, Attr)); |
||
16026 | return AttributeApplied; |
||
16027 | } |
||
16028 | |||
16029 | bool isParamExpr(size_t N) const override { |
||
16030 | return false; |
||
16031 | } |
||
16032 | |||
16033 | static const ParsedAttrInfoWarnUnused Instance; |
||
16034 | }; |
||
16035 | const ParsedAttrInfoWarnUnused ParsedAttrInfoWarnUnused::Instance; |
||
16036 | static constexpr ParsedAttrInfo::Spelling WarnUnusedResultSpellings[] = { |
||
16037 | {AttributeCommonInfo::AS_CXX11, "nodiscard"}, |
||
16038 | {AttributeCommonInfo::AS_C2x, "nodiscard"}, |
||
16039 | {AttributeCommonInfo::AS_CXX11, "clang::warn_unused_result"}, |
||
16040 | {AttributeCommonInfo::AS_GNU, "warn_unused_result"}, |
||
16041 | {AttributeCommonInfo::AS_CXX11, "gnu::warn_unused_result"}, |
||
16042 | {AttributeCommonInfo::AS_C2x, "gnu::warn_unused_result"}, |
||
16043 | }; |
||
16044 | static constexpr const char *WarnUnusedResultArgNames[] = { |
||
16045 | "Message",}; |
||
16046 | struct ParsedAttrInfoWarnUnusedResult final : public ParsedAttrInfo { |
||
16047 | constexpr ParsedAttrInfoWarnUnusedResult() : ParsedAttrInfo( |
||
16048 | /*AttrKind=*/ParsedAttr::AT_WarnUnusedResult, |
||
16049 | /*NumArgs=*/0, |
||
16050 | /*OptArgs=*/1, |
||
16051 | /*NumArgMembers=*/1, |
||
16052 | /*HasCustomParsing=*/0, |
||
16053 | /*AcceptsExprPack=*/0, |
||
16054 | /*IsTargetSpecific=*/0, |
||
16055 | /*IsType=*/0, |
||
16056 | /*IsStmt=*/0, |
||
16057 | /*IsKnownToGCC=*/1, |
||
16058 | /*IsSupportedByPragmaAttribute=*/1, |
||
16059 | /*Spellings=*/WarnUnusedResultSpellings, |
||
16060 | /*ArgNames=*/WarnUnusedResultArgNames) {} |
||
16061 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16062 | if (!isa<ObjCMethodDecl>(D) && !isa<EnumDecl>(D) && !isa<RecordDecl>(D) && !isFunctionLike(D) && !isa<TypedefNameDecl>(D)) { |
||
16063 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
16064 | << Attr << "Objective-C methods, enums, structs, unions, classes, functions, function pointers, and typedefs"; |
||
16065 | return false; |
||
16066 | } |
||
16067 | return true; |
||
16068 | } |
||
16069 | |||
16070 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16071 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16072 | << AL << St->getBeginLoc(); |
||
16073 | return false; |
||
16074 | } |
||
16075 | |||
16076 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
16077 | enum Spelling { |
||
16078 | CXX11_nodiscard = 0, |
||
16079 | C2x_nodiscard = 1, |
||
16080 | CXX11_clang_warn_unused_result = 2, |
||
16081 | GNU_warn_unused_result = 3, |
||
16082 | CXX11_gnu_warn_unused_result = 4, |
||
16083 | C2x_gnu_warn_unused_result = 5, |
||
16084 | SpellingNotCalculated = 15 |
||
16085 | |||
16086 | }; |
||
16087 | |||
16088 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
16089 | switch (Idx) { |
||
16090 | default: llvm_unreachable("Unknown spelling list index"); |
||
16091 | case 0: return CXX11_nodiscard; |
||
16092 | case 1: return C2x_nodiscard; |
||
16093 | case 2: return CXX11_clang_warn_unused_result; |
||
16094 | case 3: return GNU_warn_unused_result; |
||
16095 | case 4: return CXX11_gnu_warn_unused_result; |
||
16096 | case 5: return C2x_gnu_warn_unused_result; |
||
16097 | } |
||
16098 | } |
||
16099 | |||
16100 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16101 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
16102 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true)); |
||
16103 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
16104 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true)); |
||
16105 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true)); |
||
16106 | } |
||
16107 | |||
16108 | bool isParamExpr(size_t N) const override { |
||
16109 | return false; |
||
16110 | } |
||
16111 | |||
16112 | static const ParsedAttrInfoWarnUnusedResult Instance; |
||
16113 | }; |
||
16114 | const ParsedAttrInfoWarnUnusedResult ParsedAttrInfoWarnUnusedResult::Instance; |
||
16115 | static constexpr ParsedAttrInfo::Spelling WeakSpellings[] = { |
||
16116 | {AttributeCommonInfo::AS_GNU, "weak"}, |
||
16117 | {AttributeCommonInfo::AS_CXX11, "gnu::weak"}, |
||
16118 | {AttributeCommonInfo::AS_C2x, "gnu::weak"}, |
||
16119 | }; |
||
16120 | struct ParsedAttrInfoWeak final : public ParsedAttrInfo { |
||
16121 | constexpr ParsedAttrInfoWeak() : ParsedAttrInfo( |
||
16122 | /*AttrKind=*/ParsedAttr::AT_Weak, |
||
16123 | /*NumArgs=*/0, |
||
16124 | /*OptArgs=*/0, |
||
16125 | /*NumArgMembers=*/0, |
||
16126 | /*HasCustomParsing=*/0, |
||
16127 | /*AcceptsExprPack=*/0, |
||
16128 | /*IsTargetSpecific=*/0, |
||
16129 | /*IsType=*/0, |
||
16130 | /*IsStmt=*/0, |
||
16131 | /*IsKnownToGCC=*/1, |
||
16132 | /*IsSupportedByPragmaAttribute=*/1, |
||
16133 | /*Spellings=*/WeakSpellings, |
||
16134 | /*ArgNames=*/{}) {} |
||
16135 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16136 | if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) { |
||
16137 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
16138 | << Attr << "variables, functions, and classes"; |
||
16139 | return false; |
||
16140 | } |
||
16141 | return true; |
||
16142 | } |
||
16143 | |||
16144 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16145 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16146 | << AL << St->getBeginLoc(); |
||
16147 | return false; |
||
16148 | } |
||
16149 | |||
16150 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16151 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
16152 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16153 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true)); |
||
16154 | } |
||
16155 | |||
16156 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
16157 | D->addAttr(::new (S.Context) WeakAttr(S.Context, Attr)); |
||
16158 | return AttributeApplied; |
||
16159 | } |
||
16160 | |||
16161 | bool isParamExpr(size_t N) const override { |
||
16162 | return false; |
||
16163 | } |
||
16164 | |||
16165 | static const ParsedAttrInfoWeak Instance; |
||
16166 | }; |
||
16167 | const ParsedAttrInfoWeak ParsedAttrInfoWeak::Instance; |
||
16168 | static constexpr ParsedAttrInfo::Spelling WeakImportSpellings[] = { |
||
16169 | {AttributeCommonInfo::AS_GNU, "weak_import"}, |
||
16170 | {AttributeCommonInfo::AS_CXX11, "clang::weak_import"}, |
||
16171 | {AttributeCommonInfo::AS_C2x, "clang::weak_import"}, |
||
16172 | }; |
||
16173 | struct ParsedAttrInfoWeakImport final : public ParsedAttrInfo { |
||
16174 | constexpr ParsedAttrInfoWeakImport() : ParsedAttrInfo( |
||
16175 | /*AttrKind=*/ParsedAttr::AT_WeakImport, |
||
16176 | /*NumArgs=*/0, |
||
16177 | /*OptArgs=*/0, |
||
16178 | /*NumArgMembers=*/0, |
||
16179 | /*HasCustomParsing=*/0, |
||
16180 | /*AcceptsExprPack=*/0, |
||
16181 | /*IsTargetSpecific=*/0, |
||
16182 | /*IsType=*/0, |
||
16183 | /*IsStmt=*/0, |
||
16184 | /*IsKnownToGCC=*/0, |
||
16185 | /*IsSupportedByPragmaAttribute=*/0, |
||
16186 | /*Spellings=*/WeakImportSpellings, |
||
16187 | /*ArgNames=*/{}) {} |
||
16188 | bool isParamExpr(size_t N) const override { |
||
16189 | return false; |
||
16190 | } |
||
16191 | |||
16192 | static const ParsedAttrInfoWeakImport Instance; |
||
16193 | }; |
||
16194 | const ParsedAttrInfoWeakImport ParsedAttrInfoWeakImport::Instance; |
||
16195 | static constexpr ParsedAttrInfo::Spelling WeakRefSpellings[] = { |
||
16196 | {AttributeCommonInfo::AS_GNU, "weakref"}, |
||
16197 | {AttributeCommonInfo::AS_CXX11, "gnu::weakref"}, |
||
16198 | {AttributeCommonInfo::AS_C2x, "gnu::weakref"}, |
||
16199 | }; |
||
16200 | static constexpr const char *WeakRefArgNames[] = { |
||
16201 | "Aliasee",}; |
||
16202 | struct ParsedAttrInfoWeakRef final : public ParsedAttrInfo { |
||
16203 | constexpr ParsedAttrInfoWeakRef() : ParsedAttrInfo( |
||
16204 | /*AttrKind=*/ParsedAttr::AT_WeakRef, |
||
16205 | /*NumArgs=*/0, |
||
16206 | /*OptArgs=*/1, |
||
16207 | /*NumArgMembers=*/1, |
||
16208 | /*HasCustomParsing=*/0, |
||
16209 | /*AcceptsExprPack=*/0, |
||
16210 | /*IsTargetSpecific=*/0, |
||
16211 | /*IsType=*/0, |
||
16212 | /*IsStmt=*/0, |
||
16213 | /*IsKnownToGCC=*/1, |
||
16214 | /*IsSupportedByPragmaAttribute=*/1, |
||
16215 | /*Spellings=*/WeakRefSpellings, |
||
16216 | /*ArgNames=*/WeakRefArgNames) {} |
||
16217 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16218 | if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) { |
||
16219 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
16220 | << Attr << "variables and functions"; |
||
16221 | return false; |
||
16222 | } |
||
16223 | return true; |
||
16224 | } |
||
16225 | |||
16226 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16227 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16228 | << AL << St->getBeginLoc(); |
||
16229 | return false; |
||
16230 | } |
||
16231 | |||
16232 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16233 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true)); |
||
16234 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16235 | } |
||
16236 | |||
16237 | bool isParamExpr(size_t N) const override { |
||
16238 | return false; |
||
16239 | } |
||
16240 | |||
16241 | static const ParsedAttrInfoWeakRef Instance; |
||
16242 | }; |
||
16243 | const ParsedAttrInfoWeakRef ParsedAttrInfoWeakRef::Instance; |
||
16244 | static constexpr ParsedAttrInfo::Spelling WebAssemblyExportNameSpellings[] = { |
||
16245 | {AttributeCommonInfo::AS_GNU, "export_name"}, |
||
16246 | {AttributeCommonInfo::AS_CXX11, "clang::export_name"}, |
||
16247 | {AttributeCommonInfo::AS_C2x, "clang::export_name"}, |
||
16248 | }; |
||
16249 | static constexpr const char *WebAssemblyExportNameArgNames[] = { |
||
16250 | "ExportName",}; |
||
16251 | struct ParsedAttrInfoWebAssemblyExportName final : public ParsedAttrInfo { |
||
16252 | constexpr ParsedAttrInfoWebAssemblyExportName() : ParsedAttrInfo( |
||
16253 | /*AttrKind=*/ParsedAttr::AT_WebAssemblyExportName, |
||
16254 | /*NumArgs=*/1, |
||
16255 | /*OptArgs=*/0, |
||
16256 | /*NumArgMembers=*/1, |
||
16257 | /*HasCustomParsing=*/0, |
||
16258 | /*AcceptsExprPack=*/0, |
||
16259 | /*IsTargetSpecific=*/1, |
||
16260 | /*IsType=*/0, |
||
16261 | /*IsStmt=*/0, |
||
16262 | /*IsKnownToGCC=*/0, |
||
16263 | /*IsSupportedByPragmaAttribute=*/1, |
||
16264 | /*Spellings=*/WebAssemblyExportNameSpellings, |
||
16265 | /*ArgNames=*/WebAssemblyExportNameArgNames) {} |
||
16266 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16267 | if (!isa<FunctionDecl>(D)) { |
||
16268 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
16269 | << Attr << "functions"; |
||
16270 | return false; |
||
16271 | } |
||
16272 | return true; |
||
16273 | } |
||
16274 | |||
16275 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16276 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16277 | << AL << St->getBeginLoc(); |
||
16278 | return false; |
||
16279 | } |
||
16280 | |||
16281 | bool existsInTarget(const TargetInfo &Target) const override { |
||
16282 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
16283 | return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64); |
||
16284 | } |
||
16285 | |||
16286 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16287 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16288 | } |
||
16289 | |||
16290 | bool isParamExpr(size_t N) const override { |
||
16291 | return false; |
||
16292 | } |
||
16293 | |||
16294 | static const ParsedAttrInfoWebAssemblyExportName Instance; |
||
16295 | }; |
||
16296 | const ParsedAttrInfoWebAssemblyExportName ParsedAttrInfoWebAssemblyExportName::Instance; |
||
16297 | static constexpr ParsedAttrInfo::Spelling WebAssemblyImportModuleSpellings[] = { |
||
16298 | {AttributeCommonInfo::AS_GNU, "import_module"}, |
||
16299 | {AttributeCommonInfo::AS_CXX11, "clang::import_module"}, |
||
16300 | {AttributeCommonInfo::AS_C2x, "clang::import_module"}, |
||
16301 | }; |
||
16302 | static constexpr const char *WebAssemblyImportModuleArgNames[] = { |
||
16303 | "ImportModule",}; |
||
16304 | struct ParsedAttrInfoWebAssemblyImportModule final : public ParsedAttrInfo { |
||
16305 | constexpr ParsedAttrInfoWebAssemblyImportModule() : ParsedAttrInfo( |
||
16306 | /*AttrKind=*/ParsedAttr::AT_WebAssemblyImportModule, |
||
16307 | /*NumArgs=*/1, |
||
16308 | /*OptArgs=*/0, |
||
16309 | /*NumArgMembers=*/1, |
||
16310 | /*HasCustomParsing=*/0, |
||
16311 | /*AcceptsExprPack=*/0, |
||
16312 | /*IsTargetSpecific=*/1, |
||
16313 | /*IsType=*/0, |
||
16314 | /*IsStmt=*/0, |
||
16315 | /*IsKnownToGCC=*/0, |
||
16316 | /*IsSupportedByPragmaAttribute=*/1, |
||
16317 | /*Spellings=*/WebAssemblyImportModuleSpellings, |
||
16318 | /*ArgNames=*/WebAssemblyImportModuleArgNames) {} |
||
16319 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16320 | if (!isa<FunctionDecl>(D)) { |
||
16321 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
16322 | << Attr << "functions"; |
||
16323 | return false; |
||
16324 | } |
||
16325 | return true; |
||
16326 | } |
||
16327 | |||
16328 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16329 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16330 | << AL << St->getBeginLoc(); |
||
16331 | return false; |
||
16332 | } |
||
16333 | |||
16334 | bool existsInTarget(const TargetInfo &Target) const override { |
||
16335 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
16336 | return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64); |
||
16337 | } |
||
16338 | |||
16339 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16340 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16341 | } |
||
16342 | |||
16343 | bool isParamExpr(size_t N) const override { |
||
16344 | return false; |
||
16345 | } |
||
16346 | |||
16347 | static const ParsedAttrInfoWebAssemblyImportModule Instance; |
||
16348 | }; |
||
16349 | const ParsedAttrInfoWebAssemblyImportModule ParsedAttrInfoWebAssemblyImportModule::Instance; |
||
16350 | static constexpr ParsedAttrInfo::Spelling WebAssemblyImportNameSpellings[] = { |
||
16351 | {AttributeCommonInfo::AS_GNU, "import_name"}, |
||
16352 | {AttributeCommonInfo::AS_CXX11, "clang::import_name"}, |
||
16353 | {AttributeCommonInfo::AS_C2x, "clang::import_name"}, |
||
16354 | }; |
||
16355 | static constexpr const char *WebAssemblyImportNameArgNames[] = { |
||
16356 | "ImportName",}; |
||
16357 | struct ParsedAttrInfoWebAssemblyImportName final : public ParsedAttrInfo { |
||
16358 | constexpr ParsedAttrInfoWebAssemblyImportName() : ParsedAttrInfo( |
||
16359 | /*AttrKind=*/ParsedAttr::AT_WebAssemblyImportName, |
||
16360 | /*NumArgs=*/1, |
||
16361 | /*OptArgs=*/0, |
||
16362 | /*NumArgMembers=*/1, |
||
16363 | /*HasCustomParsing=*/0, |
||
16364 | /*AcceptsExprPack=*/0, |
||
16365 | /*IsTargetSpecific=*/1, |
||
16366 | /*IsType=*/0, |
||
16367 | /*IsStmt=*/0, |
||
16368 | /*IsKnownToGCC=*/0, |
||
16369 | /*IsSupportedByPragmaAttribute=*/1, |
||
16370 | /*Spellings=*/WebAssemblyImportNameSpellings, |
||
16371 | /*ArgNames=*/WebAssemblyImportNameArgNames) {} |
||
16372 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16373 | if (!isa<FunctionDecl>(D)) { |
||
16374 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
16375 | << Attr << "functions"; |
||
16376 | return false; |
||
16377 | } |
||
16378 | return true; |
||
16379 | } |
||
16380 | |||
16381 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16382 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16383 | << AL << St->getBeginLoc(); |
||
16384 | return false; |
||
16385 | } |
||
16386 | |||
16387 | bool existsInTarget(const TargetInfo &Target) const override { |
||
16388 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
16389 | return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64); |
||
16390 | } |
||
16391 | |||
16392 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16393 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16394 | } |
||
16395 | |||
16396 | bool isParamExpr(size_t N) const override { |
||
16397 | return false; |
||
16398 | } |
||
16399 | |||
16400 | static const ParsedAttrInfoWebAssemblyImportName Instance; |
||
16401 | }; |
||
16402 | const ParsedAttrInfoWebAssemblyImportName ParsedAttrInfoWebAssemblyImportName::Instance; |
||
16403 | static constexpr ParsedAttrInfo::Spelling WorkGroupSizeHintSpellings[] = { |
||
16404 | {AttributeCommonInfo::AS_GNU, "work_group_size_hint"}, |
||
16405 | }; |
||
16406 | static constexpr const char *WorkGroupSizeHintArgNames[] = { |
||
16407 | "XDim","YDim","ZDim",}; |
||
16408 | struct ParsedAttrInfoWorkGroupSizeHint final : public ParsedAttrInfo { |
||
16409 | constexpr ParsedAttrInfoWorkGroupSizeHint() : ParsedAttrInfo( |
||
16410 | /*AttrKind=*/ParsedAttr::AT_WorkGroupSizeHint, |
||
16411 | /*NumArgs=*/3, |
||
16412 | /*OptArgs=*/0, |
||
16413 | /*NumArgMembers=*/3, |
||
16414 | /*HasCustomParsing=*/0, |
||
16415 | /*AcceptsExprPack=*/0, |
||
16416 | /*IsTargetSpecific=*/0, |
||
16417 | /*IsType=*/0, |
||
16418 | /*IsStmt=*/0, |
||
16419 | /*IsKnownToGCC=*/0, |
||
16420 | /*IsSupportedByPragmaAttribute=*/1, |
||
16421 | /*Spellings=*/WorkGroupSizeHintSpellings, |
||
16422 | /*ArgNames=*/WorkGroupSizeHintArgNames) {} |
||
16423 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16424 | if (!isa<FunctionDecl>(D)) { |
||
16425 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
16426 | << Attr << "functions"; |
||
16427 | return false; |
||
16428 | } |
||
16429 | return true; |
||
16430 | } |
||
16431 | |||
16432 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16433 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16434 | << AL << St->getBeginLoc(); |
||
16435 | return false; |
||
16436 | } |
||
16437 | |||
16438 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16439 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16440 | } |
||
16441 | |||
16442 | bool isParamExpr(size_t N) const override { |
||
16443 | return false; |
||
16444 | } |
||
16445 | |||
16446 | static const ParsedAttrInfoWorkGroupSizeHint Instance; |
||
16447 | }; |
||
16448 | const ParsedAttrInfoWorkGroupSizeHint ParsedAttrInfoWorkGroupSizeHint::Instance; |
||
16449 | static constexpr ParsedAttrInfo::Spelling X86ForceAlignArgPointerSpellings[] = { |
||
16450 | {AttributeCommonInfo::AS_GNU, "force_align_arg_pointer"}, |
||
16451 | {AttributeCommonInfo::AS_CXX11, "gnu::force_align_arg_pointer"}, |
||
16452 | {AttributeCommonInfo::AS_C2x, "gnu::force_align_arg_pointer"}, |
||
16453 | }; |
||
16454 | struct ParsedAttrInfoX86ForceAlignArgPointer final : public ParsedAttrInfo { |
||
16455 | constexpr ParsedAttrInfoX86ForceAlignArgPointer() : ParsedAttrInfo( |
||
16456 | /*AttrKind=*/ParsedAttr::AT_X86ForceAlignArgPointer, |
||
16457 | /*NumArgs=*/0, |
||
16458 | /*OptArgs=*/0, |
||
16459 | /*NumArgMembers=*/0, |
||
16460 | /*HasCustomParsing=*/0, |
||
16461 | /*AcceptsExprPack=*/0, |
||
16462 | /*IsTargetSpecific=*/1, |
||
16463 | /*IsType=*/0, |
||
16464 | /*IsStmt=*/0, |
||
16465 | /*IsKnownToGCC=*/1, |
||
16466 | /*IsSupportedByPragmaAttribute=*/0, |
||
16467 | /*Spellings=*/X86ForceAlignArgPointerSpellings, |
||
16468 | /*ArgNames=*/{}) {} |
||
16469 | bool existsInTarget(const TargetInfo &Target) const override { |
||
16470 | const llvm::Triple &T = Target.getTriple(); (void)T; |
||
16471 | return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64); |
||
16472 | } |
||
16473 | |||
16474 | bool isParamExpr(size_t N) const override { |
||
16475 | return false; |
||
16476 | } |
||
16477 | |||
16478 | static const ParsedAttrInfoX86ForceAlignArgPointer Instance; |
||
16479 | }; |
||
16480 | const ParsedAttrInfoX86ForceAlignArgPointer ParsedAttrInfoX86ForceAlignArgPointer::Instance; |
||
16481 | static constexpr ParsedAttrInfo::Spelling XRayInstrumentSpellings[] = { |
||
16482 | {AttributeCommonInfo::AS_GNU, "xray_always_instrument"}, |
||
16483 | {AttributeCommonInfo::AS_CXX11, "clang::xray_always_instrument"}, |
||
16484 | {AttributeCommonInfo::AS_C2x, "clang::xray_always_instrument"}, |
||
16485 | {AttributeCommonInfo::AS_GNU, "xray_never_instrument"}, |
||
16486 | {AttributeCommonInfo::AS_CXX11, "clang::xray_never_instrument"}, |
||
16487 | {AttributeCommonInfo::AS_C2x, "clang::xray_never_instrument"}, |
||
16488 | }; |
||
16489 | struct ParsedAttrInfoXRayInstrument final : public ParsedAttrInfo { |
||
16490 | constexpr ParsedAttrInfoXRayInstrument() : ParsedAttrInfo( |
||
16491 | /*AttrKind=*/ParsedAttr::AT_XRayInstrument, |
||
16492 | /*NumArgs=*/0, |
||
16493 | /*OptArgs=*/0, |
||
16494 | /*NumArgMembers=*/0, |
||
16495 | /*HasCustomParsing=*/0, |
||
16496 | /*AcceptsExprPack=*/0, |
||
16497 | /*IsTargetSpecific=*/0, |
||
16498 | /*IsType=*/0, |
||
16499 | /*IsStmt=*/0, |
||
16500 | /*IsKnownToGCC=*/0, |
||
16501 | /*IsSupportedByPragmaAttribute=*/1, |
||
16502 | /*Spellings=*/XRayInstrumentSpellings, |
||
16503 | /*ArgNames=*/{}) {} |
||
16504 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16505 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
16506 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
16507 | << Attr << "functions and Objective-C methods"; |
||
16508 | return false; |
||
16509 | } |
||
16510 | return true; |
||
16511 | } |
||
16512 | |||
16513 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16514 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16515 | << AL << St->getBeginLoc(); |
||
16516 | return false; |
||
16517 | } |
||
16518 | |||
16519 | unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override { |
||
16520 | enum Spelling { |
||
16521 | GNU_xray_always_instrument = 0, |
||
16522 | CXX11_clang_xray_always_instrument = 1, |
||
16523 | C2x_clang_xray_always_instrument = 2, |
||
16524 | GNU_xray_never_instrument = 3, |
||
16525 | CXX11_clang_xray_never_instrument = 4, |
||
16526 | C2x_clang_xray_never_instrument = 5, |
||
16527 | SpellingNotCalculated = 15 |
||
16528 | |||
16529 | }; |
||
16530 | |||
16531 | unsigned Idx = Attr.getAttributeSpellingListIndex(); |
||
16532 | switch (Idx) { |
||
16533 | default: llvm_unreachable("Unknown spelling list index"); |
||
16534 | case 0: return GNU_xray_always_instrument; |
||
16535 | case 1: return CXX11_clang_xray_always_instrument; |
||
16536 | case 2: return C2x_clang_xray_always_instrument; |
||
16537 | case 3: return GNU_xray_never_instrument; |
||
16538 | case 4: return CXX11_clang_xray_never_instrument; |
||
16539 | case 5: return C2x_clang_xray_never_instrument; |
||
16540 | } |
||
16541 | } |
||
16542 | |||
16543 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16544 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16545 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
16546 | } |
||
16547 | |||
16548 | AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override { |
||
16549 | D->addAttr(::new (S.Context) XRayInstrumentAttr(S.Context, Attr)); |
||
16550 | return AttributeApplied; |
||
16551 | } |
||
16552 | |||
16553 | bool isParamExpr(size_t N) const override { |
||
16554 | return false; |
||
16555 | } |
||
16556 | |||
16557 | static const ParsedAttrInfoXRayInstrument Instance; |
||
16558 | }; |
||
16559 | const ParsedAttrInfoXRayInstrument ParsedAttrInfoXRayInstrument::Instance; |
||
16560 | static constexpr ParsedAttrInfo::Spelling XRayLogArgsSpellings[] = { |
||
16561 | {AttributeCommonInfo::AS_GNU, "xray_log_args"}, |
||
16562 | {AttributeCommonInfo::AS_CXX11, "clang::xray_log_args"}, |
||
16563 | {AttributeCommonInfo::AS_C2x, "clang::xray_log_args"}, |
||
16564 | }; |
||
16565 | static constexpr const char *XRayLogArgsArgNames[] = { |
||
16566 | "ArgumentCount",}; |
||
16567 | struct ParsedAttrInfoXRayLogArgs final : public ParsedAttrInfo { |
||
16568 | constexpr ParsedAttrInfoXRayLogArgs() : ParsedAttrInfo( |
||
16569 | /*AttrKind=*/ParsedAttr::AT_XRayLogArgs, |
||
16570 | /*NumArgs=*/1, |
||
16571 | /*OptArgs=*/0, |
||
16572 | /*NumArgMembers=*/1, |
||
16573 | /*HasCustomParsing=*/0, |
||
16574 | /*AcceptsExprPack=*/0, |
||
16575 | /*IsTargetSpecific=*/0, |
||
16576 | /*IsType=*/0, |
||
16577 | /*IsStmt=*/0, |
||
16578 | /*IsKnownToGCC=*/0, |
||
16579 | /*IsSupportedByPragmaAttribute=*/1, |
||
16580 | /*Spellings=*/XRayLogArgsSpellings, |
||
16581 | /*ArgNames=*/XRayLogArgsArgNames) {} |
||
16582 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16583 | if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) { |
||
16584 | S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str) |
||
16585 | << Attr << "functions and Objective-C methods"; |
||
16586 | return false; |
||
16587 | } |
||
16588 | return true; |
||
16589 | } |
||
16590 | |||
16591 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16592 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16593 | << AL << St->getBeginLoc(); |
||
16594 | return false; |
||
16595 | } |
||
16596 | |||
16597 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16598 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16599 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC)); |
||
16600 | } |
||
16601 | |||
16602 | bool isParamExpr(size_t N) const override { |
||
16603 | return false; |
||
16604 | } |
||
16605 | |||
16606 | static const ParsedAttrInfoXRayLogArgs Instance; |
||
16607 | }; |
||
16608 | const ParsedAttrInfoXRayLogArgs ParsedAttrInfoXRayLogArgs::Instance; |
||
16609 | static constexpr ParsedAttrInfo::Spelling ZeroCallUsedRegsSpellings[] = { |
||
16610 | {AttributeCommonInfo::AS_GNU, "zero_call_used_regs"}, |
||
16611 | {AttributeCommonInfo::AS_CXX11, "gnu::zero_call_used_regs"}, |
||
16612 | {AttributeCommonInfo::AS_C2x, "gnu::zero_call_used_regs"}, |
||
16613 | }; |
||
16614 | static constexpr const char *ZeroCallUsedRegsArgNames[] = { |
||
16615 | "ZeroCallUsedRegs",}; |
||
16616 | struct ParsedAttrInfoZeroCallUsedRegs final : public ParsedAttrInfo { |
||
16617 | constexpr ParsedAttrInfoZeroCallUsedRegs() : ParsedAttrInfo( |
||
16618 | /*AttrKind=*/ParsedAttr::AT_ZeroCallUsedRegs, |
||
16619 | /*NumArgs=*/1, |
||
16620 | /*OptArgs=*/0, |
||
16621 | /*NumArgMembers=*/1, |
||
16622 | /*HasCustomParsing=*/0, |
||
16623 | /*AcceptsExprPack=*/0, |
||
16624 | /*IsTargetSpecific=*/0, |
||
16625 | /*IsType=*/0, |
||
16626 | /*IsStmt=*/0, |
||
16627 | /*IsKnownToGCC=*/1, |
||
16628 | /*IsSupportedByPragmaAttribute=*/1, |
||
16629 | /*Spellings=*/ZeroCallUsedRegsSpellings, |
||
16630 | /*ArgNames=*/ZeroCallUsedRegsArgNames) {} |
||
16631 | bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override { |
||
16632 | if (!isa<FunctionDecl>(D)) { |
||
16633 | S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str) |
||
16634 | << Attr << "functions"; |
||
16635 | return false; |
||
16636 | } |
||
16637 | return true; |
||
16638 | } |
||
16639 | |||
16640 | bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override { |
||
16641 | S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt) |
||
16642 | << AL << St->getBeginLoc(); |
||
16643 | return false; |
||
16644 | } |
||
16645 | |||
16646 | void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override { |
||
16647 | MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true)); |
||
16648 | } |
||
16649 | |||
16650 | bool isParamExpr(size_t N) const override { |
||
16651 | return false; |
||
16652 | } |
||
16653 | |||
16654 | static const ParsedAttrInfoZeroCallUsedRegs Instance; |
||
16655 | }; |
||
16656 | const ParsedAttrInfoZeroCallUsedRegs ParsedAttrInfoZeroCallUsedRegs::Instance; |
||
16657 | static const ParsedAttrInfo *AttrInfoMap[] = { |
||
16658 | &ParsedAttrInfoAArch64SVEPcs::Instance, |
||
16659 | &ParsedAttrInfoAArch64VectorPcs::Instance, |
||
16660 | &ParsedAttrInfoAMDGPUFlatWorkGroupSize::Instance, |
||
16661 | &ParsedAttrInfoAMDGPUKernelCall::Instance, |
||
16662 | &ParsedAttrInfoAMDGPUNumSGPR::Instance, |
||
16663 | &ParsedAttrInfoAMDGPUNumVGPR::Instance, |
||
16664 | &ParsedAttrInfoAMDGPUWavesPerEU::Instance, |
||
16665 | &ParsedAttrInfoInterrupt::Instance, |
||
16666 | &ParsedAttrInfoAVRSignal::Instance, |
||
16667 | &ParsedAttrInfoAbiTag::Instance, |
||
16668 | &ParsedAttrInfoAcquireCapability::Instance, |
||
16669 | &ParsedAttrInfoAcquireHandle::Instance, |
||
16670 | &ParsedAttrInfoAcquiredAfter::Instance, |
||
16671 | &ParsedAttrInfoAcquiredBefore::Instance, |
||
16672 | &ParsedAttrInfoAddressSpace::Instance, |
||
16673 | &ParsedAttrInfoAlias::Instance, |
||
16674 | &ParsedAttrInfoAlignValue::Instance, |
||
16675 | &ParsedAttrInfoAligned::Instance, |
||
16676 | &ParsedAttrInfoAllocAlign::Instance, |
||
16677 | &ParsedAttrInfoAllocSize::Instance, |
||
16678 | &ParsedAttrInfoAlwaysDestroy::Instance, |
||
16679 | &ParsedAttrInfoAlwaysInline::Instance, |
||
16680 | &ParsedAttrInfoAnalyzerNoReturn::Instance, |
||
16681 | &ParsedAttrInfoAnnotate::Instance, |
||
16682 | &ParsedAttrInfoAnnotateType::Instance, |
||
16683 | &ParsedAttrInfoAnyX86NoCallerSavedRegisters::Instance, |
||
16684 | &ParsedAttrInfoAnyX86NoCfCheck::Instance, |
||
16685 | &ParsedAttrInfoArcWeakrefUnavailable::Instance, |
||
16686 | &ParsedAttrInfoArgumentWithTypeTag::Instance, |
||
16687 | &ParsedAttrInfoArmBuiltinAlias::Instance, |
||
16688 | &ParsedAttrInfoArmMveStrictPolymorphism::Instance, |
||
16689 | &ParsedAttrInfoArmSveVectorBits::Instance, |
||
16690 | &ParsedAttrInfoArtificial::Instance, |
||
16691 | &ParsedAttrInfoAssertCapability::Instance, |
||
16692 | &ParsedAttrInfoAssertExclusiveLock::Instance, |
||
16693 | &ParsedAttrInfoAssertSharedLock::Instance, |
||
16694 | &ParsedAttrInfoAssumeAligned::Instance, |
||
16695 | &ParsedAttrInfoAssumption::Instance, |
||
16696 | &ParsedAttrInfoAvailability::Instance, |
||
16697 | &ParsedAttrInfoBPFPreserveAccessIndex::Instance, |
||
16698 | &ParsedAttrInfoBTFDeclTag::Instance, |
||
16699 | &ParsedAttrInfoBTFTypeTag::Instance, |
||
16700 | &ParsedAttrInfoBlocks::Instance, |
||
16701 | &ParsedAttrInfoBuiltinAlias::Instance, |
||
16702 | &ParsedAttrInfoCDecl::Instance, |
||
16703 | &ParsedAttrInfoCFAuditedTransfer::Instance, |
||
16704 | &ParsedAttrInfoCFConsumed::Instance, |
||
16705 | &ParsedAttrInfoCFGuard::Instance, |
||
16706 | &ParsedAttrInfoCFICanonicalJumpTable::Instance, |
||
16707 | &ParsedAttrInfoCFReturnsNotRetained::Instance, |
||
16708 | &ParsedAttrInfoCFReturnsRetained::Instance, |
||
16709 | &ParsedAttrInfoCFUnknownTransfer::Instance, |
||
16710 | &ParsedAttrInfoCPUDispatch::Instance, |
||
16711 | &ParsedAttrInfoCPUSpecific::Instance, |
||
16712 | &ParsedAttrInfoCUDAConstant::Instance, |
||
16713 | &ParsedAttrInfoCUDADevice::Instance, |
||
16714 | &ParsedAttrInfoCUDADeviceBuiltinSurfaceType::Instance, |
||
16715 | &ParsedAttrInfoCUDADeviceBuiltinTextureType::Instance, |
||
16716 | &ParsedAttrInfoCUDAGlobal::Instance, |
||
16717 | &ParsedAttrInfoCUDAHost::Instance, |
||
16718 | &ParsedAttrInfoCUDAInvalidTarget::Instance, |
||
16719 | &ParsedAttrInfoCUDALaunchBounds::Instance, |
||
16720 | &ParsedAttrInfoCUDAShared::Instance, |
||
16721 | &ParsedAttrInfoCXX11NoReturn::Instance, |
||
16722 | &ParsedAttrInfoCallableWhen::Instance, |
||
16723 | &ParsedAttrInfoCallback::Instance, |
||
16724 | &ParsedAttrInfoCalledOnce::Instance, |
||
16725 | &ParsedAttrInfoCapability::Instance, |
||
16726 | &ParsedAttrInfoCarriesDependency::Instance, |
||
16727 | &ParsedAttrInfoCleanup::Instance, |
||
16728 | &ParsedAttrInfoCmseNSCall::Instance, |
||
16729 | &ParsedAttrInfoCmseNSEntry::Instance, |
||
16730 | &ParsedAttrInfoCodeSeg::Instance, |
||
16731 | &ParsedAttrInfoCold::Instance, |
||
16732 | &ParsedAttrInfoCommon::Instance, |
||
16733 | &ParsedAttrInfoConst::Instance, |
||
16734 | &ParsedAttrInfoConstInit::Instance, |
||
16735 | &ParsedAttrInfoConstructor::Instance, |
||
16736 | &ParsedAttrInfoConsumable::Instance, |
||
16737 | &ParsedAttrInfoConsumableAutoCast::Instance, |
||
16738 | &ParsedAttrInfoConsumableSetOnRead::Instance, |
||
16739 | &ParsedAttrInfoConvergent::Instance, |
||
16740 | &ParsedAttrInfoDLLExport::Instance, |
||
16741 | &ParsedAttrInfoDLLExportStaticLocal::Instance, |
||
16742 | &ParsedAttrInfoDLLImport::Instance, |
||
16743 | &ParsedAttrInfoDLLImportStaticLocal::Instance, |
||
16744 | &ParsedAttrInfoDeprecated::Instance, |
||
16745 | &ParsedAttrInfoDestructor::Instance, |
||
16746 | &ParsedAttrInfoDiagnoseAsBuiltin::Instance, |
||
16747 | &ParsedAttrInfoDiagnoseIf::Instance, |
||
16748 | &ParsedAttrInfoDisableSanitizerInstrumentation::Instance, |
||
16749 | &ParsedAttrInfoDisableTailCalls::Instance, |
||
16750 | &ParsedAttrInfoEmptyBases::Instance, |
||
16751 | &ParsedAttrInfoEnableIf::Instance, |
||
16752 | &ParsedAttrInfoEnforceTCB::Instance, |
||
16753 | &ParsedAttrInfoEnforceTCBLeaf::Instance, |
||
16754 | &ParsedAttrInfoEnumExtensibility::Instance, |
||
16755 | &ParsedAttrInfoError::Instance, |
||
16756 | &ParsedAttrInfoExcludeFromExplicitInstantiation::Instance, |
||
16757 | &ParsedAttrInfoExclusiveTrylockFunction::Instance, |
||
16758 | &ParsedAttrInfoExtVectorType::Instance, |
||
16759 | &ParsedAttrInfoExternalSourceSymbol::Instance, |
||
16760 | &ParsedAttrInfoFallThrough::Instance, |
||
16761 | &ParsedAttrInfoFastCall::Instance, |
||
16762 | &ParsedAttrInfoFlagEnum::Instance, |
||
16763 | &ParsedAttrInfoFlatten::Instance, |
||
16764 | &ParsedAttrInfoFormat::Instance, |
||
16765 | &ParsedAttrInfoFormatArg::Instance, |
||
16766 | &ParsedAttrInfoFunctionReturnThunks::Instance, |
||
16767 | &ParsedAttrInfoGNUInline::Instance, |
||
16768 | &ParsedAttrInfoGuardedBy::Instance, |
||
16769 | &ParsedAttrInfoGuardedVar::Instance, |
||
16770 | &ParsedAttrInfoHIPManaged::Instance, |
||
16771 | &ParsedAttrInfoHLSLGroupSharedAddressSpace::Instance, |
||
16772 | &ParsedAttrInfoHLSLNumThreads::Instance, |
||
16773 | &ParsedAttrInfoHLSLResource::Instance, |
||
16774 | &ParsedAttrInfoHLSLResourceBinding::Instance, |
||
16775 | &ParsedAttrInfoHLSLSV_DispatchThreadID::Instance, |
||
16776 | &ParsedAttrInfoHLSLSV_GroupIndex::Instance, |
||
16777 | &ParsedAttrInfoHLSLShader::Instance, |
||
16778 | &ParsedAttrInfoHot::Instance, |
||
16779 | &ParsedAttrInfoIBAction::Instance, |
||
16780 | &ParsedAttrInfoIBOutlet::Instance, |
||
16781 | &ParsedAttrInfoIBOutletCollection::Instance, |
||
16782 | &ParsedAttrInfoIFunc::Instance, |
||
16783 | &ParsedAttrInfoInitPriority::Instance, |
||
16784 | &ParsedAttrInfoIntelOclBicc::Instance, |
||
16785 | &ParsedAttrInfoInternalLinkage::Instance, |
||
16786 | &ParsedAttrInfoLTOVisibilityPublic::Instance, |
||
16787 | &ParsedAttrInfoLayoutVersion::Instance, |
||
16788 | &ParsedAttrInfoLeaf::Instance, |
||
16789 | &ParsedAttrInfoLifetimeBound::Instance, |
||
16790 | &ParsedAttrInfoLikely::Instance, |
||
16791 | &ParsedAttrInfoLoaderUninitialized::Instance, |
||
16792 | &ParsedAttrInfoLockReturned::Instance, |
||
16793 | &ParsedAttrInfoLockable::Instance, |
||
16794 | &ParsedAttrInfoLocksExcluded::Instance, |
||
16795 | &ParsedAttrInfoLoopHint::Instance, |
||
16796 | &ParsedAttrInfoMIGServerRoutine::Instance, |
||
16797 | &ParsedAttrInfoMSABI::Instance, |
||
16798 | &ParsedAttrInfoMSAllocator::Instance, |
||
16799 | &ParsedAttrInfoMSInheritance::Instance, |
||
16800 | &ParsedAttrInfoMSNoVTable::Instance, |
||
16801 | &ParsedAttrInfoMSStruct::Instance, |
||
16802 | &ParsedAttrInfoMatrixType::Instance, |
||
16803 | &ParsedAttrInfoMayAlias::Instance, |
||
16804 | &ParsedAttrInfoMaybeUndef::Instance, |
||
16805 | &ParsedAttrInfoMicroMips::Instance, |
||
16806 | &ParsedAttrInfoMinSize::Instance, |
||
16807 | &ParsedAttrInfoMinVectorWidth::Instance, |
||
16808 | &ParsedAttrInfoMips16::Instance, |
||
16809 | &ParsedAttrInfoMipsLongCall::Instance, |
||
16810 | &ParsedAttrInfoMipsShortCall::Instance, |
||
16811 | &ParsedAttrInfoMode::Instance, |
||
16812 | &ParsedAttrInfoMustTail::Instance, |
||
16813 | &ParsedAttrInfoNSConsumed::Instance, |
||
16814 | &ParsedAttrInfoNSConsumesSelf::Instance, |
||
16815 | &ParsedAttrInfoNSErrorDomain::Instance, |
||
16816 | &ParsedAttrInfoNSReturnsAutoreleased::Instance, |
||
16817 | &ParsedAttrInfoNSReturnsNotRetained::Instance, |
||
16818 | &ParsedAttrInfoNSReturnsRetained::Instance, |
||
16819 | &ParsedAttrInfoNaked::Instance, |
||
16820 | &ParsedAttrInfoNeonPolyVectorType::Instance, |
||
16821 | &ParsedAttrInfoNeonVectorType::Instance, |
||
16822 | &ParsedAttrInfoNoAlias::Instance, |
||
16823 | &ParsedAttrInfoNoBuiltin::Instance, |
||
16824 | &ParsedAttrInfoNoCommon::Instance, |
||
16825 | &ParsedAttrInfoNoDebug::Instance, |
||
16826 | &ParsedAttrInfoNoDeref::Instance, |
||
16827 | &ParsedAttrInfoNoDestroy::Instance, |
||
16828 | &ParsedAttrInfoNoDuplicate::Instance, |
||
16829 | &ParsedAttrInfoNoEscape::Instance, |
||
16830 | &ParsedAttrInfoNoInline::Instance, |
||
16831 | &ParsedAttrInfoNoInstrumentFunction::Instance, |
||
16832 | &ParsedAttrInfoNoMerge::Instance, |
||
16833 | &ParsedAttrInfoNoMicroMips::Instance, |
||
16834 | &ParsedAttrInfoNoMips16::Instance, |
||
16835 | &ParsedAttrInfoNoProfileFunction::Instance, |
||
16836 | &ParsedAttrInfoNoRandomizeLayout::Instance, |
||
16837 | &ParsedAttrInfoNoReturn::Instance, |
||
16838 | &ParsedAttrInfoNoSanitize::Instance, |
||
16839 | &ParsedAttrInfoNoSanitizeSpecific::Instance, |
||
16840 | &ParsedAttrInfoNoSpeculativeLoadHardening::Instance, |
||
16841 | &ParsedAttrInfoNoSplitStack::Instance, |
||
16842 | &ParsedAttrInfoNoStackProtector::Instance, |
||
16843 | &ParsedAttrInfoNoThreadSafetyAnalysis::Instance, |
||
16844 | &ParsedAttrInfoNoThrow::Instance, |
||
16845 | &ParsedAttrInfoNoUniqueAddress::Instance, |
||
16846 | &ParsedAttrInfoNoUwtable::Instance, |
||
16847 | &ParsedAttrInfoNonNull::Instance, |
||
16848 | &ParsedAttrInfoNotTailCalled::Instance, |
||
16849 | &ParsedAttrInfoOSConsumed::Instance, |
||
16850 | &ParsedAttrInfoOSConsumesThis::Instance, |
||
16851 | &ParsedAttrInfoOSReturnsNotRetained::Instance, |
||
16852 | &ParsedAttrInfoOSReturnsRetained::Instance, |
||
16853 | &ParsedAttrInfoOSReturnsRetainedOnNonZero::Instance, |
||
16854 | &ParsedAttrInfoOSReturnsRetainedOnZero::Instance, |
||
16855 | &ParsedAttrInfoObjCBoxable::Instance, |
||
16856 | &ParsedAttrInfoObjCBridge::Instance, |
||
16857 | &ParsedAttrInfoObjCBridgeMutable::Instance, |
||
16858 | &ParsedAttrInfoObjCBridgeRelated::Instance, |
||
16859 | &ParsedAttrInfoObjCClassStub::Instance, |
||
16860 | &ParsedAttrInfoObjCDesignatedInitializer::Instance, |
||
16861 | &ParsedAttrInfoObjCDirect::Instance, |
||
16862 | &ParsedAttrInfoObjCDirectMembers::Instance, |
||
16863 | &ParsedAttrInfoObjCException::Instance, |
||
16864 | &ParsedAttrInfoObjCExplicitProtocolImpl::Instance, |
||
16865 | &ParsedAttrInfoObjCExternallyRetained::Instance, |
||
16866 | &ParsedAttrInfoObjCGC::Instance, |
||
16867 | &ParsedAttrInfoObjCIndependentClass::Instance, |
||
16868 | &ParsedAttrInfoObjCInertUnsafeUnretained::Instance, |
||
16869 | &ParsedAttrInfoObjCKindOf::Instance, |
||
16870 | &ParsedAttrInfoObjCMethodFamily::Instance, |
||
16871 | &ParsedAttrInfoObjCNSObject::Instance, |
||
16872 | &ParsedAttrInfoObjCNonLazyClass::Instance, |
||
16873 | &ParsedAttrInfoObjCNonRuntimeProtocol::Instance, |
||
16874 | &ParsedAttrInfoObjCOwnership::Instance, |
||
16875 | &ParsedAttrInfoObjCPreciseLifetime::Instance, |
||
16876 | &ParsedAttrInfoObjCRequiresPropertyDefs::Instance, |
||
16877 | &ParsedAttrInfoObjCRequiresSuper::Instance, |
||
16878 | &ParsedAttrInfoObjCReturnsInnerPointer::Instance, |
||
16879 | &ParsedAttrInfoObjCRootClass::Instance, |
||
16880 | &ParsedAttrInfoObjCRuntimeName::Instance, |
||
16881 | &ParsedAttrInfoObjCRuntimeVisible::Instance, |
||
16882 | &ParsedAttrInfoObjCSubclassingRestricted::Instance, |
||
16883 | &ParsedAttrInfoOpenCLAccess::Instance, |
||
16884 | &ParsedAttrInfoOpenCLConstantAddressSpace::Instance, |
||
16885 | &ParsedAttrInfoOpenCLGenericAddressSpace::Instance, |
||
16886 | &ParsedAttrInfoOpenCLGlobalAddressSpace::Instance, |
||
16887 | &ParsedAttrInfoOpenCLGlobalDeviceAddressSpace::Instance, |
||
16888 | &ParsedAttrInfoOpenCLGlobalHostAddressSpace::Instance, |
||
16889 | &ParsedAttrInfoOpenCLIntelReqdSubGroupSize::Instance, |
||
16890 | &ParsedAttrInfoOpenCLKernel::Instance, |
||
16891 | &ParsedAttrInfoOpenCLLocalAddressSpace::Instance, |
||
16892 | &ParsedAttrInfoOpenCLNoSVM::Instance, |
||
16893 | &ParsedAttrInfoOpenCLPrivateAddressSpace::Instance, |
||
16894 | &ParsedAttrInfoOpenCLUnrollHint::Instance, |
||
16895 | &ParsedAttrInfoOptimizeNone::Instance, |
||
16896 | &ParsedAttrInfoOverloadable::Instance, |
||
16897 | &ParsedAttrInfoOwner::Instance, |
||
16898 | &ParsedAttrInfoOwnership::Instance, |
||
16899 | &ParsedAttrInfoPacked::Instance, |
||
16900 | &ParsedAttrInfoParamTypestate::Instance, |
||
16901 | &ParsedAttrInfoPascal::Instance, |
||
16902 | &ParsedAttrInfoPassObjectSize::Instance, |
||
16903 | &ParsedAttrInfoPatchableFunctionEntry::Instance, |
||
16904 | &ParsedAttrInfoPcs::Instance, |
||
16905 | &ParsedAttrInfoPointer::Instance, |
||
16906 | &ParsedAttrInfoPragmaClangBSSSection::Instance, |
||
16907 | &ParsedAttrInfoPragmaClangDataSection::Instance, |
||
16908 | &ParsedAttrInfoPragmaClangRelroSection::Instance, |
||
16909 | &ParsedAttrInfoPragmaClangRodataSection::Instance, |
||
16910 | &ParsedAttrInfoPragmaClangTextSection::Instance, |
||
16911 | &ParsedAttrInfoPreferredName::Instance, |
||
16912 | &ParsedAttrInfoPreserveAll::Instance, |
||
16913 | &ParsedAttrInfoPreserveMost::Instance, |
||
16914 | &ParsedAttrInfoPtGuardedBy::Instance, |
||
16915 | &ParsedAttrInfoPtGuardedVar::Instance, |
||
16916 | &ParsedAttrInfoPtr32::Instance, |
||
16917 | &ParsedAttrInfoPtr64::Instance, |
||
16918 | &ParsedAttrInfoPure::Instance, |
||
16919 | &ParsedAttrInfoRandomizeLayout::Instance, |
||
16920 | &ParsedAttrInfoReadOnlyPlacement::Instance, |
||
16921 | &ParsedAttrInfoRegCall::Instance, |
||
16922 | &ParsedAttrInfoRegparm::Instance, |
||
16923 | &ParsedAttrInfoReinitializes::Instance, |
||
16924 | &ParsedAttrInfoReleaseCapability::Instance, |
||
16925 | &ParsedAttrInfoReleaseHandle::Instance, |
||
16926 | &ParsedAttrInfoRenderScriptKernel::Instance, |
||
16927 | &ParsedAttrInfoReqdWorkGroupSize::Instance, |
||
16928 | &ParsedAttrInfoRequiresCapability::Instance, |
||
16929 | &ParsedAttrInfoRestrict::Instance, |
||
16930 | &ParsedAttrInfoRetain::Instance, |
||
16931 | &ParsedAttrInfoReturnTypestate::Instance, |
||
16932 | &ParsedAttrInfoReturnsNonNull::Instance, |
||
16933 | &ParsedAttrInfoReturnsTwice::Instance, |
||
16934 | &ParsedAttrInfoSPtr::Instance, |
||
16935 | &ParsedAttrInfoSYCLKernel::Instance, |
||
16936 | &ParsedAttrInfoSYCLSpecialClass::Instance, |
||
16937 | &ParsedAttrInfoScopedLockable::Instance, |
||
16938 | &ParsedAttrInfoSection::Instance, |
||
16939 | &ParsedAttrInfoSelectAny::Instance, |
||
16940 | &ParsedAttrInfoSentinel::Instance, |
||
16941 | &ParsedAttrInfoSetTypestate::Instance, |
||
16942 | &ParsedAttrInfoSharedTrylockFunction::Instance, |
||
16943 | &ParsedAttrInfoSpeculativeLoadHardening::Instance, |
||
16944 | &ParsedAttrInfoStandaloneDebug::Instance, |
||
16945 | &ParsedAttrInfoStdCall::Instance, |
||
16946 | &ParsedAttrInfoStrictFP::Instance, |
||
16947 | &ParsedAttrInfoStrictGuardStackCheck::Instance, |
||
16948 | &ParsedAttrInfoSuppress::Instance, |
||
16949 | &ParsedAttrInfoSwiftAsync::Instance, |
||
16950 | &ParsedAttrInfoSwiftAsyncCall::Instance, |
||
16951 | &ParsedAttrInfoSwiftAsyncContext::Instance, |
||
16952 | &ParsedAttrInfoSwiftAsyncError::Instance, |
||
16953 | &ParsedAttrInfoSwiftAsyncName::Instance, |
||
16954 | &ParsedAttrInfoSwiftAttr::Instance, |
||
16955 | &ParsedAttrInfoSwiftBridge::Instance, |
||
16956 | &ParsedAttrInfoSwiftBridgedTypedef::Instance, |
||
16957 | &ParsedAttrInfoSwiftCall::Instance, |
||
16958 | &ParsedAttrInfoSwiftContext::Instance, |
||
16959 | &ParsedAttrInfoSwiftError::Instance, |
||
16960 | &ParsedAttrInfoSwiftErrorResult::Instance, |
||
16961 | &ParsedAttrInfoSwiftIndirectResult::Instance, |
||
16962 | &ParsedAttrInfoSwiftName::Instance, |
||
16963 | &ParsedAttrInfoSwiftNewType::Instance, |
||
16964 | &ParsedAttrInfoSwiftObjCMembers::Instance, |
||
16965 | &ParsedAttrInfoSwiftPrivate::Instance, |
||
16966 | &ParsedAttrInfoSysVABI::Instance, |
||
16967 | &ParsedAttrInfoTLSModel::Instance, |
||
16968 | &ParsedAttrInfoTarget::Instance, |
||
16969 | &ParsedAttrInfoTargetClones::Instance, |
||
16970 | &ParsedAttrInfoTargetVersion::Instance, |
||
16971 | &ParsedAttrInfoTestTypestate::Instance, |
||
16972 | &ParsedAttrInfoThisCall::Instance, |
||
16973 | &ParsedAttrInfoThread::Instance, |
||
16974 | &ParsedAttrInfoTransparentUnion::Instance, |
||
16975 | &ParsedAttrInfoTrivialABI::Instance, |
||
16976 | &ParsedAttrInfoTryAcquireCapability::Instance, |
||
16977 | &ParsedAttrInfoTypeNonNull::Instance, |
||
16978 | &ParsedAttrInfoTypeNullUnspecified::Instance, |
||
16979 | &ParsedAttrInfoTypeNullable::Instance, |
||
16980 | &ParsedAttrInfoTypeNullableResult::Instance, |
||
16981 | &ParsedAttrInfoTypeTagForDatatype::Instance, |
||
16982 | &ParsedAttrInfoTypeVisibility::Instance, |
||
16983 | &ParsedAttrInfoUPtr::Instance, |
||
16984 | &ParsedAttrInfoUnavailable::Instance, |
||
16985 | &ParsedAttrInfoUninitialized::Instance, |
||
16986 | &ParsedAttrInfoUnlikely::Instance, |
||
16987 | &ParsedAttrInfoUnused::Instance, |
||
16988 | &ParsedAttrInfoUseHandle::Instance, |
||
16989 | &ParsedAttrInfoUsed::Instance, |
||
16990 | &ParsedAttrInfoUsingIfExists::Instance, |
||
16991 | &ParsedAttrInfoUuid::Instance, |
||
16992 | &ParsedAttrInfoVecReturn::Instance, |
||
16993 | &ParsedAttrInfoVecTypeHint::Instance, |
||
16994 | &ParsedAttrInfoVectorCall::Instance, |
||
16995 | &ParsedAttrInfoVectorSize::Instance, |
||
16996 | &ParsedAttrInfoVisibility::Instance, |
||
16997 | &ParsedAttrInfoWarnUnused::Instance, |
||
16998 | &ParsedAttrInfoWarnUnusedResult::Instance, |
||
16999 | &ParsedAttrInfoWeak::Instance, |
||
17000 | &ParsedAttrInfoWeakImport::Instance, |
||
17001 | &ParsedAttrInfoWeakRef::Instance, |
||
17002 | &ParsedAttrInfoWebAssemblyExportName::Instance, |
||
17003 | &ParsedAttrInfoWebAssemblyImportModule::Instance, |
||
17004 | &ParsedAttrInfoWebAssemblyImportName::Instance, |
||
17005 | &ParsedAttrInfoWorkGroupSizeHint::Instance, |
||
17006 | &ParsedAttrInfoX86ForceAlignArgPointer::Instance, |
||
17007 | &ParsedAttrInfoXRayInstrument::Instance, |
||
17008 | &ParsedAttrInfoXRayLogArgs::Instance, |
||
17009 | &ParsedAttrInfoZeroCallUsedRegs::Instance, |
||
17010 | }; |
||
17011 | |||
17012 | static void handleAttrWithDelayedArgs(Sema &S, Decl *D, const ParsedAttr &Attr) { |
||
17013 | SmallVector<Expr *, 4> ArgExprs; |
||
17014 | ArgExprs.reserve(Attr.getNumArgs()); |
||
17015 | for (unsigned I = 0; I < Attr.getNumArgs(); ++I) { |
||
17016 | assert(!Attr.isArgIdent(I)); |
||
17017 | ArgExprs.push_back(Attr.getArgAsExpr(I)); |
||
17018 | } |
||
17019 | clang::Attr *CreatedAttr = nullptr; |
||
17020 | switch (Attr.getKind()) { |
||
17021 | default: |
||
17022 | llvm_unreachable("Attribute cannot hold delayed arguments."); |
||
17023 | case ParsedAttr::AT_Annotate: { |
||
17024 | CreatedAttr = AnnotateAttr::CreateWithDelayedArgs(S.Context, ArgExprs.data(), ArgExprs.size(), Attr); |
||
17025 | break; |
||
17026 | } |
||
17027 | case ParsedAttr::AT_AnnotateType: { |
||
17028 | CreatedAttr = AnnotateTypeAttr::CreateWithDelayedArgs(S.Context, ArgExprs.data(), ArgExprs.size(), Attr); |
||
17029 | break; |
||
17030 | } |
||
17031 | } |
||
17032 | D->addAttr(CreatedAttr); |
||
17033 | } |
||
17034 | |||
17035 | static bool checkAttributeMatchRuleAppliesTo(const Decl *D, attr::SubjectMatchRule rule) { |
||
17036 | switch (rule) { |
||
17037 | case attr::SubjectMatchRule_block: |
||
17038 | return isa<BlockDecl>(D); |
||
17039 | case attr::SubjectMatchRule_enum: |
||
17040 | return isa<EnumDecl>(D); |
||
17041 | case attr::SubjectMatchRule_enum_constant: |
||
17042 | return isa<EnumConstantDecl>(D); |
||
17043 | case attr::SubjectMatchRule_field: |
||
17044 | return isa<FieldDecl>(D); |
||
17045 | case attr::SubjectMatchRule_function: |
||
17046 | return isa<FunctionDecl>(D); |
||
17047 | case attr::SubjectMatchRule_function_is_member: |
||
17048 | return isa<CXXMethodDecl>(D); |
||
17049 | case attr::SubjectMatchRule_namespace: |
||
17050 | return isa<NamespaceDecl>(D); |
||
17051 | case attr::SubjectMatchRule_objc_category: |
||
17052 | return isa<ObjCCategoryDecl>(D); |
||
17053 | case attr::SubjectMatchRule_objc_implementation: |
||
17054 | return isa<ObjCImplDecl>(D); |
||
17055 | case attr::SubjectMatchRule_objc_interface: |
||
17056 | return isa<ObjCInterfaceDecl>(D); |
||
17057 | case attr::SubjectMatchRule_objc_method: |
||
17058 | return isa<ObjCMethodDecl>(D); |
||
17059 | case attr::SubjectMatchRule_objc_method_is_instance: |
||
17060 | return isObjCInstanceMethod(D); |
||
17061 | case attr::SubjectMatchRule_objc_property: |
||
17062 | return isa<ObjCPropertyDecl>(D); |
||
17063 | case attr::SubjectMatchRule_objc_protocol: |
||
17064 | return isa<ObjCProtocolDecl>(D); |
||
17065 | case attr::SubjectMatchRule_record: |
||
17066 | return isa<RecordDecl>(D) || isa<CXXRecordDecl>(D); |
||
17067 | case attr::SubjectMatchRule_record_not_is_union: |
||
17068 | return isStruct(D); |
||
17069 | case attr::SubjectMatchRule_hasType_abstract: |
||
17070 | assert(false && "Abstract matcher rule isn't allowed"); |
||
17071 | return false; |
||
17072 | case attr::SubjectMatchRule_hasType_functionType: |
||
17073 | return isFunctionLike(D); |
||
17074 | case attr::SubjectMatchRule_type_alias: |
||
17075 | return isa<TypedefNameDecl>(D); |
||
17076 | case attr::SubjectMatchRule_variable: |
||
17077 | return isa<VarDecl>(D); |
||
17078 | case attr::SubjectMatchRule_variable_is_thread_local: |
||
17079 | return isTLSVar(D); |
||
17080 | case attr::SubjectMatchRule_variable_is_global: |
||
17081 | return isGlobalVar(D); |
||
17082 | case attr::SubjectMatchRule_variable_is_local: |
||
17083 | return isLocalVar(D); |
||
17084 | case attr::SubjectMatchRule_variable_is_parameter: |
||
17085 | return isa<ParmVarDecl>(D); |
||
17086 | case attr::SubjectMatchRule_variable_not_is_parameter: |
||
17087 | return isNonParmVar(D); |
||
17088 | } |
||
17089 | llvm_unreachable("Invalid match rule"); |
||
17090 | return false; |
||
17091 | } |
||
17092 | |||
17093 | #elif defined(WANT_DECL_MERGE_LOGIC) |
||
17094 | |||
17095 | static bool DiagnoseMutualExclusions(Sema &S, const NamedDecl *D, const Attr *A) { |
||
17096 | if (const auto *Second = dyn_cast<AlwaysDestroyAttr>(A)) { |
||
17097 | if (const auto *First = D->getAttr<NoDestroyAttr>()) { |
||
17098 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17099 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17100 | return false; |
||
17101 | } |
||
17102 | return true; |
||
17103 | } |
||
17104 | if (const auto *Second = dyn_cast<AlwaysInlineAttr>(A)) { |
||
17105 | if (const auto *First = D->getAttr<NotTailCalledAttr>()) { |
||
17106 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17107 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17108 | return false; |
||
17109 | } |
||
17110 | return true; |
||
17111 | } |
||
17112 | if (const auto *Second = dyn_cast<CFAuditedTransferAttr>(A)) { |
||
17113 | if (const auto *First = D->getAttr<CFUnknownTransferAttr>()) { |
||
17114 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17115 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17116 | return false; |
||
17117 | } |
||
17118 | return true; |
||
17119 | } |
||
17120 | if (const auto *Second = dyn_cast<CFUnknownTransferAttr>(A)) { |
||
17121 | if (const auto *First = D->getAttr<CFAuditedTransferAttr>()) { |
||
17122 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17123 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17124 | return false; |
||
17125 | } |
||
17126 | return true; |
||
17127 | } |
||
17128 | if (const auto *Second = dyn_cast<CPUDispatchAttr>(A)) { |
||
17129 | if (const auto *First = D->getAttr<TargetClonesAttr>()) { |
||
17130 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17131 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17132 | return false; |
||
17133 | } |
||
17134 | if (const auto *First = D->getAttr<TargetVersionAttr>()) { |
||
17135 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17136 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17137 | return false; |
||
17138 | } |
||
17139 | if (const auto *First = D->getAttr<TargetAttr>()) { |
||
17140 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17141 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17142 | return false; |
||
17143 | } |
||
17144 | if (const auto *First = D->getAttr<CPUSpecificAttr>()) { |
||
17145 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17146 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17147 | return false; |
||
17148 | } |
||
17149 | return true; |
||
17150 | } |
||
17151 | if (const auto *Second = dyn_cast<CPUSpecificAttr>(A)) { |
||
17152 | if (const auto *First = D->getAttr<TargetClonesAttr>()) { |
||
17153 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17154 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17155 | return false; |
||
17156 | } |
||
17157 | if (const auto *First = D->getAttr<TargetVersionAttr>()) { |
||
17158 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17159 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17160 | return false; |
||
17161 | } |
||
17162 | if (const auto *First = D->getAttr<TargetAttr>()) { |
||
17163 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17164 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17165 | return false; |
||
17166 | } |
||
17167 | if (const auto *First = D->getAttr<CPUDispatchAttr>()) { |
||
17168 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17169 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17170 | return false; |
||
17171 | } |
||
17172 | return true; |
||
17173 | } |
||
17174 | if (const auto *Second = dyn_cast<CUDAConstantAttr>(A)) { |
||
17175 | if (const auto *First = D->getAttr<CUDASharedAttr>()) { |
||
17176 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17177 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17178 | return false; |
||
17179 | } |
||
17180 | if (const auto *First = D->getAttr<HIPManagedAttr>()) { |
||
17181 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17182 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17183 | return false; |
||
17184 | } |
||
17185 | return true; |
||
17186 | } |
||
17187 | if (const auto *Second = dyn_cast<CUDADeviceAttr>(A)) { |
||
17188 | if (const auto *First = D->getAttr<CUDAGlobalAttr>()) { |
||
17189 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17190 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17191 | return false; |
||
17192 | } |
||
17193 | return true; |
||
17194 | } |
||
17195 | if (const auto *Second = dyn_cast<CUDADeviceBuiltinSurfaceTypeAttr>(A)) { |
||
17196 | if (const auto *First = D->getAttr<CUDADeviceBuiltinTextureTypeAttr>()) { |
||
17197 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17198 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17199 | return false; |
||
17200 | } |
||
17201 | return true; |
||
17202 | } |
||
17203 | if (const auto *Second = dyn_cast<CUDADeviceBuiltinTextureTypeAttr>(A)) { |
||
17204 | if (const auto *First = D->getAttr<CUDADeviceBuiltinSurfaceTypeAttr>()) { |
||
17205 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17206 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17207 | return false; |
||
17208 | } |
||
17209 | return true; |
||
17210 | } |
||
17211 | if (const auto *Second = dyn_cast<CUDAGlobalAttr>(A)) { |
||
17212 | if (const auto *First = D->getAttr<CUDADeviceAttr>()) { |
||
17213 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17214 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17215 | return false; |
||
17216 | } |
||
17217 | if (const auto *First = D->getAttr<CUDAHostAttr>()) { |
||
17218 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17219 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17220 | return false; |
||
17221 | } |
||
17222 | return true; |
||
17223 | } |
||
17224 | if (const auto *Second = dyn_cast<CUDAHostAttr>(A)) { |
||
17225 | if (const auto *First = D->getAttr<CUDAGlobalAttr>()) { |
||
17226 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17227 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17228 | return false; |
||
17229 | } |
||
17230 | return true; |
||
17231 | } |
||
17232 | if (const auto *Second = dyn_cast<CUDASharedAttr>(A)) { |
||
17233 | if (const auto *First = D->getAttr<CUDAConstantAttr>()) { |
||
17234 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17235 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17236 | return false; |
||
17237 | } |
||
17238 | if (const auto *First = D->getAttr<HIPManagedAttr>()) { |
||
17239 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17240 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17241 | return false; |
||
17242 | } |
||
17243 | return true; |
||
17244 | } |
||
17245 | if (const auto *Second = dyn_cast<ColdAttr>(A)) { |
||
17246 | if (const auto *First = D->getAttr<HotAttr>()) { |
||
17247 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17248 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17249 | return false; |
||
17250 | } |
||
17251 | return true; |
||
17252 | } |
||
17253 | if (const auto *Second = dyn_cast<CommonAttr>(A)) { |
||
17254 | if (const auto *First = D->getAttr<InternalLinkageAttr>()) { |
||
17255 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17256 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17257 | return false; |
||
17258 | } |
||
17259 | return true; |
||
17260 | } |
||
17261 | if (const auto *Second = dyn_cast<DisableTailCallsAttr>(A)) { |
||
17262 | if (const auto *First = D->getAttr<NakedAttr>()) { |
||
17263 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17264 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17265 | return false; |
||
17266 | } |
||
17267 | return true; |
||
17268 | } |
||
17269 | if (const auto *Second = dyn_cast<HIPManagedAttr>(A)) { |
||
17270 | if (const auto *First = D->getAttr<CUDAConstantAttr>()) { |
||
17271 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17272 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17273 | return false; |
||
17274 | } |
||
17275 | if (const auto *First = D->getAttr<CUDASharedAttr>()) { |
||
17276 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17277 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17278 | return false; |
||
17279 | } |
||
17280 | return true; |
||
17281 | } |
||
17282 | if (const auto *Second = dyn_cast<HotAttr>(A)) { |
||
17283 | if (const auto *First = D->getAttr<ColdAttr>()) { |
||
17284 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17285 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17286 | return false; |
||
17287 | } |
||
17288 | return true; |
||
17289 | } |
||
17290 | if (const auto *Second = dyn_cast<InternalLinkageAttr>(A)) { |
||
17291 | if (const auto *First = D->getAttr<CommonAttr>()) { |
||
17292 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17293 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17294 | return false; |
||
17295 | } |
||
17296 | return true; |
||
17297 | } |
||
17298 | if (const auto *Second = dyn_cast<MicroMipsAttr>(A)) { |
||
17299 | if (const auto *First = D->getAttr<Mips16Attr>()) { |
||
17300 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17301 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17302 | return false; |
||
17303 | } |
||
17304 | return true; |
||
17305 | } |
||
17306 | if (const auto *Second = dyn_cast<Mips16Attr>(A)) { |
||
17307 | if (const auto *First = D->getAttr<MipsInterruptAttr>()) { |
||
17308 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17309 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17310 | return false; |
||
17311 | } |
||
17312 | if (const auto *First = D->getAttr<MicroMipsAttr>()) { |
||
17313 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17314 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17315 | return false; |
||
17316 | } |
||
17317 | return true; |
||
17318 | } |
||
17319 | if (const auto *Second = dyn_cast<MipsLongCallAttr>(A)) { |
||
17320 | if (const auto *First = D->getAttr<MipsShortCallAttr>()) { |
||
17321 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17322 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17323 | return false; |
||
17324 | } |
||
17325 | return true; |
||
17326 | } |
||
17327 | if (const auto *Second = dyn_cast<MipsShortCallAttr>(A)) { |
||
17328 | if (const auto *First = D->getAttr<MipsLongCallAttr>()) { |
||
17329 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17330 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17331 | return false; |
||
17332 | } |
||
17333 | return true; |
||
17334 | } |
||
17335 | if (const auto *Second = dyn_cast<NakedAttr>(A)) { |
||
17336 | if (const auto *First = D->getAttr<DisableTailCallsAttr>()) { |
||
17337 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17338 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17339 | return false; |
||
17340 | } |
||
17341 | return true; |
||
17342 | } |
||
17343 | if (const auto *Second = dyn_cast<NoDestroyAttr>(A)) { |
||
17344 | if (const auto *First = D->getAttr<AlwaysDestroyAttr>()) { |
||
17345 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17346 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17347 | return false; |
||
17348 | } |
||
17349 | return true; |
||
17350 | } |
||
17351 | if (const auto *Second = dyn_cast<NoRandomizeLayoutAttr>(A)) { |
||
17352 | if (const auto *First = D->getAttr<RandomizeLayoutAttr>()) { |
||
17353 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17354 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17355 | return false; |
||
17356 | } |
||
17357 | return true; |
||
17358 | } |
||
17359 | if (const auto *Second = dyn_cast<NoSpeculativeLoadHardeningAttr>(A)) { |
||
17360 | if (const auto *First = D->getAttr<SpeculativeLoadHardeningAttr>()) { |
||
17361 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17362 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17363 | return false; |
||
17364 | } |
||
17365 | return true; |
||
17366 | } |
||
17367 | if (const auto *Second = dyn_cast<NotTailCalledAttr>(A)) { |
||
17368 | if (const auto *First = D->getAttr<AlwaysInlineAttr>()) { |
||
17369 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17370 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17371 | return false; |
||
17372 | } |
||
17373 | return true; |
||
17374 | } |
||
17375 | if (const auto *Second = dyn_cast<OwnerAttr>(A)) { |
||
17376 | if (const auto *First = D->getAttr<PointerAttr>()) { |
||
17377 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17378 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17379 | return false; |
||
17380 | } |
||
17381 | return true; |
||
17382 | } |
||
17383 | if (const auto *Second = dyn_cast<PointerAttr>(A)) { |
||
17384 | if (const auto *First = D->getAttr<OwnerAttr>()) { |
||
17385 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17386 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17387 | return false; |
||
17388 | } |
||
17389 | return true; |
||
17390 | } |
||
17391 | if (const auto *Second = dyn_cast<RandomizeLayoutAttr>(A)) { |
||
17392 | if (const auto *First = D->getAttr<NoRandomizeLayoutAttr>()) { |
||
17393 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17394 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17395 | return false; |
||
17396 | } |
||
17397 | return true; |
||
17398 | } |
||
17399 | if (const auto *Second = dyn_cast<SpeculativeLoadHardeningAttr>(A)) { |
||
17400 | if (const auto *First = D->getAttr<NoSpeculativeLoadHardeningAttr>()) { |
||
17401 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17402 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17403 | return false; |
||
17404 | } |
||
17405 | return true; |
||
17406 | } |
||
17407 | if (const auto *Second = dyn_cast<TargetAttr>(A)) { |
||
17408 | if (const auto *First = D->getAttr<TargetClonesAttr>()) { |
||
17409 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17410 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17411 | return false; |
||
17412 | } |
||
17413 | if (const auto *First = D->getAttr<TargetVersionAttr>()) { |
||
17414 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17415 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17416 | return false; |
||
17417 | } |
||
17418 | if (const auto *First = D->getAttr<CPUDispatchAttr>()) { |
||
17419 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17420 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17421 | return false; |
||
17422 | } |
||
17423 | if (const auto *First = D->getAttr<CPUSpecificAttr>()) { |
||
17424 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17425 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17426 | return false; |
||
17427 | } |
||
17428 | return true; |
||
17429 | } |
||
17430 | if (const auto *Second = dyn_cast<TargetClonesAttr>(A)) { |
||
17431 | if (const auto *First = D->getAttr<TargetVersionAttr>()) { |
||
17432 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17433 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17434 | return false; |
||
17435 | } |
||
17436 | if (const auto *First = D->getAttr<TargetAttr>()) { |
||
17437 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17438 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17439 | return false; |
||
17440 | } |
||
17441 | if (const auto *First = D->getAttr<CPUDispatchAttr>()) { |
||
17442 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17443 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17444 | return false; |
||
17445 | } |
||
17446 | if (const auto *First = D->getAttr<CPUSpecificAttr>()) { |
||
17447 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17448 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17449 | return false; |
||
17450 | } |
||
17451 | return true; |
||
17452 | } |
||
17453 | if (const auto *Second = dyn_cast<TargetVersionAttr>(A)) { |
||
17454 | if (const auto *First = D->getAttr<TargetClonesAttr>()) { |
||
17455 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17456 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17457 | return false; |
||
17458 | } |
||
17459 | if (const auto *First = D->getAttr<TargetAttr>()) { |
||
17460 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17461 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17462 | return false; |
||
17463 | } |
||
17464 | if (const auto *First = D->getAttr<CPUDispatchAttr>()) { |
||
17465 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17466 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17467 | return false; |
||
17468 | } |
||
17469 | if (const auto *First = D->getAttr<CPUSpecificAttr>()) { |
||
17470 | S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second; |
||
17471 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17472 | return false; |
||
17473 | } |
||
17474 | return true; |
||
17475 | } |
||
17476 | return true; |
||
17477 | } |
||
17478 | |||
17479 | #elif defined(WANT_STMT_MERGE_LOGIC) |
||
17480 | |||
17481 | static bool DiagnoseMutualExclusions(Sema &S, const SmallVectorImpl<const Attr *> &C) { |
||
17482 | for (const Attr *A : C) { |
||
17483 | if (const auto *Second = dyn_cast<AlwaysInlineAttr>(A)) { |
||
17484 | auto Iter = llvm::find_if(C, [](const Attr *Check) { return isa<NotTailCalledAttr>(Check); }); |
||
17485 | if (Iter != C.end()) { |
||
17486 | S.Diag((*Iter)->getLocation(), diag::err_attributes_are_not_compatible) << *Iter << Second; |
||
17487 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17488 | return false; |
||
17489 | } |
||
17490 | } |
||
17491 | if (const auto *Second = dyn_cast<LikelyAttr>(A)) { |
||
17492 | auto Iter = llvm::find_if(C, [](const Attr *Check) { return isa<UnlikelyAttr>(Check); }); |
||
17493 | if (Iter != C.end()) { |
||
17494 | S.Diag((*Iter)->getLocation(), diag::err_attributes_are_not_compatible) << *Iter << Second; |
||
17495 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17496 | return false; |
||
17497 | } |
||
17498 | } |
||
17499 | if (const auto *Second = dyn_cast<UnlikelyAttr>(A)) { |
||
17500 | auto Iter = llvm::find_if(C, [](const Attr *Check) { return isa<LikelyAttr>(Check); }); |
||
17501 | if (Iter != C.end()) { |
||
17502 | S.Diag((*Iter)->getLocation(), diag::err_attributes_are_not_compatible) << *Iter << Second; |
||
17503 | S.Diag(Second->getLocation(), diag::note_conflicting_attribute); |
||
17504 | return false; |
||
17505 | } |
||
17506 | } |
||
17507 | } |
||
17508 | return true; |
||
17509 | } |
||
17510 | |||
17511 | #endif |