Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/clang/Sema/AttrParsedAttrImpl.inc is written in an unsupported language. File is not indexed.

0001 /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
0002 |*                                                                            *|
0003 |* Parsed attribute helpers                                                   *|
0004 |*                                                                            *|
0005 |* Automatically generated file, do not edit!                                 *|
0006 |* From: Attr.td                                                              *|
0007 |*                                                                            *|
0008 \*===----------------------------------------------------------------------===*/
0009 
0010 #if !defined(WANT_DECL_MERGE_LOGIC) && !defined(WANT_STMT_MERGE_LOGIC)
0011 static bool isStruct(const Decl *D) {
0012   if (const auto *S = dyn_cast<RecordDecl>(D))
0013     return !S->isUnion();
0014   return false;
0015 }
0016 
0017 static bool isSharedVar(const Decl *D) {
0018   if (const auto *S = dyn_cast<VarDecl>(D))
0019     return S->hasGlobalStorage() && !S->getTLSKind();
0020   return false;
0021 }
0022 
0023 static bool isGlobalVar(const Decl *D) {
0024   if (const auto *S = dyn_cast<VarDecl>(D))
0025     return S->hasGlobalStorage();
0026   return false;
0027 }
0028 
0029 static bool isHasFunctionProto(const Decl *D) {
0030   if (const auto *S = dyn_cast<Decl>(D))
0031     return (S->getFunctionType(true) != nullptr &&
0032                                        isa<FunctionProtoType>(S->getFunctionType())) ||
0033                                        isa<ObjCMethodDecl>(S) ||
0034                                        isa<BlockDecl>(S);
0035   return false;
0036 }
0037 
0038 static bool isFunctionLike(const Decl *D) {
0039   if (const auto *S = dyn_cast<Decl>(D))
0040     return S->getFunctionType(false) != nullptr;
0041   return false;
0042 }
0043 
0044 static bool isInlineFunction(const Decl *D) {
0045   if (const auto *S = dyn_cast<FunctionDecl>(D))
0046     return S->isInlineSpecified();
0047   return false;
0048 }
0049 
0050 static bool isLocalVar(const Decl *D) {
0051   if (const auto *S = dyn_cast<VarDecl>(D))
0052     return S->hasLocalStorage() && !isa<ParmVarDecl>(S);
0053   return false;
0054 }
0055 
0056 static bool isNonTLSGlobalVar(const Decl *D) {
0057   if (const auto *S = dyn_cast<VarDecl>(D))
0058     return S->hasGlobalStorage() &&
0059                                S->getTLSKind() == 0;
0060   return false;
0061 }
0062 
0063 static bool isHLSLEntry(const Decl *D) {
0064   if (const auto *S = dyn_cast<FunctionDecl>(D))
0065     return S->isExternallyVisible() && !isa<CXXMethodDecl>(S);
0066   return false;
0067 }
0068 
0069 static bool isHLSLBufferObj(const Decl *D) {
0070   if (const auto *S = dyn_cast<HLSLBufferDecl>(D))
0071     return isa<HLSLBufferDecl>(S);
0072   return false;
0073 }
0074 
0075 static bool isExternalGlobalVar(const Decl *D) {
0076   if (const auto *S = dyn_cast<VarDecl>(D))
0077     return S->hasGlobalStorage() &&
0078                                S->getStorageClass()!=StorageClass::SC_Static &&
0079                                !S->isLocalExternDecl();
0080   return false;
0081 }
0082 
0083 static bool isObjCInstanceMethod(const Decl *D) {
0084   if (const auto *S = dyn_cast<ObjCMethodDecl>(D))
0085     return S->isInstanceMethod();
0086   return false;
0087 }
0088 
0089 static bool isImplicitObjectParameter(const Decl *D) {
0090   if (const auto *S = dyn_cast<FunctionDecl>(D))
0091     return static_cast<void>(S), false;
0092   return false;
0093 }
0094 
0095 static bool isNonParmVar(const Decl *D) {
0096   if (const auto *S = dyn_cast<VarDecl>(D))
0097     return S->getKind() != Decl::ParmVar;
0098   return false;
0099 }
0100 
0101 static bool isClassTmpl(const Decl *D) {
0102   if (const auto *S = dyn_cast<CXXRecordDecl>(D))
0103     return S->getDescribedClassTemplate();
0104   return false;
0105 }
0106 
0107 static bool isFunctionTmpl(const Decl *D) {
0108   if (const auto *S = dyn_cast<FunctionDecl>(D))
0109     return S->getTemplatedKind() ==
0110                                  FunctionDecl::TK_FunctionTemplate;
0111   return false;
0112 }
0113 
0114 static bool isVarTmpl(const Decl *D) {
0115   if (const auto *S = dyn_cast<VarDecl>(D))
0116     return S->getDescribedVarTemplate();
0117   return false;
0118 }
0119 
0120 static bool isNonBitField(const Decl *D) {
0121   if (const auto *S = dyn_cast<FieldDecl>(D))
0122     return !S->isBitField();
0123   return false;
0124 }
0125 
0126 static bool isNonStaticCXXMethod(const Decl *D) {
0127   if (const auto *S = dyn_cast<CXXMethodDecl>(D))
0128     return !S->isStatic();
0129   return false;
0130 }
0131 
0132 static bool isBitField(const Decl *D) {
0133   if (const auto *S = dyn_cast<FieldDecl>(D))
0134     return S->isBitField();
0135   return false;
0136 }
0137 
0138 static bool isNonStaticNonConstCXXMethod(const Decl *D) {
0139   if (const auto *S = dyn_cast<CXXMethodDecl>(D))
0140     return !S->isStatic() && !S->isConst();
0141   return false;
0142 }
0143 
0144 static bool isNonLocalVar(const Decl *D) {
0145   if (const auto *S = dyn_cast<VarDecl>(D))
0146     return !S->hasLocalStorage();
0147   return false;
0148 }
0149 
0150 static bool isTLSVar(const Decl *D) {
0151   if (const auto *S = dyn_cast<VarDecl>(D))
0152     return S->getTLSKind() != 0;
0153   return false;
0154 }
0155 
0156 static bool isFunctionPointer(const Decl *D) {
0157   if (const auto *S = dyn_cast<Decl>(D))
0158     return S->isFunctionPointerType();
0159   return false;
0160 }
0161 
0162 static constexpr ParsedAttrInfo::Spelling AArch64SVEPcsSpellings[] = {
0163   {AttributeCommonInfo::AS_GNU, "aarch64_sve_pcs"},
0164   {AttributeCommonInfo::AS_CXX11, "clang::aarch64_sve_pcs"},
0165   {AttributeCommonInfo::AS_C23, "clang::aarch64_sve_pcs"},
0166 };
0167 struct ParsedAttrInfoAArch64SVEPcs final : public ParsedAttrInfo {
0168   constexpr ParsedAttrInfoAArch64SVEPcs() : ParsedAttrInfo(
0169     /*AttrKind=*/ParsedAttr::AT_AArch64SVEPcs,
0170     /*NumArgs=*/0,
0171     /*OptArgs=*/0,
0172     /*NumArgMembers=*/0,
0173     /*HasCustomParsing=*/0,
0174     /*AcceptsExprPack=*/0,
0175     /*IsTargetSpecific=*/0,
0176     /*IsType=*/1,
0177     /*IsStmt=*/0,
0178     /*IsKnownToGCC=*/0,
0179     /*IsSupportedByPragmaAttribute=*/0,
0180     /*Spellings=*/AArch64SVEPcsSpellings,
0181     /*ArgNames=*/{}) {}
0182 bool isParamExpr(size_t N) const override {
0183   return false;
0184 }
0185 
0186 static const ParsedAttrInfoAArch64SVEPcs Instance;
0187 };
0188 const ParsedAttrInfoAArch64SVEPcs ParsedAttrInfoAArch64SVEPcs::Instance;
0189 static constexpr ParsedAttrInfo::Spelling AArch64VectorPcsSpellings[] = {
0190   {AttributeCommonInfo::AS_GNU, "aarch64_vector_pcs"},
0191   {AttributeCommonInfo::AS_CXX11, "clang::aarch64_vector_pcs"},
0192   {AttributeCommonInfo::AS_C23, "clang::aarch64_vector_pcs"},
0193 };
0194 struct ParsedAttrInfoAArch64VectorPcs final : public ParsedAttrInfo {
0195   constexpr ParsedAttrInfoAArch64VectorPcs() : ParsedAttrInfo(
0196     /*AttrKind=*/ParsedAttr::AT_AArch64VectorPcs,
0197     /*NumArgs=*/0,
0198     /*OptArgs=*/0,
0199     /*NumArgMembers=*/0,
0200     /*HasCustomParsing=*/0,
0201     /*AcceptsExprPack=*/0,
0202     /*IsTargetSpecific=*/0,
0203     /*IsType=*/1,
0204     /*IsStmt=*/0,
0205     /*IsKnownToGCC=*/0,
0206     /*IsSupportedByPragmaAttribute=*/0,
0207     /*Spellings=*/AArch64VectorPcsSpellings,
0208     /*ArgNames=*/{}) {}
0209 bool isParamExpr(size_t N) const override {
0210   return false;
0211 }
0212 
0213 static const ParsedAttrInfoAArch64VectorPcs Instance;
0214 };
0215 const ParsedAttrInfoAArch64VectorPcs ParsedAttrInfoAArch64VectorPcs::Instance;
0216 static constexpr ParsedAttrInfo::Spelling AMDGPUFlatWorkGroupSizeSpellings[] = {
0217   {AttributeCommonInfo::AS_GNU, "amdgpu_flat_work_group_size"},
0218   {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_flat_work_group_size"},
0219 };
0220 static constexpr const char *AMDGPUFlatWorkGroupSizeArgNames[] = {
0221 "Min","Max",};
0222 struct ParsedAttrInfoAMDGPUFlatWorkGroupSize final : public ParsedAttrInfo {
0223   constexpr ParsedAttrInfoAMDGPUFlatWorkGroupSize() : ParsedAttrInfo(
0224     /*AttrKind=*/ParsedAttr::AT_AMDGPUFlatWorkGroupSize,
0225     /*NumArgs=*/2,
0226     /*OptArgs=*/0,
0227     /*NumArgMembers=*/2,
0228     /*HasCustomParsing=*/0,
0229     /*AcceptsExprPack=*/0,
0230     /*IsTargetSpecific=*/0,
0231     /*IsType=*/0,
0232     /*IsStmt=*/0,
0233     /*IsKnownToGCC=*/0,
0234     /*IsSupportedByPragmaAttribute=*/1,
0235     /*Spellings=*/AMDGPUFlatWorkGroupSizeSpellings,
0236     /*ArgNames=*/AMDGPUFlatWorkGroupSizeArgNames) {}
0237 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0238   if (!isa<FunctionDecl>(D)) {
0239     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0240       << Attr << Attr.isRegularKeywordAttribute() << "kernel functions";
0241     return false;
0242   }
0243   return true;
0244 }
0245 
0246 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0247   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0248     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0249   return false;
0250 }
0251 
0252 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0253   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0254 }
0255 
0256 bool isParamExpr(size_t N) const override {
0257   return (N == 0) || (N == 1) || false;
0258 }
0259 
0260 static const ParsedAttrInfoAMDGPUFlatWorkGroupSize Instance;
0261 };
0262 const ParsedAttrInfoAMDGPUFlatWorkGroupSize ParsedAttrInfoAMDGPUFlatWorkGroupSize::Instance;
0263 static constexpr ParsedAttrInfo::Spelling AMDGPUKernelCallSpellings[] = {
0264   {AttributeCommonInfo::AS_GNU, "amdgpu_kernel"},
0265   {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_kernel"},
0266   {AttributeCommonInfo::AS_C23, "clang::amdgpu_kernel"},
0267 };
0268 struct ParsedAttrInfoAMDGPUKernelCall final : public ParsedAttrInfo {
0269   constexpr ParsedAttrInfoAMDGPUKernelCall() : ParsedAttrInfo(
0270     /*AttrKind=*/ParsedAttr::AT_AMDGPUKernelCall,
0271     /*NumArgs=*/0,
0272     /*OptArgs=*/0,
0273     /*NumArgMembers=*/0,
0274     /*HasCustomParsing=*/0,
0275     /*AcceptsExprPack=*/0,
0276     /*IsTargetSpecific=*/0,
0277     /*IsType=*/1,
0278     /*IsStmt=*/0,
0279     /*IsKnownToGCC=*/0,
0280     /*IsSupportedByPragmaAttribute=*/0,
0281     /*Spellings=*/AMDGPUKernelCallSpellings,
0282     /*ArgNames=*/{}) {}
0283 bool isParamExpr(size_t N) const override {
0284   return false;
0285 }
0286 
0287 static const ParsedAttrInfoAMDGPUKernelCall Instance;
0288 };
0289 const ParsedAttrInfoAMDGPUKernelCall ParsedAttrInfoAMDGPUKernelCall::Instance;
0290 static constexpr ParsedAttrInfo::Spelling AMDGPUMaxNumWorkGroupsSpellings[] = {
0291   {AttributeCommonInfo::AS_GNU, "amdgpu_max_num_work_groups"},
0292   {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_max_num_work_groups"},
0293 };
0294 static constexpr const char *AMDGPUMaxNumWorkGroupsArgNames[] = {
0295 "MaxNumWorkGroupsX","MaxNumWorkGroupsY","MaxNumWorkGroupsZ",};
0296 struct ParsedAttrInfoAMDGPUMaxNumWorkGroups final : public ParsedAttrInfo {
0297   constexpr ParsedAttrInfoAMDGPUMaxNumWorkGroups() : ParsedAttrInfo(
0298     /*AttrKind=*/ParsedAttr::AT_AMDGPUMaxNumWorkGroups,
0299     /*NumArgs=*/1,
0300     /*OptArgs=*/2,
0301     /*NumArgMembers=*/3,
0302     /*HasCustomParsing=*/0,
0303     /*AcceptsExprPack=*/0,
0304     /*IsTargetSpecific=*/0,
0305     /*IsType=*/0,
0306     /*IsStmt=*/0,
0307     /*IsKnownToGCC=*/0,
0308     /*IsSupportedByPragmaAttribute=*/1,
0309     /*Spellings=*/AMDGPUMaxNumWorkGroupsSpellings,
0310     /*ArgNames=*/AMDGPUMaxNumWorkGroupsArgNames) {}
0311 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0312   if (!isa<FunctionDecl>(D)) {
0313     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0314       << Attr << Attr.isRegularKeywordAttribute() << "kernel functions";
0315     return false;
0316   }
0317   return true;
0318 }
0319 
0320 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0321   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0322     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0323   return false;
0324 }
0325 
0326 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0327   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0328 }
0329 
0330 bool isParamExpr(size_t N) const override {
0331   return (N == 0) || (N == 1) || (N == 2) || false;
0332 }
0333 
0334 static const ParsedAttrInfoAMDGPUMaxNumWorkGroups Instance;
0335 };
0336 const ParsedAttrInfoAMDGPUMaxNumWorkGroups ParsedAttrInfoAMDGPUMaxNumWorkGroups::Instance;
0337 static constexpr ParsedAttrInfo::Spelling AMDGPUNumSGPRSpellings[] = {
0338   {AttributeCommonInfo::AS_GNU, "amdgpu_num_sgpr"},
0339   {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_num_sgpr"},
0340 };
0341 static constexpr const char *AMDGPUNumSGPRArgNames[] = {
0342 "NumSGPR",};
0343 struct ParsedAttrInfoAMDGPUNumSGPR final : public ParsedAttrInfo {
0344   constexpr ParsedAttrInfoAMDGPUNumSGPR() : ParsedAttrInfo(
0345     /*AttrKind=*/ParsedAttr::AT_AMDGPUNumSGPR,
0346     /*NumArgs=*/1,
0347     /*OptArgs=*/0,
0348     /*NumArgMembers=*/1,
0349     /*HasCustomParsing=*/0,
0350     /*AcceptsExprPack=*/0,
0351     /*IsTargetSpecific=*/0,
0352     /*IsType=*/0,
0353     /*IsStmt=*/0,
0354     /*IsKnownToGCC=*/0,
0355     /*IsSupportedByPragmaAttribute=*/1,
0356     /*Spellings=*/AMDGPUNumSGPRSpellings,
0357     /*ArgNames=*/AMDGPUNumSGPRArgNames) {}
0358 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0359   if (!isa<FunctionDecl>(D)) {
0360     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0361       << Attr << Attr.isRegularKeywordAttribute() << "kernel functions";
0362     return false;
0363   }
0364   return true;
0365 }
0366 
0367 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0368   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0369     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0370   return false;
0371 }
0372 
0373 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0374   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0375 }
0376 
0377 bool isParamExpr(size_t N) const override {
0378   return false;
0379 }
0380 
0381 static const ParsedAttrInfoAMDGPUNumSGPR Instance;
0382 };
0383 const ParsedAttrInfoAMDGPUNumSGPR ParsedAttrInfoAMDGPUNumSGPR::Instance;
0384 static constexpr ParsedAttrInfo::Spelling AMDGPUNumVGPRSpellings[] = {
0385   {AttributeCommonInfo::AS_GNU, "amdgpu_num_vgpr"},
0386   {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_num_vgpr"},
0387 };
0388 static constexpr const char *AMDGPUNumVGPRArgNames[] = {
0389 "NumVGPR",};
0390 struct ParsedAttrInfoAMDGPUNumVGPR final : public ParsedAttrInfo {
0391   constexpr ParsedAttrInfoAMDGPUNumVGPR() : ParsedAttrInfo(
0392     /*AttrKind=*/ParsedAttr::AT_AMDGPUNumVGPR,
0393     /*NumArgs=*/1,
0394     /*OptArgs=*/0,
0395     /*NumArgMembers=*/1,
0396     /*HasCustomParsing=*/0,
0397     /*AcceptsExprPack=*/0,
0398     /*IsTargetSpecific=*/0,
0399     /*IsType=*/0,
0400     /*IsStmt=*/0,
0401     /*IsKnownToGCC=*/0,
0402     /*IsSupportedByPragmaAttribute=*/1,
0403     /*Spellings=*/AMDGPUNumVGPRSpellings,
0404     /*ArgNames=*/AMDGPUNumVGPRArgNames) {}
0405 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0406   if (!isa<FunctionDecl>(D)) {
0407     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0408       << Attr << Attr.isRegularKeywordAttribute() << "kernel functions";
0409     return false;
0410   }
0411   return true;
0412 }
0413 
0414 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0415   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0416     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0417   return false;
0418 }
0419 
0420 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0421   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0422 }
0423 
0424 bool isParamExpr(size_t N) const override {
0425   return false;
0426 }
0427 
0428 static const ParsedAttrInfoAMDGPUNumVGPR Instance;
0429 };
0430 const ParsedAttrInfoAMDGPUNumVGPR ParsedAttrInfoAMDGPUNumVGPR::Instance;
0431 static constexpr ParsedAttrInfo::Spelling AMDGPUWavesPerEUSpellings[] = {
0432   {AttributeCommonInfo::AS_GNU, "amdgpu_waves_per_eu"},
0433   {AttributeCommonInfo::AS_CXX11, "clang::amdgpu_waves_per_eu"},
0434 };
0435 static constexpr const char *AMDGPUWavesPerEUArgNames[] = {
0436 "Min","Max",};
0437 struct ParsedAttrInfoAMDGPUWavesPerEU final : public ParsedAttrInfo {
0438   constexpr ParsedAttrInfoAMDGPUWavesPerEU() : ParsedAttrInfo(
0439     /*AttrKind=*/ParsedAttr::AT_AMDGPUWavesPerEU,
0440     /*NumArgs=*/1,
0441     /*OptArgs=*/1,
0442     /*NumArgMembers=*/2,
0443     /*HasCustomParsing=*/0,
0444     /*AcceptsExprPack=*/0,
0445     /*IsTargetSpecific=*/0,
0446     /*IsType=*/0,
0447     /*IsStmt=*/0,
0448     /*IsKnownToGCC=*/0,
0449     /*IsSupportedByPragmaAttribute=*/1,
0450     /*Spellings=*/AMDGPUWavesPerEUSpellings,
0451     /*ArgNames=*/AMDGPUWavesPerEUArgNames) {}
0452 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0453   if (!isa<FunctionDecl>(D)) {
0454     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0455       << Attr << Attr.isRegularKeywordAttribute() << "kernel functions";
0456     return false;
0457   }
0458   return true;
0459 }
0460 
0461 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0462   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0463     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0464   return false;
0465 }
0466 
0467 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0468   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0469 }
0470 
0471 bool isParamExpr(size_t N) const override {
0472   return (N == 0) || (N == 1) || false;
0473 }
0474 
0475 static const ParsedAttrInfoAMDGPUWavesPerEU Instance;
0476 };
0477 const ParsedAttrInfoAMDGPUWavesPerEU ParsedAttrInfoAMDGPUWavesPerEU::Instance;
0478 static constexpr ParsedAttrInfo::Spelling InterruptSpellings[] = {
0479   {AttributeCommonInfo::AS_GNU, "interrupt"},
0480   {AttributeCommonInfo::AS_CXX11, "gnu::interrupt"},
0481   {AttributeCommonInfo::AS_C23, "gnu::interrupt"},
0482 };
0483 static constexpr const char *InterruptArgNames[] = {
0484 "Interrupt",};
0485 struct ParsedAttrInfoInterrupt final : public ParsedAttrInfo {
0486   constexpr ParsedAttrInfoInterrupt() : ParsedAttrInfo(
0487     /*AttrKind=*/ParsedAttr::AT_Interrupt,
0488     /*NumArgs=*/0,
0489     /*OptArgs=*/1,
0490     /*NumArgMembers=*/1,
0491     /*HasCustomParsing=*/1,
0492     /*AcceptsExprPack=*/0,
0493     /*IsTargetSpecific=*/1,
0494     /*IsType=*/0,
0495     /*IsStmt=*/0,
0496     /*IsKnownToGCC=*/1,
0497     /*IsSupportedByPragmaAttribute=*/0,
0498     /*Spellings=*/InterruptSpellings,
0499     /*ArgNames=*/InterruptArgNames) {}
0500 bool existsInTarget(const TargetInfo &Target) const override {
0501   const llvm::Triple &T = Target.getTriple(); (void)T;
0502   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);
0503 }
0504 
0505 bool isParamExpr(size_t N) const override {
0506   return false;
0507 }
0508 
0509 static const ParsedAttrInfoInterrupt Instance;
0510 };
0511 const ParsedAttrInfoInterrupt ParsedAttrInfoInterrupt::Instance;
0512 static constexpr ParsedAttrInfo::Spelling AVRSignalSpellings[] = {
0513   {AttributeCommonInfo::AS_GNU, "signal"},
0514   {AttributeCommonInfo::AS_CXX11, "gnu::signal"},
0515   {AttributeCommonInfo::AS_C23, "gnu::signal"},
0516 };
0517 struct ParsedAttrInfoAVRSignal final : public ParsedAttrInfo {
0518   constexpr ParsedAttrInfoAVRSignal() : ParsedAttrInfo(
0519     /*AttrKind=*/ParsedAttr::AT_AVRSignal,
0520     /*NumArgs=*/0,
0521     /*OptArgs=*/0,
0522     /*NumArgMembers=*/0,
0523     /*HasCustomParsing=*/0,
0524     /*AcceptsExprPack=*/0,
0525     /*IsTargetSpecific=*/1,
0526     /*IsType=*/0,
0527     /*IsStmt=*/0,
0528     /*IsKnownToGCC=*/1,
0529     /*IsSupportedByPragmaAttribute=*/1,
0530     /*Spellings=*/AVRSignalSpellings,
0531     /*ArgNames=*/{}) {}
0532 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0533   if (!isa<FunctionDecl>(D)) {
0534     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
0535       << Attr << Attr.isRegularKeywordAttribute() << "functions";
0536     return false;
0537   }
0538   return true;
0539 }
0540 
0541 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0542   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0543     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0544   return false;
0545 }
0546 
0547 bool existsInTarget(const TargetInfo &Target) const override {
0548   const llvm::Triple &T = Target.getTriple(); (void)T;
0549   return true && (T.getArch() == llvm::Triple::avr);
0550 }
0551 
0552 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0553   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0554 }
0555 
0556 bool isParamExpr(size_t N) const override {
0557   return false;
0558 }
0559 
0560 static const ParsedAttrInfoAVRSignal Instance;
0561 };
0562 const ParsedAttrInfoAVRSignal ParsedAttrInfoAVRSignal::Instance;
0563 static constexpr ParsedAttrInfo::Spelling AbiTagSpellings[] = {
0564   {AttributeCommonInfo::AS_GNU, "abi_tag"},
0565   {AttributeCommonInfo::AS_CXX11, "gnu::abi_tag"},
0566 };
0567 static constexpr const char *AbiTagArgNames[] = {
0568 "Tags...",};
0569 struct ParsedAttrInfoAbiTag final : public ParsedAttrInfo {
0570   constexpr ParsedAttrInfoAbiTag() : ParsedAttrInfo(
0571     /*AttrKind=*/ParsedAttr::AT_AbiTag,
0572     /*NumArgs=*/0,
0573     /*OptArgs=*/15,
0574     /*NumArgMembers=*/1,
0575     /*HasCustomParsing=*/0,
0576     /*AcceptsExprPack=*/0,
0577     /*IsTargetSpecific=*/0,
0578     /*IsType=*/0,
0579     /*IsStmt=*/0,
0580     /*IsKnownToGCC=*/1,
0581     /*IsSupportedByPragmaAttribute=*/1,
0582     /*Spellings=*/AbiTagSpellings,
0583     /*ArgNames=*/AbiTagArgNames) {}
0584 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0585   if (!isStruct(D) && !isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<NamespaceDecl>(D)) {
0586     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0587       << Attr << Attr.isRegularKeywordAttribute() << "structs, variables, functions, and namespaces";
0588     return false;
0589   }
0590   return true;
0591 }
0592 
0593 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0594   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0595     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0596   return false;
0597 }
0598 
0599 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0600   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true));
0601   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
0602   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0603   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus));
0604 }
0605 
0606 bool isParamExpr(size_t N) const override {
0607   return false;
0608 }
0609 
0610 static const ParsedAttrInfoAbiTag Instance;
0611 };
0612 const ParsedAttrInfoAbiTag ParsedAttrInfoAbiTag::Instance;
0613 static constexpr ParsedAttrInfo::Spelling AcquireCapabilitySpellings[] = {
0614   {AttributeCommonInfo::AS_GNU, "acquire_capability"},
0615   {AttributeCommonInfo::AS_CXX11, "clang::acquire_capability"},
0616   {AttributeCommonInfo::AS_GNU, "acquire_shared_capability"},
0617   {AttributeCommonInfo::AS_CXX11, "clang::acquire_shared_capability"},
0618   {AttributeCommonInfo::AS_GNU, "exclusive_lock_function"},
0619   {AttributeCommonInfo::AS_GNU, "shared_lock_function"},
0620 };
0621 static constexpr const char *AcquireCapabilityArgNames[] = {
0622 "Args...",};
0623 struct ParsedAttrInfoAcquireCapability final : public ParsedAttrInfo {
0624   constexpr ParsedAttrInfoAcquireCapability() : ParsedAttrInfo(
0625     /*AttrKind=*/ParsedAttr::AT_AcquireCapability,
0626     /*NumArgs=*/0,
0627     /*OptArgs=*/15,
0628     /*NumArgMembers=*/1,
0629     /*HasCustomParsing=*/0,
0630     /*AcceptsExprPack=*/0,
0631     /*IsTargetSpecific=*/0,
0632     /*IsType=*/0,
0633     /*IsStmt=*/0,
0634     /*IsKnownToGCC=*/0,
0635     /*IsSupportedByPragmaAttribute=*/0,
0636     /*Spellings=*/AcquireCapabilitySpellings,
0637     /*ArgNames=*/AcquireCapabilityArgNames) {}
0638 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0639   if (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D)) {
0640     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
0641       << Attr << Attr.isRegularKeywordAttribute() << "functions and parameters";
0642     return false;
0643   }
0644   return true;
0645 }
0646 
0647 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0648   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0649     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0650   return false;
0651 }
0652 
0653 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
0654   enum Spelling {
0655     GNU_acquire_capability = 0,
0656     CXX11_clang_acquire_capability = 1,
0657     GNU_acquire_shared_capability = 2,
0658     CXX11_clang_acquire_shared_capability = 3,
0659     GNU_exclusive_lock_function = 4,
0660     GNU_shared_lock_function = 5,
0661   SpellingNotCalculated = 15
0662 
0663   };
0664 
0665   unsigned Idx = Attr.getAttributeSpellingListIndex();
0666   switch (Idx) {
0667     default: llvm_unreachable("Unknown spelling list index");
0668     case 0: return GNU_acquire_capability;
0669     case 1: return CXX11_clang_acquire_capability;
0670     case 2: return GNU_acquire_shared_capability;
0671     case 3: return CXX11_clang_acquire_shared_capability;
0672     case 4: return GNU_exclusive_lock_function;
0673     case 5: return GNU_shared_lock_function;
0674   }
0675 }
0676 
0677 bool isParamExpr(size_t N) const override {
0678   return (N == 0) || false;
0679 }
0680 
0681 static const ParsedAttrInfoAcquireCapability Instance;
0682 };
0683 const ParsedAttrInfoAcquireCapability ParsedAttrInfoAcquireCapability::Instance;
0684 static constexpr ParsedAttrInfo::Spelling AcquireHandleSpellings[] = {
0685   {AttributeCommonInfo::AS_GNU, "acquire_handle"},
0686   {AttributeCommonInfo::AS_CXX11, "clang::acquire_handle"},
0687   {AttributeCommonInfo::AS_C23, "clang::acquire_handle"},
0688 };
0689 static constexpr const char *AcquireHandleArgNames[] = {
0690 "HandleType",};
0691 struct ParsedAttrInfoAcquireHandle final : public ParsedAttrInfo {
0692   constexpr ParsedAttrInfoAcquireHandle() : ParsedAttrInfo(
0693     /*AttrKind=*/ParsedAttr::AT_AcquireHandle,
0694     /*NumArgs=*/1,
0695     /*OptArgs=*/0,
0696     /*NumArgMembers=*/1,
0697     /*HasCustomParsing=*/0,
0698     /*AcceptsExprPack=*/0,
0699     /*IsTargetSpecific=*/0,
0700     /*IsType=*/1,
0701     /*IsStmt=*/0,
0702     /*IsKnownToGCC=*/0,
0703     /*IsSupportedByPragmaAttribute=*/1,
0704     /*Spellings=*/AcquireHandleSpellings,
0705     /*ArgNames=*/AcquireHandleArgNames) {}
0706 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0707   if (!isa<FunctionDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<ParmVarDecl>(D)) {
0708     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
0709       << Attr << Attr.isRegularKeywordAttribute() << "functions, typedefs, and parameters";
0710     return false;
0711   }
0712   return true;
0713 }
0714 
0715 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0716   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0717     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0718   return false;
0719 }
0720 
0721 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0722   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0723   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
0724   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
0725 }
0726 
0727 bool isParamExpr(size_t N) const override {
0728   return false;
0729 }
0730 
0731 static const ParsedAttrInfoAcquireHandle Instance;
0732 };
0733 const ParsedAttrInfoAcquireHandle ParsedAttrInfoAcquireHandle::Instance;
0734 static constexpr ParsedAttrInfo::Spelling AcquiredAfterSpellings[] = {
0735   {AttributeCommonInfo::AS_GNU, "acquired_after"},
0736 };
0737 static constexpr const char *AcquiredAfterArgNames[] = {
0738 "Args...",};
0739 struct ParsedAttrInfoAcquiredAfter final : public ParsedAttrInfo {
0740   constexpr ParsedAttrInfoAcquiredAfter() : ParsedAttrInfo(
0741     /*AttrKind=*/ParsedAttr::AT_AcquiredAfter,
0742     /*NumArgs=*/0,
0743     /*OptArgs=*/15,
0744     /*NumArgMembers=*/1,
0745     /*HasCustomParsing=*/0,
0746     /*AcceptsExprPack=*/0,
0747     /*IsTargetSpecific=*/0,
0748     /*IsType=*/0,
0749     /*IsStmt=*/0,
0750     /*IsKnownToGCC=*/0,
0751     /*IsSupportedByPragmaAttribute=*/0,
0752     /*Spellings=*/AcquiredAfterSpellings,
0753     /*ArgNames=*/AcquiredAfterArgNames) {}
0754 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0755   if (!isa<FieldDecl>(D) && !isSharedVar(D)) {
0756     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
0757       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members and global variables";
0758     return false;
0759   }
0760   return true;
0761 }
0762 
0763 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0764   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0765     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0766   return false;
0767 }
0768 
0769 bool isParamExpr(size_t N) const override {
0770   return (N == 0) || false;
0771 }
0772 
0773 static const ParsedAttrInfoAcquiredAfter Instance;
0774 };
0775 const ParsedAttrInfoAcquiredAfter ParsedAttrInfoAcquiredAfter::Instance;
0776 static constexpr ParsedAttrInfo::Spelling AcquiredBeforeSpellings[] = {
0777   {AttributeCommonInfo::AS_GNU, "acquired_before"},
0778 };
0779 static constexpr const char *AcquiredBeforeArgNames[] = {
0780 "Args...",};
0781 struct ParsedAttrInfoAcquiredBefore final : public ParsedAttrInfo {
0782   constexpr ParsedAttrInfoAcquiredBefore() : ParsedAttrInfo(
0783     /*AttrKind=*/ParsedAttr::AT_AcquiredBefore,
0784     /*NumArgs=*/0,
0785     /*OptArgs=*/15,
0786     /*NumArgMembers=*/1,
0787     /*HasCustomParsing=*/0,
0788     /*AcceptsExprPack=*/0,
0789     /*IsTargetSpecific=*/0,
0790     /*IsType=*/0,
0791     /*IsStmt=*/0,
0792     /*IsKnownToGCC=*/0,
0793     /*IsSupportedByPragmaAttribute=*/0,
0794     /*Spellings=*/AcquiredBeforeSpellings,
0795     /*ArgNames=*/AcquiredBeforeArgNames) {}
0796 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0797   if (!isa<FieldDecl>(D) && !isSharedVar(D)) {
0798     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
0799       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members and global variables";
0800     return false;
0801   }
0802   return true;
0803 }
0804 
0805 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0806   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0807     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0808   return false;
0809 }
0810 
0811 bool isParamExpr(size_t N) const override {
0812   return (N == 0) || false;
0813 }
0814 
0815 static const ParsedAttrInfoAcquiredBefore Instance;
0816 };
0817 const ParsedAttrInfoAcquiredBefore ParsedAttrInfoAcquiredBefore::Instance;
0818 static constexpr ParsedAttrInfo::Spelling AddressSpaceSpellings[] = {
0819   {AttributeCommonInfo::AS_GNU, "address_space"},
0820   {AttributeCommonInfo::AS_CXX11, "clang::address_space"},
0821   {AttributeCommonInfo::AS_C23, "clang::address_space"},
0822 };
0823 static constexpr const char *AddressSpaceArgNames[] = {
0824 "AddressSpace",};
0825 struct ParsedAttrInfoAddressSpace final : public ParsedAttrInfo {
0826   constexpr ParsedAttrInfoAddressSpace() : ParsedAttrInfo(
0827     /*AttrKind=*/ParsedAttr::AT_AddressSpace,
0828     /*NumArgs=*/1,
0829     /*OptArgs=*/0,
0830     /*NumArgMembers=*/1,
0831     /*HasCustomParsing=*/0,
0832     /*AcceptsExprPack=*/0,
0833     /*IsTargetSpecific=*/0,
0834     /*IsType=*/1,
0835     /*IsStmt=*/0,
0836     /*IsKnownToGCC=*/0,
0837     /*IsSupportedByPragmaAttribute=*/0,
0838     /*Spellings=*/AddressSpaceSpellings,
0839     /*ArgNames=*/AddressSpaceArgNames) {}
0840 bool isParamExpr(size_t N) const override {
0841   return false;
0842 }
0843 
0844 static const ParsedAttrInfoAddressSpace Instance;
0845 };
0846 const ParsedAttrInfoAddressSpace ParsedAttrInfoAddressSpace::Instance;
0847 static constexpr ParsedAttrInfo::Spelling AliasSpellings[] = {
0848   {AttributeCommonInfo::AS_GNU, "alias"},
0849   {AttributeCommonInfo::AS_CXX11, "gnu::alias"},
0850   {AttributeCommonInfo::AS_C23, "gnu::alias"},
0851 };
0852 static constexpr const char *AliasArgNames[] = {
0853 "Aliasee",};
0854 struct ParsedAttrInfoAlias final : public ParsedAttrInfo {
0855   constexpr ParsedAttrInfoAlias() : ParsedAttrInfo(
0856     /*AttrKind=*/ParsedAttr::AT_Alias,
0857     /*NumArgs=*/1,
0858     /*OptArgs=*/0,
0859     /*NumArgMembers=*/1,
0860     /*HasCustomParsing=*/0,
0861     /*AcceptsExprPack=*/0,
0862     /*IsTargetSpecific=*/0,
0863     /*IsType=*/0,
0864     /*IsStmt=*/0,
0865     /*IsKnownToGCC=*/1,
0866     /*IsSupportedByPragmaAttribute=*/1,
0867     /*Spellings=*/AliasSpellings,
0868     /*ArgNames=*/AliasArgNames) {}
0869 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0870   if (!isa<FunctionDecl>(D) && !isGlobalVar(D)) {
0871     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
0872       << Attr << Attr.isRegularKeywordAttribute() << "functions and global variables";
0873     return false;
0874   }
0875   return true;
0876 }
0877 
0878 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0879   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0880     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0881   return false;
0882 }
0883 
0884 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0885   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
0886   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
0887 }
0888 
0889 bool isParamExpr(size_t N) const override {
0890   return false;
0891 }
0892 
0893 static const ParsedAttrInfoAlias Instance;
0894 };
0895 const ParsedAttrInfoAlias ParsedAttrInfoAlias::Instance;
0896 static constexpr ParsedAttrInfo::Spelling AlignValueSpellings[] = {
0897   {AttributeCommonInfo::AS_GNU, "align_value"},
0898 };
0899 static constexpr const char *AlignValueArgNames[] = {
0900 "Alignment",};
0901 struct ParsedAttrInfoAlignValue final : public ParsedAttrInfo {
0902   constexpr ParsedAttrInfoAlignValue() : ParsedAttrInfo(
0903     /*AttrKind=*/ParsedAttr::AT_AlignValue,
0904     /*NumArgs=*/1,
0905     /*OptArgs=*/0,
0906     /*NumArgMembers=*/1,
0907     /*HasCustomParsing=*/0,
0908     /*AcceptsExprPack=*/0,
0909     /*IsTargetSpecific=*/0,
0910     /*IsType=*/0,
0911     /*IsStmt=*/0,
0912     /*IsKnownToGCC=*/0,
0913     /*IsSupportedByPragmaAttribute=*/1,
0914     /*Spellings=*/AlignValueSpellings,
0915     /*ArgNames=*/AlignValueArgNames) {}
0916 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
0917   if (!isa<VarDecl>(D) && !isa<TypedefNameDecl>(D)) {
0918     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
0919       << Attr << Attr.isRegularKeywordAttribute() << "variables and typedefs";
0920     return false;
0921   }
0922   return true;
0923 }
0924 
0925 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
0926   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
0927     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
0928   return false;
0929 }
0930 
0931 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
0932   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
0933   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
0934 }
0935 
0936 bool isParamExpr(size_t N) const override {
0937   return (N == 0) || false;
0938 }
0939 
0940 static const ParsedAttrInfoAlignValue Instance;
0941 };
0942 const ParsedAttrInfoAlignValue ParsedAttrInfoAlignValue::Instance;
0943 static constexpr ParsedAttrInfo::Spelling AlignedSpellings[] = {
0944   {AttributeCommonInfo::AS_GNU, "aligned"},
0945   {AttributeCommonInfo::AS_CXX11, "gnu::aligned"},
0946   {AttributeCommonInfo::AS_C23, "gnu::aligned"},
0947   {AttributeCommonInfo::AS_Declspec, "align"},
0948   {AttributeCommonInfo::AS_Keyword, "alignas"},
0949   {AttributeCommonInfo::AS_Keyword, "_Alignas"},
0950 };
0951 static constexpr const char *AlignedArgNames[] = {
0952 "Alignment",};
0953 struct ParsedAttrInfoAligned final : public ParsedAttrInfo {
0954   constexpr ParsedAttrInfoAligned() : ParsedAttrInfo(
0955     /*AttrKind=*/ParsedAttr::AT_Aligned,
0956     /*NumArgs=*/0,
0957     /*OptArgs=*/1,
0958     /*NumArgMembers=*/1,
0959     /*HasCustomParsing=*/0,
0960     /*AcceptsExprPack=*/0,
0961     /*IsTargetSpecific=*/0,
0962     /*IsType=*/0,
0963     /*IsStmt=*/0,
0964     /*IsKnownToGCC=*/1,
0965     /*IsSupportedByPragmaAttribute=*/0,
0966     /*Spellings=*/AlignedSpellings,
0967     /*ArgNames=*/AlignedArgNames) {}
0968 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
0969   enum Spelling {
0970     GNU_aligned = 0,
0971     CXX11_gnu_aligned = 1,
0972     C23_gnu_aligned = 2,
0973     Declspec_align = 3,
0974     Keyword_alignas = 4,
0975     Keyword_Alignas = 5,
0976   SpellingNotCalculated = 15
0977 
0978   };
0979 
0980   unsigned Idx = Attr.getAttributeSpellingListIndex();
0981   switch (Idx) {
0982     default: llvm_unreachable("Unknown spelling list index");
0983     case 0: return GNU_aligned;
0984     case 1: return CXX11_gnu_aligned;
0985     case 2: return C23_gnu_aligned;
0986     case 3: return Declspec_align;
0987     case 4: return Keyword_alignas;
0988     case 5: return Keyword_Alignas;
0989   }
0990 }
0991 
0992 bool isParamExpr(size_t N) const override {
0993   return false;
0994 }
0995 
0996 static const ParsedAttrInfoAligned Instance;
0997 };
0998 const ParsedAttrInfoAligned ParsedAttrInfoAligned::Instance;
0999 static constexpr ParsedAttrInfo::Spelling AllocAlignSpellings[] = {
1000   {AttributeCommonInfo::AS_GNU, "alloc_align"},
1001   {AttributeCommonInfo::AS_CXX11, "gnu::alloc_align"},
1002   {AttributeCommonInfo::AS_C23, "gnu::alloc_align"},
1003 };
1004 static constexpr const char *AllocAlignArgNames[] = {
1005 "ParamIndex",};
1006 struct ParsedAttrInfoAllocAlign final : public ParsedAttrInfo {
1007   constexpr ParsedAttrInfoAllocAlign() : ParsedAttrInfo(
1008     /*AttrKind=*/ParsedAttr::AT_AllocAlign,
1009     /*NumArgs=*/1,
1010     /*OptArgs=*/0,
1011     /*NumArgMembers=*/1,
1012     /*HasCustomParsing=*/0,
1013     /*AcceptsExprPack=*/0,
1014     /*IsTargetSpecific=*/0,
1015     /*IsType=*/0,
1016     /*IsStmt=*/0,
1017     /*IsKnownToGCC=*/1,
1018     /*IsSupportedByPragmaAttribute=*/0,
1019     /*Spellings=*/AllocAlignSpellings,
1020     /*ArgNames=*/AllocAlignArgNames) {}
1021 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1022   if (!isHasFunctionProto(D)) {
1023     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1024       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1025     return false;
1026   }
1027   return true;
1028 }
1029 
1030 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1031   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1032     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1033   return false;
1034 }
1035 
1036 bool isParamExpr(size_t N) const override {
1037   return false;
1038 }
1039 
1040 static const ParsedAttrInfoAllocAlign Instance;
1041 };
1042 const ParsedAttrInfoAllocAlign ParsedAttrInfoAllocAlign::Instance;
1043 static constexpr ParsedAttrInfo::Spelling AllocSizeSpellings[] = {
1044   {AttributeCommonInfo::AS_GNU, "alloc_size"},
1045   {AttributeCommonInfo::AS_CXX11, "gnu::alloc_size"},
1046   {AttributeCommonInfo::AS_C23, "gnu::alloc_size"},
1047 };
1048 static constexpr const char *AllocSizeArgNames[] = {
1049 "ElemSizeParam","NumElemsParam",};
1050 struct ParsedAttrInfoAllocSize final : public ParsedAttrInfo {
1051   constexpr ParsedAttrInfoAllocSize() : ParsedAttrInfo(
1052     /*AttrKind=*/ParsedAttr::AT_AllocSize,
1053     /*NumArgs=*/1,
1054     /*OptArgs=*/1,
1055     /*NumArgMembers=*/2,
1056     /*HasCustomParsing=*/0,
1057     /*AcceptsExprPack=*/0,
1058     /*IsTargetSpecific=*/0,
1059     /*IsType=*/0,
1060     /*IsStmt=*/0,
1061     /*IsKnownToGCC=*/1,
1062     /*IsSupportedByPragmaAttribute=*/0,
1063     /*Spellings=*/AllocSizeSpellings,
1064     /*ArgNames=*/AllocSizeArgNames) {}
1065 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1066   if (!isHasFunctionProto(D)) {
1067     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1068       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1069     return false;
1070   }
1071   return true;
1072 }
1073 
1074 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1075   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1076     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1077   return false;
1078 }
1079 
1080 bool isParamExpr(size_t N) const override {
1081   return false;
1082 }
1083 
1084 static const ParsedAttrInfoAllocSize Instance;
1085 };
1086 const ParsedAttrInfoAllocSize ParsedAttrInfoAllocSize::Instance;
1087 static constexpr ParsedAttrInfo::Spelling AllocatingSpellings[] = {
1088   {AttributeCommonInfo::AS_GNU, "allocating"},
1089   {AttributeCommonInfo::AS_CXX11, "clang::allocating"},
1090   {AttributeCommonInfo::AS_C23, "clang::allocating"},
1091 };
1092 struct ParsedAttrInfoAllocating final : public ParsedAttrInfo {
1093   constexpr ParsedAttrInfoAllocating() : ParsedAttrInfo(
1094     /*AttrKind=*/ParsedAttr::AT_Allocating,
1095     /*NumArgs=*/0,
1096     /*OptArgs=*/0,
1097     /*NumArgMembers=*/0,
1098     /*HasCustomParsing=*/0,
1099     /*AcceptsExprPack=*/0,
1100     /*IsTargetSpecific=*/0,
1101     /*IsType=*/1,
1102     /*IsStmt=*/0,
1103     /*IsKnownToGCC=*/0,
1104     /*IsSupportedByPragmaAttribute=*/0,
1105     /*Spellings=*/AllocatingSpellings,
1106     /*ArgNames=*/{}) {}
1107 bool isParamExpr(size_t N) const override {
1108   return false;
1109 }
1110 
1111 static const ParsedAttrInfoAllocating Instance;
1112 };
1113 const ParsedAttrInfoAllocating ParsedAttrInfoAllocating::Instance;
1114 static constexpr ParsedAttrInfo::Spelling AlwaysDestroySpellings[] = {
1115   {AttributeCommonInfo::AS_GNU, "always_destroy"},
1116   {AttributeCommonInfo::AS_CXX11, "clang::always_destroy"},
1117 };
1118 struct ParsedAttrInfoAlwaysDestroy final : public ParsedAttrInfo {
1119   constexpr ParsedAttrInfoAlwaysDestroy() : ParsedAttrInfo(
1120     /*AttrKind=*/ParsedAttr::AT_AlwaysDestroy,
1121     /*NumArgs=*/0,
1122     /*OptArgs=*/0,
1123     /*NumArgMembers=*/0,
1124     /*HasCustomParsing=*/0,
1125     /*AcceptsExprPack=*/0,
1126     /*IsTargetSpecific=*/0,
1127     /*IsType=*/0,
1128     /*IsStmt=*/0,
1129     /*IsKnownToGCC=*/0,
1130     /*IsSupportedByPragmaAttribute=*/1,
1131     /*Spellings=*/AlwaysDestroySpellings,
1132     /*ArgNames=*/{}) {}
1133 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1134   if (!isa<VarDecl>(D)) {
1135     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1136       << Attr << Attr.isRegularKeywordAttribute() << "variables";
1137     return false;
1138   }
1139   return true;
1140 }
1141 
1142 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1143   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1144     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1145   return false;
1146 }
1147 
1148   using ParsedAttrInfo::diagMutualExclusion;
1149 
1150   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
1151     if (const auto *A = D->getAttr<NoDestroyAttr>()) {
1152       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
1153       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
1154 return false;
1155     }
1156     return true;
1157   }
1158 
1159 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
1160   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
1161 }
1162 
1163 bool isParamExpr(size_t N) const override {
1164   return false;
1165 }
1166 
1167 static const ParsedAttrInfoAlwaysDestroy Instance;
1168 };
1169 const ParsedAttrInfoAlwaysDestroy ParsedAttrInfoAlwaysDestroy::Instance;
1170 static constexpr ParsedAttrInfo::Spelling AlwaysInlineSpellings[] = {
1171   {AttributeCommonInfo::AS_GNU, "always_inline"},
1172   {AttributeCommonInfo::AS_CXX11, "gnu::always_inline"},
1173   {AttributeCommonInfo::AS_C23, "gnu::always_inline"},
1174   {AttributeCommonInfo::AS_CXX11, "clang::always_inline"},
1175   {AttributeCommonInfo::AS_C23, "clang::always_inline"},
1176   {AttributeCommonInfo::AS_Keyword, "__forceinline"},
1177 };
1178 struct ParsedAttrInfoAlwaysInline final : public ParsedAttrInfo {
1179   constexpr ParsedAttrInfoAlwaysInline() : ParsedAttrInfo(
1180     /*AttrKind=*/ParsedAttr::AT_AlwaysInline,
1181     /*NumArgs=*/0,
1182     /*OptArgs=*/0,
1183     /*NumArgMembers=*/0,
1184     /*HasCustomParsing=*/0,
1185     /*AcceptsExprPack=*/0,
1186     /*IsTargetSpecific=*/0,
1187     /*IsType=*/0,
1188     /*IsStmt=*/1,
1189     /*IsKnownToGCC=*/1,
1190     /*IsSupportedByPragmaAttribute=*/1,
1191     /*Spellings=*/AlwaysInlineSpellings,
1192     /*ArgNames=*/{}) {}
1193 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1194   if (!isa<FunctionDecl>(D)) {
1195     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1196       << Attr << Attr.isRegularKeywordAttribute() << "functions and statements";
1197     return false;
1198   }
1199   return true;
1200 }
1201 
1202 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
1203   if (!isa<Stmt>(St)) {
1204     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1205       << Attr << Attr.isRegularKeywordAttribute() << "functions and statements";
1206     return false;
1207   }
1208   return true;
1209 }
1210 
1211   using ParsedAttrInfo::diagMutualExclusion;
1212 
1213   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
1214     if (const auto *A = D->getAttr<NotTailCalledAttr>()) {
1215       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
1216       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
1217 return false;
1218     }
1219     return true;
1220   }
1221 
1222 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
1223   enum Spelling {
1224     GNU_always_inline = 0,
1225     CXX11_gnu_always_inline = 1,
1226     C23_gnu_always_inline = 2,
1227     CXX11_clang_always_inline = 3,
1228     C23_clang_always_inline = 4,
1229     Keyword_forceinline = 5,
1230   SpellingNotCalculated = 15
1231 
1232   };
1233 
1234   unsigned Idx = Attr.getAttributeSpellingListIndex();
1235   switch (Idx) {
1236     default: llvm_unreachable("Unknown spelling list index");
1237     case 0: return GNU_always_inline;
1238     case 1: return CXX11_gnu_always_inline;
1239     case 2: return C23_gnu_always_inline;
1240     case 3: return CXX11_clang_always_inline;
1241     case 4: return C23_clang_always_inline;
1242     case 5: return Keyword_forceinline;
1243   }
1244 }
1245 
1246 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
1247   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1248 }
1249 
1250 bool isParamExpr(size_t N) const override {
1251   return false;
1252 }
1253 
1254 static const ParsedAttrInfoAlwaysInline Instance;
1255 };
1256 const ParsedAttrInfoAlwaysInline ParsedAttrInfoAlwaysInline::Instance;
1257 static constexpr ParsedAttrInfo::Spelling AnalyzerNoReturnSpellings[] = {
1258   {AttributeCommonInfo::AS_GNU, "analyzer_noreturn"},
1259 };
1260 struct ParsedAttrInfoAnalyzerNoReturn final : public ParsedAttrInfo {
1261   constexpr ParsedAttrInfoAnalyzerNoReturn() : ParsedAttrInfo(
1262     /*AttrKind=*/ParsedAttr::AT_AnalyzerNoReturn,
1263     /*NumArgs=*/0,
1264     /*OptArgs=*/0,
1265     /*NumArgMembers=*/0,
1266     /*HasCustomParsing=*/0,
1267     /*AcceptsExprPack=*/0,
1268     /*IsTargetSpecific=*/0,
1269     /*IsType=*/0,
1270     /*IsStmt=*/0,
1271     /*IsKnownToGCC=*/0,
1272     /*IsSupportedByPragmaAttribute=*/0,
1273     /*Spellings=*/AnalyzerNoReturnSpellings,
1274     /*ArgNames=*/{}) {}
1275 bool isParamExpr(size_t N) const override {
1276   return false;
1277 }
1278 
1279 static const ParsedAttrInfoAnalyzerNoReturn Instance;
1280 };
1281 const ParsedAttrInfoAnalyzerNoReturn ParsedAttrInfoAnalyzerNoReturn::Instance;
1282 static constexpr ParsedAttrInfo::Spelling AnnotateSpellings[] = {
1283   {AttributeCommonInfo::AS_GNU, "annotate"},
1284   {AttributeCommonInfo::AS_CXX11, "clang::annotate"},
1285   {AttributeCommonInfo::AS_C23, "clang::annotate"},
1286 };
1287 static constexpr const char *AnnotateArgNames[] = {
1288 "Annotation","Args...",};
1289 struct ParsedAttrInfoAnnotate final : public ParsedAttrInfo {
1290   constexpr ParsedAttrInfoAnnotate() : ParsedAttrInfo(
1291     /*AttrKind=*/ParsedAttr::AT_Annotate,
1292     /*NumArgs=*/1,
1293     /*OptArgs=*/15,
1294     /*NumArgMembers=*/2,
1295     /*HasCustomParsing=*/0,
1296     /*AcceptsExprPack=*/1,
1297     /*IsTargetSpecific=*/0,
1298     /*IsType=*/0,
1299     /*IsStmt=*/0,
1300     /*IsKnownToGCC=*/0,
1301     /*IsSupportedByPragmaAttribute=*/1,
1302     /*Spellings=*/AnnotateSpellings,
1303     /*ArgNames=*/AnnotateArgNames) {}
1304 bool isParamExpr(size_t N) const override {
1305   return (N == 1) || false;
1306 }
1307 
1308 static const ParsedAttrInfoAnnotate Instance;
1309 };
1310 const ParsedAttrInfoAnnotate ParsedAttrInfoAnnotate::Instance;
1311 static constexpr ParsedAttrInfo::Spelling AnnotateTypeSpellings[] = {
1312   {AttributeCommonInfo::AS_CXX11, "clang::annotate_type"},
1313   {AttributeCommonInfo::AS_C23, "clang::annotate_type"},
1314 };
1315 static constexpr const char *AnnotateTypeArgNames[] = {
1316 "Annotation","Args...",};
1317 struct ParsedAttrInfoAnnotateType final : public ParsedAttrInfo {
1318   constexpr ParsedAttrInfoAnnotateType() : ParsedAttrInfo(
1319     /*AttrKind=*/ParsedAttr::AT_AnnotateType,
1320     /*NumArgs=*/1,
1321     /*OptArgs=*/15,
1322     /*NumArgMembers=*/2,
1323     /*HasCustomParsing=*/1,
1324     /*AcceptsExprPack=*/1,
1325     /*IsTargetSpecific=*/0,
1326     /*IsType=*/1,
1327     /*IsStmt=*/0,
1328     /*IsKnownToGCC=*/0,
1329     /*IsSupportedByPragmaAttribute=*/0,
1330     /*Spellings=*/AnnotateTypeSpellings,
1331     /*ArgNames=*/AnnotateTypeArgNames) {}
1332 bool isParamExpr(size_t N) const override {
1333   return (N == 1) || false;
1334 }
1335 
1336 static const ParsedAttrInfoAnnotateType Instance;
1337 };
1338 const ParsedAttrInfoAnnotateType ParsedAttrInfoAnnotateType::Instance;
1339 static constexpr ParsedAttrInfo::Spelling AnyX86NoCallerSavedRegistersSpellings[] = {
1340   {AttributeCommonInfo::AS_GNU, "no_caller_saved_registers"},
1341   {AttributeCommonInfo::AS_CXX11, "gnu::no_caller_saved_registers"},
1342   {AttributeCommonInfo::AS_C23, "gnu::no_caller_saved_registers"},
1343 };
1344 struct ParsedAttrInfoAnyX86NoCallerSavedRegisters final : public ParsedAttrInfo {
1345   constexpr ParsedAttrInfoAnyX86NoCallerSavedRegisters() : ParsedAttrInfo(
1346     /*AttrKind=*/ParsedAttr::AT_AnyX86NoCallerSavedRegisters,
1347     /*NumArgs=*/0,
1348     /*OptArgs=*/0,
1349     /*NumArgMembers=*/0,
1350     /*HasCustomParsing=*/0,
1351     /*AcceptsExprPack=*/0,
1352     /*IsTargetSpecific=*/1,
1353     /*IsType=*/0,
1354     /*IsStmt=*/0,
1355     /*IsKnownToGCC=*/1,
1356     /*IsSupportedByPragmaAttribute=*/0,
1357     /*Spellings=*/AnyX86NoCallerSavedRegistersSpellings,
1358     /*ArgNames=*/{}) {}
1359 bool existsInTarget(const TargetInfo &Target) const override {
1360   const llvm::Triple &T = Target.getTriple(); (void)T;
1361   return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64);
1362 }
1363 
1364 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
1365   D->addAttr(::new (S.Context) AnyX86NoCallerSavedRegistersAttr(S.Context, Attr));
1366   return AttributeApplied;
1367 }
1368 
1369 bool isParamExpr(size_t N) const override {
1370   return false;
1371 }
1372 
1373 static const ParsedAttrInfoAnyX86NoCallerSavedRegisters Instance;
1374 };
1375 const ParsedAttrInfoAnyX86NoCallerSavedRegisters ParsedAttrInfoAnyX86NoCallerSavedRegisters::Instance;
1376 static constexpr ParsedAttrInfo::Spelling AnyX86NoCfCheckSpellings[] = {
1377   {AttributeCommonInfo::AS_GNU, "nocf_check"},
1378   {AttributeCommonInfo::AS_CXX11, "gnu::nocf_check"},
1379   {AttributeCommonInfo::AS_C23, "gnu::nocf_check"},
1380 };
1381 struct ParsedAttrInfoAnyX86NoCfCheck final : public ParsedAttrInfo {
1382   constexpr ParsedAttrInfoAnyX86NoCfCheck() : ParsedAttrInfo(
1383     /*AttrKind=*/ParsedAttr::AT_AnyX86NoCfCheck,
1384     /*NumArgs=*/0,
1385     /*OptArgs=*/0,
1386     /*NumArgMembers=*/0,
1387     /*HasCustomParsing=*/0,
1388     /*AcceptsExprPack=*/0,
1389     /*IsTargetSpecific=*/1,
1390     /*IsType=*/1,
1391     /*IsStmt=*/0,
1392     /*IsKnownToGCC=*/1,
1393     /*IsSupportedByPragmaAttribute=*/1,
1394     /*Spellings=*/AnyX86NoCfCheckSpellings,
1395     /*ArgNames=*/{}) {}
1396 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1397   if (!isFunctionLike(D)) {
1398     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
1399       << Attr << Attr.isRegularKeywordAttribute() << "functions and function pointers";
1400     return false;
1401   }
1402   return true;
1403 }
1404 
1405 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1406   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1407     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1408   return false;
1409 }
1410 
1411 bool existsInTarget(const TargetInfo &Target) const override {
1412   const llvm::Triple &T = Target.getTriple(); (void)T;
1413   return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64);
1414 }
1415 
1416 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
1417   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
1418 }
1419 
1420 bool isParamExpr(size_t N) const override {
1421   return false;
1422 }
1423 
1424 static const ParsedAttrInfoAnyX86NoCfCheck Instance;
1425 };
1426 const ParsedAttrInfoAnyX86NoCfCheck ParsedAttrInfoAnyX86NoCfCheck::Instance;
1427 static constexpr ParsedAttrInfo::Spelling ArcWeakrefUnavailableSpellings[] = {
1428   {AttributeCommonInfo::AS_GNU, "objc_arc_weak_reference_unavailable"},
1429   {AttributeCommonInfo::AS_CXX11, "clang::objc_arc_weak_reference_unavailable"},
1430   {AttributeCommonInfo::AS_C23, "clang::objc_arc_weak_reference_unavailable"},
1431 };
1432 struct ParsedAttrInfoArcWeakrefUnavailable final : public ParsedAttrInfo {
1433   constexpr ParsedAttrInfoArcWeakrefUnavailable() : ParsedAttrInfo(
1434     /*AttrKind=*/ParsedAttr::AT_ArcWeakrefUnavailable,
1435     /*NumArgs=*/0,
1436     /*OptArgs=*/0,
1437     /*NumArgMembers=*/0,
1438     /*HasCustomParsing=*/0,
1439     /*AcceptsExprPack=*/0,
1440     /*IsTargetSpecific=*/0,
1441     /*IsType=*/0,
1442     /*IsStmt=*/0,
1443     /*IsKnownToGCC=*/0,
1444     /*IsSupportedByPragmaAttribute=*/1,
1445     /*Spellings=*/ArcWeakrefUnavailableSpellings,
1446     /*ArgNames=*/{}) {}
1447 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1448   if (!isa<ObjCInterfaceDecl>(D)) {
1449     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1450       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
1451     return false;
1452   }
1453   return true;
1454 }
1455 
1456 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1457   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1458     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1459   return false;
1460 }
1461 
1462 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
1463   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
1464 }
1465 
1466 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
1467   D->addAttr(::new (S.Context) ArcWeakrefUnavailableAttr(S.Context, Attr));
1468   return AttributeApplied;
1469 }
1470 
1471 bool isParamExpr(size_t N) const override {
1472   return false;
1473 }
1474 
1475 static const ParsedAttrInfoArcWeakrefUnavailable Instance;
1476 };
1477 const ParsedAttrInfoArcWeakrefUnavailable ParsedAttrInfoArcWeakrefUnavailable::Instance;
1478 static constexpr ParsedAttrInfo::Spelling ArgumentWithTypeTagSpellings[] = {
1479   {AttributeCommonInfo::AS_GNU, "argument_with_type_tag"},
1480   {AttributeCommonInfo::AS_CXX11, "clang::argument_with_type_tag"},
1481   {AttributeCommonInfo::AS_C23, "clang::argument_with_type_tag"},
1482   {AttributeCommonInfo::AS_GNU, "pointer_with_type_tag"},
1483   {AttributeCommonInfo::AS_CXX11, "clang::pointer_with_type_tag"},
1484   {AttributeCommonInfo::AS_C23, "clang::pointer_with_type_tag"},
1485 };
1486 static constexpr const char *ArgumentWithTypeTagArgNames[] = {
1487 "ArgumentKind","ArgumentIdx","TypeTagIdx",};
1488 struct ParsedAttrInfoArgumentWithTypeTag final : public ParsedAttrInfo {
1489   constexpr ParsedAttrInfoArgumentWithTypeTag() : ParsedAttrInfo(
1490     /*AttrKind=*/ParsedAttr::AT_ArgumentWithTypeTag,
1491     /*NumArgs=*/3,
1492     /*OptArgs=*/0,
1493     /*NumArgMembers=*/3,
1494     /*HasCustomParsing=*/0,
1495     /*AcceptsExprPack=*/0,
1496     /*IsTargetSpecific=*/0,
1497     /*IsType=*/0,
1498     /*IsStmt=*/0,
1499     /*IsKnownToGCC=*/0,
1500     /*IsSupportedByPragmaAttribute=*/0,
1501     /*Spellings=*/ArgumentWithTypeTagSpellings,
1502     /*ArgNames=*/ArgumentWithTypeTagArgNames) {}
1503 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1504   if (!isHasFunctionProto(D)) {
1505     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1506       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1507     return false;
1508   }
1509   return true;
1510 }
1511 
1512 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1513   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1514     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1515   return false;
1516 }
1517 
1518 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
1519   enum Spelling {
1520     GNU_argument_with_type_tag = 0,
1521     CXX11_clang_argument_with_type_tag = 1,
1522     C23_clang_argument_with_type_tag = 2,
1523     GNU_pointer_with_type_tag = 3,
1524     CXX11_clang_pointer_with_type_tag = 4,
1525     C23_clang_pointer_with_type_tag = 5,
1526   SpellingNotCalculated = 15
1527 
1528   };
1529 
1530   unsigned Idx = Attr.getAttributeSpellingListIndex();
1531   switch (Idx) {
1532     default: llvm_unreachable("Unknown spelling list index");
1533     case 0: return GNU_argument_with_type_tag;
1534     case 1: return CXX11_clang_argument_with_type_tag;
1535     case 2: return C23_clang_argument_with_type_tag;
1536     case 3: return GNU_pointer_with_type_tag;
1537     case 4: return CXX11_clang_pointer_with_type_tag;
1538     case 5: return C23_clang_pointer_with_type_tag;
1539   }
1540 }
1541 
1542 bool isParamExpr(size_t N) const override {
1543   return false;
1544 }
1545 
1546 static const ParsedAttrInfoArgumentWithTypeTag Instance;
1547 };
1548 const ParsedAttrInfoArgumentWithTypeTag ParsedAttrInfoArgumentWithTypeTag::Instance;
1549 static constexpr ParsedAttrInfo::Spelling ArmAgnosticSpellings[] = {
1550   {AttributeCommonInfo::AS_Keyword, "__arm_agnostic"},
1551 };
1552 static constexpr const char *ArmAgnosticArgNames[] = {
1553 "AgnosticArgs...",};
1554 struct ParsedAttrInfoArmAgnostic final : public ParsedAttrInfo {
1555   constexpr ParsedAttrInfoArmAgnostic() : ParsedAttrInfo(
1556     /*AttrKind=*/ParsedAttr::AT_ArmAgnostic,
1557     /*NumArgs=*/0,
1558     /*OptArgs=*/15,
1559     /*NumArgMembers=*/1,
1560     /*HasCustomParsing=*/0,
1561     /*AcceptsExprPack=*/0,
1562     /*IsTargetSpecific=*/1,
1563     /*IsType=*/1,
1564     /*IsStmt=*/0,
1565     /*IsKnownToGCC=*/0,
1566     /*IsSupportedByPragmaAttribute=*/0,
1567     /*Spellings=*/ArmAgnosticSpellings,
1568     /*ArgNames=*/ArmAgnosticArgNames) {}
1569 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1570   if (!isHasFunctionProto(D)) {
1571     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1572       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1573     return false;
1574   }
1575   return true;
1576 }
1577 
1578 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1579   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1580     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1581   return false;
1582 }
1583 
1584 bool existsInTarget(const TargetInfo &Target) const override {
1585   const llvm::Triple &T = Target.getTriple(); (void)T;
1586   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1587 }
1588 
1589 bool isParamExpr(size_t N) const override {
1590   return false;
1591 }
1592 
1593 static const ParsedAttrInfoArmAgnostic Instance;
1594 };
1595 const ParsedAttrInfoArmAgnostic ParsedAttrInfoArmAgnostic::Instance;
1596 static constexpr ParsedAttrInfo::Spelling ArmBuiltinAliasSpellings[] = {
1597   {AttributeCommonInfo::AS_GNU, "__clang_arm_builtin_alias"},
1598   {AttributeCommonInfo::AS_CXX11, "clang::__clang_arm_builtin_alias"},
1599   {AttributeCommonInfo::AS_C23, "clang::__clang_arm_builtin_alias"},
1600 };
1601 static constexpr const char *ArmBuiltinAliasArgNames[] = {
1602 "BuiltinName",};
1603 struct ParsedAttrInfoArmBuiltinAlias final : public ParsedAttrInfo {
1604   constexpr ParsedAttrInfoArmBuiltinAlias() : ParsedAttrInfo(
1605     /*AttrKind=*/ParsedAttr::AT_ArmBuiltinAlias,
1606     /*NumArgs=*/1,
1607     /*OptArgs=*/0,
1608     /*NumArgMembers=*/1,
1609     /*HasCustomParsing=*/0,
1610     /*AcceptsExprPack=*/0,
1611     /*IsTargetSpecific=*/1,
1612     /*IsType=*/0,
1613     /*IsStmt=*/0,
1614     /*IsKnownToGCC=*/0,
1615     /*IsSupportedByPragmaAttribute=*/1,
1616     /*Spellings=*/ArmBuiltinAliasSpellings,
1617     /*ArgNames=*/ArmBuiltinAliasArgNames) {}
1618 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1619   if (!isa<FunctionDecl>(D)) {
1620     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1621       << Attr << Attr.isRegularKeywordAttribute() << "functions";
1622     return false;
1623   }
1624   return true;
1625 }
1626 
1627 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1628   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1629     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1630   return false;
1631 }
1632 
1633 bool existsInTarget(const TargetInfo &Target) const override {
1634   const llvm::Triple &T = Target.getTriple(); (void)T;
1635   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 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1636 }
1637 
1638 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
1639   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
1640 }
1641 
1642 bool isParamExpr(size_t N) const override {
1643   return false;
1644 }
1645 
1646 static const ParsedAttrInfoArmBuiltinAlias Instance;
1647 };
1648 const ParsedAttrInfoArmBuiltinAlias ParsedAttrInfoArmBuiltinAlias::Instance;
1649 static constexpr ParsedAttrInfo::Spelling ArmInSpellings[] = {
1650   {AttributeCommonInfo::AS_Keyword, "__arm_in"},
1651 };
1652 static constexpr const char *ArmInArgNames[] = {
1653 "InArgs...",};
1654 struct ParsedAttrInfoArmIn final : public ParsedAttrInfo {
1655   constexpr ParsedAttrInfoArmIn() : ParsedAttrInfo(
1656     /*AttrKind=*/ParsedAttr::AT_ArmIn,
1657     /*NumArgs=*/0,
1658     /*OptArgs=*/15,
1659     /*NumArgMembers=*/1,
1660     /*HasCustomParsing=*/0,
1661     /*AcceptsExprPack=*/0,
1662     /*IsTargetSpecific=*/1,
1663     /*IsType=*/1,
1664     /*IsStmt=*/0,
1665     /*IsKnownToGCC=*/0,
1666     /*IsSupportedByPragmaAttribute=*/0,
1667     /*Spellings=*/ArmInSpellings,
1668     /*ArgNames=*/ArmInArgNames) {}
1669 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1670   if (!isHasFunctionProto(D)) {
1671     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1672       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1673     return false;
1674   }
1675   return true;
1676 }
1677 
1678 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1679   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1680     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1681   return false;
1682 }
1683 
1684 bool existsInTarget(const TargetInfo &Target) const override {
1685   const llvm::Triple &T = Target.getTriple(); (void)T;
1686   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1687 }
1688 
1689 bool isParamExpr(size_t N) const override {
1690   return false;
1691 }
1692 
1693 static const ParsedAttrInfoArmIn Instance;
1694 };
1695 const ParsedAttrInfoArmIn ParsedAttrInfoArmIn::Instance;
1696 static constexpr ParsedAttrInfo::Spelling ArmInOutSpellings[] = {
1697   {AttributeCommonInfo::AS_Keyword, "__arm_inout"},
1698 };
1699 static constexpr const char *ArmInOutArgNames[] = {
1700 "InOutArgs...",};
1701 struct ParsedAttrInfoArmInOut final : public ParsedAttrInfo {
1702   constexpr ParsedAttrInfoArmInOut() : ParsedAttrInfo(
1703     /*AttrKind=*/ParsedAttr::AT_ArmInOut,
1704     /*NumArgs=*/0,
1705     /*OptArgs=*/15,
1706     /*NumArgMembers=*/1,
1707     /*HasCustomParsing=*/0,
1708     /*AcceptsExprPack=*/0,
1709     /*IsTargetSpecific=*/1,
1710     /*IsType=*/1,
1711     /*IsStmt=*/0,
1712     /*IsKnownToGCC=*/0,
1713     /*IsSupportedByPragmaAttribute=*/0,
1714     /*Spellings=*/ArmInOutSpellings,
1715     /*ArgNames=*/ArmInOutArgNames) {}
1716 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1717   if (!isHasFunctionProto(D)) {
1718     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1719       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1720     return false;
1721   }
1722   return true;
1723 }
1724 
1725 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1726   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1727     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1728   return false;
1729 }
1730 
1731 bool existsInTarget(const TargetInfo &Target) const override {
1732   const llvm::Triple &T = Target.getTriple(); (void)T;
1733   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1734 }
1735 
1736 bool isParamExpr(size_t N) const override {
1737   return false;
1738 }
1739 
1740 static const ParsedAttrInfoArmInOut Instance;
1741 };
1742 const ParsedAttrInfoArmInOut ParsedAttrInfoArmInOut::Instance;
1743 static constexpr ParsedAttrInfo::Spelling ArmLocallyStreamingSpellings[] = {
1744   {AttributeCommonInfo::AS_Keyword, "__arm_locally_streaming"},
1745 };
1746 struct ParsedAttrInfoArmLocallyStreaming final : public ParsedAttrInfo {
1747   constexpr ParsedAttrInfoArmLocallyStreaming() : ParsedAttrInfo(
1748     /*AttrKind=*/ParsedAttr::AT_ArmLocallyStreaming,
1749     /*NumArgs=*/0,
1750     /*OptArgs=*/0,
1751     /*NumArgMembers=*/0,
1752     /*HasCustomParsing=*/0,
1753     /*AcceptsExprPack=*/0,
1754     /*IsTargetSpecific=*/1,
1755     /*IsType=*/0,
1756     /*IsStmt=*/0,
1757     /*IsKnownToGCC=*/0,
1758     /*IsSupportedByPragmaAttribute=*/0,
1759     /*Spellings=*/ArmLocallyStreamingSpellings,
1760     /*ArgNames=*/{}) {}
1761 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1762   if (!isa<FunctionDecl>(D)) {
1763     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1764       << Attr << Attr.isRegularKeywordAttribute() << "functions";
1765     return false;
1766   }
1767   return true;
1768 }
1769 
1770 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1771   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1772     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1773   return false;
1774 }
1775 
1776 bool existsInTarget(const TargetInfo &Target) const override {
1777   const llvm::Triple &T = Target.getTriple(); (void)T;
1778   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1779 }
1780 
1781 bool isParamExpr(size_t N) const override {
1782   return false;
1783 }
1784 
1785 static const ParsedAttrInfoArmLocallyStreaming Instance;
1786 };
1787 const ParsedAttrInfoArmLocallyStreaming ParsedAttrInfoArmLocallyStreaming::Instance;
1788 static constexpr ParsedAttrInfo::Spelling ArmMveStrictPolymorphismSpellings[] = {
1789   {AttributeCommonInfo::AS_GNU, "__clang_arm_mve_strict_polymorphism"},
1790   {AttributeCommonInfo::AS_CXX11, "clang::__clang_arm_mve_strict_polymorphism"},
1791   {AttributeCommonInfo::AS_C23, "clang::__clang_arm_mve_strict_polymorphism"},
1792 };
1793 struct ParsedAttrInfoArmMveStrictPolymorphism final : public ParsedAttrInfo {
1794   constexpr ParsedAttrInfoArmMveStrictPolymorphism() : ParsedAttrInfo(
1795     /*AttrKind=*/ParsedAttr::AT_ArmMveStrictPolymorphism,
1796     /*NumArgs=*/0,
1797     /*OptArgs=*/0,
1798     /*NumArgMembers=*/0,
1799     /*HasCustomParsing=*/0,
1800     /*AcceptsExprPack=*/0,
1801     /*IsTargetSpecific=*/1,
1802     /*IsType=*/1,
1803     /*IsStmt=*/0,
1804     /*IsKnownToGCC=*/0,
1805     /*IsSupportedByPragmaAttribute=*/0,
1806     /*Spellings=*/ArmMveStrictPolymorphismSpellings,
1807     /*ArgNames=*/{}) {}
1808 bool existsInTarget(const TargetInfo &Target) const override {
1809   const llvm::Triple &T = Target.getTriple(); (void)T;
1810   return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb);
1811 }
1812 
1813 bool isParamExpr(size_t N) const override {
1814   return false;
1815 }
1816 
1817 static const ParsedAttrInfoArmMveStrictPolymorphism Instance;
1818 };
1819 const ParsedAttrInfoArmMveStrictPolymorphism ParsedAttrInfoArmMveStrictPolymorphism::Instance;
1820 static constexpr ParsedAttrInfo::Spelling ArmNewSpellings[] = {
1821   {AttributeCommonInfo::AS_Keyword, "__arm_new"},
1822 };
1823 static constexpr const char *ArmNewArgNames[] = {
1824 "NewArgs...",};
1825 struct ParsedAttrInfoArmNew final : public ParsedAttrInfo {
1826   constexpr ParsedAttrInfoArmNew() : ParsedAttrInfo(
1827     /*AttrKind=*/ParsedAttr::AT_ArmNew,
1828     /*NumArgs=*/0,
1829     /*OptArgs=*/15,
1830     /*NumArgMembers=*/1,
1831     /*HasCustomParsing=*/0,
1832     /*AcceptsExprPack=*/0,
1833     /*IsTargetSpecific=*/1,
1834     /*IsType=*/0,
1835     /*IsStmt=*/0,
1836     /*IsKnownToGCC=*/0,
1837     /*IsSupportedByPragmaAttribute=*/0,
1838     /*Spellings=*/ArmNewSpellings,
1839     /*ArgNames=*/ArmNewArgNames) {}
1840 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1841   if (!isa<FunctionDecl>(D)) {
1842     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1843       << Attr << Attr.isRegularKeywordAttribute() << "functions";
1844     return false;
1845   }
1846   return true;
1847 }
1848 
1849 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1850   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1851     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1852   return false;
1853 }
1854 
1855 bool existsInTarget(const TargetInfo &Target) const override {
1856   const llvm::Triple &T = Target.getTriple(); (void)T;
1857   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1858 }
1859 
1860 bool isParamExpr(size_t N) const override {
1861   return false;
1862 }
1863 
1864 static const ParsedAttrInfoArmNew Instance;
1865 };
1866 const ParsedAttrInfoArmNew ParsedAttrInfoArmNew::Instance;
1867 static constexpr ParsedAttrInfo::Spelling ArmOutSpellings[] = {
1868   {AttributeCommonInfo::AS_Keyword, "__arm_out"},
1869 };
1870 static constexpr const char *ArmOutArgNames[] = {
1871 "OutArgs...",};
1872 struct ParsedAttrInfoArmOut final : public ParsedAttrInfo {
1873   constexpr ParsedAttrInfoArmOut() : ParsedAttrInfo(
1874     /*AttrKind=*/ParsedAttr::AT_ArmOut,
1875     /*NumArgs=*/0,
1876     /*OptArgs=*/15,
1877     /*NumArgMembers=*/1,
1878     /*HasCustomParsing=*/0,
1879     /*AcceptsExprPack=*/0,
1880     /*IsTargetSpecific=*/1,
1881     /*IsType=*/1,
1882     /*IsStmt=*/0,
1883     /*IsKnownToGCC=*/0,
1884     /*IsSupportedByPragmaAttribute=*/0,
1885     /*Spellings=*/ArmOutSpellings,
1886     /*ArgNames=*/ArmOutArgNames) {}
1887 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1888   if (!isHasFunctionProto(D)) {
1889     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1890       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1891     return false;
1892   }
1893   return true;
1894 }
1895 
1896 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1897   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1898     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1899   return false;
1900 }
1901 
1902 bool existsInTarget(const TargetInfo &Target) const override {
1903   const llvm::Triple &T = Target.getTriple(); (void)T;
1904   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1905 }
1906 
1907 bool isParamExpr(size_t N) const override {
1908   return false;
1909 }
1910 
1911 static const ParsedAttrInfoArmOut Instance;
1912 };
1913 const ParsedAttrInfoArmOut ParsedAttrInfoArmOut::Instance;
1914 static constexpr ParsedAttrInfo::Spelling ArmPreservesSpellings[] = {
1915   {AttributeCommonInfo::AS_Keyword, "__arm_preserves"},
1916 };
1917 static constexpr const char *ArmPreservesArgNames[] = {
1918 "PreserveArgs...",};
1919 struct ParsedAttrInfoArmPreserves final : public ParsedAttrInfo {
1920   constexpr ParsedAttrInfoArmPreserves() : ParsedAttrInfo(
1921     /*AttrKind=*/ParsedAttr::AT_ArmPreserves,
1922     /*NumArgs=*/0,
1923     /*OptArgs=*/15,
1924     /*NumArgMembers=*/1,
1925     /*HasCustomParsing=*/0,
1926     /*AcceptsExprPack=*/0,
1927     /*IsTargetSpecific=*/1,
1928     /*IsType=*/1,
1929     /*IsStmt=*/0,
1930     /*IsKnownToGCC=*/0,
1931     /*IsSupportedByPragmaAttribute=*/0,
1932     /*Spellings=*/ArmPreservesSpellings,
1933     /*ArgNames=*/ArmPreservesArgNames) {}
1934 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1935   if (!isHasFunctionProto(D)) {
1936     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1937       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1938     return false;
1939   }
1940   return true;
1941 }
1942 
1943 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1944   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1945     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1946   return false;
1947 }
1948 
1949 bool existsInTarget(const TargetInfo &Target) const override {
1950   const llvm::Triple &T = Target.getTriple(); (void)T;
1951   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1952 }
1953 
1954 bool isParamExpr(size_t N) const override {
1955   return false;
1956 }
1957 
1958 static const ParsedAttrInfoArmPreserves Instance;
1959 };
1960 const ParsedAttrInfoArmPreserves ParsedAttrInfoArmPreserves::Instance;
1961 static constexpr ParsedAttrInfo::Spelling ArmStreamingSpellings[] = {
1962   {AttributeCommonInfo::AS_Keyword, "__arm_streaming"},
1963 };
1964 struct ParsedAttrInfoArmStreaming final : public ParsedAttrInfo {
1965   constexpr ParsedAttrInfoArmStreaming() : ParsedAttrInfo(
1966     /*AttrKind=*/ParsedAttr::AT_ArmStreaming,
1967     /*NumArgs=*/0,
1968     /*OptArgs=*/0,
1969     /*NumArgMembers=*/0,
1970     /*HasCustomParsing=*/0,
1971     /*AcceptsExprPack=*/0,
1972     /*IsTargetSpecific=*/1,
1973     /*IsType=*/1,
1974     /*IsStmt=*/0,
1975     /*IsKnownToGCC=*/0,
1976     /*IsSupportedByPragmaAttribute=*/0,
1977     /*Spellings=*/ArmStreamingSpellings,
1978     /*ArgNames=*/{}) {}
1979 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
1980   if (!isHasFunctionProto(D)) {
1981     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
1982       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
1983     return false;
1984   }
1985   return true;
1986 }
1987 
1988 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
1989   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
1990     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
1991   return false;
1992 }
1993 
1994 bool existsInTarget(const TargetInfo &Target) const override {
1995   const llvm::Triple &T = Target.getTriple(); (void)T;
1996   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
1997 }
1998 
1999 bool isParamExpr(size_t N) const override {
2000   return false;
2001 }
2002 
2003 static const ParsedAttrInfoArmStreaming Instance;
2004 };
2005 const ParsedAttrInfoArmStreaming ParsedAttrInfoArmStreaming::Instance;
2006 static constexpr ParsedAttrInfo::Spelling ArmStreamingCompatibleSpellings[] = {
2007   {AttributeCommonInfo::AS_Keyword, "__arm_streaming_compatible"},
2008 };
2009 struct ParsedAttrInfoArmStreamingCompatible final : public ParsedAttrInfo {
2010   constexpr ParsedAttrInfoArmStreamingCompatible() : ParsedAttrInfo(
2011     /*AttrKind=*/ParsedAttr::AT_ArmStreamingCompatible,
2012     /*NumArgs=*/0,
2013     /*OptArgs=*/0,
2014     /*NumArgMembers=*/0,
2015     /*HasCustomParsing=*/0,
2016     /*AcceptsExprPack=*/0,
2017     /*IsTargetSpecific=*/1,
2018     /*IsType=*/1,
2019     /*IsStmt=*/0,
2020     /*IsKnownToGCC=*/0,
2021     /*IsSupportedByPragmaAttribute=*/0,
2022     /*Spellings=*/ArmStreamingCompatibleSpellings,
2023     /*ArgNames=*/{}) {}
2024 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2025   if (!isHasFunctionProto(D)) {
2026     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2027       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
2028     return false;
2029   }
2030   return true;
2031 }
2032 
2033 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2034   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2035     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2036   return false;
2037 }
2038 
2039 bool existsInTarget(const TargetInfo &Target) const override {
2040   const llvm::Triple &T = Target.getTriple(); (void)T;
2041   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32);
2042 }
2043 
2044 bool isParamExpr(size_t N) const override {
2045   return false;
2046 }
2047 
2048 static const ParsedAttrInfoArmStreamingCompatible Instance;
2049 };
2050 const ParsedAttrInfoArmStreamingCompatible ParsedAttrInfoArmStreamingCompatible::Instance;
2051 static constexpr ParsedAttrInfo::Spelling ArmSveVectorBitsSpellings[] = {
2052   {AttributeCommonInfo::AS_GNU, "arm_sve_vector_bits"},
2053 };
2054 static constexpr const char *ArmSveVectorBitsArgNames[] = {
2055 "NumBits",};
2056 struct ParsedAttrInfoArmSveVectorBits final : public ParsedAttrInfo {
2057   constexpr ParsedAttrInfoArmSveVectorBits() : ParsedAttrInfo(
2058     /*AttrKind=*/ParsedAttr::AT_ArmSveVectorBits,
2059     /*NumArgs=*/1,
2060     /*OptArgs=*/0,
2061     /*NumArgMembers=*/1,
2062     /*HasCustomParsing=*/0,
2063     /*AcceptsExprPack=*/0,
2064     /*IsTargetSpecific=*/0,
2065     /*IsType=*/1,
2066     /*IsStmt=*/0,
2067     /*IsKnownToGCC=*/0,
2068     /*IsSupportedByPragmaAttribute=*/0,
2069     /*Spellings=*/ArmSveVectorBitsSpellings,
2070     /*ArgNames=*/ArmSveVectorBitsArgNames) {}
2071 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2072   if (!isa<TypedefNameDecl>(D)) {
2073     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2074       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
2075     return false;
2076   }
2077   return true;
2078 }
2079 
2080 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2081   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2082     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2083   return false;
2084 }
2085 
2086 bool isParamExpr(size_t N) const override {
2087   return false;
2088 }
2089 
2090 static const ParsedAttrInfoArmSveVectorBits Instance;
2091 };
2092 const ParsedAttrInfoArmSveVectorBits ParsedAttrInfoArmSveVectorBits::Instance;
2093 static constexpr ParsedAttrInfo::Spelling ArtificialSpellings[] = {
2094   {AttributeCommonInfo::AS_GNU, "artificial"},
2095   {AttributeCommonInfo::AS_CXX11, "gnu::artificial"},
2096   {AttributeCommonInfo::AS_C23, "gnu::artificial"},
2097 };
2098 struct ParsedAttrInfoArtificial final : public ParsedAttrInfo {
2099   constexpr ParsedAttrInfoArtificial() : ParsedAttrInfo(
2100     /*AttrKind=*/ParsedAttr::AT_Artificial,
2101     /*NumArgs=*/0,
2102     /*OptArgs=*/0,
2103     /*NumArgMembers=*/0,
2104     /*HasCustomParsing=*/0,
2105     /*AcceptsExprPack=*/0,
2106     /*IsTargetSpecific=*/0,
2107     /*IsType=*/0,
2108     /*IsStmt=*/0,
2109     /*IsKnownToGCC=*/1,
2110     /*IsSupportedByPragmaAttribute=*/0,
2111     /*Spellings=*/ArtificialSpellings,
2112     /*ArgNames=*/{}) {}
2113 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2114   if (!isInlineFunction(D)) {
2115     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2116       << Attr << Attr.isRegularKeywordAttribute() << "inline functions";
2117     return false;
2118   }
2119   return true;
2120 }
2121 
2122 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2123   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2124     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2125   return false;
2126 }
2127 
2128 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
2129   D->addAttr(::new (S.Context) ArtificialAttr(S.Context, Attr));
2130   return AttributeApplied;
2131 }
2132 
2133 bool isParamExpr(size_t N) const override {
2134   return false;
2135 }
2136 
2137 static const ParsedAttrInfoArtificial Instance;
2138 };
2139 const ParsedAttrInfoArtificial ParsedAttrInfoArtificial::Instance;
2140 static constexpr ParsedAttrInfo::Spelling AssertCapabilitySpellings[] = {
2141   {AttributeCommonInfo::AS_GNU, "assert_capability"},
2142   {AttributeCommonInfo::AS_CXX11, "clang::assert_capability"},
2143   {AttributeCommonInfo::AS_GNU, "assert_shared_capability"},
2144   {AttributeCommonInfo::AS_CXX11, "clang::assert_shared_capability"},
2145 };
2146 static constexpr const char *AssertCapabilityArgNames[] = {
2147 "Args...",};
2148 struct ParsedAttrInfoAssertCapability final : public ParsedAttrInfo {
2149   constexpr ParsedAttrInfoAssertCapability() : ParsedAttrInfo(
2150     /*AttrKind=*/ParsedAttr::AT_AssertCapability,
2151     /*NumArgs=*/0,
2152     /*OptArgs=*/15,
2153     /*NumArgMembers=*/1,
2154     /*HasCustomParsing=*/0,
2155     /*AcceptsExprPack=*/0,
2156     /*IsTargetSpecific=*/0,
2157     /*IsType=*/0,
2158     /*IsStmt=*/0,
2159     /*IsKnownToGCC=*/0,
2160     /*IsSupportedByPragmaAttribute=*/0,
2161     /*Spellings=*/AssertCapabilitySpellings,
2162     /*ArgNames=*/AssertCapabilityArgNames) {}
2163 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2164   if (!isa<FunctionDecl>(D)) {
2165     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2166       << Attr << Attr.isRegularKeywordAttribute() << "functions";
2167     return false;
2168   }
2169   return true;
2170 }
2171 
2172 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2173   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2174     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2175   return false;
2176 }
2177 
2178 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
2179   enum Spelling {
2180     GNU_assert_capability = 0,
2181     CXX11_clang_assert_capability = 1,
2182     GNU_assert_shared_capability = 2,
2183     CXX11_clang_assert_shared_capability = 3,
2184   SpellingNotCalculated = 15
2185 
2186   };
2187 
2188   unsigned Idx = Attr.getAttributeSpellingListIndex();
2189   switch (Idx) {
2190     default: llvm_unreachable("Unknown spelling list index");
2191     case 0: return GNU_assert_capability;
2192     case 1: return CXX11_clang_assert_capability;
2193     case 2: return GNU_assert_shared_capability;
2194     case 3: return CXX11_clang_assert_shared_capability;
2195   }
2196 }
2197 
2198 bool isParamExpr(size_t N) const override {
2199   return (N == 0) || false;
2200 }
2201 
2202 static const ParsedAttrInfoAssertCapability Instance;
2203 };
2204 const ParsedAttrInfoAssertCapability ParsedAttrInfoAssertCapability::Instance;
2205 static constexpr ParsedAttrInfo::Spelling AssertExclusiveLockSpellings[] = {
2206   {AttributeCommonInfo::AS_GNU, "assert_exclusive_lock"},
2207 };
2208 static constexpr const char *AssertExclusiveLockArgNames[] = {
2209 "Args...",};
2210 struct ParsedAttrInfoAssertExclusiveLock final : public ParsedAttrInfo {
2211   constexpr ParsedAttrInfoAssertExclusiveLock() : ParsedAttrInfo(
2212     /*AttrKind=*/ParsedAttr::AT_AssertExclusiveLock,
2213     /*NumArgs=*/0,
2214     /*OptArgs=*/15,
2215     /*NumArgMembers=*/1,
2216     /*HasCustomParsing=*/0,
2217     /*AcceptsExprPack=*/0,
2218     /*IsTargetSpecific=*/0,
2219     /*IsType=*/0,
2220     /*IsStmt=*/0,
2221     /*IsKnownToGCC=*/0,
2222     /*IsSupportedByPragmaAttribute=*/0,
2223     /*Spellings=*/AssertExclusiveLockSpellings,
2224     /*ArgNames=*/AssertExclusiveLockArgNames) {}
2225 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2226   if (!isa<FunctionDecl>(D)) {
2227     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2228       << Attr << Attr.isRegularKeywordAttribute() << "functions";
2229     return false;
2230   }
2231   return true;
2232 }
2233 
2234 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2235   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2236     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2237   return false;
2238 }
2239 
2240 bool isParamExpr(size_t N) const override {
2241   return (N == 0) || false;
2242 }
2243 
2244 static const ParsedAttrInfoAssertExclusiveLock Instance;
2245 };
2246 const ParsedAttrInfoAssertExclusiveLock ParsedAttrInfoAssertExclusiveLock::Instance;
2247 static constexpr ParsedAttrInfo::Spelling AssertSharedLockSpellings[] = {
2248   {AttributeCommonInfo::AS_GNU, "assert_shared_lock"},
2249 };
2250 static constexpr const char *AssertSharedLockArgNames[] = {
2251 "Args...",};
2252 struct ParsedAttrInfoAssertSharedLock final : public ParsedAttrInfo {
2253   constexpr ParsedAttrInfoAssertSharedLock() : ParsedAttrInfo(
2254     /*AttrKind=*/ParsedAttr::AT_AssertSharedLock,
2255     /*NumArgs=*/0,
2256     /*OptArgs=*/15,
2257     /*NumArgMembers=*/1,
2258     /*HasCustomParsing=*/0,
2259     /*AcceptsExprPack=*/0,
2260     /*IsTargetSpecific=*/0,
2261     /*IsType=*/0,
2262     /*IsStmt=*/0,
2263     /*IsKnownToGCC=*/0,
2264     /*IsSupportedByPragmaAttribute=*/0,
2265     /*Spellings=*/AssertSharedLockSpellings,
2266     /*ArgNames=*/AssertSharedLockArgNames) {}
2267 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2268   if (!isa<FunctionDecl>(D)) {
2269     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2270       << Attr << Attr.isRegularKeywordAttribute() << "functions";
2271     return false;
2272   }
2273   return true;
2274 }
2275 
2276 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2277   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2278     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2279   return false;
2280 }
2281 
2282 bool isParamExpr(size_t N) const override {
2283   return (N == 0) || false;
2284 }
2285 
2286 static const ParsedAttrInfoAssertSharedLock Instance;
2287 };
2288 const ParsedAttrInfoAssertSharedLock ParsedAttrInfoAssertSharedLock::Instance;
2289 static constexpr ParsedAttrInfo::Spelling AssumeAlignedSpellings[] = {
2290   {AttributeCommonInfo::AS_GNU, "assume_aligned"},
2291   {AttributeCommonInfo::AS_CXX11, "gnu::assume_aligned"},
2292   {AttributeCommonInfo::AS_C23, "gnu::assume_aligned"},
2293 };
2294 static constexpr const char *AssumeAlignedArgNames[] = {
2295 "Alignment","Offset",};
2296 struct ParsedAttrInfoAssumeAligned final : public ParsedAttrInfo {
2297   constexpr ParsedAttrInfoAssumeAligned() : ParsedAttrInfo(
2298     /*AttrKind=*/ParsedAttr::AT_AssumeAligned,
2299     /*NumArgs=*/1,
2300     /*OptArgs=*/1,
2301     /*NumArgMembers=*/2,
2302     /*HasCustomParsing=*/0,
2303     /*AcceptsExprPack=*/0,
2304     /*IsTargetSpecific=*/0,
2305     /*IsType=*/0,
2306     /*IsStmt=*/0,
2307     /*IsKnownToGCC=*/1,
2308     /*IsSupportedByPragmaAttribute=*/1,
2309     /*Spellings=*/AssumeAlignedSpellings,
2310     /*ArgNames=*/AssumeAlignedArgNames) {}
2311 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2312   if (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) {
2313     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2314       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods and functions";
2315     return false;
2316   }
2317   return true;
2318 }
2319 
2320 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2321   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2322     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2323   return false;
2324 }
2325 
2326 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2327   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
2328   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2329 }
2330 
2331 bool isParamExpr(size_t N) const override {
2332   return (N == 0) || (N == 1) || false;
2333 }
2334 
2335 static const ParsedAttrInfoAssumeAligned Instance;
2336 };
2337 const ParsedAttrInfoAssumeAligned ParsedAttrInfoAssumeAligned::Instance;
2338 static constexpr ParsedAttrInfo::Spelling AvailabilitySpellings[] = {
2339   {AttributeCommonInfo::AS_GNU, "availability"},
2340   {AttributeCommonInfo::AS_CXX11, "clang::availability"},
2341   {AttributeCommonInfo::AS_C23, "clang::availability"},
2342 };
2343 static constexpr const char *AvailabilityArgNames[] = {
2344 "platform","introduced","deprecated","obsoleted","unavailable","message","strict","replacement","priority","environment",};
2345 struct ParsedAttrInfoAvailability final : public ParsedAttrInfo {
2346   constexpr ParsedAttrInfoAvailability() : ParsedAttrInfo(
2347     /*AttrKind=*/ParsedAttr::AT_Availability,
2348     /*NumArgs=*/10,
2349     /*OptArgs=*/0,
2350     /*NumArgMembers=*/10,
2351     /*HasCustomParsing=*/1,
2352     /*AcceptsExprPack=*/0,
2353     /*IsTargetSpecific=*/0,
2354     /*IsType=*/0,
2355     /*IsStmt=*/0,
2356     /*IsKnownToGCC=*/0,
2357     /*IsSupportedByPragmaAttribute=*/1,
2358     /*Spellings=*/AvailabilitySpellings,
2359     /*ArgNames=*/AvailabilityArgNames) {}
2360 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2361   if (!isa<NamedDecl>(D)) {
2362     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2363       << Attr << Attr.isRegularKeywordAttribute() << "named declarations";
2364     return false;
2365   }
2366   return true;
2367 }
2368 
2369 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2370   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2371     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2372   return false;
2373 }
2374 
2375 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2376   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2377   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
2378   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum_constant, /*IsSupported=*/true));
2379   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true));
2380   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2381   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus));
2382   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC));
2383   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC));
2384   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
2385   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
2386   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC));
2387   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC));
2388   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2389   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
2390   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
2391 }
2392 
2393 bool isParamExpr(size_t N) const override {
2394   return false;
2395 }
2396 
2397 static const ParsedAttrInfoAvailability Instance;
2398 };
2399 const ParsedAttrInfoAvailability ParsedAttrInfoAvailability::Instance;
2400 static constexpr ParsedAttrInfo::Spelling AvailableOnlyInDefaultEvalMethodSpellings[] = {
2401   {AttributeCommonInfo::AS_GNU, "available_only_in_default_eval_method"},
2402   {AttributeCommonInfo::AS_CXX11, "clang::available_only_in_default_eval_method"},
2403   {AttributeCommonInfo::AS_C23, "clang::available_only_in_default_eval_method"},
2404 };
2405 struct ParsedAttrInfoAvailableOnlyInDefaultEvalMethod final : public ParsedAttrInfo {
2406   constexpr ParsedAttrInfoAvailableOnlyInDefaultEvalMethod() : ParsedAttrInfo(
2407     /*AttrKind=*/ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod,
2408     /*NumArgs=*/0,
2409     /*OptArgs=*/0,
2410     /*NumArgMembers=*/0,
2411     /*HasCustomParsing=*/0,
2412     /*AcceptsExprPack=*/0,
2413     /*IsTargetSpecific=*/0,
2414     /*IsType=*/0,
2415     /*IsStmt=*/0,
2416     /*IsKnownToGCC=*/0,
2417     /*IsSupportedByPragmaAttribute=*/1,
2418     /*Spellings=*/AvailableOnlyInDefaultEvalMethodSpellings,
2419     /*ArgNames=*/{}) {}
2420 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2421   if (!isa<TypedefNameDecl>(D)) {
2422     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2423       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
2424     return false;
2425   }
2426   return true;
2427 }
2428 
2429 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2430   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2431     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2432   return false;
2433 }
2434 
2435 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2436   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
2437 }
2438 
2439 bool isParamExpr(size_t N) const override {
2440   return false;
2441 }
2442 
2443 static const ParsedAttrInfoAvailableOnlyInDefaultEvalMethod Instance;
2444 };
2445 const ParsedAttrInfoAvailableOnlyInDefaultEvalMethod ParsedAttrInfoAvailableOnlyInDefaultEvalMethod::Instance;
2446 static constexpr ParsedAttrInfo::Spelling BPFFastCallSpellings[] = {
2447   {AttributeCommonInfo::AS_GNU, "bpf_fastcall"},
2448   {AttributeCommonInfo::AS_CXX11, "clang::bpf_fastcall"},
2449   {AttributeCommonInfo::AS_C23, "clang::bpf_fastcall"},
2450 };
2451 struct ParsedAttrInfoBPFFastCall final : public ParsedAttrInfo {
2452   constexpr ParsedAttrInfoBPFFastCall() : ParsedAttrInfo(
2453     /*AttrKind=*/ParsedAttr::AT_BPFFastCall,
2454     /*NumArgs=*/0,
2455     /*OptArgs=*/0,
2456     /*NumArgMembers=*/0,
2457     /*HasCustomParsing=*/0,
2458     /*AcceptsExprPack=*/0,
2459     /*IsTargetSpecific=*/1,
2460     /*IsType=*/0,
2461     /*IsStmt=*/0,
2462     /*IsKnownToGCC=*/0,
2463     /*IsSupportedByPragmaAttribute=*/1,
2464     /*Spellings=*/BPFFastCallSpellings,
2465     /*ArgNames=*/{}) {}
2466 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2467   if (!isFunctionLike(D)) {
2468     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2469       << Attr << Attr.isRegularKeywordAttribute() << "functions and function pointers";
2470     return false;
2471   }
2472   return true;
2473 }
2474 
2475 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2476   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2477     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2478   return false;
2479 }
2480 
2481 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
2482   return (!LangOpts.CPlusPlus);
2483 }
2484 
2485 bool existsInTarget(const TargetInfo &Target) const override {
2486   const llvm::Triple &T = Target.getTriple(); (void)T;
2487   return true && (T.getArch() == llvm::Triple::bpfel || T.getArch() == llvm::Triple::bpfeb);
2488 }
2489 
2490 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2491   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
2492 }
2493 
2494 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
2495   D->addAttr(::new (S.Context) BPFFastCallAttr(S.Context, Attr));
2496   return AttributeApplied;
2497 }
2498 
2499 bool isParamExpr(size_t N) const override {
2500   return false;
2501 }
2502 
2503 static const ParsedAttrInfoBPFFastCall Instance;
2504 };
2505 const ParsedAttrInfoBPFFastCall ParsedAttrInfoBPFFastCall::Instance;
2506 static constexpr ParsedAttrInfo::Spelling BPFPreserveAccessIndexSpellings[] = {
2507   {AttributeCommonInfo::AS_GNU, "preserve_access_index"},
2508   {AttributeCommonInfo::AS_CXX11, "clang::preserve_access_index"},
2509   {AttributeCommonInfo::AS_C23, "clang::preserve_access_index"},
2510 };
2511 struct ParsedAttrInfoBPFPreserveAccessIndex final : public ParsedAttrInfo {
2512   constexpr ParsedAttrInfoBPFPreserveAccessIndex() : ParsedAttrInfo(
2513     /*AttrKind=*/ParsedAttr::AT_BPFPreserveAccessIndex,
2514     /*NumArgs=*/0,
2515     /*OptArgs=*/0,
2516     /*NumArgMembers=*/0,
2517     /*HasCustomParsing=*/0,
2518     /*AcceptsExprPack=*/0,
2519     /*IsTargetSpecific=*/1,
2520     /*IsType=*/0,
2521     /*IsStmt=*/0,
2522     /*IsKnownToGCC=*/0,
2523     /*IsSupportedByPragmaAttribute=*/1,
2524     /*Spellings=*/BPFPreserveAccessIndexSpellings,
2525     /*ArgNames=*/{}) {}
2526 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2527   if (!isa<RecordDecl>(D)) {
2528     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2529       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
2530     return false;
2531   }
2532   return true;
2533 }
2534 
2535 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2536   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2537     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2538   return false;
2539 }
2540 
2541 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
2542   return (!LangOpts.CPlusPlus);
2543 }
2544 
2545 bool existsInTarget(const TargetInfo &Target) const override {
2546   const llvm::Triple &T = Target.getTriple(); (void)T;
2547   return true && (T.getArch() == llvm::Triple::bpfel || T.getArch() == llvm::Triple::bpfeb);
2548 }
2549 
2550 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2551   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2552 }
2553 
2554 bool isParamExpr(size_t N) const override {
2555   return false;
2556 }
2557 
2558 static const ParsedAttrInfoBPFPreserveAccessIndex Instance;
2559 };
2560 const ParsedAttrInfoBPFPreserveAccessIndex ParsedAttrInfoBPFPreserveAccessIndex::Instance;
2561 static constexpr ParsedAttrInfo::Spelling BPFPreserveStaticOffsetSpellings[] = {
2562   {AttributeCommonInfo::AS_GNU, "preserve_static_offset"},
2563   {AttributeCommonInfo::AS_CXX11, "clang::preserve_static_offset"},
2564   {AttributeCommonInfo::AS_C23, "clang::preserve_static_offset"},
2565 };
2566 struct ParsedAttrInfoBPFPreserveStaticOffset final : public ParsedAttrInfo {
2567   constexpr ParsedAttrInfoBPFPreserveStaticOffset() : ParsedAttrInfo(
2568     /*AttrKind=*/ParsedAttr::AT_BPFPreserveStaticOffset,
2569     /*NumArgs=*/0,
2570     /*OptArgs=*/0,
2571     /*NumArgMembers=*/0,
2572     /*HasCustomParsing=*/0,
2573     /*AcceptsExprPack=*/0,
2574     /*IsTargetSpecific=*/1,
2575     /*IsType=*/0,
2576     /*IsStmt=*/0,
2577     /*IsKnownToGCC=*/0,
2578     /*IsSupportedByPragmaAttribute=*/1,
2579     /*Spellings=*/BPFPreserveStaticOffsetSpellings,
2580     /*ArgNames=*/{}) {}
2581 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2582   if (!isa<RecordDecl>(D)) {
2583     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2584       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
2585     return false;
2586   }
2587   return true;
2588 }
2589 
2590 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2591   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2592     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2593   return false;
2594 }
2595 
2596 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
2597   return (!LangOpts.CPlusPlus);
2598 }
2599 
2600 bool existsInTarget(const TargetInfo &Target) const override {
2601   const llvm::Triple &T = Target.getTriple(); (void)T;
2602   return true && (T.getArch() == llvm::Triple::bpfel || T.getArch() == llvm::Triple::bpfeb);
2603 }
2604 
2605 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2606   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2607 }
2608 
2609 bool isParamExpr(size_t N) const override {
2610   return false;
2611 }
2612 
2613 static const ParsedAttrInfoBPFPreserveStaticOffset Instance;
2614 };
2615 const ParsedAttrInfoBPFPreserveStaticOffset ParsedAttrInfoBPFPreserveStaticOffset::Instance;
2616 static constexpr ParsedAttrInfo::Spelling BTFDeclTagSpellings[] = {
2617   {AttributeCommonInfo::AS_GNU, "btf_decl_tag"},
2618   {AttributeCommonInfo::AS_CXX11, "clang::btf_decl_tag"},
2619   {AttributeCommonInfo::AS_C23, "clang::btf_decl_tag"},
2620 };
2621 static constexpr const char *BTFDeclTagArgNames[] = {
2622 "BTFDeclTag",};
2623 struct ParsedAttrInfoBTFDeclTag final : public ParsedAttrInfo {
2624   constexpr ParsedAttrInfoBTFDeclTag() : ParsedAttrInfo(
2625     /*AttrKind=*/ParsedAttr::AT_BTFDeclTag,
2626     /*NumArgs=*/1,
2627     /*OptArgs=*/0,
2628     /*NumArgMembers=*/1,
2629     /*HasCustomParsing=*/0,
2630     /*AcceptsExprPack=*/0,
2631     /*IsTargetSpecific=*/0,
2632     /*IsType=*/0,
2633     /*IsStmt=*/0,
2634     /*IsKnownToGCC=*/0,
2635     /*IsSupportedByPragmaAttribute=*/1,
2636     /*Spellings=*/BTFDeclTagSpellings,
2637     /*ArgNames=*/BTFDeclTagArgNames) {}
2638 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2639   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<RecordDecl>(D) && !isa<FieldDecl>(D) && !isa<TypedefNameDecl>(D)) {
2640     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2641       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, structs, unions, classes, non-static data members, and typedefs";
2642     return false;
2643   }
2644   return true;
2645 }
2646 
2647 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2648   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2649     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2650   return false;
2651 }
2652 
2653 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
2654   return (!LangOpts.CPlusPlus);
2655 }
2656 
2657 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2658   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
2659   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2660   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
2661   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true));
2662   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
2663 }
2664 
2665 bool isParamExpr(size_t N) const override {
2666   return false;
2667 }
2668 
2669 static const ParsedAttrInfoBTFDeclTag Instance;
2670 };
2671 const ParsedAttrInfoBTFDeclTag ParsedAttrInfoBTFDeclTag::Instance;
2672 static constexpr ParsedAttrInfo::Spelling BTFTypeTagSpellings[] = {
2673   {AttributeCommonInfo::AS_GNU, "btf_type_tag"},
2674   {AttributeCommonInfo::AS_CXX11, "clang::btf_type_tag"},
2675   {AttributeCommonInfo::AS_C23, "clang::btf_type_tag"},
2676 };
2677 static constexpr const char *BTFTypeTagArgNames[] = {
2678 "BTFTypeTag",};
2679 struct ParsedAttrInfoBTFTypeTag final : public ParsedAttrInfo {
2680   constexpr ParsedAttrInfoBTFTypeTag() : ParsedAttrInfo(
2681     /*AttrKind=*/ParsedAttr::AT_BTFTypeTag,
2682     /*NumArgs=*/1,
2683     /*OptArgs=*/0,
2684     /*NumArgMembers=*/1,
2685     /*HasCustomParsing=*/0,
2686     /*AcceptsExprPack=*/0,
2687     /*IsTargetSpecific=*/0,
2688     /*IsType=*/1,
2689     /*IsStmt=*/0,
2690     /*IsKnownToGCC=*/0,
2691     /*IsSupportedByPragmaAttribute=*/0,
2692     /*Spellings=*/BTFTypeTagSpellings,
2693     /*ArgNames=*/BTFTypeTagArgNames) {}
2694 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
2695   return (!LangOpts.CPlusPlus);
2696 }
2697 
2698 bool isParamExpr(size_t N) const override {
2699   return false;
2700 }
2701 
2702 static const ParsedAttrInfoBTFTypeTag Instance;
2703 };
2704 const ParsedAttrInfoBTFTypeTag ParsedAttrInfoBTFTypeTag::Instance;
2705 static constexpr ParsedAttrInfo::Spelling BlockingSpellings[] = {
2706   {AttributeCommonInfo::AS_GNU, "blocking"},
2707   {AttributeCommonInfo::AS_CXX11, "clang::blocking"},
2708   {AttributeCommonInfo::AS_C23, "clang::blocking"},
2709 };
2710 struct ParsedAttrInfoBlocking final : public ParsedAttrInfo {
2711   constexpr ParsedAttrInfoBlocking() : ParsedAttrInfo(
2712     /*AttrKind=*/ParsedAttr::AT_Blocking,
2713     /*NumArgs=*/0,
2714     /*OptArgs=*/0,
2715     /*NumArgMembers=*/0,
2716     /*HasCustomParsing=*/0,
2717     /*AcceptsExprPack=*/0,
2718     /*IsTargetSpecific=*/0,
2719     /*IsType=*/1,
2720     /*IsStmt=*/0,
2721     /*IsKnownToGCC=*/0,
2722     /*IsSupportedByPragmaAttribute=*/0,
2723     /*Spellings=*/BlockingSpellings,
2724     /*ArgNames=*/{}) {}
2725 bool isParamExpr(size_t N) const override {
2726   return false;
2727 }
2728 
2729 static const ParsedAttrInfoBlocking Instance;
2730 };
2731 const ParsedAttrInfoBlocking ParsedAttrInfoBlocking::Instance;
2732 static constexpr ParsedAttrInfo::Spelling BlocksSpellings[] = {
2733   {AttributeCommonInfo::AS_GNU, "blocks"},
2734   {AttributeCommonInfo::AS_CXX11, "clang::blocks"},
2735   {AttributeCommonInfo::AS_C23, "clang::blocks"},
2736 };
2737 static constexpr const char *BlocksArgNames[] = {
2738 "Type",};
2739 struct ParsedAttrInfoBlocks final : public ParsedAttrInfo {
2740   constexpr ParsedAttrInfoBlocks() : ParsedAttrInfo(
2741     /*AttrKind=*/ParsedAttr::AT_Blocks,
2742     /*NumArgs=*/1,
2743     /*OptArgs=*/0,
2744     /*NumArgMembers=*/1,
2745     /*HasCustomParsing=*/0,
2746     /*AcceptsExprPack=*/0,
2747     /*IsTargetSpecific=*/0,
2748     /*IsType=*/0,
2749     /*IsStmt=*/0,
2750     /*IsKnownToGCC=*/0,
2751     /*IsSupportedByPragmaAttribute=*/0,
2752     /*Spellings=*/BlocksSpellings,
2753     /*ArgNames=*/BlocksArgNames) {}
2754 bool isParamExpr(size_t N) const override {
2755   return false;
2756 }
2757 
2758 static const ParsedAttrInfoBlocks Instance;
2759 };
2760 const ParsedAttrInfoBlocks ParsedAttrInfoBlocks::Instance;
2761 static constexpr ParsedAttrInfo::Spelling BuiltinAliasSpellings[] = {
2762   {AttributeCommonInfo::AS_CXX11, "clang::builtin_alias"},
2763   {AttributeCommonInfo::AS_C23, "clang::builtin_alias"},
2764   {AttributeCommonInfo::AS_GNU, "clang_builtin_alias"},
2765 };
2766 static constexpr const char *BuiltinAliasArgNames[] = {
2767 "BuiltinName",};
2768 struct ParsedAttrInfoBuiltinAlias final : public ParsedAttrInfo {
2769   constexpr ParsedAttrInfoBuiltinAlias() : ParsedAttrInfo(
2770     /*AttrKind=*/ParsedAttr::AT_BuiltinAlias,
2771     /*NumArgs=*/1,
2772     /*OptArgs=*/0,
2773     /*NumArgMembers=*/1,
2774     /*HasCustomParsing=*/0,
2775     /*AcceptsExprPack=*/0,
2776     /*IsTargetSpecific=*/0,
2777     /*IsType=*/0,
2778     /*IsStmt=*/0,
2779     /*IsKnownToGCC=*/0,
2780     /*IsSupportedByPragmaAttribute=*/1,
2781     /*Spellings=*/BuiltinAliasSpellings,
2782     /*ArgNames=*/BuiltinAliasArgNames) {}
2783 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2784   if (!isa<FunctionDecl>(D)) {
2785     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2786       << Attr << Attr.isRegularKeywordAttribute() << "functions";
2787     return false;
2788   }
2789   return true;
2790 }
2791 
2792 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2793   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2794     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2795   return false;
2796 }
2797 
2798 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
2799   enum Spelling {
2800     CXX11_clang_builtin_alias = 0,
2801     C23_clang_builtin_alias = 1,
2802     GNU_clang_builtin_alias = 2,
2803   SpellingNotCalculated = 15
2804 
2805   };
2806 
2807   unsigned Idx = Attr.getAttributeSpellingListIndex();
2808   switch (Idx) {
2809     default: llvm_unreachable("Unknown spelling list index");
2810     case 0: return CXX11_clang_builtin_alias;
2811     case 1: return C23_clang_builtin_alias;
2812     case 2: return GNU_clang_builtin_alias;
2813   }
2814 }
2815 
2816 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2817   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2818 }
2819 
2820 bool isParamExpr(size_t N) const override {
2821   return false;
2822 }
2823 
2824 static const ParsedAttrInfoBuiltinAlias Instance;
2825 };
2826 const ParsedAttrInfoBuiltinAlias ParsedAttrInfoBuiltinAlias::Instance;
2827 static constexpr ParsedAttrInfo::Spelling CDeclSpellings[] = {
2828   {AttributeCommonInfo::AS_GNU, "cdecl"},
2829   {AttributeCommonInfo::AS_CXX11, "gnu::cdecl"},
2830   {AttributeCommonInfo::AS_C23, "gnu::cdecl"},
2831   {AttributeCommonInfo::AS_Keyword, "__cdecl"},
2832   {AttributeCommonInfo::AS_Keyword, "_cdecl"},
2833 };
2834 struct ParsedAttrInfoCDecl final : public ParsedAttrInfo {
2835   constexpr ParsedAttrInfoCDecl() : ParsedAttrInfo(
2836     /*AttrKind=*/ParsedAttr::AT_CDecl,
2837     /*NumArgs=*/0,
2838     /*OptArgs=*/0,
2839     /*NumArgMembers=*/0,
2840     /*HasCustomParsing=*/0,
2841     /*AcceptsExprPack=*/0,
2842     /*IsTargetSpecific=*/0,
2843     /*IsType=*/1,
2844     /*IsStmt=*/0,
2845     /*IsKnownToGCC=*/1,
2846     /*IsSupportedByPragmaAttribute=*/0,
2847     /*Spellings=*/CDeclSpellings,
2848     /*ArgNames=*/{}) {}
2849 bool isParamExpr(size_t N) const override {
2850   return false;
2851 }
2852 
2853 static const ParsedAttrInfoCDecl Instance;
2854 };
2855 const ParsedAttrInfoCDecl ParsedAttrInfoCDecl::Instance;
2856 static constexpr ParsedAttrInfo::Spelling CFAuditedTransferSpellings[] = {
2857   {AttributeCommonInfo::AS_GNU, "cf_audited_transfer"},
2858   {AttributeCommonInfo::AS_CXX11, "clang::cf_audited_transfer"},
2859   {AttributeCommonInfo::AS_C23, "clang::cf_audited_transfer"},
2860 };
2861 struct ParsedAttrInfoCFAuditedTransfer final : public ParsedAttrInfo {
2862   constexpr ParsedAttrInfoCFAuditedTransfer() : ParsedAttrInfo(
2863     /*AttrKind=*/ParsedAttr::AT_CFAuditedTransfer,
2864     /*NumArgs=*/0,
2865     /*OptArgs=*/0,
2866     /*NumArgMembers=*/0,
2867     /*HasCustomParsing=*/0,
2868     /*AcceptsExprPack=*/0,
2869     /*IsTargetSpecific=*/0,
2870     /*IsType=*/0,
2871     /*IsStmt=*/0,
2872     /*IsKnownToGCC=*/0,
2873     /*IsSupportedByPragmaAttribute=*/1,
2874     /*Spellings=*/CFAuditedTransferSpellings,
2875     /*ArgNames=*/{}) {}
2876 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2877   if (!isa<FunctionDecl>(D)) {
2878     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
2879       << Attr << Attr.isRegularKeywordAttribute() << "functions";
2880     return false;
2881   }
2882   return true;
2883 }
2884 
2885 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2886   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2887     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2888   return false;
2889 }
2890 
2891   using ParsedAttrInfo::diagMutualExclusion;
2892 
2893   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
2894     if (const auto *A = D->getAttr<CFUnknownTransferAttr>()) {
2895       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
2896       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
2897 return false;
2898     }
2899     return true;
2900   }
2901 
2902 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2903   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
2904 }
2905 
2906 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
2907   D->addAttr(::new (S.Context) CFAuditedTransferAttr(S.Context, Attr));
2908   return AttributeApplied;
2909 }
2910 
2911 bool isParamExpr(size_t N) const override {
2912   return false;
2913 }
2914 
2915 static const ParsedAttrInfoCFAuditedTransfer Instance;
2916 };
2917 const ParsedAttrInfoCFAuditedTransfer ParsedAttrInfoCFAuditedTransfer::Instance;
2918 static constexpr ParsedAttrInfo::Spelling CFConsumedSpellings[] = {
2919   {AttributeCommonInfo::AS_GNU, "cf_consumed"},
2920   {AttributeCommonInfo::AS_CXX11, "clang::cf_consumed"},
2921   {AttributeCommonInfo::AS_C23, "clang::cf_consumed"},
2922 };
2923 struct ParsedAttrInfoCFConsumed final : public ParsedAttrInfo {
2924   constexpr ParsedAttrInfoCFConsumed() : ParsedAttrInfo(
2925     /*AttrKind=*/ParsedAttr::AT_CFConsumed,
2926     /*NumArgs=*/0,
2927     /*OptArgs=*/0,
2928     /*NumArgMembers=*/0,
2929     /*HasCustomParsing=*/0,
2930     /*AcceptsExprPack=*/0,
2931     /*IsTargetSpecific=*/0,
2932     /*IsType=*/0,
2933     /*IsStmt=*/0,
2934     /*IsKnownToGCC=*/0,
2935     /*IsSupportedByPragmaAttribute=*/1,
2936     /*Spellings=*/CFConsumedSpellings,
2937     /*ArgNames=*/{}) {}
2938 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2939   if (!isa<ParmVarDecl>(D)) {
2940     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2941       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
2942     return false;
2943   }
2944   return true;
2945 }
2946 
2947 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2948   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2949     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2950   return false;
2951 }
2952 
2953 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
2954   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
2955 }
2956 
2957 bool isParamExpr(size_t N) const override {
2958   return false;
2959 }
2960 
2961 static const ParsedAttrInfoCFConsumed Instance;
2962 };
2963 const ParsedAttrInfoCFConsumed ParsedAttrInfoCFConsumed::Instance;
2964 static constexpr ParsedAttrInfo::Spelling CFGuardSpellings[] = {
2965   {AttributeCommonInfo::AS_Declspec, "guard"},
2966   {AttributeCommonInfo::AS_GNU, "guard"},
2967   {AttributeCommonInfo::AS_CXX11, "clang::guard"},
2968   {AttributeCommonInfo::AS_C23, "clang::guard"},
2969 };
2970 static constexpr const char *CFGuardArgNames[] = {
2971 "Guard",};
2972 struct ParsedAttrInfoCFGuard final : public ParsedAttrInfo {
2973   constexpr ParsedAttrInfoCFGuard() : ParsedAttrInfo(
2974     /*AttrKind=*/ParsedAttr::AT_CFGuard,
2975     /*NumArgs=*/1,
2976     /*OptArgs=*/0,
2977     /*NumArgMembers=*/1,
2978     /*HasCustomParsing=*/0,
2979     /*AcceptsExprPack=*/0,
2980     /*IsTargetSpecific=*/1,
2981     /*IsType=*/0,
2982     /*IsStmt=*/0,
2983     /*IsKnownToGCC=*/0,
2984     /*IsSupportedByPragmaAttribute=*/1,
2985     /*Spellings=*/CFGuardSpellings,
2986     /*ArgNames=*/CFGuardArgNames) {}
2987 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
2988   if (!isa<FunctionDecl>(D)) {
2989     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
2990       << Attr << Attr.isRegularKeywordAttribute() << "functions";
2991     return false;
2992   }
2993   return true;
2994 }
2995 
2996 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
2997   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
2998     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
2999   return false;
3000 }
3001 
3002 bool existsInTarget(const TargetInfo &Target) const override {
3003   const llvm::Triple &T = Target.getTriple(); (void)T;
3004   return true && (T.getOS() == llvm::Triple::Win32);
3005 }
3006 
3007 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3008   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3009 }
3010 
3011 bool isParamExpr(size_t N) const override {
3012   return false;
3013 }
3014 
3015 static const ParsedAttrInfoCFGuard Instance;
3016 };
3017 const ParsedAttrInfoCFGuard ParsedAttrInfoCFGuard::Instance;
3018 static constexpr ParsedAttrInfo::Spelling CFICanonicalJumpTableSpellings[] = {
3019   {AttributeCommonInfo::AS_GNU, "cfi_canonical_jump_table"},
3020   {AttributeCommonInfo::AS_CXX11, "clang::cfi_canonical_jump_table"},
3021   {AttributeCommonInfo::AS_C23, "clang::cfi_canonical_jump_table"},
3022 };
3023 struct ParsedAttrInfoCFICanonicalJumpTable final : public ParsedAttrInfo {
3024   constexpr ParsedAttrInfoCFICanonicalJumpTable() : ParsedAttrInfo(
3025     /*AttrKind=*/ParsedAttr::AT_CFICanonicalJumpTable,
3026     /*NumArgs=*/0,
3027     /*OptArgs=*/0,
3028     /*NumArgMembers=*/0,
3029     /*HasCustomParsing=*/0,
3030     /*AcceptsExprPack=*/0,
3031     /*IsTargetSpecific=*/0,
3032     /*IsType=*/0,
3033     /*IsStmt=*/0,
3034     /*IsKnownToGCC=*/0,
3035     /*IsSupportedByPragmaAttribute=*/1,
3036     /*Spellings=*/CFICanonicalJumpTableSpellings,
3037     /*ArgNames=*/{}) {}
3038 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3039   if (!isa<FunctionDecl>(D)) {
3040     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
3041       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3042     return false;
3043   }
3044   return true;
3045 }
3046 
3047 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3048   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3049     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3050   return false;
3051 }
3052 
3053 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3054   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3055 }
3056 
3057 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
3058   D->addAttr(::new (S.Context) CFICanonicalJumpTableAttr(S.Context, Attr));
3059   return AttributeApplied;
3060 }
3061 
3062 bool isParamExpr(size_t N) const override {
3063   return false;
3064 }
3065 
3066 static const ParsedAttrInfoCFICanonicalJumpTable Instance;
3067 };
3068 const ParsedAttrInfoCFICanonicalJumpTable ParsedAttrInfoCFICanonicalJumpTable::Instance;
3069 static constexpr ParsedAttrInfo::Spelling CFReturnsNotRetainedSpellings[] = {
3070   {AttributeCommonInfo::AS_GNU, "cf_returns_not_retained"},
3071   {AttributeCommonInfo::AS_CXX11, "clang::cf_returns_not_retained"},
3072   {AttributeCommonInfo::AS_C23, "clang::cf_returns_not_retained"},
3073 };
3074 struct ParsedAttrInfoCFReturnsNotRetained final : public ParsedAttrInfo {
3075   constexpr ParsedAttrInfoCFReturnsNotRetained() : ParsedAttrInfo(
3076     /*AttrKind=*/ParsedAttr::AT_CFReturnsNotRetained,
3077     /*NumArgs=*/0,
3078     /*OptArgs=*/0,
3079     /*NumArgMembers=*/0,
3080     /*HasCustomParsing=*/0,
3081     /*AcceptsExprPack=*/0,
3082     /*IsTargetSpecific=*/0,
3083     /*IsType=*/0,
3084     /*IsStmt=*/0,
3085     /*IsKnownToGCC=*/0,
3086     /*IsSupportedByPragmaAttribute=*/0,
3087     /*Spellings=*/CFReturnsNotRetainedSpellings,
3088     /*ArgNames=*/{}) {}
3089 bool isParamExpr(size_t N) const override {
3090   return false;
3091 }
3092 
3093 static const ParsedAttrInfoCFReturnsNotRetained Instance;
3094 };
3095 const ParsedAttrInfoCFReturnsNotRetained ParsedAttrInfoCFReturnsNotRetained::Instance;
3096 static constexpr ParsedAttrInfo::Spelling CFReturnsRetainedSpellings[] = {
3097   {AttributeCommonInfo::AS_GNU, "cf_returns_retained"},
3098   {AttributeCommonInfo::AS_CXX11, "clang::cf_returns_retained"},
3099   {AttributeCommonInfo::AS_C23, "clang::cf_returns_retained"},
3100 };
3101 struct ParsedAttrInfoCFReturnsRetained final : public ParsedAttrInfo {
3102   constexpr ParsedAttrInfoCFReturnsRetained() : ParsedAttrInfo(
3103     /*AttrKind=*/ParsedAttr::AT_CFReturnsRetained,
3104     /*NumArgs=*/0,
3105     /*OptArgs=*/0,
3106     /*NumArgMembers=*/0,
3107     /*HasCustomParsing=*/0,
3108     /*AcceptsExprPack=*/0,
3109     /*IsTargetSpecific=*/0,
3110     /*IsType=*/0,
3111     /*IsStmt=*/0,
3112     /*IsKnownToGCC=*/0,
3113     /*IsSupportedByPragmaAttribute=*/0,
3114     /*Spellings=*/CFReturnsRetainedSpellings,
3115     /*ArgNames=*/{}) {}
3116 bool isParamExpr(size_t N) const override {
3117   return false;
3118 }
3119 
3120 static const ParsedAttrInfoCFReturnsRetained Instance;
3121 };
3122 const ParsedAttrInfoCFReturnsRetained ParsedAttrInfoCFReturnsRetained::Instance;
3123 static constexpr ParsedAttrInfo::Spelling CFUnknownTransferSpellings[] = {
3124   {AttributeCommonInfo::AS_GNU, "cf_unknown_transfer"},
3125   {AttributeCommonInfo::AS_CXX11, "clang::cf_unknown_transfer"},
3126   {AttributeCommonInfo::AS_C23, "clang::cf_unknown_transfer"},
3127 };
3128 struct ParsedAttrInfoCFUnknownTransfer final : public ParsedAttrInfo {
3129   constexpr ParsedAttrInfoCFUnknownTransfer() : ParsedAttrInfo(
3130     /*AttrKind=*/ParsedAttr::AT_CFUnknownTransfer,
3131     /*NumArgs=*/0,
3132     /*OptArgs=*/0,
3133     /*NumArgMembers=*/0,
3134     /*HasCustomParsing=*/0,
3135     /*AcceptsExprPack=*/0,
3136     /*IsTargetSpecific=*/0,
3137     /*IsType=*/0,
3138     /*IsStmt=*/0,
3139     /*IsKnownToGCC=*/0,
3140     /*IsSupportedByPragmaAttribute=*/1,
3141     /*Spellings=*/CFUnknownTransferSpellings,
3142     /*ArgNames=*/{}) {}
3143 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3144   if (!isa<FunctionDecl>(D)) {
3145     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
3146       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3147     return false;
3148   }
3149   return true;
3150 }
3151 
3152 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3153   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3154     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3155   return false;
3156 }
3157 
3158   using ParsedAttrInfo::diagMutualExclusion;
3159 
3160   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3161     if (const auto *A = D->getAttr<CFAuditedTransferAttr>()) {
3162       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3163       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3164 return false;
3165     }
3166     return true;
3167   }
3168 
3169 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3170   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3171 }
3172 
3173 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
3174   D->addAttr(::new (S.Context) CFUnknownTransferAttr(S.Context, Attr));
3175   return AttributeApplied;
3176 }
3177 
3178 bool isParamExpr(size_t N) const override {
3179   return false;
3180 }
3181 
3182 static const ParsedAttrInfoCFUnknownTransfer Instance;
3183 };
3184 const ParsedAttrInfoCFUnknownTransfer ParsedAttrInfoCFUnknownTransfer::Instance;
3185 static constexpr ParsedAttrInfo::Spelling CPUDispatchSpellings[] = {
3186   {AttributeCommonInfo::AS_GNU, "cpu_dispatch"},
3187   {AttributeCommonInfo::AS_CXX11, "clang::cpu_dispatch"},
3188   {AttributeCommonInfo::AS_C23, "clang::cpu_dispatch"},
3189   {AttributeCommonInfo::AS_Declspec, "cpu_dispatch"},
3190 };
3191 static constexpr const char *CPUDispatchArgNames[] = {
3192 "Cpus...",};
3193 struct ParsedAttrInfoCPUDispatch final : public ParsedAttrInfo {
3194   constexpr ParsedAttrInfoCPUDispatch() : ParsedAttrInfo(
3195     /*AttrKind=*/ParsedAttr::AT_CPUDispatch,
3196     /*NumArgs=*/0,
3197     /*OptArgs=*/15,
3198     /*NumArgMembers=*/1,
3199     /*HasCustomParsing=*/0,
3200     /*AcceptsExprPack=*/0,
3201     /*IsTargetSpecific=*/0,
3202     /*IsType=*/0,
3203     /*IsStmt=*/0,
3204     /*IsKnownToGCC=*/0,
3205     /*IsSupportedByPragmaAttribute=*/1,
3206     /*Spellings=*/CPUDispatchSpellings,
3207     /*ArgNames=*/CPUDispatchArgNames) {}
3208 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3209   if (!isa<FunctionDecl>(D)) {
3210     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3211       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3212     return false;
3213   }
3214   return true;
3215 }
3216 
3217 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3218   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3219     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3220   return false;
3221 }
3222 
3223   using ParsedAttrInfo::diagMutualExclusion;
3224 
3225   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3226     if (const auto *A = D->getAttr<TargetClonesAttr>()) {
3227       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3228       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3229 return false;
3230     }
3231     if (const auto *A = D->getAttr<TargetVersionAttr>()) {
3232       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3233       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3234 return false;
3235     }
3236     if (const auto *A = D->getAttr<TargetAttr>()) {
3237       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3238       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3239 return false;
3240     }
3241     if (const auto *A = D->getAttr<CPUSpecificAttr>()) {
3242       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3243       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3244 return false;
3245     }
3246     return true;
3247   }
3248 
3249 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3250   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3251 }
3252 
3253 bool isParamExpr(size_t N) const override {
3254   return false;
3255 }
3256 
3257 static const ParsedAttrInfoCPUDispatch Instance;
3258 };
3259 const ParsedAttrInfoCPUDispatch ParsedAttrInfoCPUDispatch::Instance;
3260 static constexpr ParsedAttrInfo::Spelling CPUSpecificSpellings[] = {
3261   {AttributeCommonInfo::AS_GNU, "cpu_specific"},
3262   {AttributeCommonInfo::AS_CXX11, "clang::cpu_specific"},
3263   {AttributeCommonInfo::AS_C23, "clang::cpu_specific"},
3264   {AttributeCommonInfo::AS_Declspec, "cpu_specific"},
3265 };
3266 static constexpr const char *CPUSpecificArgNames[] = {
3267 "Cpus...",};
3268 struct ParsedAttrInfoCPUSpecific final : public ParsedAttrInfo {
3269   constexpr ParsedAttrInfoCPUSpecific() : ParsedAttrInfo(
3270     /*AttrKind=*/ParsedAttr::AT_CPUSpecific,
3271     /*NumArgs=*/0,
3272     /*OptArgs=*/15,
3273     /*NumArgMembers=*/1,
3274     /*HasCustomParsing=*/0,
3275     /*AcceptsExprPack=*/0,
3276     /*IsTargetSpecific=*/0,
3277     /*IsType=*/0,
3278     /*IsStmt=*/0,
3279     /*IsKnownToGCC=*/0,
3280     /*IsSupportedByPragmaAttribute=*/1,
3281     /*Spellings=*/CPUSpecificSpellings,
3282     /*ArgNames=*/CPUSpecificArgNames) {}
3283 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3284   if (!isa<FunctionDecl>(D)) {
3285     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3286       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3287     return false;
3288   }
3289   return true;
3290 }
3291 
3292 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3293   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3294     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3295   return false;
3296 }
3297 
3298   using ParsedAttrInfo::diagMutualExclusion;
3299 
3300   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3301     if (const auto *A = D->getAttr<TargetClonesAttr>()) {
3302       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3303       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3304 return false;
3305     }
3306     if (const auto *A = D->getAttr<TargetVersionAttr>()) {
3307       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3308       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3309 return false;
3310     }
3311     if (const auto *A = D->getAttr<TargetAttr>()) {
3312       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3313       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3314 return false;
3315     }
3316     if (const auto *A = D->getAttr<CPUDispatchAttr>()) {
3317       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3318       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3319 return false;
3320     }
3321     return true;
3322   }
3323 
3324 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3325   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3326 }
3327 
3328 bool isParamExpr(size_t N) const override {
3329   return false;
3330 }
3331 
3332 static const ParsedAttrInfoCPUSpecific Instance;
3333 };
3334 const ParsedAttrInfoCPUSpecific ParsedAttrInfoCPUSpecific::Instance;
3335 static constexpr ParsedAttrInfo::Spelling CUDAConstantSpellings[] = {
3336   {AttributeCommonInfo::AS_GNU, "constant"},
3337   {AttributeCommonInfo::AS_Declspec, "__constant__"},
3338 };
3339 struct ParsedAttrInfoCUDAConstant final : public ParsedAttrInfo {
3340   constexpr ParsedAttrInfoCUDAConstant() : ParsedAttrInfo(
3341     /*AttrKind=*/ParsedAttr::AT_CUDAConstant,
3342     /*NumArgs=*/0,
3343     /*OptArgs=*/0,
3344     /*NumArgMembers=*/0,
3345     /*HasCustomParsing=*/0,
3346     /*AcceptsExprPack=*/0,
3347     /*IsTargetSpecific=*/0,
3348     /*IsType=*/0,
3349     /*IsStmt=*/0,
3350     /*IsKnownToGCC=*/0,
3351     /*IsSupportedByPragmaAttribute=*/1,
3352     /*Spellings=*/CUDAConstantSpellings,
3353     /*ArgNames=*/{}) {}
3354 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3355   if (!isa<VarDecl>(D)) {
3356     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3357       << Attr << Attr.isRegularKeywordAttribute() << "variables";
3358     return false;
3359   }
3360   return true;
3361 }
3362 
3363 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3364   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3365     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3366   return false;
3367 }
3368 
3369   using ParsedAttrInfo::diagMutualExclusion;
3370 
3371   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3372     if (const auto *A = D->getAttr<CUDASharedAttr>()) {
3373       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3374       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3375 return false;
3376     }
3377     if (const auto *A = D->getAttr<HIPManagedAttr>()) {
3378       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3379       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3380 return false;
3381     }
3382     return true;
3383   }
3384 
3385 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3386   return LangOpts.CUDA;
3387 }
3388 
3389 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3390   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
3391 }
3392 
3393 bool isParamExpr(size_t N) const override {
3394   return false;
3395 }
3396 
3397 static const ParsedAttrInfoCUDAConstant Instance;
3398 };
3399 const ParsedAttrInfoCUDAConstant ParsedAttrInfoCUDAConstant::Instance;
3400 static constexpr ParsedAttrInfo::Spelling CUDADeviceSpellings[] = {
3401   {AttributeCommonInfo::AS_GNU, "device"},
3402   {AttributeCommonInfo::AS_Declspec, "__device__"},
3403 };
3404 struct ParsedAttrInfoCUDADevice final : public ParsedAttrInfo {
3405   constexpr ParsedAttrInfoCUDADevice() : ParsedAttrInfo(
3406     /*AttrKind=*/ParsedAttr::AT_CUDADevice,
3407     /*NumArgs=*/0,
3408     /*OptArgs=*/0,
3409     /*NumArgMembers=*/0,
3410     /*HasCustomParsing=*/0,
3411     /*AcceptsExprPack=*/0,
3412     /*IsTargetSpecific=*/0,
3413     /*IsType=*/0,
3414     /*IsStmt=*/0,
3415     /*IsKnownToGCC=*/0,
3416     /*IsSupportedByPragmaAttribute=*/1,
3417     /*Spellings=*/CUDADeviceSpellings,
3418     /*ArgNames=*/{}) {}
3419 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3420   if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
3421     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3422       << Attr << Attr.isRegularKeywordAttribute() << "functions and variables";
3423     return false;
3424   }
3425   return true;
3426 }
3427 
3428 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3429   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3430     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3431   return false;
3432 }
3433 
3434   using ParsedAttrInfo::diagMutualExclusion;
3435 
3436   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3437     if (const auto *A = D->getAttr<CUDAGlobalAttr>()) {
3438       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3439       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3440 return false;
3441     }
3442     return true;
3443   }
3444 
3445 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3446   return LangOpts.CUDA;
3447 }
3448 
3449 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3450   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3451   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
3452 }
3453 
3454 bool isParamExpr(size_t N) const override {
3455   return false;
3456 }
3457 
3458 static const ParsedAttrInfoCUDADevice Instance;
3459 };
3460 const ParsedAttrInfoCUDADevice ParsedAttrInfoCUDADevice::Instance;
3461 static constexpr ParsedAttrInfo::Spelling CUDADeviceBuiltinSurfaceTypeSpellings[] = {
3462   {AttributeCommonInfo::AS_GNU, "device_builtin_surface_type"},
3463   {AttributeCommonInfo::AS_Declspec, "__device_builtin_surface_type__"},
3464 };
3465 struct ParsedAttrInfoCUDADeviceBuiltinSurfaceType final : public ParsedAttrInfo {
3466   constexpr ParsedAttrInfoCUDADeviceBuiltinSurfaceType() : ParsedAttrInfo(
3467     /*AttrKind=*/ParsedAttr::AT_CUDADeviceBuiltinSurfaceType,
3468     /*NumArgs=*/0,
3469     /*OptArgs=*/0,
3470     /*NumArgMembers=*/0,
3471     /*HasCustomParsing=*/0,
3472     /*AcceptsExprPack=*/0,
3473     /*IsTargetSpecific=*/0,
3474     /*IsType=*/0,
3475     /*IsStmt=*/0,
3476     /*IsKnownToGCC=*/0,
3477     /*IsSupportedByPragmaAttribute=*/1,
3478     /*Spellings=*/CUDADeviceBuiltinSurfaceTypeSpellings,
3479     /*ArgNames=*/{}) {}
3480 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3481   if (!isa<CXXRecordDecl>(D)) {
3482     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3483       << Attr << Attr.isRegularKeywordAttribute() << "classes";
3484     return false;
3485   }
3486   return true;
3487 }
3488 
3489 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3490   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3491     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3492   return false;
3493 }
3494 
3495   using ParsedAttrInfo::diagMutualExclusion;
3496 
3497   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3498     if (const auto *A = D->getAttr<CUDADeviceBuiltinTextureTypeAttr>()) {
3499       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3500       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3501 return false;
3502     }
3503     return true;
3504   }
3505 
3506 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3507   return LangOpts.CUDA;
3508 }
3509 
3510 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3511   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
3512 }
3513 
3514 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
3515   D->addAttr(::new (S.Context) CUDADeviceBuiltinSurfaceTypeAttr(S.Context, Attr));
3516   return AttributeApplied;
3517 }
3518 
3519 bool isParamExpr(size_t N) const override {
3520   return false;
3521 }
3522 
3523 static const ParsedAttrInfoCUDADeviceBuiltinSurfaceType Instance;
3524 };
3525 const ParsedAttrInfoCUDADeviceBuiltinSurfaceType ParsedAttrInfoCUDADeviceBuiltinSurfaceType::Instance;
3526 static constexpr ParsedAttrInfo::Spelling CUDADeviceBuiltinTextureTypeSpellings[] = {
3527   {AttributeCommonInfo::AS_GNU, "device_builtin_texture_type"},
3528   {AttributeCommonInfo::AS_Declspec, "__device_builtin_texture_type__"},
3529 };
3530 struct ParsedAttrInfoCUDADeviceBuiltinTextureType final : public ParsedAttrInfo {
3531   constexpr ParsedAttrInfoCUDADeviceBuiltinTextureType() : ParsedAttrInfo(
3532     /*AttrKind=*/ParsedAttr::AT_CUDADeviceBuiltinTextureType,
3533     /*NumArgs=*/0,
3534     /*OptArgs=*/0,
3535     /*NumArgMembers=*/0,
3536     /*HasCustomParsing=*/0,
3537     /*AcceptsExprPack=*/0,
3538     /*IsTargetSpecific=*/0,
3539     /*IsType=*/0,
3540     /*IsStmt=*/0,
3541     /*IsKnownToGCC=*/0,
3542     /*IsSupportedByPragmaAttribute=*/1,
3543     /*Spellings=*/CUDADeviceBuiltinTextureTypeSpellings,
3544     /*ArgNames=*/{}) {}
3545 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3546   if (!isa<CXXRecordDecl>(D)) {
3547     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3548       << Attr << Attr.isRegularKeywordAttribute() << "classes";
3549     return false;
3550   }
3551   return true;
3552 }
3553 
3554 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3555   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3556     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3557   return false;
3558 }
3559 
3560   using ParsedAttrInfo::diagMutualExclusion;
3561 
3562   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3563     if (const auto *A = D->getAttr<CUDADeviceBuiltinSurfaceTypeAttr>()) {
3564       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3565       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3566 return false;
3567     }
3568     return true;
3569   }
3570 
3571 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3572   return LangOpts.CUDA;
3573 }
3574 
3575 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3576   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
3577 }
3578 
3579 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
3580   D->addAttr(::new (S.Context) CUDADeviceBuiltinTextureTypeAttr(S.Context, Attr));
3581   return AttributeApplied;
3582 }
3583 
3584 bool isParamExpr(size_t N) const override {
3585   return false;
3586 }
3587 
3588 static const ParsedAttrInfoCUDADeviceBuiltinTextureType Instance;
3589 };
3590 const ParsedAttrInfoCUDADeviceBuiltinTextureType ParsedAttrInfoCUDADeviceBuiltinTextureType::Instance;
3591 static constexpr ParsedAttrInfo::Spelling CUDAGlobalSpellings[] = {
3592   {AttributeCommonInfo::AS_GNU, "global"},
3593   {AttributeCommonInfo::AS_Declspec, "__global__"},
3594 };
3595 struct ParsedAttrInfoCUDAGlobal final : public ParsedAttrInfo {
3596   constexpr ParsedAttrInfoCUDAGlobal() : ParsedAttrInfo(
3597     /*AttrKind=*/ParsedAttr::AT_CUDAGlobal,
3598     /*NumArgs=*/0,
3599     /*OptArgs=*/0,
3600     /*NumArgMembers=*/0,
3601     /*HasCustomParsing=*/0,
3602     /*AcceptsExprPack=*/0,
3603     /*IsTargetSpecific=*/0,
3604     /*IsType=*/0,
3605     /*IsStmt=*/0,
3606     /*IsKnownToGCC=*/0,
3607     /*IsSupportedByPragmaAttribute=*/1,
3608     /*Spellings=*/CUDAGlobalSpellings,
3609     /*ArgNames=*/{}) {}
3610 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3611   if (!isa<FunctionDecl>(D)) {
3612     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3613       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3614     return false;
3615   }
3616   return true;
3617 }
3618 
3619 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3620   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3621     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3622   return false;
3623 }
3624 
3625   using ParsedAttrInfo::diagMutualExclusion;
3626 
3627   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3628     if (const auto *A = D->getAttr<CUDADeviceAttr>()) {
3629       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3630       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3631 return false;
3632     }
3633     if (const auto *A = D->getAttr<CUDAHostAttr>()) {
3634       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3635       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3636 return false;
3637     }
3638     return true;
3639   }
3640 
3641 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3642   return LangOpts.CUDA;
3643 }
3644 
3645 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3646   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3647 }
3648 
3649 bool isParamExpr(size_t N) const override {
3650   return false;
3651 }
3652 
3653 static const ParsedAttrInfoCUDAGlobal Instance;
3654 };
3655 const ParsedAttrInfoCUDAGlobal ParsedAttrInfoCUDAGlobal::Instance;
3656 static constexpr ParsedAttrInfo::Spelling CUDAGridConstantSpellings[] = {
3657   {AttributeCommonInfo::AS_GNU, "grid_constant"},
3658   {AttributeCommonInfo::AS_Declspec, "__grid_constant__"},
3659 };
3660 struct ParsedAttrInfoCUDAGridConstant final : public ParsedAttrInfo {
3661   constexpr ParsedAttrInfoCUDAGridConstant() : ParsedAttrInfo(
3662     /*AttrKind=*/ParsedAttr::AT_CUDAGridConstant,
3663     /*NumArgs=*/0,
3664     /*OptArgs=*/0,
3665     /*NumArgMembers=*/0,
3666     /*HasCustomParsing=*/0,
3667     /*AcceptsExprPack=*/0,
3668     /*IsTargetSpecific=*/0,
3669     /*IsType=*/0,
3670     /*IsStmt=*/0,
3671     /*IsKnownToGCC=*/0,
3672     /*IsSupportedByPragmaAttribute=*/1,
3673     /*Spellings=*/CUDAGridConstantSpellings,
3674     /*ArgNames=*/{}) {}
3675 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3676   if (!isa<ParmVarDecl>(D)) {
3677     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3678       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
3679     return false;
3680   }
3681   return true;
3682 }
3683 
3684 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3685   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3686     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3687   return false;
3688 }
3689 
3690 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3691   return LangOpts.CUDA;
3692 }
3693 
3694 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3695   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
3696 }
3697 
3698 bool isParamExpr(size_t N) const override {
3699   return false;
3700 }
3701 
3702 static const ParsedAttrInfoCUDAGridConstant Instance;
3703 };
3704 const ParsedAttrInfoCUDAGridConstant ParsedAttrInfoCUDAGridConstant::Instance;
3705 static constexpr ParsedAttrInfo::Spelling CUDAHostSpellings[] = {
3706   {AttributeCommonInfo::AS_GNU, "host"},
3707   {AttributeCommonInfo::AS_Declspec, "__host__"},
3708 };
3709 struct ParsedAttrInfoCUDAHost final : public ParsedAttrInfo {
3710   constexpr ParsedAttrInfoCUDAHost() : ParsedAttrInfo(
3711     /*AttrKind=*/ParsedAttr::AT_CUDAHost,
3712     /*NumArgs=*/0,
3713     /*OptArgs=*/0,
3714     /*NumArgMembers=*/0,
3715     /*HasCustomParsing=*/0,
3716     /*AcceptsExprPack=*/0,
3717     /*IsTargetSpecific=*/0,
3718     /*IsType=*/0,
3719     /*IsStmt=*/0,
3720     /*IsKnownToGCC=*/0,
3721     /*IsSupportedByPragmaAttribute=*/1,
3722     /*Spellings=*/CUDAHostSpellings,
3723     /*ArgNames=*/{}) {}
3724 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3725   if (!isa<FunctionDecl>(D)) {
3726     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3727       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3728     return false;
3729   }
3730   return true;
3731 }
3732 
3733 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3734   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3735     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3736   return false;
3737 }
3738 
3739   using ParsedAttrInfo::diagMutualExclusion;
3740 
3741   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3742     if (const auto *A = D->getAttr<CUDAGlobalAttr>()) {
3743       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3744       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3745 return false;
3746     }
3747     return true;
3748   }
3749 
3750 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3751   return LangOpts.CUDA;
3752 }
3753 
3754 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3755   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3756 }
3757 
3758 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
3759   D->addAttr(::new (S.Context) CUDAHostAttr(S.Context, Attr));
3760   return AttributeApplied;
3761 }
3762 
3763 bool isParamExpr(size_t N) const override {
3764   return false;
3765 }
3766 
3767 static const ParsedAttrInfoCUDAHost Instance;
3768 };
3769 const ParsedAttrInfoCUDAHost ParsedAttrInfoCUDAHost::Instance;
3770 struct ParsedAttrInfoCUDAInvalidTarget final : public ParsedAttrInfo {
3771   constexpr ParsedAttrInfoCUDAInvalidTarget() : ParsedAttrInfo(
3772     /*AttrKind=*/ParsedAttr::AT_CUDAInvalidTarget,
3773     /*NumArgs=*/0,
3774     /*OptArgs=*/0,
3775     /*NumArgMembers=*/0,
3776     /*HasCustomParsing=*/0,
3777     /*AcceptsExprPack=*/0,
3778     /*IsTargetSpecific=*/0,
3779     /*IsType=*/0,
3780     /*IsStmt=*/0,
3781     /*IsKnownToGCC=*/0,
3782     /*IsSupportedByPragmaAttribute=*/0,
3783     /*Spellings=*/{},
3784     /*ArgNames=*/{}) {}
3785 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3786   if (!isa<FunctionDecl>(D)) {
3787     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3788       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3789     return false;
3790   }
3791   return true;
3792 }
3793 
3794 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3795   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3796     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3797   return false;
3798 }
3799 
3800 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3801   return LangOpts.CUDA;
3802 }
3803 
3804 bool isParamExpr(size_t N) const override {
3805   return false;
3806 }
3807 
3808 static const ParsedAttrInfoCUDAInvalidTarget Instance;
3809 };
3810 const ParsedAttrInfoCUDAInvalidTarget ParsedAttrInfoCUDAInvalidTarget::Instance;
3811 static constexpr ParsedAttrInfo::Spelling CUDALaunchBoundsSpellings[] = {
3812   {AttributeCommonInfo::AS_GNU, "launch_bounds"},
3813   {AttributeCommonInfo::AS_Declspec, "__launch_bounds__"},
3814 };
3815 static constexpr const char *CUDALaunchBoundsArgNames[] = {
3816 "MaxThreads","MinBlocks","MaxBlocks",};
3817 struct ParsedAttrInfoCUDALaunchBounds final : public ParsedAttrInfo {
3818   constexpr ParsedAttrInfoCUDALaunchBounds() : ParsedAttrInfo(
3819     /*AttrKind=*/ParsedAttr::AT_CUDALaunchBounds,
3820     /*NumArgs=*/1,
3821     /*OptArgs=*/2,
3822     /*NumArgMembers=*/3,
3823     /*HasCustomParsing=*/0,
3824     /*AcceptsExprPack=*/0,
3825     /*IsTargetSpecific=*/0,
3826     /*IsType=*/0,
3827     /*IsStmt=*/0,
3828     /*IsKnownToGCC=*/0,
3829     /*IsSupportedByPragmaAttribute=*/1,
3830     /*Spellings=*/CUDALaunchBoundsSpellings,
3831     /*ArgNames=*/CUDALaunchBoundsArgNames) {}
3832 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3833   if (!isa<ObjCMethodDecl>(D) && !isFunctionLike(D)) {
3834     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3835       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods, functions, and function pointers";
3836     return false;
3837   }
3838   return true;
3839 }
3840 
3841 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3842   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3843     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3844   return false;
3845 }
3846 
3847 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3848   return LangOpts.CUDA;
3849 }
3850 
3851 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3852   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
3853   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
3854 }
3855 
3856 bool isParamExpr(size_t N) const override {
3857   return (N == 0) || (N == 1) || (N == 2) || false;
3858 }
3859 
3860 static const ParsedAttrInfoCUDALaunchBounds Instance;
3861 };
3862 const ParsedAttrInfoCUDALaunchBounds ParsedAttrInfoCUDALaunchBounds::Instance;
3863 static constexpr ParsedAttrInfo::Spelling CUDASharedSpellings[] = {
3864   {AttributeCommonInfo::AS_GNU, "shared"},
3865   {AttributeCommonInfo::AS_Declspec, "__shared__"},
3866 };
3867 struct ParsedAttrInfoCUDAShared final : public ParsedAttrInfo {
3868   constexpr ParsedAttrInfoCUDAShared() : ParsedAttrInfo(
3869     /*AttrKind=*/ParsedAttr::AT_CUDAShared,
3870     /*NumArgs=*/0,
3871     /*OptArgs=*/0,
3872     /*NumArgMembers=*/0,
3873     /*HasCustomParsing=*/0,
3874     /*AcceptsExprPack=*/0,
3875     /*IsTargetSpecific=*/0,
3876     /*IsType=*/0,
3877     /*IsStmt=*/0,
3878     /*IsKnownToGCC=*/0,
3879     /*IsSupportedByPragmaAttribute=*/1,
3880     /*Spellings=*/CUDASharedSpellings,
3881     /*ArgNames=*/{}) {}
3882 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3883   if (!isa<VarDecl>(D)) {
3884     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
3885       << Attr << Attr.isRegularKeywordAttribute() << "variables";
3886     return false;
3887   }
3888   return true;
3889 }
3890 
3891 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3892   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3893     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3894   return false;
3895 }
3896 
3897   using ParsedAttrInfo::diagMutualExclusion;
3898 
3899   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
3900     if (const auto *A = D->getAttr<CUDAConstantAttr>()) {
3901       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3902       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3903 return false;
3904     }
3905     if (const auto *A = D->getAttr<HIPManagedAttr>()) {
3906       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
3907       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
3908 return false;
3909     }
3910     return true;
3911   }
3912 
3913 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
3914   return LangOpts.CUDA;
3915 }
3916 
3917 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3918   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
3919 }
3920 
3921 bool isParamExpr(size_t N) const override {
3922   return false;
3923 }
3924 
3925 static const ParsedAttrInfoCUDAShared Instance;
3926 };
3927 const ParsedAttrInfoCUDAShared ParsedAttrInfoCUDAShared::Instance;
3928 static constexpr ParsedAttrInfo::Spelling CXX11NoReturnSpellings[] = {
3929   {AttributeCommonInfo::AS_CXX11, "noreturn"},
3930   {AttributeCommonInfo::AS_C23, "noreturn"},
3931   {AttributeCommonInfo::AS_C23, "_Noreturn"},
3932 };
3933 struct ParsedAttrInfoCXX11NoReturn final : public ParsedAttrInfo {
3934   constexpr ParsedAttrInfoCXX11NoReturn() : ParsedAttrInfo(
3935     /*AttrKind=*/ParsedAttr::AT_CXX11NoReturn,
3936     /*NumArgs=*/0,
3937     /*OptArgs=*/0,
3938     /*NumArgMembers=*/0,
3939     /*HasCustomParsing=*/0,
3940     /*AcceptsExprPack=*/0,
3941     /*IsTargetSpecific=*/0,
3942     /*IsType=*/0,
3943     /*IsStmt=*/0,
3944     /*IsKnownToGCC=*/0,
3945     /*IsSupportedByPragmaAttribute=*/1,
3946     /*Spellings=*/CXX11NoReturnSpellings,
3947     /*ArgNames=*/{}) {}
3948 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
3949   if (!isa<FunctionDecl>(D)) {
3950     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
3951       << Attr << Attr.isRegularKeywordAttribute() << "functions";
3952     return false;
3953   }
3954   return true;
3955 }
3956 
3957 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
3958   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
3959     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
3960   return false;
3961 }
3962 
3963 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
3964   enum Spelling {
3965     CXX11_noreturn = 0,
3966     C23_noreturn = 1,
3967     C23_Noreturn = 2,
3968   SpellingNotCalculated = 15
3969 
3970   };
3971 
3972   unsigned Idx = Attr.getAttributeSpellingListIndex();
3973   switch (Idx) {
3974     default: llvm_unreachable("Unknown spelling list index");
3975     case 0: return CXX11_noreturn;
3976     case 1: return C23_noreturn;
3977     case 2: return C23_Noreturn;
3978   }
3979 }
3980 
3981 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
3982   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
3983 }
3984 
3985 bool isParamExpr(size_t N) const override {
3986   return false;
3987 }
3988 
3989 static const ParsedAttrInfoCXX11NoReturn Instance;
3990 };
3991 const ParsedAttrInfoCXX11NoReturn ParsedAttrInfoCXX11NoReturn::Instance;
3992 static constexpr ParsedAttrInfo::Spelling CXXAssumeSpellings[] = {
3993   {AttributeCommonInfo::AS_CXX11, "assume"},
3994   {AttributeCommonInfo::AS_GNU, "assume"},
3995   {AttributeCommonInfo::AS_CXX11, "clang::assume"},
3996   {AttributeCommonInfo::AS_C23, "clang::assume"},
3997 };
3998 static constexpr const char *CXXAssumeArgNames[] = {
3999 "Assumption",};
4000 struct ParsedAttrInfoCXXAssume final : public ParsedAttrInfo {
4001   constexpr ParsedAttrInfoCXXAssume() : ParsedAttrInfo(
4002     /*AttrKind=*/ParsedAttr::AT_CXXAssume,
4003     /*NumArgs=*/1,
4004     /*OptArgs=*/0,
4005     /*NumArgMembers=*/1,
4006     /*HasCustomParsing=*/1,
4007     /*AcceptsExprPack=*/0,
4008     /*IsTargetSpecific=*/0,
4009     /*IsType=*/0,
4010     /*IsStmt=*/1,
4011     /*IsKnownToGCC=*/0,
4012     /*IsSupportedByPragmaAttribute=*/0,
4013     /*Spellings=*/CXXAssumeSpellings,
4014     /*ArgNames=*/CXXAssumeArgNames) {}
4015 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
4016   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
4017     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
4018   return false;
4019 }
4020 
4021 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
4022   if (!isa<NullStmt>(St)) {
4023     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4024       << Attr << Attr.isRegularKeywordAttribute() << "empty statements";
4025     return false;
4026   }
4027   return true;
4028 }
4029 
4030 bool isParamExpr(size_t N) const override {
4031   return (N == 0) || false;
4032 }
4033 
4034 static const ParsedAttrInfoCXXAssume Instance;
4035 };
4036 const ParsedAttrInfoCXXAssume ParsedAttrInfoCXXAssume::Instance;
4037 static constexpr ParsedAttrInfo::Spelling CallableWhenSpellings[] = {
4038   {AttributeCommonInfo::AS_GNU, "callable_when"},
4039   {AttributeCommonInfo::AS_CXX11, "clang::callable_when"},
4040 };
4041 static constexpr const char *CallableWhenArgNames[] = {
4042 "CallableStates...",};
4043 struct ParsedAttrInfoCallableWhen final : public ParsedAttrInfo {
4044   constexpr ParsedAttrInfoCallableWhen() : ParsedAttrInfo(
4045     /*AttrKind=*/ParsedAttr::AT_CallableWhen,
4046     /*NumArgs=*/0,
4047     /*OptArgs=*/15,
4048     /*NumArgMembers=*/1,
4049     /*HasCustomParsing=*/0,
4050     /*AcceptsExprPack=*/0,
4051     /*IsTargetSpecific=*/0,
4052     /*IsType=*/0,
4053     /*IsStmt=*/0,
4054     /*IsKnownToGCC=*/0,
4055     /*IsSupportedByPragmaAttribute=*/1,
4056     /*Spellings=*/CallableWhenSpellings,
4057     /*ArgNames=*/CallableWhenArgNames) {}
4058 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4059   if (!isa<CXXMethodDecl>(D)) {
4060     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4061       << Attr << Attr.isRegularKeywordAttribute() << "functions";
4062     return false;
4063   }
4064   return true;
4065 }
4066 
4067 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4068   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4069     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4070   return false;
4071 }
4072 
4073 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4074   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus));
4075 }
4076 
4077 bool isParamExpr(size_t N) const override {
4078   return false;
4079 }
4080 
4081 static const ParsedAttrInfoCallableWhen Instance;
4082 };
4083 const ParsedAttrInfoCallableWhen ParsedAttrInfoCallableWhen::Instance;
4084 static constexpr ParsedAttrInfo::Spelling CallbackSpellings[] = {
4085   {AttributeCommonInfo::AS_GNU, "callback"},
4086   {AttributeCommonInfo::AS_CXX11, "clang::callback"},
4087   {AttributeCommonInfo::AS_C23, "clang::callback"},
4088 };
4089 static constexpr const char *CallbackArgNames[] = {
4090 "Encoding...",};
4091 struct ParsedAttrInfoCallback final : public ParsedAttrInfo {
4092   constexpr ParsedAttrInfoCallback() : ParsedAttrInfo(
4093     /*AttrKind=*/ParsedAttr::AT_Callback,
4094     /*NumArgs=*/0,
4095     /*OptArgs=*/15,
4096     /*NumArgMembers=*/1,
4097     /*HasCustomParsing=*/0,
4098     /*AcceptsExprPack=*/0,
4099     /*IsTargetSpecific=*/0,
4100     /*IsType=*/0,
4101     /*IsStmt=*/0,
4102     /*IsKnownToGCC=*/0,
4103     /*IsSupportedByPragmaAttribute=*/1,
4104     /*Spellings=*/CallbackSpellings,
4105     /*ArgNames=*/CallbackArgNames) {}
4106 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4107   if (!isa<FunctionDecl>(D)) {
4108     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4109       << Attr << Attr.isRegularKeywordAttribute() << "functions";
4110     return false;
4111   }
4112   return true;
4113 }
4114 
4115 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4116   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4117     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4118   return false;
4119 }
4120 
4121 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4122   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
4123 }
4124 
4125 bool isParamExpr(size_t N) const override {
4126   return false;
4127 }
4128 
4129 static const ParsedAttrInfoCallback Instance;
4130 };
4131 const ParsedAttrInfoCallback ParsedAttrInfoCallback::Instance;
4132 static constexpr ParsedAttrInfo::Spelling CalledOnceSpellings[] = {
4133   {AttributeCommonInfo::AS_GNU, "called_once"},
4134   {AttributeCommonInfo::AS_CXX11, "clang::called_once"},
4135   {AttributeCommonInfo::AS_C23, "clang::called_once"},
4136 };
4137 struct ParsedAttrInfoCalledOnce final : public ParsedAttrInfo {
4138   constexpr ParsedAttrInfoCalledOnce() : ParsedAttrInfo(
4139     /*AttrKind=*/ParsedAttr::AT_CalledOnce,
4140     /*NumArgs=*/0,
4141     /*OptArgs=*/0,
4142     /*NumArgMembers=*/0,
4143     /*HasCustomParsing=*/0,
4144     /*AcceptsExprPack=*/0,
4145     /*IsTargetSpecific=*/0,
4146     /*IsType=*/0,
4147     /*IsStmt=*/0,
4148     /*IsKnownToGCC=*/0,
4149     /*IsSupportedByPragmaAttribute=*/1,
4150     /*Spellings=*/CalledOnceSpellings,
4151     /*ArgNames=*/{}) {}
4152 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4153   if (!isa<ParmVarDecl>(D)) {
4154     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4155       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
4156     return false;
4157   }
4158   return true;
4159 }
4160 
4161 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4162   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4163     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4164   return false;
4165 }
4166 
4167 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
4168   return LangOpts.ObjC;
4169 }
4170 
4171 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4172   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
4173 }
4174 
4175 bool isParamExpr(size_t N) const override {
4176   return false;
4177 }
4178 
4179 static const ParsedAttrInfoCalledOnce Instance;
4180 };
4181 const ParsedAttrInfoCalledOnce ParsedAttrInfoCalledOnce::Instance;
4182 static constexpr ParsedAttrInfo::Spelling CapabilitySpellings[] = {
4183   {AttributeCommonInfo::AS_GNU, "capability"},
4184   {AttributeCommonInfo::AS_CXX11, "clang::capability"},
4185   {AttributeCommonInfo::AS_GNU, "shared_capability"},
4186   {AttributeCommonInfo::AS_CXX11, "clang::shared_capability"},
4187 };
4188 static constexpr const char *CapabilityArgNames[] = {
4189 "Name",};
4190 struct ParsedAttrInfoCapability final : public ParsedAttrInfo {
4191   constexpr ParsedAttrInfoCapability() : ParsedAttrInfo(
4192     /*AttrKind=*/ParsedAttr::AT_Capability,
4193     /*NumArgs=*/1,
4194     /*OptArgs=*/0,
4195     /*NumArgMembers=*/1,
4196     /*HasCustomParsing=*/0,
4197     /*AcceptsExprPack=*/0,
4198     /*IsTargetSpecific=*/0,
4199     /*IsType=*/0,
4200     /*IsStmt=*/0,
4201     /*IsKnownToGCC=*/0,
4202     /*IsSupportedByPragmaAttribute=*/1,
4203     /*Spellings=*/CapabilitySpellings,
4204     /*ArgNames=*/CapabilityArgNames) {}
4205 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4206   if (!isa<RecordDecl>(D) && !isa<TypedefNameDecl>(D)) {
4207     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4208       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, classes, and typedefs";
4209     return false;
4210   }
4211   return true;
4212 }
4213 
4214 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4215   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4216     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4217   return false;
4218 }
4219 
4220 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
4221   enum Spelling {
4222     GNU_capability = 0,
4223     CXX11_clang_capability = 1,
4224     GNU_shared_capability = 2,
4225     CXX11_clang_shared_capability = 3,
4226   SpellingNotCalculated = 15
4227 
4228   };
4229 
4230   unsigned Idx = Attr.getAttributeSpellingListIndex();
4231   switch (Idx) {
4232     default: llvm_unreachable("Unknown spelling list index");
4233     case 0: return GNU_capability;
4234     case 1: return CXX11_clang_capability;
4235     case 2: return GNU_shared_capability;
4236     case 3: return CXX11_clang_shared_capability;
4237   }
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_record, /*IsSupported=*/true));
4242   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
4243 }
4244 
4245 bool isParamExpr(size_t N) const override {
4246   return false;
4247 }
4248 
4249 static const ParsedAttrInfoCapability Instance;
4250 };
4251 const ParsedAttrInfoCapability ParsedAttrInfoCapability::Instance;
4252 static constexpr ParsedAttrInfo::Spelling CarriesDependencySpellings[] = {
4253   {AttributeCommonInfo::AS_GNU, "carries_dependency"},
4254   {AttributeCommonInfo::AS_CXX11, "carries_dependency"},
4255 };
4256 struct ParsedAttrInfoCarriesDependency final : public ParsedAttrInfo {
4257   constexpr ParsedAttrInfoCarriesDependency() : ParsedAttrInfo(
4258     /*AttrKind=*/ParsedAttr::AT_CarriesDependency,
4259     /*NumArgs=*/0,
4260     /*OptArgs=*/0,
4261     /*NumArgMembers=*/0,
4262     /*HasCustomParsing=*/0,
4263     /*AcceptsExprPack=*/0,
4264     /*IsTargetSpecific=*/0,
4265     /*IsType=*/0,
4266     /*IsStmt=*/0,
4267     /*IsKnownToGCC=*/0,
4268     /*IsSupportedByPragmaAttribute=*/1,
4269     /*Spellings=*/CarriesDependencySpellings,
4270     /*ArgNames=*/{}) {}
4271 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4272   if (!isa<ParmVarDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) {
4273     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4274       << Attr << Attr.isRegularKeywordAttribute() << "parameters, Objective-C methods, and functions";
4275     return false;
4276   }
4277   return true;
4278 }
4279 
4280 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4281   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4282     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4283   return false;
4284 }
4285 
4286 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4287   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
4288   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
4289   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
4290 }
4291 
4292 bool isParamExpr(size_t N) const override {
4293   return false;
4294 }
4295 
4296 static const ParsedAttrInfoCarriesDependency Instance;
4297 };
4298 const ParsedAttrInfoCarriesDependency ParsedAttrInfoCarriesDependency::Instance;
4299 static constexpr ParsedAttrInfo::Spelling CleanupSpellings[] = {
4300   {AttributeCommonInfo::AS_GNU, "cleanup"},
4301   {AttributeCommonInfo::AS_CXX11, "gnu::cleanup"},
4302   {AttributeCommonInfo::AS_C23, "gnu::cleanup"},
4303 };
4304 static constexpr const char *CleanupArgNames[] = {
4305 "FunctionDecl",};
4306 struct ParsedAttrInfoCleanup final : public ParsedAttrInfo {
4307   constexpr ParsedAttrInfoCleanup() : ParsedAttrInfo(
4308     /*AttrKind=*/ParsedAttr::AT_Cleanup,
4309     /*NumArgs=*/1,
4310     /*OptArgs=*/0,
4311     /*NumArgMembers=*/1,
4312     /*HasCustomParsing=*/0,
4313     /*AcceptsExprPack=*/0,
4314     /*IsTargetSpecific=*/0,
4315     /*IsType=*/0,
4316     /*IsStmt=*/0,
4317     /*IsKnownToGCC=*/1,
4318     /*IsSupportedByPragmaAttribute=*/1,
4319     /*Spellings=*/CleanupSpellings,
4320     /*ArgNames=*/CleanupArgNames) {}
4321 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4322   if (!isLocalVar(D)) {
4323     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4324       << Attr << Attr.isRegularKeywordAttribute() << "local variables";
4325     return false;
4326   }
4327   return true;
4328 }
4329 
4330 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4331   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4332     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4333   return false;
4334 }
4335 
4336 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4337   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_local, /*IsSupported=*/true));
4338 }
4339 
4340 bool isParamExpr(size_t N) const override {
4341   return false;
4342 }
4343 
4344 static const ParsedAttrInfoCleanup Instance;
4345 };
4346 const ParsedAttrInfoCleanup ParsedAttrInfoCleanup::Instance;
4347 static constexpr ParsedAttrInfo::Spelling ClspvLibclcBuiltinSpellings[] = {
4348   {AttributeCommonInfo::AS_GNU, "clspv_libclc_builtin"},
4349   {AttributeCommonInfo::AS_CXX11, "clang::clspv_libclc_builtin"},
4350   {AttributeCommonInfo::AS_C23, "clang::clspv_libclc_builtin"},
4351 };
4352 struct ParsedAttrInfoClspvLibclcBuiltin final : public ParsedAttrInfo {
4353   constexpr ParsedAttrInfoClspvLibclcBuiltin() : ParsedAttrInfo(
4354     /*AttrKind=*/ParsedAttr::AT_ClspvLibclcBuiltin,
4355     /*NumArgs=*/0,
4356     /*OptArgs=*/0,
4357     /*NumArgMembers=*/0,
4358     /*HasCustomParsing=*/0,
4359     /*AcceptsExprPack=*/0,
4360     /*IsTargetSpecific=*/0,
4361     /*IsType=*/0,
4362     /*IsStmt=*/0,
4363     /*IsKnownToGCC=*/0,
4364     /*IsSupportedByPragmaAttribute=*/1,
4365     /*Spellings=*/ClspvLibclcBuiltinSpellings,
4366     /*ArgNames=*/{}) {}
4367 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4368   if (!isa<FunctionDecl>(D)) {
4369     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4370       << Attr << Attr.isRegularKeywordAttribute() << "functions";
4371     return false;
4372   }
4373   return true;
4374 }
4375 
4376 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4377   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4378     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4379   return false;
4380 }
4381 
4382 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4383   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
4384 }
4385 
4386 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
4387   D->addAttr(::new (S.Context) ClspvLibclcBuiltinAttr(S.Context, Attr));
4388   return AttributeApplied;
4389 }
4390 
4391 bool isParamExpr(size_t N) const override {
4392   return false;
4393 }
4394 
4395 static const ParsedAttrInfoClspvLibclcBuiltin Instance;
4396 };
4397 const ParsedAttrInfoClspvLibclcBuiltin ParsedAttrInfoClspvLibclcBuiltin::Instance;
4398 static constexpr ParsedAttrInfo::Spelling CmseNSCallSpellings[] = {
4399   {AttributeCommonInfo::AS_GNU, "cmse_nonsecure_call"},
4400 };
4401 struct ParsedAttrInfoCmseNSCall final : public ParsedAttrInfo {
4402   constexpr ParsedAttrInfoCmseNSCall() : ParsedAttrInfo(
4403     /*AttrKind=*/ParsedAttr::AT_CmseNSCall,
4404     /*NumArgs=*/0,
4405     /*OptArgs=*/0,
4406     /*NumArgMembers=*/0,
4407     /*HasCustomParsing=*/0,
4408     /*AcceptsExprPack=*/0,
4409     /*IsTargetSpecific=*/1,
4410     /*IsType=*/1,
4411     /*IsStmt=*/0,
4412     /*IsKnownToGCC=*/0,
4413     /*IsSupportedByPragmaAttribute=*/0,
4414     /*Spellings=*/CmseNSCallSpellings,
4415     /*ArgNames=*/{}) {}
4416 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
4417   return LangOpts.Cmse;
4418 }
4419 
4420 bool existsInTarget(const TargetInfo &Target) const override {
4421   const llvm::Triple &T = Target.getTriple(); (void)T;
4422   return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb);
4423 }
4424 
4425 bool isParamExpr(size_t N) const override {
4426   return false;
4427 }
4428 
4429 static const ParsedAttrInfoCmseNSCall Instance;
4430 };
4431 const ParsedAttrInfoCmseNSCall ParsedAttrInfoCmseNSCall::Instance;
4432 static constexpr ParsedAttrInfo::Spelling CmseNSEntrySpellings[] = {
4433   {AttributeCommonInfo::AS_GNU, "cmse_nonsecure_entry"},
4434 };
4435 struct ParsedAttrInfoCmseNSEntry final : public ParsedAttrInfo {
4436   constexpr ParsedAttrInfoCmseNSEntry() : ParsedAttrInfo(
4437     /*AttrKind=*/ParsedAttr::AT_CmseNSEntry,
4438     /*NumArgs=*/0,
4439     /*OptArgs=*/0,
4440     /*NumArgMembers=*/0,
4441     /*HasCustomParsing=*/0,
4442     /*AcceptsExprPack=*/0,
4443     /*IsTargetSpecific=*/1,
4444     /*IsType=*/0,
4445     /*IsStmt=*/0,
4446     /*IsKnownToGCC=*/0,
4447     /*IsSupportedByPragmaAttribute=*/1,
4448     /*Spellings=*/CmseNSEntrySpellings,
4449     /*ArgNames=*/{}) {}
4450 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4451   if (!isa<FunctionDecl>(D)) {
4452     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4453       << Attr << Attr.isRegularKeywordAttribute() << "functions";
4454     return false;
4455   }
4456   return true;
4457 }
4458 
4459 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4460   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4461     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4462   return false;
4463 }
4464 
4465 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
4466   return LangOpts.Cmse;
4467 }
4468 
4469 bool existsInTarget(const TargetInfo &Target) const override {
4470   const llvm::Triple &T = Target.getTriple(); (void)T;
4471   return true && (T.getArch() == llvm::Triple::arm || T.getArch() == llvm::Triple::thumb || T.getArch() == llvm::Triple::armeb || T.getArch() == llvm::Triple::thumbeb);
4472 }
4473 
4474 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4475   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
4476 }
4477 
4478 bool isParamExpr(size_t N) const override {
4479   return false;
4480 }
4481 
4482 static const ParsedAttrInfoCmseNSEntry Instance;
4483 };
4484 const ParsedAttrInfoCmseNSEntry ParsedAttrInfoCmseNSEntry::Instance;
4485 static constexpr ParsedAttrInfo::Spelling CodeAlignSpellings[] = {
4486   {AttributeCommonInfo::AS_GNU, "code_align"},
4487   {AttributeCommonInfo::AS_CXX11, "clang::code_align"},
4488   {AttributeCommonInfo::AS_C23, "clang::code_align"},
4489 };
4490 static constexpr const char *CodeAlignArgNames[] = {
4491 "Alignment",};
4492 struct ParsedAttrInfoCodeAlign final : public ParsedAttrInfo {
4493   constexpr ParsedAttrInfoCodeAlign() : ParsedAttrInfo(
4494     /*AttrKind=*/ParsedAttr::AT_CodeAlign,
4495     /*NumArgs=*/1,
4496     /*OptArgs=*/0,
4497     /*NumArgMembers=*/1,
4498     /*HasCustomParsing=*/0,
4499     /*AcceptsExprPack=*/0,
4500     /*IsTargetSpecific=*/0,
4501     /*IsType=*/0,
4502     /*IsStmt=*/1,
4503     /*IsKnownToGCC=*/0,
4504     /*IsSupportedByPragmaAttribute=*/0,
4505     /*Spellings=*/CodeAlignSpellings,
4506     /*ArgNames=*/CodeAlignArgNames) {}
4507 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
4508   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
4509     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
4510   return false;
4511 }
4512 
4513 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
4514   if (!isa<ForStmt>(St) && !isa<CXXForRangeStmt>(St) && !isa<WhileStmt>(St) && !isa<DoStmt>(St)) {
4515     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4516       << Attr << Attr.isRegularKeywordAttribute() << "'for', 'while', and 'do' statements";
4517     return false;
4518   }
4519   return true;
4520 }
4521 
4522 bool isParamExpr(size_t N) const override {
4523   return (N == 0) || false;
4524 }
4525 
4526 static const ParsedAttrInfoCodeAlign Instance;
4527 };
4528 const ParsedAttrInfoCodeAlign ParsedAttrInfoCodeAlign::Instance;
4529 static constexpr ParsedAttrInfo::Spelling CodeModelSpellings[] = {
4530   {AttributeCommonInfo::AS_GNU, "model"},
4531   {AttributeCommonInfo::AS_CXX11, "gnu::model"},
4532   {AttributeCommonInfo::AS_C23, "gnu::model"},
4533 };
4534 static constexpr const char *CodeModelArgNames[] = {
4535 "Model",};
4536 struct ParsedAttrInfoCodeModel final : public ParsedAttrInfo {
4537   constexpr ParsedAttrInfoCodeModel() : ParsedAttrInfo(
4538     /*AttrKind=*/ParsedAttr::AT_CodeModel,
4539     /*NumArgs=*/1,
4540     /*OptArgs=*/0,
4541     /*NumArgMembers=*/1,
4542     /*HasCustomParsing=*/0,
4543     /*AcceptsExprPack=*/0,
4544     /*IsTargetSpecific=*/1,
4545     /*IsType=*/0,
4546     /*IsStmt=*/0,
4547     /*IsKnownToGCC=*/1,
4548     /*IsSupportedByPragmaAttribute=*/0,
4549     /*Spellings=*/CodeModelSpellings,
4550     /*ArgNames=*/CodeModelArgNames) {}
4551 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4552   if (!isNonTLSGlobalVar(D)) {
4553     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4554       << Attr << Attr.isRegularKeywordAttribute() << "non-TLS global variables";
4555     return false;
4556   }
4557   return true;
4558 }
4559 
4560 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4561   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4562     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4563   return false;
4564 }
4565 
4566 bool existsInTarget(const TargetInfo &Target) const override {
4567   const llvm::Triple &T = Target.getTriple(); (void)T;
4568   return true && (T.getArch() == llvm::Triple::loongarch32 || T.getArch() == llvm::Triple::loongarch64);
4569 }
4570 
4571 bool isParamExpr(size_t N) const override {
4572   return false;
4573 }
4574 
4575 static const ParsedAttrInfoCodeModel Instance;
4576 };
4577 const ParsedAttrInfoCodeModel ParsedAttrInfoCodeModel::Instance;
4578 static constexpr ParsedAttrInfo::Spelling CodeSegSpellings[] = {
4579   {AttributeCommonInfo::AS_Declspec, "code_seg"},
4580 };
4581 static constexpr const char *CodeSegArgNames[] = {
4582 "Name",};
4583 struct ParsedAttrInfoCodeSeg final : public ParsedAttrInfo {
4584   constexpr ParsedAttrInfoCodeSeg() : ParsedAttrInfo(
4585     /*AttrKind=*/ParsedAttr::AT_CodeSeg,
4586     /*NumArgs=*/1,
4587     /*OptArgs=*/0,
4588     /*NumArgMembers=*/1,
4589     /*HasCustomParsing=*/0,
4590     /*AcceptsExprPack=*/0,
4591     /*IsTargetSpecific=*/0,
4592     /*IsType=*/0,
4593     /*IsStmt=*/0,
4594     /*IsKnownToGCC=*/0,
4595     /*IsSupportedByPragmaAttribute=*/0,
4596     /*Spellings=*/CodeSegSpellings,
4597     /*ArgNames=*/CodeSegArgNames) {}
4598 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4599   if (!isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) {
4600     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4601       << Attr << Attr.isRegularKeywordAttribute() << "functions and classes";
4602     return false;
4603   }
4604   return true;
4605 }
4606 
4607 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4608   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4609     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4610   return false;
4611 }
4612 
4613 bool isParamExpr(size_t N) const override {
4614   return false;
4615 }
4616 
4617 static const ParsedAttrInfoCodeSeg Instance;
4618 };
4619 const ParsedAttrInfoCodeSeg ParsedAttrInfoCodeSeg::Instance;
4620 static constexpr ParsedAttrInfo::Spelling ColdSpellings[] = {
4621   {AttributeCommonInfo::AS_GNU, "cold"},
4622   {AttributeCommonInfo::AS_CXX11, "gnu::cold"},
4623   {AttributeCommonInfo::AS_C23, "gnu::cold"},
4624 };
4625 struct ParsedAttrInfoCold final : public ParsedAttrInfo {
4626   constexpr ParsedAttrInfoCold() : ParsedAttrInfo(
4627     /*AttrKind=*/ParsedAttr::AT_Cold,
4628     /*NumArgs=*/0,
4629     /*OptArgs=*/0,
4630     /*NumArgMembers=*/0,
4631     /*HasCustomParsing=*/0,
4632     /*AcceptsExprPack=*/0,
4633     /*IsTargetSpecific=*/0,
4634     /*IsType=*/0,
4635     /*IsStmt=*/0,
4636     /*IsKnownToGCC=*/1,
4637     /*IsSupportedByPragmaAttribute=*/1,
4638     /*Spellings=*/ColdSpellings,
4639     /*ArgNames=*/{}) {}
4640 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4641   if (!isa<FunctionDecl>(D)) {
4642     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4643       << Attr << Attr.isRegularKeywordAttribute() << "functions";
4644     return false;
4645   }
4646   return true;
4647 }
4648 
4649 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4650   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4651     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4652   return false;
4653 }
4654 
4655   using ParsedAttrInfo::diagMutualExclusion;
4656 
4657   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
4658     if (const auto *A = D->getAttr<HotAttr>()) {
4659       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
4660       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
4661 return false;
4662     }
4663     return true;
4664   }
4665 
4666 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4667   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
4668 }
4669 
4670 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
4671   D->addAttr(::new (S.Context) ColdAttr(S.Context, Attr));
4672   return AttributeApplied;
4673 }
4674 
4675 bool isParamExpr(size_t N) const override {
4676   return false;
4677 }
4678 
4679 static const ParsedAttrInfoCold Instance;
4680 };
4681 const ParsedAttrInfoCold ParsedAttrInfoCold::Instance;
4682 static constexpr ParsedAttrInfo::Spelling CommonSpellings[] = {
4683   {AttributeCommonInfo::AS_GNU, "common"},
4684   {AttributeCommonInfo::AS_CXX11, "gnu::common"},
4685   {AttributeCommonInfo::AS_C23, "gnu::common"},
4686 };
4687 struct ParsedAttrInfoCommon final : public ParsedAttrInfo {
4688   constexpr ParsedAttrInfoCommon() : ParsedAttrInfo(
4689     /*AttrKind=*/ParsedAttr::AT_Common,
4690     /*NumArgs=*/0,
4691     /*OptArgs=*/0,
4692     /*NumArgMembers=*/0,
4693     /*HasCustomParsing=*/0,
4694     /*AcceptsExprPack=*/0,
4695     /*IsTargetSpecific=*/0,
4696     /*IsType=*/0,
4697     /*IsStmt=*/0,
4698     /*IsKnownToGCC=*/1,
4699     /*IsSupportedByPragmaAttribute=*/1,
4700     /*Spellings=*/CommonSpellings,
4701     /*ArgNames=*/{}) {}
4702 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4703   if (!isa<VarDecl>(D)) {
4704     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4705       << Attr << Attr.isRegularKeywordAttribute() << "variables";
4706     return false;
4707   }
4708   return true;
4709 }
4710 
4711 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4712   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4713     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4714   return false;
4715 }
4716 
4717   using ParsedAttrInfo::diagMutualExclusion;
4718 
4719   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
4720     if (const auto *A = D->getAttr<InternalLinkageAttr>()) {
4721       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
4722       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
4723 return false;
4724     }
4725     return true;
4726   }
4727 
4728 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4729   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
4730 }
4731 
4732 bool isParamExpr(size_t N) const override {
4733   return false;
4734 }
4735 
4736 static const ParsedAttrInfoCommon Instance;
4737 };
4738 const ParsedAttrInfoCommon ParsedAttrInfoCommon::Instance;
4739 static constexpr ParsedAttrInfo::Spelling ConstSpellings[] = {
4740   {AttributeCommonInfo::AS_GNU, "const"},
4741   {AttributeCommonInfo::AS_CXX11, "gnu::const"},
4742   {AttributeCommonInfo::AS_C23, "gnu::const"},
4743   {AttributeCommonInfo::AS_GNU, "__const"},
4744   {AttributeCommonInfo::AS_CXX11, "gnu::__const"},
4745   {AttributeCommonInfo::AS_C23, "gnu::__const"},
4746 };
4747 struct ParsedAttrInfoConst final : public ParsedAttrInfo {
4748   constexpr ParsedAttrInfoConst() : ParsedAttrInfo(
4749     /*AttrKind=*/ParsedAttr::AT_Const,
4750     /*NumArgs=*/0,
4751     /*OptArgs=*/0,
4752     /*NumArgMembers=*/0,
4753     /*HasCustomParsing=*/0,
4754     /*AcceptsExprPack=*/0,
4755     /*IsTargetSpecific=*/0,
4756     /*IsType=*/0,
4757     /*IsStmt=*/0,
4758     /*IsKnownToGCC=*/1,
4759     /*IsSupportedByPragmaAttribute=*/0,
4760     /*Spellings=*/ConstSpellings,
4761     /*ArgNames=*/{}) {}
4762 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
4763   D->addAttr(::new (S.Context) ConstAttr(S.Context, Attr));
4764   return AttributeApplied;
4765 }
4766 
4767 bool isParamExpr(size_t N) const override {
4768   return false;
4769 }
4770 
4771 static const ParsedAttrInfoConst Instance;
4772 };
4773 const ParsedAttrInfoConst ParsedAttrInfoConst::Instance;
4774 static constexpr ParsedAttrInfo::Spelling ConstInitSpellings[] = {
4775   {AttributeCommonInfo::AS_Keyword, "constinit"},
4776   {AttributeCommonInfo::AS_GNU, "require_constant_initialization"},
4777   {AttributeCommonInfo::AS_CXX11, "clang::require_constant_initialization"},
4778 };
4779 struct ParsedAttrInfoConstInit final : public ParsedAttrInfo {
4780   constexpr ParsedAttrInfoConstInit() : ParsedAttrInfo(
4781     /*AttrKind=*/ParsedAttr::AT_ConstInit,
4782     /*NumArgs=*/0,
4783     /*OptArgs=*/0,
4784     /*NumArgMembers=*/0,
4785     /*HasCustomParsing=*/0,
4786     /*AcceptsExprPack=*/0,
4787     /*IsTargetSpecific=*/0,
4788     /*IsType=*/0,
4789     /*IsStmt=*/0,
4790     /*IsKnownToGCC=*/0,
4791     /*IsSupportedByPragmaAttribute=*/1,
4792     /*Spellings=*/ConstInitSpellings,
4793     /*ArgNames=*/{}) {}
4794 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4795   if (!isGlobalVar(D)) {
4796     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
4797       << Attr << Attr.isRegularKeywordAttribute() << "global variables";
4798     return false;
4799   }
4800   return true;
4801 }
4802 
4803 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4804   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4805     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4806   return false;
4807 }
4808 
4809 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
4810   return LangOpts.CPlusPlus;
4811 }
4812 
4813 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
4814   enum Spelling {
4815     Keyword_constinit = 0,
4816     GNU_require_constant_initialization = 1,
4817     CXX11_clang_require_constant_initialization = 2,
4818   SpellingNotCalculated = 15
4819 
4820   };
4821 
4822   unsigned Idx = Attr.getAttributeSpellingListIndex();
4823   switch (Idx) {
4824     default: llvm_unreachable("Unknown spelling list index");
4825     case 0: return Keyword_constinit;
4826     case 1: return GNU_require_constant_initialization;
4827     case 2: return CXX11_clang_require_constant_initialization;
4828   }
4829 }
4830 
4831 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4832   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
4833 }
4834 
4835 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
4836   D->addAttr(::new (S.Context) ConstInitAttr(S.Context, Attr));
4837   return AttributeApplied;
4838 }
4839 
4840 bool isParamExpr(size_t N) const override {
4841   return false;
4842 }
4843 
4844 static const ParsedAttrInfoConstInit Instance;
4845 };
4846 const ParsedAttrInfoConstInit ParsedAttrInfoConstInit::Instance;
4847 static constexpr ParsedAttrInfo::Spelling ConstructorSpellings[] = {
4848   {AttributeCommonInfo::AS_GNU, "constructor"},
4849   {AttributeCommonInfo::AS_CXX11, "gnu::constructor"},
4850   {AttributeCommonInfo::AS_C23, "gnu::constructor"},
4851 };
4852 static constexpr const char *ConstructorArgNames[] = {
4853 "Priority",};
4854 struct ParsedAttrInfoConstructor final : public ParsedAttrInfo {
4855   constexpr ParsedAttrInfoConstructor() : ParsedAttrInfo(
4856     /*AttrKind=*/ParsedAttr::AT_Constructor,
4857     /*NumArgs=*/0,
4858     /*OptArgs=*/1,
4859     /*NumArgMembers=*/1,
4860     /*HasCustomParsing=*/0,
4861     /*AcceptsExprPack=*/0,
4862     /*IsTargetSpecific=*/0,
4863     /*IsType=*/0,
4864     /*IsStmt=*/0,
4865     /*IsKnownToGCC=*/1,
4866     /*IsSupportedByPragmaAttribute=*/1,
4867     /*Spellings=*/ConstructorSpellings,
4868     /*ArgNames=*/ConstructorArgNames) {}
4869 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4870   if (!isa<FunctionDecl>(D)) {
4871     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4872       << Attr << Attr.isRegularKeywordAttribute() << "functions";
4873     return false;
4874   }
4875   return true;
4876 }
4877 
4878 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4879   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4880     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4881   return false;
4882 }
4883 
4884 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4885   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
4886 }
4887 
4888 bool isParamExpr(size_t N) const override {
4889   return false;
4890 }
4891 
4892 static const ParsedAttrInfoConstructor Instance;
4893 };
4894 const ParsedAttrInfoConstructor ParsedAttrInfoConstructor::Instance;
4895 static constexpr ParsedAttrInfo::Spelling ConsumableSpellings[] = {
4896   {AttributeCommonInfo::AS_GNU, "consumable"},
4897   {AttributeCommonInfo::AS_CXX11, "clang::consumable"},
4898 };
4899 static constexpr const char *ConsumableArgNames[] = {
4900 "DefaultState",};
4901 struct ParsedAttrInfoConsumable final : public ParsedAttrInfo {
4902   constexpr ParsedAttrInfoConsumable() : ParsedAttrInfo(
4903     /*AttrKind=*/ParsedAttr::AT_Consumable,
4904     /*NumArgs=*/1,
4905     /*OptArgs=*/0,
4906     /*NumArgMembers=*/1,
4907     /*HasCustomParsing=*/0,
4908     /*AcceptsExprPack=*/0,
4909     /*IsTargetSpecific=*/0,
4910     /*IsType=*/0,
4911     /*IsStmt=*/0,
4912     /*IsKnownToGCC=*/0,
4913     /*IsSupportedByPragmaAttribute=*/1,
4914     /*Spellings=*/ConsumableSpellings,
4915     /*ArgNames=*/ConsumableArgNames) {}
4916 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4917   if (!isa<CXXRecordDecl>(D)) {
4918     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4919       << Attr << Attr.isRegularKeywordAttribute() << "classes";
4920     return false;
4921   }
4922   return true;
4923 }
4924 
4925 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4926   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4927     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4928   return false;
4929 }
4930 
4931 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4932   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
4933 }
4934 
4935 bool isParamExpr(size_t N) const override {
4936   return false;
4937 }
4938 
4939 static const ParsedAttrInfoConsumable Instance;
4940 };
4941 const ParsedAttrInfoConsumable ParsedAttrInfoConsumable::Instance;
4942 static constexpr ParsedAttrInfo::Spelling ConsumableAutoCastSpellings[] = {
4943   {AttributeCommonInfo::AS_GNU, "consumable_auto_cast_state"},
4944   {AttributeCommonInfo::AS_CXX11, "clang::consumable_auto_cast_state"},
4945 };
4946 struct ParsedAttrInfoConsumableAutoCast final : public ParsedAttrInfo {
4947   constexpr ParsedAttrInfoConsumableAutoCast() : ParsedAttrInfo(
4948     /*AttrKind=*/ParsedAttr::AT_ConsumableAutoCast,
4949     /*NumArgs=*/0,
4950     /*OptArgs=*/0,
4951     /*NumArgMembers=*/0,
4952     /*HasCustomParsing=*/0,
4953     /*AcceptsExprPack=*/0,
4954     /*IsTargetSpecific=*/0,
4955     /*IsType=*/0,
4956     /*IsStmt=*/0,
4957     /*IsKnownToGCC=*/0,
4958     /*IsSupportedByPragmaAttribute=*/1,
4959     /*Spellings=*/ConsumableAutoCastSpellings,
4960     /*ArgNames=*/{}) {}
4961 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
4962   if (!isa<CXXRecordDecl>(D)) {
4963     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
4964       << Attr << Attr.isRegularKeywordAttribute() << "classes";
4965     return false;
4966   }
4967   return true;
4968 }
4969 
4970 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
4971   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
4972     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
4973   return false;
4974 }
4975 
4976 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
4977   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
4978 }
4979 
4980 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
4981   D->addAttr(::new (S.Context) ConsumableAutoCastAttr(S.Context, Attr));
4982   return AttributeApplied;
4983 }
4984 
4985 bool isParamExpr(size_t N) const override {
4986   return false;
4987 }
4988 
4989 static const ParsedAttrInfoConsumableAutoCast Instance;
4990 };
4991 const ParsedAttrInfoConsumableAutoCast ParsedAttrInfoConsumableAutoCast::Instance;
4992 static constexpr ParsedAttrInfo::Spelling ConsumableSetOnReadSpellings[] = {
4993   {AttributeCommonInfo::AS_GNU, "consumable_set_state_on_read"},
4994   {AttributeCommonInfo::AS_CXX11, "clang::consumable_set_state_on_read"},
4995 };
4996 struct ParsedAttrInfoConsumableSetOnRead final : public ParsedAttrInfo {
4997   constexpr ParsedAttrInfoConsumableSetOnRead() : ParsedAttrInfo(
4998     /*AttrKind=*/ParsedAttr::AT_ConsumableSetOnRead,
4999     /*NumArgs=*/0,
5000     /*OptArgs=*/0,
5001     /*NumArgMembers=*/0,
5002     /*HasCustomParsing=*/0,
5003     /*AcceptsExprPack=*/0,
5004     /*IsTargetSpecific=*/0,
5005     /*IsType=*/0,
5006     /*IsStmt=*/0,
5007     /*IsKnownToGCC=*/0,
5008     /*IsSupportedByPragmaAttribute=*/1,
5009     /*Spellings=*/ConsumableSetOnReadSpellings,
5010     /*ArgNames=*/{}) {}
5011 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5012   if (!isa<CXXRecordDecl>(D)) {
5013     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5014       << Attr << Attr.isRegularKeywordAttribute() << "classes";
5015     return false;
5016   }
5017   return true;
5018 }
5019 
5020 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5021   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5022     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5023   return false;
5024 }
5025 
5026 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5027   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5028 }
5029 
5030 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5031   D->addAttr(::new (S.Context) ConsumableSetOnReadAttr(S.Context, Attr));
5032   return AttributeApplied;
5033 }
5034 
5035 bool isParamExpr(size_t N) const override {
5036   return false;
5037 }
5038 
5039 static const ParsedAttrInfoConsumableSetOnRead Instance;
5040 };
5041 const ParsedAttrInfoConsumableSetOnRead ParsedAttrInfoConsumableSetOnRead::Instance;
5042 static constexpr ParsedAttrInfo::Spelling ConvergentSpellings[] = {
5043   {AttributeCommonInfo::AS_GNU, "convergent"},
5044   {AttributeCommonInfo::AS_CXX11, "clang::convergent"},
5045   {AttributeCommonInfo::AS_C23, "clang::convergent"},
5046 };
5047 struct ParsedAttrInfoConvergent final : public ParsedAttrInfo {
5048   constexpr ParsedAttrInfoConvergent() : ParsedAttrInfo(
5049     /*AttrKind=*/ParsedAttr::AT_Convergent,
5050     /*NumArgs=*/0,
5051     /*OptArgs=*/0,
5052     /*NumArgMembers=*/0,
5053     /*HasCustomParsing=*/0,
5054     /*AcceptsExprPack=*/0,
5055     /*IsTargetSpecific=*/0,
5056     /*IsType=*/0,
5057     /*IsStmt=*/0,
5058     /*IsKnownToGCC=*/0,
5059     /*IsSupportedByPragmaAttribute=*/1,
5060     /*Spellings=*/ConvergentSpellings,
5061     /*ArgNames=*/{}) {}
5062 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5063   if (!isa<FunctionDecl>(D)) {
5064     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5065       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5066     return false;
5067   }
5068   return true;
5069 }
5070 
5071 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5072   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5073     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5074   return false;
5075 }
5076 
5077   using ParsedAttrInfo::diagMutualExclusion;
5078 
5079   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
5080     if (const auto *A = D->getAttr<NoConvergentAttr>()) {
5081       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
5082       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
5083 return false;
5084     }
5085     return true;
5086   }
5087 
5088 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5089   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5090 }
5091 
5092 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5093   D->addAttr(::new (S.Context) ConvergentAttr(S.Context, Attr));
5094   return AttributeApplied;
5095 }
5096 
5097 bool isParamExpr(size_t N) const override {
5098   return false;
5099 }
5100 
5101 static const ParsedAttrInfoConvergent Instance;
5102 };
5103 const ParsedAttrInfoConvergent ParsedAttrInfoConvergent::Instance;
5104 static constexpr ParsedAttrInfo::Spelling CoroAwaitElidableSpellings[] = {
5105   {AttributeCommonInfo::AS_GNU, "coro_await_elidable"},
5106   {AttributeCommonInfo::AS_CXX11, "clang::coro_await_elidable"},
5107   {AttributeCommonInfo::AS_C23, "clang::coro_await_elidable"},
5108 };
5109 struct ParsedAttrInfoCoroAwaitElidable final : public ParsedAttrInfo {
5110   constexpr ParsedAttrInfoCoroAwaitElidable() : ParsedAttrInfo(
5111     /*AttrKind=*/ParsedAttr::AT_CoroAwaitElidable,
5112     /*NumArgs=*/0,
5113     /*OptArgs=*/0,
5114     /*NumArgMembers=*/0,
5115     /*HasCustomParsing=*/0,
5116     /*AcceptsExprPack=*/0,
5117     /*IsTargetSpecific=*/0,
5118     /*IsType=*/0,
5119     /*IsStmt=*/0,
5120     /*IsKnownToGCC=*/0,
5121     /*IsSupportedByPragmaAttribute=*/1,
5122     /*Spellings=*/CoroAwaitElidableSpellings,
5123     /*ArgNames=*/{}) {}
5124 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5125   if (!isa<CXXRecordDecl>(D)) {
5126     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5127       << Attr << Attr.isRegularKeywordAttribute() << "classes";
5128     return false;
5129   }
5130   return true;
5131 }
5132 
5133 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5134   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5135     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5136   return false;
5137 }
5138 
5139 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5140   return LangOpts.CPlusPlus;
5141 }
5142 
5143 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5144   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5145 }
5146 
5147 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5148   D->addAttr(::new (S.Context) CoroAwaitElidableAttr(S.Context, Attr));
5149   return AttributeApplied;
5150 }
5151 
5152 bool isParamExpr(size_t N) const override {
5153   return false;
5154 }
5155 
5156 static const ParsedAttrInfoCoroAwaitElidable Instance;
5157 };
5158 const ParsedAttrInfoCoroAwaitElidable ParsedAttrInfoCoroAwaitElidable::Instance;
5159 static constexpr ParsedAttrInfo::Spelling CoroAwaitElidableArgumentSpellings[] = {
5160   {AttributeCommonInfo::AS_GNU, "coro_await_elidable_argument"},
5161   {AttributeCommonInfo::AS_CXX11, "clang::coro_await_elidable_argument"},
5162   {AttributeCommonInfo::AS_C23, "clang::coro_await_elidable_argument"},
5163 };
5164 struct ParsedAttrInfoCoroAwaitElidableArgument final : public ParsedAttrInfo {
5165   constexpr ParsedAttrInfoCoroAwaitElidableArgument() : ParsedAttrInfo(
5166     /*AttrKind=*/ParsedAttr::AT_CoroAwaitElidableArgument,
5167     /*NumArgs=*/0,
5168     /*OptArgs=*/0,
5169     /*NumArgMembers=*/0,
5170     /*HasCustomParsing=*/0,
5171     /*AcceptsExprPack=*/0,
5172     /*IsTargetSpecific=*/0,
5173     /*IsType=*/0,
5174     /*IsStmt=*/0,
5175     /*IsKnownToGCC=*/0,
5176     /*IsSupportedByPragmaAttribute=*/1,
5177     /*Spellings=*/CoroAwaitElidableArgumentSpellings,
5178     /*ArgNames=*/{}) {}
5179 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5180   if (!isa<ParmVarDecl>(D)) {
5181     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5182       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
5183     return false;
5184   }
5185   return true;
5186 }
5187 
5188 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5189   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5190     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5191   return false;
5192 }
5193 
5194 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5195   return LangOpts.CPlusPlus;
5196 }
5197 
5198 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5199   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
5200 }
5201 
5202 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5203   D->addAttr(::new (S.Context) CoroAwaitElidableArgumentAttr(S.Context, Attr));
5204   return AttributeApplied;
5205 }
5206 
5207 bool isParamExpr(size_t N) const override {
5208   return false;
5209 }
5210 
5211 static const ParsedAttrInfoCoroAwaitElidableArgument Instance;
5212 };
5213 const ParsedAttrInfoCoroAwaitElidableArgument ParsedAttrInfoCoroAwaitElidableArgument::Instance;
5214 static constexpr ParsedAttrInfo::Spelling CoroDisableLifetimeBoundSpellings[] = {
5215   {AttributeCommonInfo::AS_GNU, "coro_disable_lifetimebound"},
5216   {AttributeCommonInfo::AS_CXX11, "clang::coro_disable_lifetimebound"},
5217   {AttributeCommonInfo::AS_C23, "clang::coro_disable_lifetimebound"},
5218 };
5219 struct ParsedAttrInfoCoroDisableLifetimeBound final : public ParsedAttrInfo {
5220   constexpr ParsedAttrInfoCoroDisableLifetimeBound() : ParsedAttrInfo(
5221     /*AttrKind=*/ParsedAttr::AT_CoroDisableLifetimeBound,
5222     /*NumArgs=*/0,
5223     /*OptArgs=*/0,
5224     /*NumArgMembers=*/0,
5225     /*HasCustomParsing=*/0,
5226     /*AcceptsExprPack=*/0,
5227     /*IsTargetSpecific=*/0,
5228     /*IsType=*/0,
5229     /*IsStmt=*/0,
5230     /*IsKnownToGCC=*/0,
5231     /*IsSupportedByPragmaAttribute=*/1,
5232     /*Spellings=*/CoroDisableLifetimeBoundSpellings,
5233     /*ArgNames=*/{}) {}
5234 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5235   if (!isa<FunctionDecl>(D)) {
5236     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5237       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5238     return false;
5239   }
5240   return true;
5241 }
5242 
5243 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5244   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5245     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5246   return false;
5247 }
5248 
5249 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5250   return LangOpts.CPlusPlus;
5251 }
5252 
5253 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5254   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5255 }
5256 
5257 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5258   D->addAttr(::new (S.Context) CoroDisableLifetimeBoundAttr(S.Context, Attr));
5259   return AttributeApplied;
5260 }
5261 
5262 bool isParamExpr(size_t N) const override {
5263   return false;
5264 }
5265 
5266 static const ParsedAttrInfoCoroDisableLifetimeBound Instance;
5267 };
5268 const ParsedAttrInfoCoroDisableLifetimeBound ParsedAttrInfoCoroDisableLifetimeBound::Instance;
5269 static constexpr ParsedAttrInfo::Spelling CoroLifetimeBoundSpellings[] = {
5270   {AttributeCommonInfo::AS_GNU, "coro_lifetimebound"},
5271   {AttributeCommonInfo::AS_CXX11, "clang::coro_lifetimebound"},
5272   {AttributeCommonInfo::AS_C23, "clang::coro_lifetimebound"},
5273 };
5274 struct ParsedAttrInfoCoroLifetimeBound final : public ParsedAttrInfo {
5275   constexpr ParsedAttrInfoCoroLifetimeBound() : ParsedAttrInfo(
5276     /*AttrKind=*/ParsedAttr::AT_CoroLifetimeBound,
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=*/CoroLifetimeBoundSpellings,
5288     /*ArgNames=*/{}) {}
5289 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5290   if (!isa<CXXRecordDecl>(D)) {
5291     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5292       << Attr << Attr.isRegularKeywordAttribute() << "classes";
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 << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5301   return false;
5302 }
5303 
5304 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5305   return LangOpts.CPlusPlus;
5306 }
5307 
5308 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5309   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5310 }
5311 
5312 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5313   D->addAttr(::new (S.Context) CoroLifetimeBoundAttr(S.Context, Attr));
5314   return AttributeApplied;
5315 }
5316 
5317 bool isParamExpr(size_t N) const override {
5318   return false;
5319 }
5320 
5321 static const ParsedAttrInfoCoroLifetimeBound Instance;
5322 };
5323 const ParsedAttrInfoCoroLifetimeBound ParsedAttrInfoCoroLifetimeBound::Instance;
5324 static constexpr ParsedAttrInfo::Spelling CoroOnlyDestroyWhenCompleteSpellings[] = {
5325   {AttributeCommonInfo::AS_GNU, "coro_only_destroy_when_complete"},
5326   {AttributeCommonInfo::AS_CXX11, "clang::coro_only_destroy_when_complete"},
5327   {AttributeCommonInfo::AS_C23, "clang::coro_only_destroy_when_complete"},
5328 };
5329 struct ParsedAttrInfoCoroOnlyDestroyWhenComplete final : public ParsedAttrInfo {
5330   constexpr ParsedAttrInfoCoroOnlyDestroyWhenComplete() : ParsedAttrInfo(
5331     /*AttrKind=*/ParsedAttr::AT_CoroOnlyDestroyWhenComplete,
5332     /*NumArgs=*/0,
5333     /*OptArgs=*/0,
5334     /*NumArgMembers=*/0,
5335     /*HasCustomParsing=*/0,
5336     /*AcceptsExprPack=*/0,
5337     /*IsTargetSpecific=*/0,
5338     /*IsType=*/0,
5339     /*IsStmt=*/0,
5340     /*IsKnownToGCC=*/0,
5341     /*IsSupportedByPragmaAttribute=*/1,
5342     /*Spellings=*/CoroOnlyDestroyWhenCompleteSpellings,
5343     /*ArgNames=*/{}) {}
5344 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5345   if (!isa<CXXRecordDecl>(D)) {
5346     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5347       << Attr << Attr.isRegularKeywordAttribute() << "classes";
5348     return false;
5349   }
5350   return true;
5351 }
5352 
5353 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5354   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5355     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5356   return false;
5357 }
5358 
5359 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5360   return LangOpts.CPlusPlus;
5361 }
5362 
5363 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5364   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5365 }
5366 
5367 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5368   D->addAttr(::new (S.Context) CoroOnlyDestroyWhenCompleteAttr(S.Context, Attr));
5369   return AttributeApplied;
5370 }
5371 
5372 bool isParamExpr(size_t N) const override {
5373   return false;
5374 }
5375 
5376 static const ParsedAttrInfoCoroOnlyDestroyWhenComplete Instance;
5377 };
5378 const ParsedAttrInfoCoroOnlyDestroyWhenComplete ParsedAttrInfoCoroOnlyDestroyWhenComplete::Instance;
5379 static constexpr ParsedAttrInfo::Spelling CoroReturnTypeSpellings[] = {
5380   {AttributeCommonInfo::AS_GNU, "coro_return_type"},
5381   {AttributeCommonInfo::AS_CXX11, "clang::coro_return_type"},
5382   {AttributeCommonInfo::AS_C23, "clang::coro_return_type"},
5383 };
5384 struct ParsedAttrInfoCoroReturnType final : public ParsedAttrInfo {
5385   constexpr ParsedAttrInfoCoroReturnType() : ParsedAttrInfo(
5386     /*AttrKind=*/ParsedAttr::AT_CoroReturnType,
5387     /*NumArgs=*/0,
5388     /*OptArgs=*/0,
5389     /*NumArgMembers=*/0,
5390     /*HasCustomParsing=*/0,
5391     /*AcceptsExprPack=*/0,
5392     /*IsTargetSpecific=*/0,
5393     /*IsType=*/0,
5394     /*IsStmt=*/0,
5395     /*IsKnownToGCC=*/0,
5396     /*IsSupportedByPragmaAttribute=*/1,
5397     /*Spellings=*/CoroReturnTypeSpellings,
5398     /*ArgNames=*/{}) {}
5399 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5400   if (!isa<CXXRecordDecl>(D)) {
5401     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5402       << Attr << Attr.isRegularKeywordAttribute() << "classes";
5403     return false;
5404   }
5405   return true;
5406 }
5407 
5408 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5409   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5410     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5411   return false;
5412 }
5413 
5414 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5415   return LangOpts.CPlusPlus;
5416 }
5417 
5418 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5419   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5420 }
5421 
5422 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5423   D->addAttr(::new (S.Context) CoroReturnTypeAttr(S.Context, Attr));
5424   return AttributeApplied;
5425 }
5426 
5427 bool isParamExpr(size_t N) const override {
5428   return false;
5429 }
5430 
5431 static const ParsedAttrInfoCoroReturnType Instance;
5432 };
5433 const ParsedAttrInfoCoroReturnType ParsedAttrInfoCoroReturnType::Instance;
5434 static constexpr ParsedAttrInfo::Spelling CoroWrapperSpellings[] = {
5435   {AttributeCommonInfo::AS_GNU, "coro_wrapper"},
5436   {AttributeCommonInfo::AS_CXX11, "clang::coro_wrapper"},
5437   {AttributeCommonInfo::AS_C23, "clang::coro_wrapper"},
5438 };
5439 struct ParsedAttrInfoCoroWrapper final : public ParsedAttrInfo {
5440   constexpr ParsedAttrInfoCoroWrapper() : ParsedAttrInfo(
5441     /*AttrKind=*/ParsedAttr::AT_CoroWrapper,
5442     /*NumArgs=*/0,
5443     /*OptArgs=*/0,
5444     /*NumArgMembers=*/0,
5445     /*HasCustomParsing=*/0,
5446     /*AcceptsExprPack=*/0,
5447     /*IsTargetSpecific=*/0,
5448     /*IsType=*/0,
5449     /*IsStmt=*/0,
5450     /*IsKnownToGCC=*/0,
5451     /*IsSupportedByPragmaAttribute=*/1,
5452     /*Spellings=*/CoroWrapperSpellings,
5453     /*ArgNames=*/{}) {}
5454 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5455   if (!isa<FunctionDecl>(D)) {
5456     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5457       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5458     return false;
5459   }
5460   return true;
5461 }
5462 
5463 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5464   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5465     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5466   return false;
5467 }
5468 
5469 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5470   return LangOpts.CPlusPlus;
5471 }
5472 
5473 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5474   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5475 }
5476 
5477 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5478   D->addAttr(::new (S.Context) CoroWrapperAttr(S.Context, Attr));
5479   return AttributeApplied;
5480 }
5481 
5482 bool isParamExpr(size_t N) const override {
5483   return false;
5484 }
5485 
5486 static const ParsedAttrInfoCoroWrapper Instance;
5487 };
5488 const ParsedAttrInfoCoroWrapper ParsedAttrInfoCoroWrapper::Instance;
5489 static constexpr ParsedAttrInfo::Spelling CountedBySpellings[] = {
5490   {AttributeCommonInfo::AS_GNU, "counted_by"},
5491   {AttributeCommonInfo::AS_CXX11, "clang::counted_by"},
5492   {AttributeCommonInfo::AS_C23, "clang::counted_by"},
5493 };
5494 static constexpr const char *CountedByArgNames[] = {
5495 "Count","NestedLevel",};
5496 struct ParsedAttrInfoCountedBy final : public ParsedAttrInfo {
5497   constexpr ParsedAttrInfoCountedBy() : ParsedAttrInfo(
5498     /*AttrKind=*/ParsedAttr::AT_CountedBy,
5499     /*NumArgs=*/1,
5500     /*OptArgs=*/1,
5501     /*NumArgMembers=*/2,
5502     /*HasCustomParsing=*/0,
5503     /*AcceptsExprPack=*/0,
5504     /*IsTargetSpecific=*/0,
5505     /*IsType=*/1,
5506     /*IsStmt=*/0,
5507     /*IsKnownToGCC=*/0,
5508     /*IsSupportedByPragmaAttribute=*/0,
5509     /*Spellings=*/CountedBySpellings,
5510     /*ArgNames=*/CountedByArgNames) {}
5511 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5512   if (!isa<FieldDecl>(D)) {
5513     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
5514       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members";
5515     return false;
5516   }
5517   return true;
5518 }
5519 
5520 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5521   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5522     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5523   return false;
5524 }
5525 
5526 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5527   return (!LangOpts.CPlusPlus);
5528 }
5529 
5530 bool isParamExpr(size_t N) const override {
5531   return (N == 0) || false;
5532 }
5533 
5534 static const ParsedAttrInfoCountedBy Instance;
5535 };
5536 const ParsedAttrInfoCountedBy ParsedAttrInfoCountedBy::Instance;
5537 static constexpr ParsedAttrInfo::Spelling CountedByOrNullSpellings[] = {
5538   {AttributeCommonInfo::AS_GNU, "counted_by_or_null"},
5539   {AttributeCommonInfo::AS_CXX11, "clang::counted_by_or_null"},
5540   {AttributeCommonInfo::AS_C23, "clang::counted_by_or_null"},
5541 };
5542 static constexpr const char *CountedByOrNullArgNames[] = {
5543 "Count","NestedLevel",};
5544 struct ParsedAttrInfoCountedByOrNull final : public ParsedAttrInfo {
5545   constexpr ParsedAttrInfoCountedByOrNull() : ParsedAttrInfo(
5546     /*AttrKind=*/ParsedAttr::AT_CountedByOrNull,
5547     /*NumArgs=*/1,
5548     /*OptArgs=*/1,
5549     /*NumArgMembers=*/2,
5550     /*HasCustomParsing=*/0,
5551     /*AcceptsExprPack=*/0,
5552     /*IsTargetSpecific=*/0,
5553     /*IsType=*/1,
5554     /*IsStmt=*/0,
5555     /*IsKnownToGCC=*/0,
5556     /*IsSupportedByPragmaAttribute=*/0,
5557     /*Spellings=*/CountedByOrNullSpellings,
5558     /*ArgNames=*/CountedByOrNullArgNames) {}
5559 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5560   if (!isa<FieldDecl>(D)) {
5561     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
5562       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members";
5563     return false;
5564   }
5565   return true;
5566 }
5567 
5568 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5569   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5570     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5571   return false;
5572 }
5573 
5574 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
5575   return (!LangOpts.CPlusPlus);
5576 }
5577 
5578 bool isParamExpr(size_t N) const override {
5579   return (N == 0) || false;
5580 }
5581 
5582 static const ParsedAttrInfoCountedByOrNull Instance;
5583 };
5584 const ParsedAttrInfoCountedByOrNull ParsedAttrInfoCountedByOrNull::Instance;
5585 static constexpr ParsedAttrInfo::Spelling DLLExportSpellings[] = {
5586   {AttributeCommonInfo::AS_Declspec, "dllexport"},
5587   {AttributeCommonInfo::AS_GNU, "dllexport"},
5588   {AttributeCommonInfo::AS_CXX11, "gnu::dllexport"},
5589   {AttributeCommonInfo::AS_C23, "gnu::dllexport"},
5590 };
5591 struct ParsedAttrInfoDLLExport final : public ParsedAttrInfo {
5592   constexpr ParsedAttrInfoDLLExport() : ParsedAttrInfo(
5593     /*AttrKind=*/ParsedAttr::AT_DLLExport,
5594     /*NumArgs=*/0,
5595     /*OptArgs=*/0,
5596     /*NumArgMembers=*/0,
5597     /*HasCustomParsing=*/0,
5598     /*AcceptsExprPack=*/0,
5599     /*IsTargetSpecific=*/1,
5600     /*IsType=*/0,
5601     /*IsStmt=*/0,
5602     /*IsKnownToGCC=*/1,
5603     /*IsSupportedByPragmaAttribute=*/1,
5604     /*Spellings=*/DLLExportSpellings,
5605     /*ArgNames=*/{}) {}
5606 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5607   if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D) && !isa<CXXRecordDecl>(D) && !isa<ObjCInterfaceDecl>(D)) {
5608     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5609       << Attr << Attr.isRegularKeywordAttribute() << "functions, variables, classes, and Objective-C interfaces";
5610     return false;
5611   }
5612   return true;
5613 }
5614 
5615 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5616   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5617     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5618   return false;
5619 }
5620 
5621 bool existsInTarget(const TargetInfo &Target) const override {
5622   const llvm::Triple &T = Target.getTriple(); (void)T;
5623   return true && ( Target.getTriple().hasDLLImportExport() );
5624 }
5625 
5626 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5627   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5628   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
5629   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5630   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
5631 }
5632 
5633 bool isParamExpr(size_t N) const override {
5634   return false;
5635 }
5636 
5637 static const ParsedAttrInfoDLLExport Instance;
5638 };
5639 const ParsedAttrInfoDLLExport ParsedAttrInfoDLLExport::Instance;
5640 struct ParsedAttrInfoDLLExportStaticLocal final : public ParsedAttrInfo {
5641   constexpr ParsedAttrInfoDLLExportStaticLocal() : ParsedAttrInfo(
5642     /*AttrKind=*/ParsedAttr::AT_DLLExportStaticLocal,
5643     /*NumArgs=*/0,
5644     /*OptArgs=*/0,
5645     /*NumArgMembers=*/0,
5646     /*HasCustomParsing=*/0,
5647     /*AcceptsExprPack=*/0,
5648     /*IsTargetSpecific=*/1,
5649     /*IsType=*/0,
5650     /*IsStmt=*/0,
5651     /*IsKnownToGCC=*/0,
5652     /*IsSupportedByPragmaAttribute=*/0,
5653     /*Spellings=*/{},
5654     /*ArgNames=*/{}) {}
5655 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5656   if (!isa<FunctionDecl>(D)) {
5657     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5658       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5659     return false;
5660   }
5661   return true;
5662 }
5663 
5664 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5665   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5666     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5667   return false;
5668 }
5669 
5670 bool existsInTarget(const TargetInfo &Target) const override {
5671   const llvm::Triple &T = Target.getTriple(); (void)T;
5672   return true && ( Target.getTriple().hasDLLImportExport() );
5673 }
5674 
5675 bool isParamExpr(size_t N) const override {
5676   return false;
5677 }
5678 
5679 static const ParsedAttrInfoDLLExportStaticLocal Instance;
5680 };
5681 const ParsedAttrInfoDLLExportStaticLocal ParsedAttrInfoDLLExportStaticLocal::Instance;
5682 static constexpr ParsedAttrInfo::Spelling DLLImportSpellings[] = {
5683   {AttributeCommonInfo::AS_Declspec, "dllimport"},
5684   {AttributeCommonInfo::AS_GNU, "dllimport"},
5685   {AttributeCommonInfo::AS_CXX11, "gnu::dllimport"},
5686   {AttributeCommonInfo::AS_C23, "gnu::dllimport"},
5687 };
5688 struct ParsedAttrInfoDLLImport final : public ParsedAttrInfo {
5689   constexpr ParsedAttrInfoDLLImport() : ParsedAttrInfo(
5690     /*AttrKind=*/ParsedAttr::AT_DLLImport,
5691     /*NumArgs=*/0,
5692     /*OptArgs=*/0,
5693     /*NumArgMembers=*/0,
5694     /*HasCustomParsing=*/0,
5695     /*AcceptsExprPack=*/0,
5696     /*IsTargetSpecific=*/1,
5697     /*IsType=*/0,
5698     /*IsStmt=*/0,
5699     /*IsKnownToGCC=*/1,
5700     /*IsSupportedByPragmaAttribute=*/1,
5701     /*Spellings=*/DLLImportSpellings,
5702     /*ArgNames=*/{}) {}
5703 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5704   if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D) && !isa<CXXRecordDecl>(D) && !isa<ObjCInterfaceDecl>(D)) {
5705     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5706       << Attr << Attr.isRegularKeywordAttribute() << "functions, variables, classes, and Objective-C interfaces";
5707     return false;
5708   }
5709   return true;
5710 }
5711 
5712 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5713   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5714     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5715   return false;
5716 }
5717 
5718 bool existsInTarget(const TargetInfo &Target) const override {
5719   const llvm::Triple &T = Target.getTriple(); (void)T;
5720   return true && ( Target.getTriple().hasDLLImportExport() );
5721 }
5722 
5723 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5724   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5725   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
5726   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
5727   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
5728 }
5729 
5730 bool isParamExpr(size_t N) const override {
5731   return false;
5732 }
5733 
5734 static const ParsedAttrInfoDLLImport Instance;
5735 };
5736 const ParsedAttrInfoDLLImport ParsedAttrInfoDLLImport::Instance;
5737 struct ParsedAttrInfoDLLImportStaticLocal final : public ParsedAttrInfo {
5738   constexpr ParsedAttrInfoDLLImportStaticLocal() : ParsedAttrInfo(
5739     /*AttrKind=*/ParsedAttr::AT_DLLImportStaticLocal,
5740     /*NumArgs=*/0,
5741     /*OptArgs=*/0,
5742     /*NumArgMembers=*/0,
5743     /*HasCustomParsing=*/0,
5744     /*AcceptsExprPack=*/0,
5745     /*IsTargetSpecific=*/1,
5746     /*IsType=*/0,
5747     /*IsStmt=*/0,
5748     /*IsKnownToGCC=*/0,
5749     /*IsSupportedByPragmaAttribute=*/0,
5750     /*Spellings=*/{},
5751     /*ArgNames=*/{}) {}
5752 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5753   if (!isa<FunctionDecl>(D)) {
5754     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5755       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5756     return false;
5757   }
5758   return true;
5759 }
5760 
5761 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5762   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5763     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5764   return false;
5765 }
5766 
5767 bool existsInTarget(const TargetInfo &Target) const override {
5768   const llvm::Triple &T = Target.getTriple(); (void)T;
5769   return true && ( Target.getTriple().hasDLLImportExport() );
5770 }
5771 
5772 bool isParamExpr(size_t N) const override {
5773   return false;
5774 }
5775 
5776 static const ParsedAttrInfoDLLImportStaticLocal Instance;
5777 };
5778 const ParsedAttrInfoDLLImportStaticLocal ParsedAttrInfoDLLImportStaticLocal::Instance;
5779 static constexpr ParsedAttrInfo::Spelling DeprecatedSpellings[] = {
5780   {AttributeCommonInfo::AS_GNU, "deprecated"},
5781   {AttributeCommonInfo::AS_CXX11, "gnu::deprecated"},
5782   {AttributeCommonInfo::AS_C23, "gnu::deprecated"},
5783   {AttributeCommonInfo::AS_Declspec, "deprecated"},
5784   {AttributeCommonInfo::AS_CXX11, "deprecated"},
5785   {AttributeCommonInfo::AS_C23, "deprecated"},
5786 };
5787 static constexpr const char *DeprecatedArgNames[] = {
5788 "Message","Replacement",};
5789 struct ParsedAttrInfoDeprecated final : public ParsedAttrInfo {
5790   constexpr ParsedAttrInfoDeprecated() : ParsedAttrInfo(
5791     /*AttrKind=*/ParsedAttr::AT_Deprecated,
5792     /*NumArgs=*/0,
5793     /*OptArgs=*/2,
5794     /*NumArgMembers=*/2,
5795     /*HasCustomParsing=*/0,
5796     /*AcceptsExprPack=*/0,
5797     /*IsTargetSpecific=*/0,
5798     /*IsType=*/0,
5799     /*IsStmt=*/0,
5800     /*IsKnownToGCC=*/1,
5801     /*IsSupportedByPragmaAttribute=*/0,
5802     /*Spellings=*/DeprecatedSpellings,
5803     /*ArgNames=*/DeprecatedArgNames) {}
5804 bool isParamExpr(size_t N) const override {
5805   return false;
5806 }
5807 
5808 static const ParsedAttrInfoDeprecated Instance;
5809 };
5810 const ParsedAttrInfoDeprecated ParsedAttrInfoDeprecated::Instance;
5811 static constexpr ParsedAttrInfo::Spelling DestructorSpellings[] = {
5812   {AttributeCommonInfo::AS_GNU, "destructor"},
5813   {AttributeCommonInfo::AS_CXX11, "gnu::destructor"},
5814   {AttributeCommonInfo::AS_C23, "gnu::destructor"},
5815 };
5816 static constexpr const char *DestructorArgNames[] = {
5817 "Priority",};
5818 struct ParsedAttrInfoDestructor final : public ParsedAttrInfo {
5819   constexpr ParsedAttrInfoDestructor() : ParsedAttrInfo(
5820     /*AttrKind=*/ParsedAttr::AT_Destructor,
5821     /*NumArgs=*/0,
5822     /*OptArgs=*/1,
5823     /*NumArgMembers=*/1,
5824     /*HasCustomParsing=*/0,
5825     /*AcceptsExprPack=*/0,
5826     /*IsTargetSpecific=*/0,
5827     /*IsType=*/0,
5828     /*IsStmt=*/0,
5829     /*IsKnownToGCC=*/1,
5830     /*IsSupportedByPragmaAttribute=*/1,
5831     /*Spellings=*/DestructorSpellings,
5832     /*ArgNames=*/DestructorArgNames) {}
5833 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5834   if (!isa<FunctionDecl>(D)) {
5835     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5836       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5837     return false;
5838   }
5839   return true;
5840 }
5841 
5842 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5843   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5844     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5845   return false;
5846 }
5847 
5848 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5849   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5850 }
5851 
5852 bool isParamExpr(size_t N) const override {
5853   return false;
5854 }
5855 
5856 static const ParsedAttrInfoDestructor Instance;
5857 };
5858 const ParsedAttrInfoDestructor ParsedAttrInfoDestructor::Instance;
5859 static constexpr ParsedAttrInfo::Spelling DiagnoseAsBuiltinSpellings[] = {
5860   {AttributeCommonInfo::AS_GNU, "diagnose_as_builtin"},
5861   {AttributeCommonInfo::AS_CXX11, "clang::diagnose_as_builtin"},
5862   {AttributeCommonInfo::AS_C23, "clang::diagnose_as_builtin"},
5863 };
5864 static constexpr const char *DiagnoseAsBuiltinArgNames[] = {
5865 "Function","ArgIndices...",};
5866 struct ParsedAttrInfoDiagnoseAsBuiltin final : public ParsedAttrInfo {
5867   constexpr ParsedAttrInfoDiagnoseAsBuiltin() : ParsedAttrInfo(
5868     /*AttrKind=*/ParsedAttr::AT_DiagnoseAsBuiltin,
5869     /*NumArgs=*/1,
5870     /*OptArgs=*/15,
5871     /*NumArgMembers=*/2,
5872     /*HasCustomParsing=*/0,
5873     /*AcceptsExprPack=*/0,
5874     /*IsTargetSpecific=*/0,
5875     /*IsType=*/0,
5876     /*IsStmt=*/0,
5877     /*IsKnownToGCC=*/0,
5878     /*IsSupportedByPragmaAttribute=*/1,
5879     /*Spellings=*/DiagnoseAsBuiltinSpellings,
5880     /*ArgNames=*/DiagnoseAsBuiltinArgNames) {}
5881 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5882   if (!isa<FunctionDecl>(D)) {
5883     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5884       << Attr << Attr.isRegularKeywordAttribute() << "functions";
5885     return false;
5886   }
5887   return true;
5888 }
5889 
5890 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5891   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5892     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5893   return false;
5894 }
5895 
5896 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5897   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5898 }
5899 
5900 bool isParamExpr(size_t N) const override {
5901   return false;
5902 }
5903 
5904 static const ParsedAttrInfoDiagnoseAsBuiltin Instance;
5905 };
5906 const ParsedAttrInfoDiagnoseAsBuiltin ParsedAttrInfoDiagnoseAsBuiltin::Instance;
5907 static constexpr ParsedAttrInfo::Spelling DiagnoseIfSpellings[] = {
5908   {AttributeCommonInfo::AS_GNU, "diagnose_if"},
5909 };
5910 static constexpr const char *DiagnoseIfArgNames[] = {
5911 "Cond","Message","DefaultSeverity","WarningGroup",};
5912 struct ParsedAttrInfoDiagnoseIf final : public ParsedAttrInfo {
5913   constexpr ParsedAttrInfoDiagnoseIf() : ParsedAttrInfo(
5914     /*AttrKind=*/ParsedAttr::AT_DiagnoseIf,
5915     /*NumArgs=*/3,
5916     /*OptArgs=*/1,
5917     /*NumArgMembers=*/4,
5918     /*HasCustomParsing=*/0,
5919     /*AcceptsExprPack=*/0,
5920     /*IsTargetSpecific=*/0,
5921     /*IsType=*/0,
5922     /*IsStmt=*/0,
5923     /*IsKnownToGCC=*/0,
5924     /*IsSupportedByPragmaAttribute=*/0,
5925     /*Spellings=*/DiagnoseIfSpellings,
5926     /*ArgNames=*/DiagnoseIfArgNames) {}
5927 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5928   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D)) {
5929     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5930       << Attr << Attr.isRegularKeywordAttribute() << "functions, Objective-C methods, and Objective-C properties";
5931     return false;
5932   }
5933   return true;
5934 }
5935 
5936 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5937   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5938     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5939   return false;
5940 }
5941 
5942 bool isParamExpr(size_t N) const override {
5943   return (N == 0) || false;
5944 }
5945 
5946 static const ParsedAttrInfoDiagnoseIf Instance;
5947 };
5948 const ParsedAttrInfoDiagnoseIf ParsedAttrInfoDiagnoseIf::Instance;
5949 static constexpr ParsedAttrInfo::Spelling DisableSanitizerInstrumentationSpellings[] = {
5950   {AttributeCommonInfo::AS_GNU, "disable_sanitizer_instrumentation"},
5951   {AttributeCommonInfo::AS_CXX11, "clang::disable_sanitizer_instrumentation"},
5952   {AttributeCommonInfo::AS_C23, "clang::disable_sanitizer_instrumentation"},
5953 };
5954 struct ParsedAttrInfoDisableSanitizerInstrumentation final : public ParsedAttrInfo {
5955   constexpr ParsedAttrInfoDisableSanitizerInstrumentation() : ParsedAttrInfo(
5956     /*AttrKind=*/ParsedAttr::AT_DisableSanitizerInstrumentation,
5957     /*NumArgs=*/0,
5958     /*OptArgs=*/0,
5959     /*NumArgMembers=*/0,
5960     /*HasCustomParsing=*/0,
5961     /*AcceptsExprPack=*/0,
5962     /*IsTargetSpecific=*/0,
5963     /*IsType=*/0,
5964     /*IsStmt=*/0,
5965     /*IsKnownToGCC=*/0,
5966     /*IsSupportedByPragmaAttribute=*/1,
5967     /*Spellings=*/DisableSanitizerInstrumentationSpellings,
5968     /*ArgNames=*/{}) {}
5969 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
5970   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isGlobalVar(D)) {
5971     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
5972       << Attr << Attr.isRegularKeywordAttribute() << "functions, Objective-C methods, and global variables";
5973     return false;
5974   }
5975   return true;
5976 }
5977 
5978 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
5979   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
5980     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
5981   return false;
5982 }
5983 
5984 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
5985   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
5986   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
5987   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
5988 }
5989 
5990 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
5991   D->addAttr(::new (S.Context) DisableSanitizerInstrumentationAttr(S.Context, Attr));
5992   return AttributeApplied;
5993 }
5994 
5995 bool isParamExpr(size_t N) const override {
5996   return false;
5997 }
5998 
5999 static const ParsedAttrInfoDisableSanitizerInstrumentation Instance;
6000 };
6001 const ParsedAttrInfoDisableSanitizerInstrumentation ParsedAttrInfoDisableSanitizerInstrumentation::Instance;
6002 static constexpr ParsedAttrInfo::Spelling DisableTailCallsSpellings[] = {
6003   {AttributeCommonInfo::AS_GNU, "disable_tail_calls"},
6004   {AttributeCommonInfo::AS_CXX11, "clang::disable_tail_calls"},
6005   {AttributeCommonInfo::AS_C23, "clang::disable_tail_calls"},
6006 };
6007 struct ParsedAttrInfoDisableTailCalls final : public ParsedAttrInfo {
6008   constexpr ParsedAttrInfoDisableTailCalls() : ParsedAttrInfo(
6009     /*AttrKind=*/ParsedAttr::AT_DisableTailCalls,
6010     /*NumArgs=*/0,
6011     /*OptArgs=*/0,
6012     /*NumArgMembers=*/0,
6013     /*HasCustomParsing=*/0,
6014     /*AcceptsExprPack=*/0,
6015     /*IsTargetSpecific=*/0,
6016     /*IsType=*/0,
6017     /*IsStmt=*/0,
6018     /*IsKnownToGCC=*/0,
6019     /*IsSupportedByPragmaAttribute=*/1,
6020     /*Spellings=*/DisableTailCallsSpellings,
6021     /*ArgNames=*/{}) {}
6022 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6023   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
6024     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6025       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
6026     return false;
6027   }
6028   return true;
6029 }
6030 
6031 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6032   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6033     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6034   return false;
6035 }
6036 
6037   using ParsedAttrInfo::diagMutualExclusion;
6038 
6039   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
6040     if (const auto *A = D->getAttr<NakedAttr>()) {
6041       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
6042       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
6043 return false;
6044     }
6045     return true;
6046   }
6047 
6048 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6049   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6050   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
6051 }
6052 
6053 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
6054   D->addAttr(::new (S.Context) DisableTailCallsAttr(S.Context, Attr));
6055   return AttributeApplied;
6056 }
6057 
6058 bool isParamExpr(size_t N) const override {
6059   return false;
6060 }
6061 
6062 static const ParsedAttrInfoDisableTailCalls Instance;
6063 };
6064 const ParsedAttrInfoDisableTailCalls ParsedAttrInfoDisableTailCalls::Instance;
6065 static constexpr ParsedAttrInfo::Spelling EmptyBasesSpellings[] = {
6066   {AttributeCommonInfo::AS_Declspec, "empty_bases"},
6067 };
6068 struct ParsedAttrInfoEmptyBases final : public ParsedAttrInfo {
6069   constexpr ParsedAttrInfoEmptyBases() : ParsedAttrInfo(
6070     /*AttrKind=*/ParsedAttr::AT_EmptyBases,
6071     /*NumArgs=*/0,
6072     /*OptArgs=*/0,
6073     /*NumArgMembers=*/0,
6074     /*HasCustomParsing=*/0,
6075     /*AcceptsExprPack=*/0,
6076     /*IsTargetSpecific=*/1,
6077     /*IsType=*/0,
6078     /*IsStmt=*/0,
6079     /*IsKnownToGCC=*/0,
6080     /*IsSupportedByPragmaAttribute=*/0,
6081     /*Spellings=*/EmptyBasesSpellings,
6082     /*ArgNames=*/{}) {}
6083 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6084   if (!isa<CXXRecordDecl>(D)) {
6085     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6086       << Attr << Attr.isRegularKeywordAttribute() << "classes";
6087     return false;
6088   }
6089   return true;
6090 }
6091 
6092 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6093   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6094     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6095   return false;
6096 }
6097 
6098 bool existsInTarget(const TargetInfo &Target) const override {
6099   const llvm::Triple &T = Target.getTriple(); (void)T;
6100   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() );
6101 }
6102 
6103 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
6104   D->addAttr(::new (S.Context) EmptyBasesAttr(S.Context, Attr));
6105   return AttributeApplied;
6106 }
6107 
6108 bool isParamExpr(size_t N) const override {
6109   return false;
6110 }
6111 
6112 static const ParsedAttrInfoEmptyBases Instance;
6113 };
6114 const ParsedAttrInfoEmptyBases ParsedAttrInfoEmptyBases::Instance;
6115 static constexpr ParsedAttrInfo::Spelling EnableIfSpellings[] = {
6116   {AttributeCommonInfo::AS_GNU, "enable_if"},
6117 };
6118 static constexpr const char *EnableIfArgNames[] = {
6119 "Cond","Message",};
6120 struct ParsedAttrInfoEnableIf final : public ParsedAttrInfo {
6121   constexpr ParsedAttrInfoEnableIf() : ParsedAttrInfo(
6122     /*AttrKind=*/ParsedAttr::AT_EnableIf,
6123     /*NumArgs=*/2,
6124     /*OptArgs=*/0,
6125     /*NumArgMembers=*/2,
6126     /*HasCustomParsing=*/0,
6127     /*AcceptsExprPack=*/0,
6128     /*IsTargetSpecific=*/0,
6129     /*IsType=*/0,
6130     /*IsStmt=*/0,
6131     /*IsKnownToGCC=*/0,
6132     /*IsSupportedByPragmaAttribute=*/1,
6133     /*Spellings=*/EnableIfSpellings,
6134     /*ArgNames=*/EnableIfArgNames) {}
6135 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6136   if (!isa<FunctionDecl>(D)) {
6137     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6138       << Attr << Attr.isRegularKeywordAttribute() << "functions";
6139     return false;
6140   }
6141   return true;
6142 }
6143 
6144 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6145   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6146     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6147   return false;
6148 }
6149 
6150 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6151   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6152 }
6153 
6154 bool isParamExpr(size_t N) const override {
6155   return (N == 0) || false;
6156 }
6157 
6158 static const ParsedAttrInfoEnableIf Instance;
6159 };
6160 const ParsedAttrInfoEnableIf ParsedAttrInfoEnableIf::Instance;
6161 static constexpr ParsedAttrInfo::Spelling EnforceTCBSpellings[] = {
6162   {AttributeCommonInfo::AS_GNU, "enforce_tcb"},
6163   {AttributeCommonInfo::AS_CXX11, "clang::enforce_tcb"},
6164   {AttributeCommonInfo::AS_C23, "clang::enforce_tcb"},
6165 };
6166 static constexpr const char *EnforceTCBArgNames[] = {
6167 "TCBName",};
6168 struct ParsedAttrInfoEnforceTCB final : public ParsedAttrInfo {
6169   constexpr ParsedAttrInfoEnforceTCB() : ParsedAttrInfo(
6170     /*AttrKind=*/ParsedAttr::AT_EnforceTCB,
6171     /*NumArgs=*/1,
6172     /*OptArgs=*/0,
6173     /*NumArgMembers=*/1,
6174     /*HasCustomParsing=*/0,
6175     /*AcceptsExprPack=*/0,
6176     /*IsTargetSpecific=*/0,
6177     /*IsType=*/0,
6178     /*IsStmt=*/0,
6179     /*IsKnownToGCC=*/0,
6180     /*IsSupportedByPragmaAttribute=*/1,
6181     /*Spellings=*/EnforceTCBSpellings,
6182     /*ArgNames=*/EnforceTCBArgNames) {}
6183 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6184   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
6185     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6186       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
6187     return false;
6188   }
6189   return true;
6190 }
6191 
6192 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6193   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6194     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6195   return false;
6196 }
6197 
6198 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6199   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6200   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
6201 }
6202 
6203 bool isParamExpr(size_t N) const override {
6204   return false;
6205 }
6206 
6207 static const ParsedAttrInfoEnforceTCB Instance;
6208 };
6209 const ParsedAttrInfoEnforceTCB ParsedAttrInfoEnforceTCB::Instance;
6210 static constexpr ParsedAttrInfo::Spelling EnforceTCBLeafSpellings[] = {
6211   {AttributeCommonInfo::AS_GNU, "enforce_tcb_leaf"},
6212   {AttributeCommonInfo::AS_CXX11, "clang::enforce_tcb_leaf"},
6213   {AttributeCommonInfo::AS_C23, "clang::enforce_tcb_leaf"},
6214 };
6215 static constexpr const char *EnforceTCBLeafArgNames[] = {
6216 "TCBName",};
6217 struct ParsedAttrInfoEnforceTCBLeaf final : public ParsedAttrInfo {
6218   constexpr ParsedAttrInfoEnforceTCBLeaf() : ParsedAttrInfo(
6219     /*AttrKind=*/ParsedAttr::AT_EnforceTCBLeaf,
6220     /*NumArgs=*/1,
6221     /*OptArgs=*/0,
6222     /*NumArgMembers=*/1,
6223     /*HasCustomParsing=*/0,
6224     /*AcceptsExprPack=*/0,
6225     /*IsTargetSpecific=*/0,
6226     /*IsType=*/0,
6227     /*IsStmt=*/0,
6228     /*IsKnownToGCC=*/0,
6229     /*IsSupportedByPragmaAttribute=*/1,
6230     /*Spellings=*/EnforceTCBLeafSpellings,
6231     /*ArgNames=*/EnforceTCBLeafArgNames) {}
6232 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6233   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
6234     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6235       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
6236     return false;
6237   }
6238   return true;
6239 }
6240 
6241 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6242   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6243     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6244   return false;
6245 }
6246 
6247 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6248   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6249   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
6250 }
6251 
6252 bool isParamExpr(size_t N) const override {
6253   return false;
6254 }
6255 
6256 static const ParsedAttrInfoEnforceTCBLeaf Instance;
6257 };
6258 const ParsedAttrInfoEnforceTCBLeaf ParsedAttrInfoEnforceTCBLeaf::Instance;
6259 static constexpr ParsedAttrInfo::Spelling EnumExtensibilitySpellings[] = {
6260   {AttributeCommonInfo::AS_GNU, "enum_extensibility"},
6261   {AttributeCommonInfo::AS_CXX11, "clang::enum_extensibility"},
6262   {AttributeCommonInfo::AS_C23, "clang::enum_extensibility"},
6263 };
6264 static constexpr const char *EnumExtensibilityArgNames[] = {
6265 "Extensibility",};
6266 struct ParsedAttrInfoEnumExtensibility final : public ParsedAttrInfo {
6267   constexpr ParsedAttrInfoEnumExtensibility() : ParsedAttrInfo(
6268     /*AttrKind=*/ParsedAttr::AT_EnumExtensibility,
6269     /*NumArgs=*/1,
6270     /*OptArgs=*/0,
6271     /*NumArgMembers=*/1,
6272     /*HasCustomParsing=*/0,
6273     /*AcceptsExprPack=*/0,
6274     /*IsTargetSpecific=*/0,
6275     /*IsType=*/0,
6276     /*IsStmt=*/0,
6277     /*IsKnownToGCC=*/0,
6278     /*IsSupportedByPragmaAttribute=*/1,
6279     /*Spellings=*/EnumExtensibilitySpellings,
6280     /*ArgNames=*/EnumExtensibilityArgNames) {}
6281 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6282   if (!isa<EnumDecl>(D)) {
6283     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6284       << Attr << Attr.isRegularKeywordAttribute() << "enums";
6285     return false;
6286   }
6287   return true;
6288 }
6289 
6290 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6291   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6292     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6293   return false;
6294 }
6295 
6296 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6297   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
6298 }
6299 
6300 bool isParamExpr(size_t N) const override {
6301   return false;
6302 }
6303 
6304 static const ParsedAttrInfoEnumExtensibility Instance;
6305 };
6306 const ParsedAttrInfoEnumExtensibility ParsedAttrInfoEnumExtensibility::Instance;
6307 static constexpr ParsedAttrInfo::Spelling ErrorSpellings[] = {
6308   {AttributeCommonInfo::AS_GNU, "error"},
6309   {AttributeCommonInfo::AS_CXX11, "gnu::error"},
6310   {AttributeCommonInfo::AS_C23, "gnu::error"},
6311   {AttributeCommonInfo::AS_GNU, "warning"},
6312   {AttributeCommonInfo::AS_CXX11, "gnu::warning"},
6313   {AttributeCommonInfo::AS_C23, "gnu::warning"},
6314 };
6315 static constexpr const char *ErrorArgNames[] = {
6316 "UserDiagnostic",};
6317 struct ParsedAttrInfoError final : public ParsedAttrInfo {
6318   constexpr ParsedAttrInfoError() : ParsedAttrInfo(
6319     /*AttrKind=*/ParsedAttr::AT_Error,
6320     /*NumArgs=*/1,
6321     /*OptArgs=*/0,
6322     /*NumArgMembers=*/1,
6323     /*HasCustomParsing=*/0,
6324     /*AcceptsExprPack=*/0,
6325     /*IsTargetSpecific=*/0,
6326     /*IsType=*/0,
6327     /*IsStmt=*/0,
6328     /*IsKnownToGCC=*/1,
6329     /*IsSupportedByPragmaAttribute=*/1,
6330     /*Spellings=*/ErrorSpellings,
6331     /*ArgNames=*/ErrorArgNames) {}
6332 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6333   if (!isa<FunctionDecl>(D)) {
6334     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
6335       << Attr << Attr.isRegularKeywordAttribute() << "functions";
6336     return false;
6337   }
6338   return true;
6339 }
6340 
6341 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6342   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6343     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6344   return false;
6345 }
6346 
6347 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
6348   enum Spelling {
6349     GNU_error = 0,
6350     CXX11_gnu_error = 1,
6351     C23_gnu_error = 2,
6352     GNU_warning = 3,
6353     CXX11_gnu_warning = 4,
6354     C23_gnu_warning = 5,
6355   SpellingNotCalculated = 15
6356 
6357   };
6358 
6359   unsigned Idx = Attr.getAttributeSpellingListIndex();
6360   switch (Idx) {
6361     default: llvm_unreachable("Unknown spelling list index");
6362     case 0: return GNU_error;
6363     case 1: return CXX11_gnu_error;
6364     case 2: return C23_gnu_error;
6365     case 3: return GNU_warning;
6366     case 4: return CXX11_gnu_warning;
6367     case 5: return C23_gnu_warning;
6368   }
6369 }
6370 
6371 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6372   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6373 }
6374 
6375 bool isParamExpr(size_t N) const override {
6376   return false;
6377 }
6378 
6379 static const ParsedAttrInfoError Instance;
6380 };
6381 const ParsedAttrInfoError ParsedAttrInfoError::Instance;
6382 static constexpr ParsedAttrInfo::Spelling ExcludeFromExplicitInstantiationSpellings[] = {
6383   {AttributeCommonInfo::AS_GNU, "exclude_from_explicit_instantiation"},
6384   {AttributeCommonInfo::AS_CXX11, "clang::exclude_from_explicit_instantiation"},
6385   {AttributeCommonInfo::AS_C23, "clang::exclude_from_explicit_instantiation"},
6386 };
6387 struct ParsedAttrInfoExcludeFromExplicitInstantiation final : public ParsedAttrInfo {
6388   constexpr ParsedAttrInfoExcludeFromExplicitInstantiation() : ParsedAttrInfo(
6389     /*AttrKind=*/ParsedAttr::AT_ExcludeFromExplicitInstantiation,
6390     /*NumArgs=*/0,
6391     /*OptArgs=*/0,
6392     /*NumArgMembers=*/0,
6393     /*HasCustomParsing=*/0,
6394     /*AcceptsExprPack=*/0,
6395     /*IsTargetSpecific=*/0,
6396     /*IsType=*/0,
6397     /*IsStmt=*/0,
6398     /*IsKnownToGCC=*/0,
6399     /*IsSupportedByPragmaAttribute=*/1,
6400     /*Spellings=*/ExcludeFromExplicitInstantiationSpellings,
6401     /*ArgNames=*/{}) {}
6402 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6403   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) {
6404     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6405       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, and classes";
6406     return false;
6407   }
6408   return true;
6409 }
6410 
6411 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6412   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6413     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6414   return false;
6415 }
6416 
6417 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6418   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
6419   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6420   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
6421 }
6422 
6423 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
6424   D->addAttr(::new (S.Context) ExcludeFromExplicitInstantiationAttr(S.Context, Attr));
6425   return AttributeApplied;
6426 }
6427 
6428 bool isParamExpr(size_t N) const override {
6429   return false;
6430 }
6431 
6432 static const ParsedAttrInfoExcludeFromExplicitInstantiation Instance;
6433 };
6434 const ParsedAttrInfoExcludeFromExplicitInstantiation ParsedAttrInfoExcludeFromExplicitInstantiation::Instance;
6435 static constexpr ParsedAttrInfo::Spelling ExclusiveTrylockFunctionSpellings[] = {
6436   {AttributeCommonInfo::AS_GNU, "exclusive_trylock_function"},
6437 };
6438 static constexpr const char *ExclusiveTrylockFunctionArgNames[] = {
6439 "SuccessValue","Args...",};
6440 struct ParsedAttrInfoExclusiveTrylockFunction final : public ParsedAttrInfo {
6441   constexpr ParsedAttrInfoExclusiveTrylockFunction() : ParsedAttrInfo(
6442     /*AttrKind=*/ParsedAttr::AT_ExclusiveTrylockFunction,
6443     /*NumArgs=*/1,
6444     /*OptArgs=*/15,
6445     /*NumArgMembers=*/2,
6446     /*HasCustomParsing=*/0,
6447     /*AcceptsExprPack=*/0,
6448     /*IsTargetSpecific=*/0,
6449     /*IsType=*/0,
6450     /*IsStmt=*/0,
6451     /*IsKnownToGCC=*/0,
6452     /*IsSupportedByPragmaAttribute=*/0,
6453     /*Spellings=*/ExclusiveTrylockFunctionSpellings,
6454     /*ArgNames=*/ExclusiveTrylockFunctionArgNames) {}
6455 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6456   if (!isa<FunctionDecl>(D)) {
6457     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6458       << Attr << Attr.isRegularKeywordAttribute() << "functions";
6459     return false;
6460   }
6461   return true;
6462 }
6463 
6464 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6465   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6466     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6467   return false;
6468 }
6469 
6470 bool isParamExpr(size_t N) const override {
6471   return (N == 0) || (N == 1) || false;
6472 }
6473 
6474 static const ParsedAttrInfoExclusiveTrylockFunction Instance;
6475 };
6476 const ParsedAttrInfoExclusiveTrylockFunction ParsedAttrInfoExclusiveTrylockFunction::Instance;
6477 static constexpr ParsedAttrInfo::Spelling ExplicitInitSpellings[] = {
6478   {AttributeCommonInfo::AS_GNU, "require_explicit_initialization"},
6479   {AttributeCommonInfo::AS_CXX11, "clang::require_explicit_initialization"},
6480   {AttributeCommonInfo::AS_C23, "clang::require_explicit_initialization"},
6481 };
6482 struct ParsedAttrInfoExplicitInit final : public ParsedAttrInfo {
6483   constexpr ParsedAttrInfoExplicitInit() : ParsedAttrInfo(
6484     /*AttrKind=*/ParsedAttr::AT_ExplicitInit,
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=*/0,
6494     /*IsSupportedByPragmaAttribute=*/1,
6495     /*Spellings=*/ExplicitInitSpellings,
6496     /*ArgNames=*/{}) {}
6497 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6498   if (!isa<FieldDecl>(D)) {
6499     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
6500       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members";
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 << AL.isRegularKeywordAttribute() << 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_field, /*IsSupported=*/true));
6514 }
6515 
6516 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
6517   D->addAttr(::new (S.Context) ExplicitInitAttr(S.Context, Attr));
6518   return AttributeApplied;
6519 }
6520 
6521 bool isParamExpr(size_t N) const override {
6522   return false;
6523 }
6524 
6525 static const ParsedAttrInfoExplicitInit Instance;
6526 };
6527 const ParsedAttrInfoExplicitInit ParsedAttrInfoExplicitInit::Instance;
6528 static constexpr ParsedAttrInfo::Spelling ExtVectorTypeSpellings[] = {
6529   {AttributeCommonInfo::AS_GNU, "ext_vector_type"},
6530 };
6531 static constexpr const char *ExtVectorTypeArgNames[] = {
6532 "NumElements",};
6533 struct ParsedAttrInfoExtVectorType final : public ParsedAttrInfo {
6534   constexpr ParsedAttrInfoExtVectorType() : ParsedAttrInfo(
6535     /*AttrKind=*/ParsedAttr::AT_ExtVectorType,
6536     /*NumArgs=*/1,
6537     /*OptArgs=*/0,
6538     /*NumArgMembers=*/1,
6539     /*HasCustomParsing=*/0,
6540     /*AcceptsExprPack=*/0,
6541     /*IsTargetSpecific=*/0,
6542     /*IsType=*/0,
6543     /*IsStmt=*/0,
6544     /*IsKnownToGCC=*/0,
6545     /*IsSupportedByPragmaAttribute=*/0,
6546     /*Spellings=*/ExtVectorTypeSpellings,
6547     /*ArgNames=*/ExtVectorTypeArgNames) {}
6548 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6549   if (!isa<TypedefNameDecl>(D)) {
6550     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
6551       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
6552     return false;
6553   }
6554   return true;
6555 }
6556 
6557 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6558   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6559     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6560   return false;
6561 }
6562 
6563 bool isParamExpr(size_t N) const override {
6564   return (N == 0) || false;
6565 }
6566 
6567 static const ParsedAttrInfoExtVectorType Instance;
6568 };
6569 const ParsedAttrInfoExtVectorType ParsedAttrInfoExtVectorType::Instance;
6570 static constexpr ParsedAttrInfo::Spelling ExternalSourceSymbolSpellings[] = {
6571   {AttributeCommonInfo::AS_GNU, "external_source_symbol"},
6572   {AttributeCommonInfo::AS_CXX11, "clang::external_source_symbol"},
6573   {AttributeCommonInfo::AS_C23, "clang::external_source_symbol"},
6574 };
6575 static constexpr const char *ExternalSourceSymbolArgNames[] = {
6576 "language","definedIn","generatedDeclaration","USR",};
6577 struct ParsedAttrInfoExternalSourceSymbol final : public ParsedAttrInfo {
6578   constexpr ParsedAttrInfoExternalSourceSymbol() : ParsedAttrInfo(
6579     /*AttrKind=*/ParsedAttr::AT_ExternalSourceSymbol,
6580     /*NumArgs=*/0,
6581     /*OptArgs=*/4,
6582     /*NumArgMembers=*/4,
6583     /*HasCustomParsing=*/1,
6584     /*AcceptsExprPack=*/0,
6585     /*IsTargetSpecific=*/0,
6586     /*IsType=*/0,
6587     /*IsStmt=*/0,
6588     /*IsKnownToGCC=*/0,
6589     /*IsSupportedByPragmaAttribute=*/1,
6590     /*Spellings=*/ExternalSourceSymbolSpellings,
6591     /*ArgNames=*/ExternalSourceSymbolArgNames) {}
6592 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6593   if (!isa<NamedDecl>(D)) {
6594     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6595       << Attr << Attr.isRegularKeywordAttribute() << "named declarations";
6596     return false;
6597   }
6598   return true;
6599 }
6600 
6601 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6602   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6603     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6604   return false;
6605 }
6606 
6607 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6608   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
6609   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
6610   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum_constant, /*IsSupported=*/true));
6611   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true));
6612   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6613   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_namespace, /*IsSupported=*/LangOpts.CPlusPlus));
6614   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC));
6615   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC));
6616   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
6617   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
6618   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC));
6619   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC));
6620   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
6621   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
6622   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
6623 }
6624 
6625 bool isParamExpr(size_t N) const override {
6626   return false;
6627 }
6628 
6629 static const ParsedAttrInfoExternalSourceSymbol Instance;
6630 };
6631 const ParsedAttrInfoExternalSourceSymbol ParsedAttrInfoExternalSourceSymbol::Instance;
6632 static constexpr ParsedAttrInfo::Spelling FallThroughSpellings[] = {
6633   {AttributeCommonInfo::AS_CXX11, "fallthrough"},
6634   {AttributeCommonInfo::AS_C23, "fallthrough"},
6635   {AttributeCommonInfo::AS_CXX11, "clang::fallthrough"},
6636   {AttributeCommonInfo::AS_GNU, "fallthrough"},
6637   {AttributeCommonInfo::AS_CXX11, "gnu::fallthrough"},
6638   {AttributeCommonInfo::AS_C23, "gnu::fallthrough"},
6639 };
6640 struct ParsedAttrInfoFallThrough final : public ParsedAttrInfo {
6641   constexpr ParsedAttrInfoFallThrough() : ParsedAttrInfo(
6642     /*AttrKind=*/ParsedAttr::AT_FallThrough,
6643     /*NumArgs=*/0,
6644     /*OptArgs=*/0,
6645     /*NumArgMembers=*/0,
6646     /*HasCustomParsing=*/0,
6647     /*AcceptsExprPack=*/0,
6648     /*IsTargetSpecific=*/0,
6649     /*IsType=*/0,
6650     /*IsStmt=*/1,
6651     /*IsKnownToGCC=*/1,
6652     /*IsSupportedByPragmaAttribute=*/0,
6653     /*Spellings=*/FallThroughSpellings,
6654     /*ArgNames=*/{}) {}
6655 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
6656   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
6657     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
6658   return false;
6659 }
6660 
6661 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
6662   if (!isa<NullStmt>(St) && !isa<SwitchCase>(St)) {
6663     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
6664       << Attr << Attr.isRegularKeywordAttribute() << "empty statements";
6665     return false;
6666   }
6667   return true;
6668 }
6669 
6670 bool isParamExpr(size_t N) const override {
6671   return false;
6672 }
6673 
6674 static const ParsedAttrInfoFallThrough Instance;
6675 };
6676 const ParsedAttrInfoFallThrough ParsedAttrInfoFallThrough::Instance;
6677 static constexpr ParsedAttrInfo::Spelling FastCallSpellings[] = {
6678   {AttributeCommonInfo::AS_GNU, "fastcall"},
6679   {AttributeCommonInfo::AS_CXX11, "gnu::fastcall"},
6680   {AttributeCommonInfo::AS_C23, "gnu::fastcall"},
6681   {AttributeCommonInfo::AS_Keyword, "__fastcall"},
6682   {AttributeCommonInfo::AS_Keyword, "_fastcall"},
6683 };
6684 struct ParsedAttrInfoFastCall final : public ParsedAttrInfo {
6685   constexpr ParsedAttrInfoFastCall() : ParsedAttrInfo(
6686     /*AttrKind=*/ParsedAttr::AT_FastCall,
6687     /*NumArgs=*/0,
6688     /*OptArgs=*/0,
6689     /*NumArgMembers=*/0,
6690     /*HasCustomParsing=*/0,
6691     /*AcceptsExprPack=*/0,
6692     /*IsTargetSpecific=*/0,
6693     /*IsType=*/1,
6694     /*IsStmt=*/0,
6695     /*IsKnownToGCC=*/1,
6696     /*IsSupportedByPragmaAttribute=*/0,
6697     /*Spellings=*/FastCallSpellings,
6698     /*ArgNames=*/{}) {}
6699 bool isParamExpr(size_t N) const override {
6700   return false;
6701 }
6702 
6703 static const ParsedAttrInfoFastCall Instance;
6704 };
6705 const ParsedAttrInfoFastCall ParsedAttrInfoFastCall::Instance;
6706 static constexpr ParsedAttrInfo::Spelling FlagEnumSpellings[] = {
6707   {AttributeCommonInfo::AS_GNU, "flag_enum"},
6708   {AttributeCommonInfo::AS_CXX11, "clang::flag_enum"},
6709   {AttributeCommonInfo::AS_C23, "clang::flag_enum"},
6710 };
6711 struct ParsedAttrInfoFlagEnum final : public ParsedAttrInfo {
6712   constexpr ParsedAttrInfoFlagEnum() : ParsedAttrInfo(
6713     /*AttrKind=*/ParsedAttr::AT_FlagEnum,
6714     /*NumArgs=*/0,
6715     /*OptArgs=*/0,
6716     /*NumArgMembers=*/0,
6717     /*HasCustomParsing=*/0,
6718     /*AcceptsExprPack=*/0,
6719     /*IsTargetSpecific=*/0,
6720     /*IsType=*/0,
6721     /*IsStmt=*/0,
6722     /*IsKnownToGCC=*/0,
6723     /*IsSupportedByPragmaAttribute=*/1,
6724     /*Spellings=*/FlagEnumSpellings,
6725     /*ArgNames=*/{}) {}
6726 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6727   if (!isa<EnumDecl>(D)) {
6728     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6729       << Attr << Attr.isRegularKeywordAttribute() << "enums";
6730     return false;
6731   }
6732   return true;
6733 }
6734 
6735 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6736   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6737     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6738   return false;
6739 }
6740 
6741 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6742   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
6743 }
6744 
6745 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
6746   D->addAttr(::new (S.Context) FlagEnumAttr(S.Context, Attr));
6747   return AttributeApplied;
6748 }
6749 
6750 bool isParamExpr(size_t N) const override {
6751   return false;
6752 }
6753 
6754 static const ParsedAttrInfoFlagEnum Instance;
6755 };
6756 const ParsedAttrInfoFlagEnum ParsedAttrInfoFlagEnum::Instance;
6757 static constexpr ParsedAttrInfo::Spelling FlattenSpellings[] = {
6758   {AttributeCommonInfo::AS_GNU, "flatten"},
6759   {AttributeCommonInfo::AS_CXX11, "gnu::flatten"},
6760   {AttributeCommonInfo::AS_C23, "gnu::flatten"},
6761 };
6762 struct ParsedAttrInfoFlatten final : public ParsedAttrInfo {
6763   constexpr ParsedAttrInfoFlatten() : ParsedAttrInfo(
6764     /*AttrKind=*/ParsedAttr::AT_Flatten,
6765     /*NumArgs=*/0,
6766     /*OptArgs=*/0,
6767     /*NumArgMembers=*/0,
6768     /*HasCustomParsing=*/0,
6769     /*AcceptsExprPack=*/0,
6770     /*IsTargetSpecific=*/0,
6771     /*IsType=*/0,
6772     /*IsStmt=*/0,
6773     /*IsKnownToGCC=*/1,
6774     /*IsSupportedByPragmaAttribute=*/1,
6775     /*Spellings=*/FlattenSpellings,
6776     /*ArgNames=*/{}) {}
6777 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6778   if (!isa<FunctionDecl>(D)) {
6779     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
6780       << Attr << Attr.isRegularKeywordAttribute() << "functions";
6781     return false;
6782   }
6783   return true;
6784 }
6785 
6786 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6787   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6788     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6789   return false;
6790 }
6791 
6792 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6793   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6794 }
6795 
6796 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
6797   D->addAttr(::new (S.Context) FlattenAttr(S.Context, Attr));
6798   return AttributeApplied;
6799 }
6800 
6801 bool isParamExpr(size_t N) const override {
6802   return false;
6803 }
6804 
6805 static const ParsedAttrInfoFlatten Instance;
6806 };
6807 const ParsedAttrInfoFlatten ParsedAttrInfoFlatten::Instance;
6808 static constexpr ParsedAttrInfo::Spelling FormatSpellings[] = {
6809   {AttributeCommonInfo::AS_GNU, "format"},
6810   {AttributeCommonInfo::AS_CXX11, "gnu::format"},
6811   {AttributeCommonInfo::AS_C23, "gnu::format"},
6812 };
6813 static constexpr const char *FormatArgNames[] = {
6814 "Type","FormatIdx","FirstArg",};
6815 struct ParsedAttrInfoFormat final : public ParsedAttrInfo {
6816   constexpr ParsedAttrInfoFormat() : ParsedAttrInfo(
6817     /*AttrKind=*/ParsedAttr::AT_Format,
6818     /*NumArgs=*/3,
6819     /*OptArgs=*/0,
6820     /*NumArgMembers=*/3,
6821     /*HasCustomParsing=*/0,
6822     /*AcceptsExprPack=*/0,
6823     /*IsTargetSpecific=*/0,
6824     /*IsType=*/0,
6825     /*IsStmt=*/0,
6826     /*IsKnownToGCC=*/1,
6827     /*IsSupportedByPragmaAttribute=*/0,
6828     /*Spellings=*/FormatSpellings,
6829     /*ArgNames=*/FormatArgNames) {}
6830 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6831   if (!isa<ObjCMethodDecl>(D) && !isa<BlockDecl>(D) && !isHasFunctionProto(D)) {
6832     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6833       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods, blocks, and non-K&R-style functions";
6834     return false;
6835   }
6836   return true;
6837 }
6838 
6839 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6840   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6841     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6842   return false;
6843 }
6844 
6845 bool isParamExpr(size_t N) const override {
6846   return false;
6847 }
6848 
6849 static const ParsedAttrInfoFormat Instance;
6850 };
6851 const ParsedAttrInfoFormat ParsedAttrInfoFormat::Instance;
6852 static constexpr ParsedAttrInfo::Spelling FormatArgSpellings[] = {
6853   {AttributeCommonInfo::AS_GNU, "format_arg"},
6854   {AttributeCommonInfo::AS_CXX11, "gnu::format_arg"},
6855   {AttributeCommonInfo::AS_C23, "gnu::format_arg"},
6856 };
6857 static constexpr const char *FormatArgArgNames[] = {
6858 "FormatIdx",};
6859 struct ParsedAttrInfoFormatArg final : public ParsedAttrInfo {
6860   constexpr ParsedAttrInfoFormatArg() : ParsedAttrInfo(
6861     /*AttrKind=*/ParsedAttr::AT_FormatArg,
6862     /*NumArgs=*/1,
6863     /*OptArgs=*/0,
6864     /*NumArgMembers=*/1,
6865     /*HasCustomParsing=*/0,
6866     /*AcceptsExprPack=*/0,
6867     /*IsTargetSpecific=*/0,
6868     /*IsType=*/0,
6869     /*IsStmt=*/0,
6870     /*IsKnownToGCC=*/1,
6871     /*IsSupportedByPragmaAttribute=*/0,
6872     /*Spellings=*/FormatArgSpellings,
6873     /*ArgNames=*/FormatArgArgNames) {}
6874 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6875   if (!isa<ObjCMethodDecl>(D) && !isHasFunctionProto(D)) {
6876     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6877       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods and non-K&R-style functions";
6878     return false;
6879   }
6880   return true;
6881 }
6882 
6883 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6884   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6885     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6886   return false;
6887 }
6888 
6889 bool isParamExpr(size_t N) const override {
6890   return false;
6891 }
6892 
6893 static const ParsedAttrInfoFormatArg Instance;
6894 };
6895 const ParsedAttrInfoFormatArg ParsedAttrInfoFormatArg::Instance;
6896 static constexpr ParsedAttrInfo::Spelling FunctionReturnThunksSpellings[] = {
6897   {AttributeCommonInfo::AS_GNU, "function_return"},
6898   {AttributeCommonInfo::AS_CXX11, "gnu::function_return"},
6899   {AttributeCommonInfo::AS_C23, "gnu::function_return"},
6900 };
6901 static constexpr const char *FunctionReturnThunksArgNames[] = {
6902 "ThunkType",};
6903 struct ParsedAttrInfoFunctionReturnThunks final : public ParsedAttrInfo {
6904   constexpr ParsedAttrInfoFunctionReturnThunks() : ParsedAttrInfo(
6905     /*AttrKind=*/ParsedAttr::AT_FunctionReturnThunks,
6906     /*NumArgs=*/1,
6907     /*OptArgs=*/0,
6908     /*NumArgMembers=*/1,
6909     /*HasCustomParsing=*/0,
6910     /*AcceptsExprPack=*/0,
6911     /*IsTargetSpecific=*/1,
6912     /*IsType=*/0,
6913     /*IsStmt=*/0,
6914     /*IsKnownToGCC=*/1,
6915     /*IsSupportedByPragmaAttribute=*/1,
6916     /*Spellings=*/FunctionReturnThunksSpellings,
6917     /*ArgNames=*/FunctionReturnThunksArgNames) {}
6918 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6919   if (!isa<FunctionDecl>(D)) {
6920     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6921       << Attr << Attr.isRegularKeywordAttribute() << "functions";
6922     return false;
6923   }
6924   return true;
6925 }
6926 
6927 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6928   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6929     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6930   return false;
6931 }
6932 
6933 bool existsInTarget(const TargetInfo &Target) const override {
6934   const llvm::Triple &T = Target.getTriple(); (void)T;
6935   return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64);
6936 }
6937 
6938 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6939   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6940 }
6941 
6942 bool isParamExpr(size_t N) const override {
6943   return false;
6944 }
6945 
6946 static const ParsedAttrInfoFunctionReturnThunks Instance;
6947 };
6948 const ParsedAttrInfoFunctionReturnThunks ParsedAttrInfoFunctionReturnThunks::Instance;
6949 static constexpr ParsedAttrInfo::Spelling GNUInlineSpellings[] = {
6950   {AttributeCommonInfo::AS_GNU, "gnu_inline"},
6951   {AttributeCommonInfo::AS_CXX11, "gnu::gnu_inline"},
6952   {AttributeCommonInfo::AS_C23, "gnu::gnu_inline"},
6953 };
6954 struct ParsedAttrInfoGNUInline final : public ParsedAttrInfo {
6955   constexpr ParsedAttrInfoGNUInline() : ParsedAttrInfo(
6956     /*AttrKind=*/ParsedAttr::AT_GNUInline,
6957     /*NumArgs=*/0,
6958     /*OptArgs=*/0,
6959     /*NumArgMembers=*/0,
6960     /*HasCustomParsing=*/0,
6961     /*AcceptsExprPack=*/0,
6962     /*IsTargetSpecific=*/0,
6963     /*IsType=*/0,
6964     /*IsStmt=*/0,
6965     /*IsKnownToGCC=*/1,
6966     /*IsSupportedByPragmaAttribute=*/1,
6967     /*Spellings=*/GNUInlineSpellings,
6968     /*ArgNames=*/{}) {}
6969 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
6970   if (!isa<FunctionDecl>(D)) {
6971     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
6972       << Attr << Attr.isRegularKeywordAttribute() << "functions";
6973     return false;
6974   }
6975   return true;
6976 }
6977 
6978 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
6979   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
6980     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
6981   return false;
6982 }
6983 
6984 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
6985   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
6986 }
6987 
6988 bool isParamExpr(size_t N) const override {
6989   return false;
6990 }
6991 
6992 static const ParsedAttrInfoGNUInline Instance;
6993 };
6994 const ParsedAttrInfoGNUInline ParsedAttrInfoGNUInline::Instance;
6995 static constexpr ParsedAttrInfo::Spelling GuardedBySpellings[] = {
6996   {AttributeCommonInfo::AS_GNU, "guarded_by"},
6997 };
6998 static constexpr const char *GuardedByArgNames[] = {
6999 "Arg",};
7000 struct ParsedAttrInfoGuardedBy final : public ParsedAttrInfo {
7001   constexpr ParsedAttrInfoGuardedBy() : ParsedAttrInfo(
7002     /*AttrKind=*/ParsedAttr::AT_GuardedBy,
7003     /*NumArgs=*/1,
7004     /*OptArgs=*/0,
7005     /*NumArgMembers=*/1,
7006     /*HasCustomParsing=*/0,
7007     /*AcceptsExprPack=*/0,
7008     /*IsTargetSpecific=*/0,
7009     /*IsType=*/0,
7010     /*IsStmt=*/0,
7011     /*IsKnownToGCC=*/0,
7012     /*IsSupportedByPragmaAttribute=*/0,
7013     /*Spellings=*/GuardedBySpellings,
7014     /*ArgNames=*/GuardedByArgNames) {}
7015 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7016   if (!isa<FieldDecl>(D) && !isSharedVar(D)) {
7017     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7018       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members and global variables";
7019     return false;
7020   }
7021   return true;
7022 }
7023 
7024 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7025   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7026     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7027   return false;
7028 }
7029 
7030 bool isParamExpr(size_t N) const override {
7031   return (N == 0) || false;
7032 }
7033 
7034 static const ParsedAttrInfoGuardedBy Instance;
7035 };
7036 const ParsedAttrInfoGuardedBy ParsedAttrInfoGuardedBy::Instance;
7037 static constexpr ParsedAttrInfo::Spelling GuardedVarSpellings[] = {
7038   {AttributeCommonInfo::AS_GNU, "guarded_var"},
7039   {AttributeCommonInfo::AS_CXX11, "clang::guarded_var"},
7040 };
7041 struct ParsedAttrInfoGuardedVar final : public ParsedAttrInfo {
7042   constexpr ParsedAttrInfoGuardedVar() : ParsedAttrInfo(
7043     /*AttrKind=*/ParsedAttr::AT_GuardedVar,
7044     /*NumArgs=*/0,
7045     /*OptArgs=*/0,
7046     /*NumArgMembers=*/0,
7047     /*HasCustomParsing=*/0,
7048     /*AcceptsExprPack=*/0,
7049     /*IsTargetSpecific=*/0,
7050     /*IsType=*/0,
7051     /*IsStmt=*/0,
7052     /*IsKnownToGCC=*/0,
7053     /*IsSupportedByPragmaAttribute=*/0,
7054     /*Spellings=*/GuardedVarSpellings,
7055     /*ArgNames=*/{}) {}
7056 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7057   if (!isa<FieldDecl>(D) && !isSharedVar(D)) {
7058     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7059       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members and global variables";
7060     return false;
7061   }
7062   return true;
7063 }
7064 
7065 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7066   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7067     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7068   return false;
7069 }
7070 
7071 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
7072   D->addAttr(::new (S.Context) GuardedVarAttr(S.Context, Attr));
7073   return AttributeApplied;
7074 }
7075 
7076 bool isParamExpr(size_t N) const override {
7077   return false;
7078 }
7079 
7080 static const ParsedAttrInfoGuardedVar Instance;
7081 };
7082 const ParsedAttrInfoGuardedVar ParsedAttrInfoGuardedVar::Instance;
7083 static constexpr ParsedAttrInfo::Spelling HIPManagedSpellings[] = {
7084   {AttributeCommonInfo::AS_GNU, "managed"},
7085   {AttributeCommonInfo::AS_Declspec, "__managed__"},
7086 };
7087 struct ParsedAttrInfoHIPManaged final : public ParsedAttrInfo {
7088   constexpr ParsedAttrInfoHIPManaged() : ParsedAttrInfo(
7089     /*AttrKind=*/ParsedAttr::AT_HIPManaged,
7090     /*NumArgs=*/0,
7091     /*OptArgs=*/0,
7092     /*NumArgMembers=*/0,
7093     /*HasCustomParsing=*/0,
7094     /*AcceptsExprPack=*/0,
7095     /*IsTargetSpecific=*/0,
7096     /*IsType=*/0,
7097     /*IsStmt=*/0,
7098     /*IsKnownToGCC=*/0,
7099     /*IsSupportedByPragmaAttribute=*/1,
7100     /*Spellings=*/HIPManagedSpellings,
7101     /*ArgNames=*/{}) {}
7102 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7103   if (!isa<VarDecl>(D)) {
7104     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7105       << Attr << Attr.isRegularKeywordAttribute() << "variables";
7106     return false;
7107   }
7108   return true;
7109 }
7110 
7111 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7112   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7113     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7114   return false;
7115 }
7116 
7117   using ParsedAttrInfo::diagMutualExclusion;
7118 
7119   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
7120     if (const auto *A = D->getAttr<CUDAConstantAttr>()) {
7121       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
7122       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
7123 return false;
7124     }
7125     if (const auto *A = D->getAttr<CUDASharedAttr>()) {
7126       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
7127       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
7128 return false;
7129     }
7130     return true;
7131   }
7132 
7133 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7134   return LangOpts.HIP;
7135 }
7136 
7137 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
7138   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
7139 }
7140 
7141 bool isParamExpr(size_t N) const override {
7142   return false;
7143 }
7144 
7145 static const ParsedAttrInfoHIPManaged Instance;
7146 };
7147 const ParsedAttrInfoHIPManaged ParsedAttrInfoHIPManaged::Instance;
7148 static constexpr ParsedAttrInfo::Spelling HLSLContainedTypeSpellings[] = {
7149   {AttributeCommonInfo::AS_CXX11, "hlsl::contained_type"},
7150 };
7151 static constexpr const char *HLSLContainedTypeArgNames[] = {
7152 "Type",};
7153 struct ParsedAttrInfoHLSLContainedType final : public ParsedAttrInfo {
7154   constexpr ParsedAttrInfoHLSLContainedType() : ParsedAttrInfo(
7155     /*AttrKind=*/ParsedAttr::AT_HLSLContainedType,
7156     /*NumArgs=*/1,
7157     /*OptArgs=*/0,
7158     /*NumArgMembers=*/1,
7159     /*HasCustomParsing=*/0,
7160     /*AcceptsExprPack=*/0,
7161     /*IsTargetSpecific=*/0,
7162     /*IsType=*/1,
7163     /*IsStmt=*/0,
7164     /*IsKnownToGCC=*/0,
7165     /*IsSupportedByPragmaAttribute=*/0,
7166     /*Spellings=*/HLSLContainedTypeSpellings,
7167     /*ArgNames=*/HLSLContainedTypeArgNames) {}
7168 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7169   return LangOpts.HLSL;
7170 }
7171 
7172 bool isParamExpr(size_t N) const override {
7173   return false;
7174 }
7175 
7176 static const ParsedAttrInfoHLSLContainedType Instance;
7177 };
7178 const ParsedAttrInfoHLSLContainedType ParsedAttrInfoHLSLContainedType::Instance;
7179 static constexpr ParsedAttrInfo::Spelling HLSLControlFlowHintSpellings[] = {
7180   {AttributeCommonInfo::AS_Microsoft, "branch"},
7181   {AttributeCommonInfo::AS_Microsoft, "flatten"},
7182 };
7183 struct ParsedAttrInfoHLSLControlFlowHint final : public ParsedAttrInfo {
7184   constexpr ParsedAttrInfoHLSLControlFlowHint() : ParsedAttrInfo(
7185     /*AttrKind=*/ParsedAttr::AT_HLSLControlFlowHint,
7186     /*NumArgs=*/0,
7187     /*OptArgs=*/0,
7188     /*NumArgMembers=*/0,
7189     /*HasCustomParsing=*/0,
7190     /*AcceptsExprPack=*/0,
7191     /*IsTargetSpecific=*/0,
7192     /*IsType=*/0,
7193     /*IsStmt=*/1,
7194     /*IsKnownToGCC=*/0,
7195     /*IsSupportedByPragmaAttribute=*/0,
7196     /*Spellings=*/HLSLControlFlowHintSpellings,
7197     /*ArgNames=*/{}) {}
7198 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
7199   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
7200     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
7201   return false;
7202 }
7203 
7204 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
7205   if (!isa<IfStmt>(St)) {
7206     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
7207       << Attr << Attr.isRegularKeywordAttribute() << "'if' statements";
7208     return false;
7209   }
7210   return true;
7211 }
7212 
7213 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7214   return LangOpts.HLSL;
7215 }
7216 
7217 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
7218   enum Spelling {
7219     Microsoft_branch = 0,
7220     Microsoft_flatten = 1,
7221   SpellingNotCalculated = 15
7222 
7223   };
7224 
7225   unsigned Idx = Attr.getAttributeSpellingListIndex();
7226   switch (Idx) {
7227     default: llvm_unreachable("Unknown spelling list index");
7228     case 0: return Microsoft_branch;
7229     case 1: return Microsoft_flatten;
7230   }
7231 }
7232 
7233 bool isParamExpr(size_t N) const override {
7234   return false;
7235 }
7236 
7237 static const ParsedAttrInfoHLSLControlFlowHint Instance;
7238 };
7239 const ParsedAttrInfoHLSLControlFlowHint ParsedAttrInfoHLSLControlFlowHint::Instance;
7240 static constexpr ParsedAttrInfo::Spelling HLSLGroupSharedAddressSpaceSpellings[] = {
7241   {AttributeCommonInfo::AS_Keyword, "groupshared"},
7242 };
7243 struct ParsedAttrInfoHLSLGroupSharedAddressSpace final : public ParsedAttrInfo {
7244   constexpr ParsedAttrInfoHLSLGroupSharedAddressSpace() : ParsedAttrInfo(
7245     /*AttrKind=*/ParsedAttr::AT_HLSLGroupSharedAddressSpace,
7246     /*NumArgs=*/0,
7247     /*OptArgs=*/0,
7248     /*NumArgMembers=*/0,
7249     /*HasCustomParsing=*/0,
7250     /*AcceptsExprPack=*/0,
7251     /*IsTargetSpecific=*/0,
7252     /*IsType=*/1,
7253     /*IsStmt=*/0,
7254     /*IsKnownToGCC=*/0,
7255     /*IsSupportedByPragmaAttribute=*/0,
7256     /*Spellings=*/HLSLGroupSharedAddressSpaceSpellings,
7257     /*ArgNames=*/{}) {}
7258 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7259   if (!isa<VarDecl>(D)) {
7260     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7261       << Attr << Attr.isRegularKeywordAttribute() << "variables";
7262     return false;
7263   }
7264   return true;
7265 }
7266 
7267 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7268   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7269     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7270   return false;
7271 }
7272 
7273 bool isParamExpr(size_t N) const override {
7274   return false;
7275 }
7276 
7277 static const ParsedAttrInfoHLSLGroupSharedAddressSpace Instance;
7278 };
7279 const ParsedAttrInfoHLSLGroupSharedAddressSpace ParsedAttrInfoHLSLGroupSharedAddressSpace::Instance;
7280 static constexpr ParsedAttrInfo::Spelling HLSLLoopHintSpellings[] = {
7281   {AttributeCommonInfo::AS_Microsoft, "unroll"},
7282   {AttributeCommonInfo::AS_Microsoft, "loop"},
7283 };
7284 static constexpr const char *HLSLLoopHintArgNames[] = {
7285 "directive",};
7286 struct ParsedAttrInfoHLSLLoopHint final : public ParsedAttrInfo {
7287   constexpr ParsedAttrInfoHLSLLoopHint() : ParsedAttrInfo(
7288     /*AttrKind=*/ParsedAttr::AT_HLSLLoopHint,
7289     /*NumArgs=*/0,
7290     /*OptArgs=*/1,
7291     /*NumArgMembers=*/1,
7292     /*HasCustomParsing=*/0,
7293     /*AcceptsExprPack=*/0,
7294     /*IsTargetSpecific=*/0,
7295     /*IsType=*/0,
7296     /*IsStmt=*/1,
7297     /*IsKnownToGCC=*/0,
7298     /*IsSupportedByPragmaAttribute=*/0,
7299     /*Spellings=*/HLSLLoopHintSpellings,
7300     /*ArgNames=*/HLSLLoopHintArgNames) {}
7301 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
7302   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
7303     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
7304   return false;
7305 }
7306 
7307 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
7308   if (!isa<ForStmt>(St) && !isa<WhileStmt>(St) && !isa<DoStmt>(St)) {
7309     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
7310       << Attr << Attr.isRegularKeywordAttribute() << "'for', 'while', and 'do' statements";
7311     return false;
7312   }
7313   return true;
7314 }
7315 
7316 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7317   return LangOpts.HLSL;
7318 }
7319 
7320 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
7321   enum Spelling {
7322     Microsoft_unroll = 0,
7323     Microsoft_loop = 1,
7324   SpellingNotCalculated = 15
7325 
7326   };
7327 
7328   unsigned Idx = Attr.getAttributeSpellingListIndex();
7329   switch (Idx) {
7330     default: llvm_unreachable("Unknown spelling list index");
7331     case 0: return Microsoft_unroll;
7332     case 1: return Microsoft_loop;
7333   }
7334 }
7335 
7336 bool isParamExpr(size_t N) const override {
7337   return false;
7338 }
7339 
7340 static const ParsedAttrInfoHLSLLoopHint Instance;
7341 };
7342 const ParsedAttrInfoHLSLLoopHint ParsedAttrInfoHLSLLoopHint::Instance;
7343 static constexpr ParsedAttrInfo::Spelling HLSLNumThreadsSpellings[] = {
7344   {AttributeCommonInfo::AS_Microsoft, "numthreads"},
7345 };
7346 static constexpr const char *HLSLNumThreadsArgNames[] = {
7347 "X","Y","Z",};
7348 struct ParsedAttrInfoHLSLNumThreads final : public ParsedAttrInfo {
7349   constexpr ParsedAttrInfoHLSLNumThreads() : ParsedAttrInfo(
7350     /*AttrKind=*/ParsedAttr::AT_HLSLNumThreads,
7351     /*NumArgs=*/3,
7352     /*OptArgs=*/0,
7353     /*NumArgMembers=*/3,
7354     /*HasCustomParsing=*/0,
7355     /*AcceptsExprPack=*/0,
7356     /*IsTargetSpecific=*/0,
7357     /*IsType=*/0,
7358     /*IsStmt=*/0,
7359     /*IsKnownToGCC=*/0,
7360     /*IsSupportedByPragmaAttribute=*/0,
7361     /*Spellings=*/HLSLNumThreadsSpellings,
7362     /*ArgNames=*/HLSLNumThreadsArgNames) {}
7363 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7364   if (!isHLSLEntry(D)) {
7365     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7366       << Attr << Attr.isRegularKeywordAttribute() << "global functions";
7367     return false;
7368   }
7369   return true;
7370 }
7371 
7372 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7373   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7374     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7375   return false;
7376 }
7377 
7378 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7379   return LangOpts.HLSL;
7380 }
7381 
7382 bool isParamExpr(size_t N) const override {
7383   return false;
7384 }
7385 
7386 static const ParsedAttrInfoHLSLNumThreads Instance;
7387 };
7388 const ParsedAttrInfoHLSLNumThreads ParsedAttrInfoHLSLNumThreads::Instance;
7389 static constexpr ParsedAttrInfo::Spelling HLSLPackOffsetSpellings[] = {
7390   {AttributeCommonInfo::AS_HLSLAnnotation, "packoffset"},
7391 };
7392 static constexpr const char *HLSLPackOffsetArgNames[] = {
7393 "Subcomponent","Component",};
7394 struct ParsedAttrInfoHLSLPackOffset final : public ParsedAttrInfo {
7395   constexpr ParsedAttrInfoHLSLPackOffset() : ParsedAttrInfo(
7396     /*AttrKind=*/ParsedAttr::AT_HLSLPackOffset,
7397     /*NumArgs=*/2,
7398     /*OptArgs=*/0,
7399     /*NumArgMembers=*/2,
7400     /*HasCustomParsing=*/0,
7401     /*AcceptsExprPack=*/0,
7402     /*IsTargetSpecific=*/0,
7403     /*IsType=*/0,
7404     /*IsStmt=*/0,
7405     /*IsKnownToGCC=*/0,
7406     /*IsSupportedByPragmaAttribute=*/0,
7407     /*Spellings=*/HLSLPackOffsetSpellings,
7408     /*ArgNames=*/HLSLPackOffsetArgNames) {}
7409 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7410   return LangOpts.HLSL;
7411 }
7412 
7413 bool isParamExpr(size_t N) const override {
7414   return false;
7415 }
7416 
7417 static const ParsedAttrInfoHLSLPackOffset Instance;
7418 };
7419 const ParsedAttrInfoHLSLPackOffset ParsedAttrInfoHLSLPackOffset::Instance;
7420 static constexpr ParsedAttrInfo::Spelling HLSLParamModifierSpellings[] = {
7421   {AttributeCommonInfo::AS_Keyword, "in"},
7422   {AttributeCommonInfo::AS_Keyword, "inout"},
7423   {AttributeCommonInfo::AS_Keyword, "out"},
7424 };
7425 struct ParsedAttrInfoHLSLParamModifier final : public ParsedAttrInfo {
7426   constexpr ParsedAttrInfoHLSLParamModifier() : ParsedAttrInfo(
7427     /*AttrKind=*/ParsedAttr::AT_HLSLParamModifier,
7428     /*NumArgs=*/0,
7429     /*OptArgs=*/0,
7430     /*NumArgMembers=*/0,
7431     /*HasCustomParsing=*/0,
7432     /*AcceptsExprPack=*/0,
7433     /*IsTargetSpecific=*/0,
7434     /*IsType=*/0,
7435     /*IsStmt=*/0,
7436     /*IsKnownToGCC=*/0,
7437     /*IsSupportedByPragmaAttribute=*/0,
7438     /*Spellings=*/HLSLParamModifierSpellings,
7439     /*ArgNames=*/{}) {}
7440 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7441   if (!isa<ParmVarDecl>(D)) {
7442     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7443       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
7444     return false;
7445   }
7446   return true;
7447 }
7448 
7449 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7450   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7451     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7452   return false;
7453 }
7454 
7455 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
7456   enum Spelling {
7457     Keyword_in = 0,
7458     Keyword_inout = 1,
7459     Keyword_out = 2,
7460   SpellingNotCalculated = 15
7461 
7462   };
7463 
7464   unsigned Idx = Attr.getAttributeSpellingListIndex();
7465   switch (Idx) {
7466     default: llvm_unreachable("Unknown spelling list index");
7467     case 0: return Keyword_in;
7468     case 1: return Keyword_inout;
7469     case 2: return Keyword_out;
7470   }
7471 }
7472 
7473 bool isParamExpr(size_t N) const override {
7474   return false;
7475 }
7476 
7477 static const ParsedAttrInfoHLSLParamModifier Instance;
7478 };
7479 const ParsedAttrInfoHLSLParamModifier ParsedAttrInfoHLSLParamModifier::Instance;
7480 static constexpr ParsedAttrInfo::Spelling HLSLROVSpellings[] = {
7481   {AttributeCommonInfo::AS_CXX11, "hlsl::is_rov"},
7482 };
7483 struct ParsedAttrInfoHLSLROV final : public ParsedAttrInfo {
7484   constexpr ParsedAttrInfoHLSLROV() : ParsedAttrInfo(
7485     /*AttrKind=*/ParsedAttr::AT_HLSLROV,
7486     /*NumArgs=*/0,
7487     /*OptArgs=*/0,
7488     /*NumArgMembers=*/0,
7489     /*HasCustomParsing=*/0,
7490     /*AcceptsExprPack=*/0,
7491     /*IsTargetSpecific=*/0,
7492     /*IsType=*/1,
7493     /*IsStmt=*/0,
7494     /*IsKnownToGCC=*/0,
7495     /*IsSupportedByPragmaAttribute=*/0,
7496     /*Spellings=*/HLSLROVSpellings,
7497     /*ArgNames=*/{}) {}
7498 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7499   return LangOpts.HLSL;
7500 }
7501 
7502 bool isParamExpr(size_t N) const override {
7503   return false;
7504 }
7505 
7506 static const ParsedAttrInfoHLSLROV Instance;
7507 };
7508 const ParsedAttrInfoHLSLROV ParsedAttrInfoHLSLROV::Instance;
7509 static constexpr ParsedAttrInfo::Spelling HLSLRawBufferSpellings[] = {
7510   {AttributeCommonInfo::AS_CXX11, "hlsl::raw_buffer"},
7511 };
7512 struct ParsedAttrInfoHLSLRawBuffer final : public ParsedAttrInfo {
7513   constexpr ParsedAttrInfoHLSLRawBuffer() : ParsedAttrInfo(
7514     /*AttrKind=*/ParsedAttr::AT_HLSLRawBuffer,
7515     /*NumArgs=*/0,
7516     /*OptArgs=*/0,
7517     /*NumArgMembers=*/0,
7518     /*HasCustomParsing=*/0,
7519     /*AcceptsExprPack=*/0,
7520     /*IsTargetSpecific=*/0,
7521     /*IsType=*/1,
7522     /*IsStmt=*/0,
7523     /*IsKnownToGCC=*/0,
7524     /*IsSupportedByPragmaAttribute=*/0,
7525     /*Spellings=*/HLSLRawBufferSpellings,
7526     /*ArgNames=*/{}) {}
7527 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7528   return LangOpts.HLSL;
7529 }
7530 
7531 bool isParamExpr(size_t N) const override {
7532   return false;
7533 }
7534 
7535 static const ParsedAttrInfoHLSLRawBuffer Instance;
7536 };
7537 const ParsedAttrInfoHLSLRawBuffer ParsedAttrInfoHLSLRawBuffer::Instance;
7538 static constexpr const char *HLSLResourceArgNames[] = {
7539 "ResourceKind",};
7540 struct ParsedAttrInfoHLSLResource final : public ParsedAttrInfo {
7541   constexpr ParsedAttrInfoHLSLResource() : ParsedAttrInfo(
7542     /*AttrKind=*/ParsedAttr::AT_HLSLResource,
7543     /*NumArgs=*/1,
7544     /*OptArgs=*/0,
7545     /*NumArgMembers=*/1,
7546     /*HasCustomParsing=*/0,
7547     /*AcceptsExprPack=*/0,
7548     /*IsTargetSpecific=*/0,
7549     /*IsType=*/0,
7550     /*IsStmt=*/0,
7551     /*IsKnownToGCC=*/0,
7552     /*IsSupportedByPragmaAttribute=*/0,
7553     /*Spellings=*/{},
7554     /*ArgNames=*/HLSLResourceArgNames) {}
7555 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7556   if (!isStruct(D)) {
7557     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7558       << Attr << Attr.isRegularKeywordAttribute() << "structs";
7559     return false;
7560   }
7561   return true;
7562 }
7563 
7564 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7565   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7566     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7567   return false;
7568 }
7569 
7570 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7571   return LangOpts.HLSL;
7572 }
7573 
7574 bool isParamExpr(size_t N) const override {
7575   return false;
7576 }
7577 
7578 static const ParsedAttrInfoHLSLResource Instance;
7579 };
7580 const ParsedAttrInfoHLSLResource ParsedAttrInfoHLSLResource::Instance;
7581 static constexpr ParsedAttrInfo::Spelling HLSLResourceBindingSpellings[] = {
7582   {AttributeCommonInfo::AS_HLSLAnnotation, "register"},
7583 };
7584 static constexpr const char *HLSLResourceBindingArgNames[] = {
7585 "Slot","Space",};
7586 struct ParsedAttrInfoHLSLResourceBinding final : public ParsedAttrInfo {
7587   constexpr ParsedAttrInfoHLSLResourceBinding() : ParsedAttrInfo(
7588     /*AttrKind=*/ParsedAttr::AT_HLSLResourceBinding,
7589     /*NumArgs=*/1,
7590     /*OptArgs=*/1,
7591     /*NumArgMembers=*/2,
7592     /*HasCustomParsing=*/0,
7593     /*AcceptsExprPack=*/0,
7594     /*IsTargetSpecific=*/0,
7595     /*IsType=*/0,
7596     /*IsStmt=*/0,
7597     /*IsKnownToGCC=*/0,
7598     /*IsSupportedByPragmaAttribute=*/0,
7599     /*Spellings=*/HLSLResourceBindingSpellings,
7600     /*ArgNames=*/HLSLResourceBindingArgNames) {}
7601 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7602   if (!isHLSLBufferObj(D) && !isExternalGlobalVar(D)) {
7603     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
7604       << Attr << Attr.isRegularKeywordAttribute() << "cbuffer/tbuffer and external global variables";
7605     return false;
7606   }
7607   return true;
7608 }
7609 
7610 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7611   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7612     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7613   return false;
7614 }
7615 
7616 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7617   return LangOpts.HLSL;
7618 }
7619 
7620 bool isParamExpr(size_t N) const override {
7621   return false;
7622 }
7623 
7624 static const ParsedAttrInfoHLSLResourceBinding Instance;
7625 };
7626 const ParsedAttrInfoHLSLResourceBinding ParsedAttrInfoHLSLResourceBinding::Instance;
7627 static constexpr ParsedAttrInfo::Spelling HLSLResourceClassSpellings[] = {
7628   {AttributeCommonInfo::AS_CXX11, "hlsl::resource_class"},
7629 };
7630 static constexpr const char *HLSLResourceClassArgNames[] = {
7631 "ResourceClass",};
7632 struct ParsedAttrInfoHLSLResourceClass final : public ParsedAttrInfo {
7633   constexpr ParsedAttrInfoHLSLResourceClass() : ParsedAttrInfo(
7634     /*AttrKind=*/ParsedAttr::AT_HLSLResourceClass,
7635     /*NumArgs=*/1,
7636     /*OptArgs=*/0,
7637     /*NumArgMembers=*/1,
7638     /*HasCustomParsing=*/0,
7639     /*AcceptsExprPack=*/0,
7640     /*IsTargetSpecific=*/0,
7641     /*IsType=*/1,
7642     /*IsStmt=*/0,
7643     /*IsKnownToGCC=*/0,
7644     /*IsSupportedByPragmaAttribute=*/0,
7645     /*Spellings=*/HLSLResourceClassSpellings,
7646     /*ArgNames=*/HLSLResourceClassArgNames) {}
7647 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7648   return LangOpts.HLSL;
7649 }
7650 
7651 bool isParamExpr(size_t N) const override {
7652   return false;
7653 }
7654 
7655 static const ParsedAttrInfoHLSLResourceClass Instance;
7656 };
7657 const ParsedAttrInfoHLSLResourceClass ParsedAttrInfoHLSLResourceClass::Instance;
7658 static constexpr ParsedAttrInfo::Spelling HLSLSV_DispatchThreadIDSpellings[] = {
7659   {AttributeCommonInfo::AS_HLSLAnnotation, "SV_DispatchThreadID"},
7660 };
7661 struct ParsedAttrInfoHLSLSV_DispatchThreadID final : public ParsedAttrInfo {
7662   constexpr ParsedAttrInfoHLSLSV_DispatchThreadID() : ParsedAttrInfo(
7663     /*AttrKind=*/ParsedAttr::AT_HLSLSV_DispatchThreadID,
7664     /*NumArgs=*/0,
7665     /*OptArgs=*/0,
7666     /*NumArgMembers=*/0,
7667     /*HasCustomParsing=*/0,
7668     /*AcceptsExprPack=*/0,
7669     /*IsTargetSpecific=*/0,
7670     /*IsType=*/0,
7671     /*IsStmt=*/0,
7672     /*IsKnownToGCC=*/0,
7673     /*IsSupportedByPragmaAttribute=*/0,
7674     /*Spellings=*/HLSLSV_DispatchThreadIDSpellings,
7675     /*ArgNames=*/{}) {}
7676 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7677   if (!isa<ParmVarDecl>(D) && !isa<FieldDecl>(D)) {
7678     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7679       << Attr << Attr.isRegularKeywordAttribute() << "parameters and non-static data members";
7680     return false;
7681   }
7682   return true;
7683 }
7684 
7685 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7686   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7687     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7688   return false;
7689 }
7690 
7691 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7692   return LangOpts.HLSL;
7693 }
7694 
7695 bool isParamExpr(size_t N) const override {
7696   return false;
7697 }
7698 
7699 static const ParsedAttrInfoHLSLSV_DispatchThreadID Instance;
7700 };
7701 const ParsedAttrInfoHLSLSV_DispatchThreadID ParsedAttrInfoHLSLSV_DispatchThreadID::Instance;
7702 static constexpr ParsedAttrInfo::Spelling HLSLSV_GroupIDSpellings[] = {
7703   {AttributeCommonInfo::AS_HLSLAnnotation, "SV_GroupID"},
7704 };
7705 struct ParsedAttrInfoHLSLSV_GroupID final : public ParsedAttrInfo {
7706   constexpr ParsedAttrInfoHLSLSV_GroupID() : ParsedAttrInfo(
7707     /*AttrKind=*/ParsedAttr::AT_HLSLSV_GroupID,
7708     /*NumArgs=*/0,
7709     /*OptArgs=*/0,
7710     /*NumArgMembers=*/0,
7711     /*HasCustomParsing=*/0,
7712     /*AcceptsExprPack=*/0,
7713     /*IsTargetSpecific=*/0,
7714     /*IsType=*/0,
7715     /*IsStmt=*/0,
7716     /*IsKnownToGCC=*/0,
7717     /*IsSupportedByPragmaAttribute=*/0,
7718     /*Spellings=*/HLSLSV_GroupIDSpellings,
7719     /*ArgNames=*/{}) {}
7720 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7721   if (!isa<ParmVarDecl>(D) && !isa<FieldDecl>(D)) {
7722     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7723       << Attr << Attr.isRegularKeywordAttribute() << "parameters and non-static data members";
7724     return false;
7725   }
7726   return true;
7727 }
7728 
7729 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7730   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7731     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7732   return false;
7733 }
7734 
7735 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7736   return LangOpts.HLSL;
7737 }
7738 
7739 bool isParamExpr(size_t N) const override {
7740   return false;
7741 }
7742 
7743 static const ParsedAttrInfoHLSLSV_GroupID Instance;
7744 };
7745 const ParsedAttrInfoHLSLSV_GroupID ParsedAttrInfoHLSLSV_GroupID::Instance;
7746 static constexpr ParsedAttrInfo::Spelling HLSLSV_GroupIndexSpellings[] = {
7747   {AttributeCommonInfo::AS_HLSLAnnotation, "SV_GroupIndex"},
7748 };
7749 struct ParsedAttrInfoHLSLSV_GroupIndex final : public ParsedAttrInfo {
7750   constexpr ParsedAttrInfoHLSLSV_GroupIndex() : ParsedAttrInfo(
7751     /*AttrKind=*/ParsedAttr::AT_HLSLSV_GroupIndex,
7752     /*NumArgs=*/0,
7753     /*OptArgs=*/0,
7754     /*NumArgMembers=*/0,
7755     /*HasCustomParsing=*/0,
7756     /*AcceptsExprPack=*/0,
7757     /*IsTargetSpecific=*/0,
7758     /*IsType=*/0,
7759     /*IsStmt=*/0,
7760     /*IsKnownToGCC=*/0,
7761     /*IsSupportedByPragmaAttribute=*/0,
7762     /*Spellings=*/HLSLSV_GroupIndexSpellings,
7763     /*ArgNames=*/{}) {}
7764 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7765   if (!isa<ParmVarDecl>(D) && !isGlobalVar(D)) {
7766     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7767       << Attr << Attr.isRegularKeywordAttribute() << "parameters and global variables";
7768     return false;
7769   }
7770   return true;
7771 }
7772 
7773 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7774   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7775     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7776   return false;
7777 }
7778 
7779 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7780   return LangOpts.HLSL;
7781 }
7782 
7783 bool isParamExpr(size_t N) const override {
7784   return false;
7785 }
7786 
7787 static const ParsedAttrInfoHLSLSV_GroupIndex Instance;
7788 };
7789 const ParsedAttrInfoHLSLSV_GroupIndex ParsedAttrInfoHLSLSV_GroupIndex::Instance;
7790 static constexpr ParsedAttrInfo::Spelling HLSLSV_GroupThreadIDSpellings[] = {
7791   {AttributeCommonInfo::AS_HLSLAnnotation, "SV_GroupThreadID"},
7792 };
7793 struct ParsedAttrInfoHLSLSV_GroupThreadID final : public ParsedAttrInfo {
7794   constexpr ParsedAttrInfoHLSLSV_GroupThreadID() : ParsedAttrInfo(
7795     /*AttrKind=*/ParsedAttr::AT_HLSLSV_GroupThreadID,
7796     /*NumArgs=*/0,
7797     /*OptArgs=*/0,
7798     /*NumArgMembers=*/0,
7799     /*HasCustomParsing=*/0,
7800     /*AcceptsExprPack=*/0,
7801     /*IsTargetSpecific=*/0,
7802     /*IsType=*/0,
7803     /*IsStmt=*/0,
7804     /*IsKnownToGCC=*/0,
7805     /*IsSupportedByPragmaAttribute=*/0,
7806     /*Spellings=*/HLSLSV_GroupThreadIDSpellings,
7807     /*ArgNames=*/{}) {}
7808 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7809   if (!isa<ParmVarDecl>(D) && !isa<FieldDecl>(D)) {
7810     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7811       << Attr << Attr.isRegularKeywordAttribute() << "parameters and non-static data members";
7812     return false;
7813   }
7814   return true;
7815 }
7816 
7817 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7818   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7819     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7820   return false;
7821 }
7822 
7823 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7824   return LangOpts.HLSL;
7825 }
7826 
7827 bool isParamExpr(size_t N) const override {
7828   return false;
7829 }
7830 
7831 static const ParsedAttrInfoHLSLSV_GroupThreadID Instance;
7832 };
7833 const ParsedAttrInfoHLSLSV_GroupThreadID ParsedAttrInfoHLSLSV_GroupThreadID::Instance;
7834 static constexpr ParsedAttrInfo::Spelling HLSLShaderSpellings[] = {
7835   {AttributeCommonInfo::AS_Microsoft, "shader"},
7836 };
7837 static constexpr const char *HLSLShaderArgNames[] = {
7838 "Type",};
7839 struct ParsedAttrInfoHLSLShader final : public ParsedAttrInfo {
7840   constexpr ParsedAttrInfoHLSLShader() : ParsedAttrInfo(
7841     /*AttrKind=*/ParsedAttr::AT_HLSLShader,
7842     /*NumArgs=*/1,
7843     /*OptArgs=*/0,
7844     /*NumArgMembers=*/1,
7845     /*HasCustomParsing=*/0,
7846     /*AcceptsExprPack=*/0,
7847     /*IsTargetSpecific=*/0,
7848     /*IsType=*/0,
7849     /*IsStmt=*/0,
7850     /*IsKnownToGCC=*/0,
7851     /*IsSupportedByPragmaAttribute=*/0,
7852     /*Spellings=*/HLSLShaderSpellings,
7853     /*ArgNames=*/HLSLShaderArgNames) {}
7854 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7855   if (!isHLSLEntry(D)) {
7856     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7857       << Attr << Attr.isRegularKeywordAttribute() << "global functions";
7858     return false;
7859   }
7860   return true;
7861 }
7862 
7863 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7864   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7865     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7866   return false;
7867 }
7868 
7869 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7870   return LangOpts.HLSL;
7871 }
7872 
7873 bool isParamExpr(size_t N) const override {
7874   return false;
7875 }
7876 
7877 static const ParsedAttrInfoHLSLShader Instance;
7878 };
7879 const ParsedAttrInfoHLSLShader ParsedAttrInfoHLSLShader::Instance;
7880 static constexpr ParsedAttrInfo::Spelling HLSLWaveSizeSpellings[] = {
7881   {AttributeCommonInfo::AS_Microsoft, "WaveSize"},
7882 };
7883 static constexpr const char *HLSLWaveSizeArgNames[] = {
7884 "Min","Max","Preferred",};
7885 struct ParsedAttrInfoHLSLWaveSize final : public ParsedAttrInfo {
7886   constexpr ParsedAttrInfoHLSLWaveSize() : ParsedAttrInfo(
7887     /*AttrKind=*/ParsedAttr::AT_HLSLWaveSize,
7888     /*NumArgs=*/1,
7889     /*OptArgs=*/2,
7890     /*NumArgMembers=*/3,
7891     /*HasCustomParsing=*/0,
7892     /*AcceptsExprPack=*/0,
7893     /*IsTargetSpecific=*/0,
7894     /*IsType=*/0,
7895     /*IsStmt=*/0,
7896     /*IsKnownToGCC=*/0,
7897     /*IsSupportedByPragmaAttribute=*/0,
7898     /*Spellings=*/HLSLWaveSizeSpellings,
7899     /*ArgNames=*/HLSLWaveSizeArgNames) {}
7900 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7901   if (!isHLSLEntry(D)) {
7902     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7903       << Attr << Attr.isRegularKeywordAttribute() << "global functions";
7904     return false;
7905   }
7906   return true;
7907 }
7908 
7909 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7910   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7911     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7912   return false;
7913 }
7914 
7915 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
7916   return LangOpts.HLSL;
7917 }
7918 
7919 bool isParamExpr(size_t N) const override {
7920   return false;
7921 }
7922 
7923 static const ParsedAttrInfoHLSLWaveSize Instance;
7924 };
7925 const ParsedAttrInfoHLSLWaveSize ParsedAttrInfoHLSLWaveSize::Instance;
7926 static constexpr ParsedAttrInfo::Spelling HotSpellings[] = {
7927   {AttributeCommonInfo::AS_GNU, "hot"},
7928   {AttributeCommonInfo::AS_CXX11, "gnu::hot"},
7929   {AttributeCommonInfo::AS_C23, "gnu::hot"},
7930 };
7931 struct ParsedAttrInfoHot final : public ParsedAttrInfo {
7932   constexpr ParsedAttrInfoHot() : ParsedAttrInfo(
7933     /*AttrKind=*/ParsedAttr::AT_Hot,
7934     /*NumArgs=*/0,
7935     /*OptArgs=*/0,
7936     /*NumArgMembers=*/0,
7937     /*HasCustomParsing=*/0,
7938     /*AcceptsExprPack=*/0,
7939     /*IsTargetSpecific=*/0,
7940     /*IsType=*/0,
7941     /*IsStmt=*/0,
7942     /*IsKnownToGCC=*/1,
7943     /*IsSupportedByPragmaAttribute=*/1,
7944     /*Spellings=*/HotSpellings,
7945     /*ArgNames=*/{}) {}
7946 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
7947   if (!isa<FunctionDecl>(D)) {
7948     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
7949       << Attr << Attr.isRegularKeywordAttribute() << "functions";
7950     return false;
7951   }
7952   return true;
7953 }
7954 
7955 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
7956   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
7957     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
7958   return false;
7959 }
7960 
7961   using ParsedAttrInfo::diagMutualExclusion;
7962 
7963   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
7964     if (const auto *A = D->getAttr<ColdAttr>()) {
7965       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
7966       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
7967 return false;
7968     }
7969     return true;
7970   }
7971 
7972 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
7973   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
7974 }
7975 
7976 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
7977   D->addAttr(::new (S.Context) HotAttr(S.Context, Attr));
7978   return AttributeApplied;
7979 }
7980 
7981 bool isParamExpr(size_t N) const override {
7982   return false;
7983 }
7984 
7985 static const ParsedAttrInfoHot Instance;
7986 };
7987 const ParsedAttrInfoHot ParsedAttrInfoHot::Instance;
7988 static constexpr ParsedAttrInfo::Spelling HybridPatchableSpellings[] = {
7989   {AttributeCommonInfo::AS_Declspec, "hybrid_patchable"},
7990   {AttributeCommonInfo::AS_GNU, "hybrid_patchable"},
7991   {AttributeCommonInfo::AS_CXX11, "clang::hybrid_patchable"},
7992   {AttributeCommonInfo::AS_C23, "clang::hybrid_patchable"},
7993 };
7994 struct ParsedAttrInfoHybridPatchable final : public ParsedAttrInfo {
7995   constexpr ParsedAttrInfoHybridPatchable() : ParsedAttrInfo(
7996     /*AttrKind=*/ParsedAttr::AT_HybridPatchable,
7997     /*NumArgs=*/0,
7998     /*OptArgs=*/0,
7999     /*NumArgMembers=*/0,
8000     /*HasCustomParsing=*/0,
8001     /*AcceptsExprPack=*/0,
8002     /*IsTargetSpecific=*/1,
8003     /*IsType=*/0,
8004     /*IsStmt=*/0,
8005     /*IsKnownToGCC=*/0,
8006     /*IsSupportedByPragmaAttribute=*/1,
8007     /*Spellings=*/HybridPatchableSpellings,
8008     /*ArgNames=*/{}) {}
8009 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8010   if (!isa<FunctionDecl>(D)) {
8011     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8012       << Attr << Attr.isRegularKeywordAttribute() << "functions";
8013     return false;
8014   }
8015   return true;
8016 }
8017 
8018 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8019   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8020     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8021   return false;
8022 }
8023 
8024 bool existsInTarget(const TargetInfo &Target) const override {
8025   const llvm::Triple &T = Target.getTriple(); (void)T;
8026   return true && ( Target.getTriple().isWindowsArm64EC() );
8027 }
8028 
8029 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8030   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
8031 }
8032 
8033 bool isParamExpr(size_t N) const override {
8034   return false;
8035 }
8036 
8037 static const ParsedAttrInfoHybridPatchable Instance;
8038 };
8039 const ParsedAttrInfoHybridPatchable ParsedAttrInfoHybridPatchable::Instance;
8040 static constexpr ParsedAttrInfo::Spelling IBActionSpellings[] = {
8041   {AttributeCommonInfo::AS_GNU, "ibaction"},
8042   {AttributeCommonInfo::AS_CXX11, "clang::ibaction"},
8043   {AttributeCommonInfo::AS_C23, "clang::ibaction"},
8044 };
8045 struct ParsedAttrInfoIBAction final : public ParsedAttrInfo {
8046   constexpr ParsedAttrInfoIBAction() : ParsedAttrInfo(
8047     /*AttrKind=*/ParsedAttr::AT_IBAction,
8048     /*NumArgs=*/0,
8049     /*OptArgs=*/0,
8050     /*NumArgMembers=*/0,
8051     /*HasCustomParsing=*/0,
8052     /*AcceptsExprPack=*/0,
8053     /*IsTargetSpecific=*/0,
8054     /*IsType=*/0,
8055     /*IsStmt=*/0,
8056     /*IsKnownToGCC=*/0,
8057     /*IsSupportedByPragmaAttribute=*/1,
8058     /*Spellings=*/IBActionSpellings,
8059     /*ArgNames=*/{}) {}
8060 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8061   if (!isObjCInstanceMethod(D)) {
8062     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8063       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C instance methods";
8064     return false;
8065   }
8066   return true;
8067 }
8068 
8069 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8070   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8071     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8072   return false;
8073 }
8074 
8075 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8076   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method_is_instance, /*IsSupported=*/LangOpts.ObjC));
8077 }
8078 
8079 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
8080   D->addAttr(::new (S.Context) IBActionAttr(S.Context, Attr));
8081   return AttributeApplied;
8082 }
8083 
8084 bool isParamExpr(size_t N) const override {
8085   return false;
8086 }
8087 
8088 static const ParsedAttrInfoIBAction Instance;
8089 };
8090 const ParsedAttrInfoIBAction ParsedAttrInfoIBAction::Instance;
8091 static constexpr ParsedAttrInfo::Spelling IBOutletSpellings[] = {
8092   {AttributeCommonInfo::AS_GNU, "iboutlet"},
8093   {AttributeCommonInfo::AS_CXX11, "clang::iboutlet"},
8094   {AttributeCommonInfo::AS_C23, "clang::iboutlet"},
8095 };
8096 struct ParsedAttrInfoIBOutlet final : public ParsedAttrInfo {
8097   constexpr ParsedAttrInfoIBOutlet() : ParsedAttrInfo(
8098     /*AttrKind=*/ParsedAttr::AT_IBOutlet,
8099     /*NumArgs=*/0,
8100     /*OptArgs=*/0,
8101     /*NumArgMembers=*/0,
8102     /*HasCustomParsing=*/0,
8103     /*AcceptsExprPack=*/0,
8104     /*IsTargetSpecific=*/0,
8105     /*IsType=*/0,
8106     /*IsStmt=*/0,
8107     /*IsKnownToGCC=*/0,
8108     /*IsSupportedByPragmaAttribute=*/0,
8109     /*Spellings=*/IBOutletSpellings,
8110     /*ArgNames=*/{}) {}
8111 bool isParamExpr(size_t N) const override {
8112   return false;
8113 }
8114 
8115 static const ParsedAttrInfoIBOutlet Instance;
8116 };
8117 const ParsedAttrInfoIBOutlet ParsedAttrInfoIBOutlet::Instance;
8118 static constexpr ParsedAttrInfo::Spelling IBOutletCollectionSpellings[] = {
8119   {AttributeCommonInfo::AS_GNU, "iboutletcollection"},
8120   {AttributeCommonInfo::AS_CXX11, "clang::iboutletcollection"},
8121   {AttributeCommonInfo::AS_C23, "clang::iboutletcollection"},
8122 };
8123 static constexpr const char *IBOutletCollectionArgNames[] = {
8124 "Interface",};
8125 struct ParsedAttrInfoIBOutletCollection final : public ParsedAttrInfo {
8126   constexpr ParsedAttrInfoIBOutletCollection() : ParsedAttrInfo(
8127     /*AttrKind=*/ParsedAttr::AT_IBOutletCollection,
8128     /*NumArgs=*/0,
8129     /*OptArgs=*/1,
8130     /*NumArgMembers=*/1,
8131     /*HasCustomParsing=*/0,
8132     /*AcceptsExprPack=*/0,
8133     /*IsTargetSpecific=*/0,
8134     /*IsType=*/0,
8135     /*IsStmt=*/0,
8136     /*IsKnownToGCC=*/0,
8137     /*IsSupportedByPragmaAttribute=*/0,
8138     /*Spellings=*/IBOutletCollectionSpellings,
8139     /*ArgNames=*/IBOutletCollectionArgNames) {}
8140 bool isParamExpr(size_t N) const override {
8141   return false;
8142 }
8143 
8144 static const ParsedAttrInfoIBOutletCollection Instance;
8145 };
8146 const ParsedAttrInfoIBOutletCollection ParsedAttrInfoIBOutletCollection::Instance;
8147 static constexpr ParsedAttrInfo::Spelling IFuncSpellings[] = {
8148   {AttributeCommonInfo::AS_GNU, "ifunc"},
8149   {AttributeCommonInfo::AS_CXX11, "gnu::ifunc"},
8150   {AttributeCommonInfo::AS_C23, "gnu::ifunc"},
8151 };
8152 static constexpr const char *IFuncArgNames[] = {
8153 "Resolver",};
8154 struct ParsedAttrInfoIFunc final : public ParsedAttrInfo {
8155   constexpr ParsedAttrInfoIFunc() : ParsedAttrInfo(
8156     /*AttrKind=*/ParsedAttr::AT_IFunc,
8157     /*NumArgs=*/1,
8158     /*OptArgs=*/0,
8159     /*NumArgMembers=*/1,
8160     /*HasCustomParsing=*/0,
8161     /*AcceptsExprPack=*/0,
8162     /*IsTargetSpecific=*/1,
8163     /*IsType=*/0,
8164     /*IsStmt=*/0,
8165     /*IsKnownToGCC=*/1,
8166     /*IsSupportedByPragmaAttribute=*/1,
8167     /*Spellings=*/IFuncSpellings,
8168     /*ArgNames=*/IFuncArgNames) {}
8169 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8170   if (!isa<FunctionDecl>(D)) {
8171     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8172       << Attr << Attr.isRegularKeywordAttribute() << "functions";
8173     return false;
8174   }
8175   return true;
8176 }
8177 
8178 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8179   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8180     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8181   return false;
8182 }
8183 
8184 bool existsInTarget(const TargetInfo &Target) const override {
8185   const llvm::Triple &T = Target.getTriple(); (void)T;
8186   return true && ( Target.supportsIFunc() );
8187 }
8188 
8189 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8190   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
8191 }
8192 
8193 bool isParamExpr(size_t N) const override {
8194   return false;
8195 }
8196 
8197 static const ParsedAttrInfoIFunc Instance;
8198 };
8199 const ParsedAttrInfoIFunc ParsedAttrInfoIFunc::Instance;
8200 static constexpr ParsedAttrInfo::Spelling InitPrioritySpellings[] = {
8201   {AttributeCommonInfo::AS_GNU, "init_priority"},
8202   {AttributeCommonInfo::AS_CXX11, "gnu::init_priority"},
8203 };
8204 static constexpr const char *InitPriorityArgNames[] = {
8205 "Priority",};
8206 struct ParsedAttrInfoInitPriority final : public ParsedAttrInfo {
8207   constexpr ParsedAttrInfoInitPriority() : ParsedAttrInfo(
8208     /*AttrKind=*/ParsedAttr::AT_InitPriority,
8209     /*NumArgs=*/1,
8210     /*OptArgs=*/0,
8211     /*NumArgMembers=*/1,
8212     /*HasCustomParsing=*/0,
8213     /*AcceptsExprPack=*/0,
8214     /*IsTargetSpecific=*/1,
8215     /*IsType=*/0,
8216     /*IsStmt=*/0,
8217     /*IsKnownToGCC=*/1,
8218     /*IsSupportedByPragmaAttribute=*/1,
8219     /*Spellings=*/InitPrioritySpellings,
8220     /*ArgNames=*/InitPriorityArgNames) {}
8221 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8222   if (!isa<VarDecl>(D)) {
8223     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
8224       << Attr << Attr.isRegularKeywordAttribute() << "variables";
8225     return false;
8226   }
8227   return true;
8228 }
8229 
8230 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8231   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8232     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8233   return false;
8234 }
8235 
8236 bool existsInTarget(const TargetInfo &Target) const override {
8237   const llvm::Triple &T = Target.getTriple(); (void)T;
8238   return true && ( !Target.getTriple().isOSzOS() );
8239 }
8240 
8241 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8242   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
8243 }
8244 
8245 bool isParamExpr(size_t N) const override {
8246   return false;
8247 }
8248 
8249 static const ParsedAttrInfoInitPriority Instance;
8250 };
8251 const ParsedAttrInfoInitPriority ParsedAttrInfoInitPriority::Instance;
8252 static constexpr ParsedAttrInfo::Spelling IntelOclBiccSpellings[] = {
8253   {AttributeCommonInfo::AS_GNU, "intel_ocl_bicc"},
8254   {AttributeCommonInfo::AS_CXX11, "clang::intel_ocl_bicc"},
8255 };
8256 struct ParsedAttrInfoIntelOclBicc final : public ParsedAttrInfo {
8257   constexpr ParsedAttrInfoIntelOclBicc() : ParsedAttrInfo(
8258     /*AttrKind=*/ParsedAttr::AT_IntelOclBicc,
8259     /*NumArgs=*/0,
8260     /*OptArgs=*/0,
8261     /*NumArgMembers=*/0,
8262     /*HasCustomParsing=*/0,
8263     /*AcceptsExprPack=*/0,
8264     /*IsTargetSpecific=*/0,
8265     /*IsType=*/1,
8266     /*IsStmt=*/0,
8267     /*IsKnownToGCC=*/0,
8268     /*IsSupportedByPragmaAttribute=*/0,
8269     /*Spellings=*/IntelOclBiccSpellings,
8270     /*ArgNames=*/{}) {}
8271 bool isParamExpr(size_t N) const override {
8272   return false;
8273 }
8274 
8275 static const ParsedAttrInfoIntelOclBicc Instance;
8276 };
8277 const ParsedAttrInfoIntelOclBicc ParsedAttrInfoIntelOclBicc::Instance;
8278 static constexpr ParsedAttrInfo::Spelling InternalLinkageSpellings[] = {
8279   {AttributeCommonInfo::AS_GNU, "internal_linkage"},
8280   {AttributeCommonInfo::AS_CXX11, "clang::internal_linkage"},
8281   {AttributeCommonInfo::AS_C23, "clang::internal_linkage"},
8282 };
8283 struct ParsedAttrInfoInternalLinkage final : public ParsedAttrInfo {
8284   constexpr ParsedAttrInfoInternalLinkage() : ParsedAttrInfo(
8285     /*AttrKind=*/ParsedAttr::AT_InternalLinkage,
8286     /*NumArgs=*/0,
8287     /*OptArgs=*/0,
8288     /*NumArgMembers=*/0,
8289     /*HasCustomParsing=*/0,
8290     /*AcceptsExprPack=*/0,
8291     /*IsTargetSpecific=*/0,
8292     /*IsType=*/0,
8293     /*IsStmt=*/0,
8294     /*IsKnownToGCC=*/0,
8295     /*IsSupportedByPragmaAttribute=*/1,
8296     /*Spellings=*/InternalLinkageSpellings,
8297     /*ArgNames=*/{}) {}
8298 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8299   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) {
8300     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8301       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, and classes";
8302     return false;
8303   }
8304   return true;
8305 }
8306 
8307 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8308   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8309     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8310   return false;
8311 }
8312 
8313   using ParsedAttrInfo::diagMutualExclusion;
8314 
8315   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
8316     if (const auto *A = D->getAttr<CommonAttr>()) {
8317       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
8318       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
8319 return false;
8320     }
8321     return true;
8322   }
8323 
8324 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8325   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
8326   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
8327   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
8328 }
8329 
8330 bool isParamExpr(size_t N) const override {
8331   return false;
8332 }
8333 
8334 static const ParsedAttrInfoInternalLinkage Instance;
8335 };
8336 const ParsedAttrInfoInternalLinkage ParsedAttrInfoInternalLinkage::Instance;
8337 static constexpr ParsedAttrInfo::Spelling LTOVisibilityPublicSpellings[] = {
8338   {AttributeCommonInfo::AS_GNU, "lto_visibility_public"},
8339   {AttributeCommonInfo::AS_CXX11, "clang::lto_visibility_public"},
8340   {AttributeCommonInfo::AS_C23, "clang::lto_visibility_public"},
8341 };
8342 struct ParsedAttrInfoLTOVisibilityPublic final : public ParsedAttrInfo {
8343   constexpr ParsedAttrInfoLTOVisibilityPublic() : ParsedAttrInfo(
8344     /*AttrKind=*/ParsedAttr::AT_LTOVisibilityPublic,
8345     /*NumArgs=*/0,
8346     /*OptArgs=*/0,
8347     /*NumArgMembers=*/0,
8348     /*HasCustomParsing=*/0,
8349     /*AcceptsExprPack=*/0,
8350     /*IsTargetSpecific=*/0,
8351     /*IsType=*/0,
8352     /*IsStmt=*/0,
8353     /*IsKnownToGCC=*/0,
8354     /*IsSupportedByPragmaAttribute=*/1,
8355     /*Spellings=*/LTOVisibilityPublicSpellings,
8356     /*ArgNames=*/{}) {}
8357 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8358   if (!isa<RecordDecl>(D)) {
8359     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8360       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
8361     return false;
8362   }
8363   return true;
8364 }
8365 
8366 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8367   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8368     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8369   return false;
8370 }
8371 
8372 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8373   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
8374 }
8375 
8376 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
8377   D->addAttr(::new (S.Context) LTOVisibilityPublicAttr(S.Context, Attr));
8378   return AttributeApplied;
8379 }
8380 
8381 bool isParamExpr(size_t N) const override {
8382   return false;
8383 }
8384 
8385 static const ParsedAttrInfoLTOVisibilityPublic Instance;
8386 };
8387 const ParsedAttrInfoLTOVisibilityPublic ParsedAttrInfoLTOVisibilityPublic::Instance;
8388 static constexpr ParsedAttrInfo::Spelling LayoutVersionSpellings[] = {
8389   {AttributeCommonInfo::AS_Declspec, "layout_version"},
8390 };
8391 static constexpr const char *LayoutVersionArgNames[] = {
8392 "Version",};
8393 struct ParsedAttrInfoLayoutVersion final : public ParsedAttrInfo {
8394   constexpr ParsedAttrInfoLayoutVersion() : ParsedAttrInfo(
8395     /*AttrKind=*/ParsedAttr::AT_LayoutVersion,
8396     /*NumArgs=*/1,
8397     /*OptArgs=*/0,
8398     /*NumArgMembers=*/1,
8399     /*HasCustomParsing=*/0,
8400     /*AcceptsExprPack=*/0,
8401     /*IsTargetSpecific=*/1,
8402     /*IsType=*/0,
8403     /*IsStmt=*/0,
8404     /*IsKnownToGCC=*/0,
8405     /*IsSupportedByPragmaAttribute=*/0,
8406     /*Spellings=*/LayoutVersionSpellings,
8407     /*ArgNames=*/LayoutVersionArgNames) {}
8408 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8409   if (!isa<CXXRecordDecl>(D)) {
8410     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8411       << Attr << Attr.isRegularKeywordAttribute() << "classes";
8412     return false;
8413   }
8414   return true;
8415 }
8416 
8417 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8418   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8419     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8420   return false;
8421 }
8422 
8423 bool existsInTarget(const TargetInfo &Target) const override {
8424   const llvm::Triple &T = Target.getTriple(); (void)T;
8425   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() );
8426 }
8427 
8428 bool isParamExpr(size_t N) const override {
8429   return false;
8430 }
8431 
8432 static const ParsedAttrInfoLayoutVersion Instance;
8433 };
8434 const ParsedAttrInfoLayoutVersion ParsedAttrInfoLayoutVersion::Instance;
8435 static constexpr ParsedAttrInfo::Spelling LeafSpellings[] = {
8436   {AttributeCommonInfo::AS_GNU, "leaf"},
8437   {AttributeCommonInfo::AS_CXX11, "gnu::leaf"},
8438   {AttributeCommonInfo::AS_C23, "gnu::leaf"},
8439 };
8440 struct ParsedAttrInfoLeaf final : public ParsedAttrInfo {
8441   constexpr ParsedAttrInfoLeaf() : ParsedAttrInfo(
8442     /*AttrKind=*/ParsedAttr::AT_Leaf,
8443     /*NumArgs=*/0,
8444     /*OptArgs=*/0,
8445     /*NumArgMembers=*/0,
8446     /*HasCustomParsing=*/0,
8447     /*AcceptsExprPack=*/0,
8448     /*IsTargetSpecific=*/0,
8449     /*IsType=*/0,
8450     /*IsStmt=*/0,
8451     /*IsKnownToGCC=*/1,
8452     /*IsSupportedByPragmaAttribute=*/1,
8453     /*Spellings=*/LeafSpellings,
8454     /*ArgNames=*/{}) {}
8455 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8456   if (!isa<FunctionDecl>(D)) {
8457     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8458       << Attr << Attr.isRegularKeywordAttribute() << "functions";
8459     return false;
8460   }
8461   return true;
8462 }
8463 
8464 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8465   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8466     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8467   return false;
8468 }
8469 
8470 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8471   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
8472 }
8473 
8474 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
8475   D->addAttr(::new (S.Context) LeafAttr(S.Context, Attr));
8476   return AttributeApplied;
8477 }
8478 
8479 bool isParamExpr(size_t N) const override {
8480   return false;
8481 }
8482 
8483 static const ParsedAttrInfoLeaf Instance;
8484 };
8485 const ParsedAttrInfoLeaf ParsedAttrInfoLeaf::Instance;
8486 static constexpr ParsedAttrInfo::Spelling LifetimeBoundSpellings[] = {
8487   {AttributeCommonInfo::AS_GNU, "lifetimebound"},
8488   {AttributeCommonInfo::AS_CXX11, "clang::lifetimebound"},
8489 };
8490 struct ParsedAttrInfoLifetimeBound final : public ParsedAttrInfo {
8491   constexpr ParsedAttrInfoLifetimeBound() : ParsedAttrInfo(
8492     /*AttrKind=*/ParsedAttr::AT_LifetimeBound,
8493     /*NumArgs=*/0,
8494     /*OptArgs=*/0,
8495     /*NumArgMembers=*/0,
8496     /*HasCustomParsing=*/0,
8497     /*AcceptsExprPack=*/0,
8498     /*IsTargetSpecific=*/0,
8499     /*IsType=*/1,
8500     /*IsStmt=*/0,
8501     /*IsKnownToGCC=*/0,
8502     /*IsSupportedByPragmaAttribute=*/0,
8503     /*Spellings=*/LifetimeBoundSpellings,
8504     /*ArgNames=*/{}) {}
8505 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8506   if (!isa<ParmVarDecl>(D) && !isImplicitObjectParameter(D)) {
8507     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
8508       << Attr << Attr.isRegularKeywordAttribute() << "parameters and implicit object parameters";
8509     return false;
8510   }
8511   return true;
8512 }
8513 
8514 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8515   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8516     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8517   return false;
8518 }
8519 
8520 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
8521   D->addAttr(::new (S.Context) LifetimeBoundAttr(S.Context, Attr));
8522   return AttributeApplied;
8523 }
8524 
8525 bool isParamExpr(size_t N) const override {
8526   return false;
8527 }
8528 
8529 static const ParsedAttrInfoLifetimeBound Instance;
8530 };
8531 const ParsedAttrInfoLifetimeBound ParsedAttrInfoLifetimeBound::Instance;
8532 static constexpr ParsedAttrInfo::Spelling LifetimeCaptureBySpellings[] = {
8533   {AttributeCommonInfo::AS_GNU, "lifetime_capture_by"},
8534   {AttributeCommonInfo::AS_CXX11, "clang::lifetime_capture_by"},
8535 };
8536 static constexpr const char *LifetimeCaptureByArgNames[] = {
8537 "Params...",};
8538 struct ParsedAttrInfoLifetimeCaptureBy final : public ParsedAttrInfo {
8539   constexpr ParsedAttrInfoLifetimeCaptureBy() : ParsedAttrInfo(
8540     /*AttrKind=*/ParsedAttr::AT_LifetimeCaptureBy,
8541     /*NumArgs=*/0,
8542     /*OptArgs=*/15,
8543     /*NumArgMembers=*/1,
8544     /*HasCustomParsing=*/0,
8545     /*AcceptsExprPack=*/0,
8546     /*IsTargetSpecific=*/0,
8547     /*IsType=*/1,
8548     /*IsStmt=*/0,
8549     /*IsKnownToGCC=*/0,
8550     /*IsSupportedByPragmaAttribute=*/0,
8551     /*Spellings=*/LifetimeCaptureBySpellings,
8552     /*ArgNames=*/LifetimeCaptureByArgNames) {}
8553 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8554   if (!isa<ParmVarDecl>(D) && !isImplicitObjectParameter(D)) {
8555     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
8556       << Attr << Attr.isRegularKeywordAttribute() << "parameters and implicit object parameters";
8557     return false;
8558   }
8559   return true;
8560 }
8561 
8562 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8563   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8564     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8565   return false;
8566 }
8567 
8568 bool isParamExpr(size_t N) const override {
8569   return false;
8570 }
8571 
8572 static const ParsedAttrInfoLifetimeCaptureBy Instance;
8573 };
8574 const ParsedAttrInfoLifetimeCaptureBy ParsedAttrInfoLifetimeCaptureBy::Instance;
8575 static constexpr ParsedAttrInfo::Spelling LikelySpellings[] = {
8576   {AttributeCommonInfo::AS_CXX11, "likely"},
8577   {AttributeCommonInfo::AS_C23, "clang::likely"},
8578 };
8579 struct ParsedAttrInfoLikely final : public ParsedAttrInfo {
8580   constexpr ParsedAttrInfoLikely() : ParsedAttrInfo(
8581     /*AttrKind=*/ParsedAttr::AT_Likely,
8582     /*NumArgs=*/0,
8583     /*OptArgs=*/0,
8584     /*NumArgMembers=*/0,
8585     /*HasCustomParsing=*/0,
8586     /*AcceptsExprPack=*/0,
8587     /*IsTargetSpecific=*/0,
8588     /*IsType=*/0,
8589     /*IsStmt=*/1,
8590     /*IsKnownToGCC=*/0,
8591     /*IsSupportedByPragmaAttribute=*/0,
8592     /*Spellings=*/LikelySpellings,
8593     /*ArgNames=*/{}) {}
8594   using ParsedAttrInfo::diagMutualExclusion;
8595 
8596 bool isParamExpr(size_t N) const override {
8597   return false;
8598 }
8599 
8600 static const ParsedAttrInfoLikely Instance;
8601 };
8602 const ParsedAttrInfoLikely ParsedAttrInfoLikely::Instance;
8603 static constexpr ParsedAttrInfo::Spelling LoaderUninitializedSpellings[] = {
8604   {AttributeCommonInfo::AS_GNU, "loader_uninitialized"},
8605   {AttributeCommonInfo::AS_CXX11, "clang::loader_uninitialized"},
8606   {AttributeCommonInfo::AS_C23, "clang::loader_uninitialized"},
8607 };
8608 struct ParsedAttrInfoLoaderUninitialized final : public ParsedAttrInfo {
8609   constexpr ParsedAttrInfoLoaderUninitialized() : ParsedAttrInfo(
8610     /*AttrKind=*/ParsedAttr::AT_LoaderUninitialized,
8611     /*NumArgs=*/0,
8612     /*OptArgs=*/0,
8613     /*NumArgMembers=*/0,
8614     /*HasCustomParsing=*/0,
8615     /*AcceptsExprPack=*/0,
8616     /*IsTargetSpecific=*/0,
8617     /*IsType=*/0,
8618     /*IsStmt=*/0,
8619     /*IsKnownToGCC=*/0,
8620     /*IsSupportedByPragmaAttribute=*/1,
8621     /*Spellings=*/LoaderUninitializedSpellings,
8622     /*ArgNames=*/{}) {}
8623 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8624   if (!isGlobalVar(D)) {
8625     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8626       << Attr << Attr.isRegularKeywordAttribute() << "global variables";
8627     return false;
8628   }
8629   return true;
8630 }
8631 
8632 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8633   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8634     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8635   return false;
8636 }
8637 
8638 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8639   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
8640 }
8641 
8642 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
8643   D->addAttr(::new (S.Context) LoaderUninitializedAttr(S.Context, Attr));
8644   return AttributeApplied;
8645 }
8646 
8647 bool isParamExpr(size_t N) const override {
8648   return false;
8649 }
8650 
8651 static const ParsedAttrInfoLoaderUninitialized Instance;
8652 };
8653 const ParsedAttrInfoLoaderUninitialized ParsedAttrInfoLoaderUninitialized::Instance;
8654 static constexpr ParsedAttrInfo::Spelling LockReturnedSpellings[] = {
8655   {AttributeCommonInfo::AS_GNU, "lock_returned"},
8656 };
8657 static constexpr const char *LockReturnedArgNames[] = {
8658 "Arg",};
8659 struct ParsedAttrInfoLockReturned final : public ParsedAttrInfo {
8660   constexpr ParsedAttrInfoLockReturned() : ParsedAttrInfo(
8661     /*AttrKind=*/ParsedAttr::AT_LockReturned,
8662     /*NumArgs=*/1,
8663     /*OptArgs=*/0,
8664     /*NumArgMembers=*/1,
8665     /*HasCustomParsing=*/0,
8666     /*AcceptsExprPack=*/0,
8667     /*IsTargetSpecific=*/0,
8668     /*IsType=*/0,
8669     /*IsStmt=*/0,
8670     /*IsKnownToGCC=*/0,
8671     /*IsSupportedByPragmaAttribute=*/0,
8672     /*Spellings=*/LockReturnedSpellings,
8673     /*ArgNames=*/LockReturnedArgNames) {}
8674 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8675   if (!isa<FunctionDecl>(D)) {
8676     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8677       << Attr << Attr.isRegularKeywordAttribute() << "functions";
8678     return false;
8679   }
8680   return true;
8681 }
8682 
8683 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8684   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8685     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8686   return false;
8687 }
8688 
8689 bool isParamExpr(size_t N) const override {
8690   return (N == 0) || false;
8691 }
8692 
8693 static const ParsedAttrInfoLockReturned Instance;
8694 };
8695 const ParsedAttrInfoLockReturned ParsedAttrInfoLockReturned::Instance;
8696 static constexpr ParsedAttrInfo::Spelling LockableSpellings[] = {
8697   {AttributeCommonInfo::AS_GNU, "lockable"},
8698 };
8699 struct ParsedAttrInfoLockable final : public ParsedAttrInfo {
8700   constexpr ParsedAttrInfoLockable() : ParsedAttrInfo(
8701     /*AttrKind=*/ParsedAttr::AT_Lockable,
8702     /*NumArgs=*/0,
8703     /*OptArgs=*/0,
8704     /*NumArgMembers=*/0,
8705     /*HasCustomParsing=*/0,
8706     /*AcceptsExprPack=*/0,
8707     /*IsTargetSpecific=*/0,
8708     /*IsType=*/0,
8709     /*IsStmt=*/0,
8710     /*IsKnownToGCC=*/0,
8711     /*IsSupportedByPragmaAttribute=*/1,
8712     /*Spellings=*/LockableSpellings,
8713     /*ArgNames=*/{}) {}
8714 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8715   if (!isa<RecordDecl>(D)) {
8716     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8717       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
8718     return false;
8719   }
8720   return true;
8721 }
8722 
8723 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8724   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8725     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8726   return false;
8727 }
8728 
8729 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8730   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
8731 }
8732 
8733 bool isParamExpr(size_t N) const override {
8734   return false;
8735 }
8736 
8737 static const ParsedAttrInfoLockable Instance;
8738 };
8739 const ParsedAttrInfoLockable ParsedAttrInfoLockable::Instance;
8740 static constexpr ParsedAttrInfo::Spelling LocksExcludedSpellings[] = {
8741   {AttributeCommonInfo::AS_GNU, "locks_excluded"},
8742 };
8743 static constexpr const char *LocksExcludedArgNames[] = {
8744 "Args...",};
8745 struct ParsedAttrInfoLocksExcluded final : public ParsedAttrInfo {
8746   constexpr ParsedAttrInfoLocksExcluded() : ParsedAttrInfo(
8747     /*AttrKind=*/ParsedAttr::AT_LocksExcluded,
8748     /*NumArgs=*/0,
8749     /*OptArgs=*/15,
8750     /*NumArgMembers=*/1,
8751     /*HasCustomParsing=*/0,
8752     /*AcceptsExprPack=*/0,
8753     /*IsTargetSpecific=*/0,
8754     /*IsType=*/0,
8755     /*IsStmt=*/0,
8756     /*IsKnownToGCC=*/0,
8757     /*IsSupportedByPragmaAttribute=*/0,
8758     /*Spellings=*/LocksExcludedSpellings,
8759     /*ArgNames=*/LocksExcludedArgNames) {}
8760 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8761   if (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D)) {
8762     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8763       << Attr << Attr.isRegularKeywordAttribute() << "functions and parameters";
8764     return false;
8765   }
8766   return true;
8767 }
8768 
8769 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8770   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8771     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8772   return false;
8773 }
8774 
8775 bool isParamExpr(size_t N) const override {
8776   return (N == 0) || false;
8777 }
8778 
8779 static const ParsedAttrInfoLocksExcluded Instance;
8780 };
8781 const ParsedAttrInfoLocksExcluded ParsedAttrInfoLocksExcluded::Instance;
8782 static constexpr ParsedAttrInfo::Spelling LoopHintSpellings[] = {
8783   {AttributeCommonInfo::AS_Pragma, "clang::loop"},
8784   {AttributeCommonInfo::AS_Pragma, "unroll"},
8785   {AttributeCommonInfo::AS_Pragma, "nounroll"},
8786   {AttributeCommonInfo::AS_Pragma, "unroll_and_jam"},
8787   {AttributeCommonInfo::AS_Pragma, "nounroll_and_jam"},
8788 };
8789 static constexpr const char *LoopHintArgNames[] = {
8790 "Option","State","Value",};
8791 struct ParsedAttrInfoLoopHint final : public ParsedAttrInfo {
8792   constexpr ParsedAttrInfoLoopHint() : ParsedAttrInfo(
8793     /*AttrKind=*/ParsedAttr::AT_LoopHint,
8794     /*NumArgs=*/3,
8795     /*OptArgs=*/0,
8796     /*NumArgMembers=*/3,
8797     /*HasCustomParsing=*/1,
8798     /*AcceptsExprPack=*/0,
8799     /*IsTargetSpecific=*/0,
8800     /*IsType=*/0,
8801     /*IsStmt=*/0,
8802     /*IsKnownToGCC=*/0,
8803     /*IsSupportedByPragmaAttribute=*/0,
8804     /*Spellings=*/LoopHintSpellings,
8805     /*ArgNames=*/LoopHintArgNames) {}
8806 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
8807   enum Spelling {
8808     Pragma_clang_loop = 0,
8809     Pragma_unroll = 1,
8810     Pragma_nounroll = 2,
8811     Pragma_unroll_and_jam = 3,
8812     Pragma_nounroll_and_jam = 4,
8813   SpellingNotCalculated = 15
8814 
8815   };
8816 
8817   unsigned Idx = Attr.getAttributeSpellingListIndex();
8818   switch (Idx) {
8819     default: llvm_unreachable("Unknown spelling list index");
8820     case 0: return Pragma_clang_loop;
8821     case 1: return Pragma_unroll;
8822     case 2: return Pragma_nounroll;
8823     case 3: return Pragma_unroll_and_jam;
8824     case 4: return Pragma_nounroll_and_jam;
8825   }
8826 }
8827 
8828 bool isParamExpr(size_t N) const override {
8829   return (N == 2) || false;
8830 }
8831 
8832 static const ParsedAttrInfoLoopHint Instance;
8833 };
8834 const ParsedAttrInfoLoopHint ParsedAttrInfoLoopHint::Instance;
8835 static constexpr ParsedAttrInfo::Spelling M68kRTDSpellings[] = {
8836   {AttributeCommonInfo::AS_GNU, "m68k_rtd"},
8837   {AttributeCommonInfo::AS_CXX11, "clang::m68k_rtd"},
8838   {AttributeCommonInfo::AS_C23, "clang::m68k_rtd"},
8839 };
8840 struct ParsedAttrInfoM68kRTD final : public ParsedAttrInfo {
8841   constexpr ParsedAttrInfoM68kRTD() : ParsedAttrInfo(
8842     /*AttrKind=*/ParsedAttr::AT_M68kRTD,
8843     /*NumArgs=*/0,
8844     /*OptArgs=*/0,
8845     /*NumArgMembers=*/0,
8846     /*HasCustomParsing=*/0,
8847     /*AcceptsExprPack=*/0,
8848     /*IsTargetSpecific=*/0,
8849     /*IsType=*/1,
8850     /*IsStmt=*/0,
8851     /*IsKnownToGCC=*/0,
8852     /*IsSupportedByPragmaAttribute=*/0,
8853     /*Spellings=*/M68kRTDSpellings,
8854     /*ArgNames=*/{}) {}
8855 bool isParamExpr(size_t N) const override {
8856   return false;
8857 }
8858 
8859 static const ParsedAttrInfoM68kRTD Instance;
8860 };
8861 const ParsedAttrInfoM68kRTD ParsedAttrInfoM68kRTD::Instance;
8862 static constexpr ParsedAttrInfo::Spelling MIGServerRoutineSpellings[] = {
8863   {AttributeCommonInfo::AS_GNU, "mig_server_routine"},
8864   {AttributeCommonInfo::AS_CXX11, "clang::mig_server_routine"},
8865   {AttributeCommonInfo::AS_C23, "clang::mig_server_routine"},
8866 };
8867 struct ParsedAttrInfoMIGServerRoutine final : public ParsedAttrInfo {
8868   constexpr ParsedAttrInfoMIGServerRoutine() : ParsedAttrInfo(
8869     /*AttrKind=*/ParsedAttr::AT_MIGServerRoutine,
8870     /*NumArgs=*/0,
8871     /*OptArgs=*/0,
8872     /*NumArgMembers=*/0,
8873     /*HasCustomParsing=*/0,
8874     /*AcceptsExprPack=*/0,
8875     /*IsTargetSpecific=*/0,
8876     /*IsType=*/0,
8877     /*IsStmt=*/0,
8878     /*IsKnownToGCC=*/0,
8879     /*IsSupportedByPragmaAttribute=*/1,
8880     /*Spellings=*/MIGServerRoutineSpellings,
8881     /*ArgNames=*/{}) {}
8882 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8883   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<BlockDecl>(D)) {
8884     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8885       << Attr << Attr.isRegularKeywordAttribute() << "functions, Objective-C methods, and blocks";
8886     return false;
8887   }
8888   return true;
8889 }
8890 
8891 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8892   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8893     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8894   return false;
8895 }
8896 
8897 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
8898   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
8899   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
8900   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_block, /*IsSupported=*/LangOpts.Blocks));
8901 }
8902 
8903 bool isParamExpr(size_t N) const override {
8904   return false;
8905 }
8906 
8907 static const ParsedAttrInfoMIGServerRoutine Instance;
8908 };
8909 const ParsedAttrInfoMIGServerRoutine ParsedAttrInfoMIGServerRoutine::Instance;
8910 static constexpr ParsedAttrInfo::Spelling MSABISpellings[] = {
8911   {AttributeCommonInfo::AS_GNU, "ms_abi"},
8912   {AttributeCommonInfo::AS_CXX11, "gnu::ms_abi"},
8913   {AttributeCommonInfo::AS_C23, "gnu::ms_abi"},
8914 };
8915 struct ParsedAttrInfoMSABI final : public ParsedAttrInfo {
8916   constexpr ParsedAttrInfoMSABI() : ParsedAttrInfo(
8917     /*AttrKind=*/ParsedAttr::AT_MSABI,
8918     /*NumArgs=*/0,
8919     /*OptArgs=*/0,
8920     /*NumArgMembers=*/0,
8921     /*HasCustomParsing=*/0,
8922     /*AcceptsExprPack=*/0,
8923     /*IsTargetSpecific=*/0,
8924     /*IsType=*/1,
8925     /*IsStmt=*/0,
8926     /*IsKnownToGCC=*/1,
8927     /*IsSupportedByPragmaAttribute=*/0,
8928     /*Spellings=*/MSABISpellings,
8929     /*ArgNames=*/{}) {}
8930 bool isParamExpr(size_t N) const override {
8931   return false;
8932 }
8933 
8934 static const ParsedAttrInfoMSABI Instance;
8935 };
8936 const ParsedAttrInfoMSABI ParsedAttrInfoMSABI::Instance;
8937 static constexpr ParsedAttrInfo::Spelling MSAllocatorSpellings[] = {
8938   {AttributeCommonInfo::AS_Declspec, "allocator"},
8939 };
8940 struct ParsedAttrInfoMSAllocator final : public ParsedAttrInfo {
8941   constexpr ParsedAttrInfoMSAllocator() : ParsedAttrInfo(
8942     /*AttrKind=*/ParsedAttr::AT_MSAllocator,
8943     /*NumArgs=*/0,
8944     /*OptArgs=*/0,
8945     /*NumArgMembers=*/0,
8946     /*HasCustomParsing=*/0,
8947     /*AcceptsExprPack=*/0,
8948     /*IsTargetSpecific=*/0,
8949     /*IsType=*/0,
8950     /*IsStmt=*/0,
8951     /*IsKnownToGCC=*/0,
8952     /*IsSupportedByPragmaAttribute=*/0,
8953     /*Spellings=*/MSAllocatorSpellings,
8954     /*ArgNames=*/{}) {}
8955 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8956   if (!isa<FunctionDecl>(D)) {
8957     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
8958       << Attr << Attr.isRegularKeywordAttribute() << "functions";
8959     return false;
8960   }
8961   return true;
8962 }
8963 
8964 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
8965   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
8966     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
8967   return false;
8968 }
8969 
8970 bool isParamExpr(size_t N) const override {
8971   return false;
8972 }
8973 
8974 static const ParsedAttrInfoMSAllocator Instance;
8975 };
8976 const ParsedAttrInfoMSAllocator ParsedAttrInfoMSAllocator::Instance;
8977 static constexpr ParsedAttrInfo::Spelling MSConstexprSpellings[] = {
8978   {AttributeCommonInfo::AS_CXX11, "msvc::constexpr"},
8979 };
8980 struct ParsedAttrInfoMSConstexpr final : public ParsedAttrInfo {
8981   constexpr ParsedAttrInfoMSConstexpr() : ParsedAttrInfo(
8982     /*AttrKind=*/ParsedAttr::AT_MSConstexpr,
8983     /*NumArgs=*/0,
8984     /*OptArgs=*/0,
8985     /*NumArgMembers=*/0,
8986     /*HasCustomParsing=*/0,
8987     /*AcceptsExprPack=*/0,
8988     /*IsTargetSpecific=*/0,
8989     /*IsType=*/0,
8990     /*IsStmt=*/0,
8991     /*IsKnownToGCC=*/0,
8992     /*IsSupportedByPragmaAttribute=*/1,
8993     /*Spellings=*/MSConstexprSpellings,
8994     /*ArgNames=*/{}) {}
8995 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
8996   if (!isa<FunctionDecl>(D)) {
8997     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
8998       << Attr << Attr.isRegularKeywordAttribute() << "functions and return statements";
8999     return false;
9000   }
9001   return true;
9002 }
9003 
9004 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
9005   if (!isa<ReturnStmt>(St)) {
9006     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9007       << Attr << Attr.isRegularKeywordAttribute() << "functions and return statements";
9008     return false;
9009   }
9010   return true;
9011 }
9012 
9013 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
9014   return LangOpts.MicrosoftExt;
9015 }
9016 
9017 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9018   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9019 }
9020 
9021 bool isParamExpr(size_t N) const override {
9022   return false;
9023 }
9024 
9025 static const ParsedAttrInfoMSConstexpr Instance;
9026 };
9027 const ParsedAttrInfoMSConstexpr ParsedAttrInfoMSConstexpr::Instance;
9028 static constexpr ParsedAttrInfo::Spelling MSInheritanceSpellings[] = {
9029   {AttributeCommonInfo::AS_Keyword, "__single_inheritance"},
9030   {AttributeCommonInfo::AS_Keyword, "__multiple_inheritance"},
9031   {AttributeCommonInfo::AS_Keyword, "__virtual_inheritance"},
9032   {AttributeCommonInfo::AS_Keyword, "__unspecified_inheritance"},
9033 };
9034 struct ParsedAttrInfoMSInheritance final : public ParsedAttrInfo {
9035   constexpr ParsedAttrInfoMSInheritance() : ParsedAttrInfo(
9036     /*AttrKind=*/ParsedAttr::AT_MSInheritance,
9037     /*NumArgs=*/0,
9038     /*OptArgs=*/0,
9039     /*NumArgMembers=*/0,
9040     /*HasCustomParsing=*/0,
9041     /*AcceptsExprPack=*/0,
9042     /*IsTargetSpecific=*/0,
9043     /*IsType=*/0,
9044     /*IsStmt=*/0,
9045     /*IsKnownToGCC=*/0,
9046     /*IsSupportedByPragmaAttribute=*/0,
9047     /*Spellings=*/MSInheritanceSpellings,
9048     /*ArgNames=*/{}) {}
9049 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
9050   return LangOpts.MicrosoftExt;
9051 }
9052 
9053 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
9054   enum Spelling {
9055     Keyword_single_inheritance = 0,
9056     Keyword_multiple_inheritance = 1,
9057     Keyword_virtual_inheritance = 2,
9058     Keyword_unspecified_inheritance = 3,
9059   SpellingNotCalculated = 15
9060 
9061   };
9062 
9063   unsigned Idx = Attr.getAttributeSpellingListIndex();
9064   switch (Idx) {
9065     default: llvm_unreachable("Unknown spelling list index");
9066     case 0: return Keyword_single_inheritance;
9067     case 1: return Keyword_multiple_inheritance;
9068     case 2: return Keyword_virtual_inheritance;
9069     case 3: return Keyword_unspecified_inheritance;
9070   }
9071 }
9072 
9073 bool isParamExpr(size_t N) const override {
9074   return false;
9075 }
9076 
9077 static const ParsedAttrInfoMSInheritance Instance;
9078 };
9079 const ParsedAttrInfoMSInheritance ParsedAttrInfoMSInheritance::Instance;
9080 static constexpr ParsedAttrInfo::Spelling MSNoVTableSpellings[] = {
9081   {AttributeCommonInfo::AS_Declspec, "novtable"},
9082 };
9083 struct ParsedAttrInfoMSNoVTable final : public ParsedAttrInfo {
9084   constexpr ParsedAttrInfoMSNoVTable() : ParsedAttrInfo(
9085     /*AttrKind=*/ParsedAttr::AT_MSNoVTable,
9086     /*NumArgs=*/0,
9087     /*OptArgs=*/0,
9088     /*NumArgMembers=*/0,
9089     /*HasCustomParsing=*/0,
9090     /*AcceptsExprPack=*/0,
9091     /*IsTargetSpecific=*/1,
9092     /*IsType=*/0,
9093     /*IsStmt=*/0,
9094     /*IsKnownToGCC=*/0,
9095     /*IsSupportedByPragmaAttribute=*/0,
9096     /*Spellings=*/MSNoVTableSpellings,
9097     /*ArgNames=*/{}) {}
9098 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9099   if (!isa<CXXRecordDecl>(D)) {
9100     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9101       << Attr << Attr.isRegularKeywordAttribute() << "classes";
9102     return false;
9103   }
9104   return true;
9105 }
9106 
9107 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9108   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9109     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9110   return false;
9111 }
9112 
9113 bool existsInTarget(const TargetInfo &Target) const override {
9114   const llvm::Triple &T = Target.getTriple(); (void)T;
9115   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() );
9116 }
9117 
9118 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9119   D->addAttr(::new (S.Context) MSNoVTableAttr(S.Context, Attr));
9120   return AttributeApplied;
9121 }
9122 
9123 bool isParamExpr(size_t N) const override {
9124   return false;
9125 }
9126 
9127 static const ParsedAttrInfoMSNoVTable Instance;
9128 };
9129 const ParsedAttrInfoMSNoVTable ParsedAttrInfoMSNoVTable::Instance;
9130 static constexpr ParsedAttrInfo::Spelling MSStructSpellings[] = {
9131   {AttributeCommonInfo::AS_GNU, "ms_struct"},
9132   {AttributeCommonInfo::AS_CXX11, "gnu::ms_struct"},
9133   {AttributeCommonInfo::AS_C23, "gnu::ms_struct"},
9134 };
9135 struct ParsedAttrInfoMSStruct final : public ParsedAttrInfo {
9136   constexpr ParsedAttrInfoMSStruct() : ParsedAttrInfo(
9137     /*AttrKind=*/ParsedAttr::AT_MSStruct,
9138     /*NumArgs=*/0,
9139     /*OptArgs=*/0,
9140     /*NumArgMembers=*/0,
9141     /*HasCustomParsing=*/0,
9142     /*AcceptsExprPack=*/0,
9143     /*IsTargetSpecific=*/0,
9144     /*IsType=*/0,
9145     /*IsStmt=*/0,
9146     /*IsKnownToGCC=*/1,
9147     /*IsSupportedByPragmaAttribute=*/1,
9148     /*Spellings=*/MSStructSpellings,
9149     /*ArgNames=*/{}) {}
9150 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9151   if (!isa<RecordDecl>(D)) {
9152     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9153       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
9154     return false;
9155   }
9156   return true;
9157 }
9158 
9159 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9160   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9161     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9162   return false;
9163 }
9164 
9165 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9166   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
9167 }
9168 
9169 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9170   D->addAttr(::new (S.Context) MSStructAttr(S.Context, Attr));
9171   return AttributeApplied;
9172 }
9173 
9174 bool isParamExpr(size_t N) const override {
9175   return false;
9176 }
9177 
9178 static const ParsedAttrInfoMSStruct Instance;
9179 };
9180 const ParsedAttrInfoMSStruct ParsedAttrInfoMSStruct::Instance;
9181 static constexpr ParsedAttrInfo::Spelling MatrixTypeSpellings[] = {
9182   {AttributeCommonInfo::AS_GNU, "matrix_type"},
9183   {AttributeCommonInfo::AS_CXX11, "clang::matrix_type"},
9184   {AttributeCommonInfo::AS_C23, "clang::matrix_type"},
9185 };
9186 static constexpr const char *MatrixTypeArgNames[] = {
9187 "NumRows","NumColumns",};
9188 struct ParsedAttrInfoMatrixType final : public ParsedAttrInfo {
9189   constexpr ParsedAttrInfoMatrixType() : ParsedAttrInfo(
9190     /*AttrKind=*/ParsedAttr::AT_MatrixType,
9191     /*NumArgs=*/2,
9192     /*OptArgs=*/0,
9193     /*NumArgMembers=*/2,
9194     /*HasCustomParsing=*/0,
9195     /*AcceptsExprPack=*/0,
9196     /*IsTargetSpecific=*/0,
9197     /*IsType=*/1,
9198     /*IsStmt=*/0,
9199     /*IsKnownToGCC=*/0,
9200     /*IsSupportedByPragmaAttribute=*/0,
9201     /*Spellings=*/MatrixTypeSpellings,
9202     /*ArgNames=*/MatrixTypeArgNames) {}
9203 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9204   if (!isa<TypedefNameDecl>(D)) {
9205     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9206       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
9207     return false;
9208   }
9209   return true;
9210 }
9211 
9212 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9213   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9214     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9215   return false;
9216 }
9217 
9218 bool isParamExpr(size_t N) const override {
9219   return (N == 0) || (N == 1) || false;
9220 }
9221 
9222 static const ParsedAttrInfoMatrixType Instance;
9223 };
9224 const ParsedAttrInfoMatrixType ParsedAttrInfoMatrixType::Instance;
9225 static constexpr ParsedAttrInfo::Spelling MayAliasSpellings[] = {
9226   {AttributeCommonInfo::AS_GNU, "may_alias"},
9227   {AttributeCommonInfo::AS_CXX11, "gnu::may_alias"},
9228   {AttributeCommonInfo::AS_C23, "gnu::may_alias"},
9229 };
9230 struct ParsedAttrInfoMayAlias final : public ParsedAttrInfo {
9231   constexpr ParsedAttrInfoMayAlias() : ParsedAttrInfo(
9232     /*AttrKind=*/ParsedAttr::AT_MayAlias,
9233     /*NumArgs=*/0,
9234     /*OptArgs=*/0,
9235     /*NumArgMembers=*/0,
9236     /*HasCustomParsing=*/0,
9237     /*AcceptsExprPack=*/0,
9238     /*IsTargetSpecific=*/0,
9239     /*IsType=*/0,
9240     /*IsStmt=*/0,
9241     /*IsKnownToGCC=*/1,
9242     /*IsSupportedByPragmaAttribute=*/0,
9243     /*Spellings=*/MayAliasSpellings,
9244     /*ArgNames=*/{}) {}
9245 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9246   D->addAttr(::new (S.Context) MayAliasAttr(S.Context, Attr));
9247   return AttributeApplied;
9248 }
9249 
9250 bool isParamExpr(size_t N) const override {
9251   return false;
9252 }
9253 
9254 static const ParsedAttrInfoMayAlias Instance;
9255 };
9256 const ParsedAttrInfoMayAlias ParsedAttrInfoMayAlias::Instance;
9257 static constexpr ParsedAttrInfo::Spelling MaybeUndefSpellings[] = {
9258   {AttributeCommonInfo::AS_GNU, "maybe_undef"},
9259   {AttributeCommonInfo::AS_CXX11, "clang::maybe_undef"},
9260   {AttributeCommonInfo::AS_C23, "clang::maybe_undef"},
9261 };
9262 struct ParsedAttrInfoMaybeUndef final : public ParsedAttrInfo {
9263   constexpr ParsedAttrInfoMaybeUndef() : ParsedAttrInfo(
9264     /*AttrKind=*/ParsedAttr::AT_MaybeUndef,
9265     /*NumArgs=*/0,
9266     /*OptArgs=*/0,
9267     /*NumArgMembers=*/0,
9268     /*HasCustomParsing=*/0,
9269     /*AcceptsExprPack=*/0,
9270     /*IsTargetSpecific=*/0,
9271     /*IsType=*/0,
9272     /*IsStmt=*/0,
9273     /*IsKnownToGCC=*/0,
9274     /*IsSupportedByPragmaAttribute=*/1,
9275     /*Spellings=*/MaybeUndefSpellings,
9276     /*ArgNames=*/{}) {}
9277 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9278   if (!isa<ParmVarDecl>(D)) {
9279     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9280       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
9281     return false;
9282   }
9283   return true;
9284 }
9285 
9286 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9287   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9288     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9289   return false;
9290 }
9291 
9292 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9293   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
9294 }
9295 
9296 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9297   D->addAttr(::new (S.Context) MaybeUndefAttr(S.Context, Attr));
9298   return AttributeApplied;
9299 }
9300 
9301 bool isParamExpr(size_t N) const override {
9302   return false;
9303 }
9304 
9305 static const ParsedAttrInfoMaybeUndef Instance;
9306 };
9307 const ParsedAttrInfoMaybeUndef ParsedAttrInfoMaybeUndef::Instance;
9308 static constexpr ParsedAttrInfo::Spelling MicroMipsSpellings[] = {
9309   {AttributeCommonInfo::AS_GNU, "micromips"},
9310   {AttributeCommonInfo::AS_CXX11, "gnu::micromips"},
9311   {AttributeCommonInfo::AS_C23, "gnu::micromips"},
9312 };
9313 struct ParsedAttrInfoMicroMips final : public ParsedAttrInfo {
9314   constexpr ParsedAttrInfoMicroMips() : ParsedAttrInfo(
9315     /*AttrKind=*/ParsedAttr::AT_MicroMips,
9316     /*NumArgs=*/0,
9317     /*OptArgs=*/0,
9318     /*NumArgMembers=*/0,
9319     /*HasCustomParsing=*/0,
9320     /*AcceptsExprPack=*/0,
9321     /*IsTargetSpecific=*/1,
9322     /*IsType=*/0,
9323     /*IsStmt=*/0,
9324     /*IsKnownToGCC=*/1,
9325     /*IsSupportedByPragmaAttribute=*/1,
9326     /*Spellings=*/MicroMipsSpellings,
9327     /*ArgNames=*/{}) {}
9328 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9329   if (!isa<FunctionDecl>(D)) {
9330     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9331       << Attr << Attr.isRegularKeywordAttribute() << "functions";
9332     return false;
9333   }
9334   return true;
9335 }
9336 
9337 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9338   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9339     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9340   return false;
9341 }
9342 
9343   using ParsedAttrInfo::diagMutualExclusion;
9344 
9345   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
9346     if (const auto *A = D->getAttr<Mips16Attr>()) {
9347       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
9348       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
9349 return false;
9350     }
9351     return true;
9352   }
9353 
9354 bool existsInTarget(const TargetInfo &Target) const override {
9355   const llvm::Triple &T = Target.getTriple(); (void)T;
9356   return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel);
9357 }
9358 
9359 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9360   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9361 }
9362 
9363 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9364   D->addAttr(::new (S.Context) MicroMipsAttr(S.Context, Attr));
9365   return AttributeApplied;
9366 }
9367 
9368 bool isParamExpr(size_t N) const override {
9369   return false;
9370 }
9371 
9372 static const ParsedAttrInfoMicroMips Instance;
9373 };
9374 const ParsedAttrInfoMicroMips ParsedAttrInfoMicroMips::Instance;
9375 static constexpr ParsedAttrInfo::Spelling MinSizeSpellings[] = {
9376   {AttributeCommonInfo::AS_GNU, "minsize"},
9377   {AttributeCommonInfo::AS_CXX11, "clang::minsize"},
9378   {AttributeCommonInfo::AS_C23, "clang::minsize"},
9379 };
9380 struct ParsedAttrInfoMinSize final : public ParsedAttrInfo {
9381   constexpr ParsedAttrInfoMinSize() : ParsedAttrInfo(
9382     /*AttrKind=*/ParsedAttr::AT_MinSize,
9383     /*NumArgs=*/0,
9384     /*OptArgs=*/0,
9385     /*NumArgMembers=*/0,
9386     /*HasCustomParsing=*/0,
9387     /*AcceptsExprPack=*/0,
9388     /*IsTargetSpecific=*/0,
9389     /*IsType=*/0,
9390     /*IsStmt=*/0,
9391     /*IsKnownToGCC=*/0,
9392     /*IsSupportedByPragmaAttribute=*/1,
9393     /*Spellings=*/MinSizeSpellings,
9394     /*ArgNames=*/{}) {}
9395 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9396   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
9397     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9398       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
9399     return false;
9400   }
9401   return true;
9402 }
9403 
9404 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9405   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9406     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9407   return false;
9408 }
9409 
9410 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9411   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9412   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
9413 }
9414 
9415 bool isParamExpr(size_t N) const override {
9416   return false;
9417 }
9418 
9419 static const ParsedAttrInfoMinSize Instance;
9420 };
9421 const ParsedAttrInfoMinSize ParsedAttrInfoMinSize::Instance;
9422 static constexpr ParsedAttrInfo::Spelling MinVectorWidthSpellings[] = {
9423   {AttributeCommonInfo::AS_GNU, "min_vector_width"},
9424   {AttributeCommonInfo::AS_CXX11, "clang::min_vector_width"},
9425   {AttributeCommonInfo::AS_C23, "clang::min_vector_width"},
9426 };
9427 static constexpr const char *MinVectorWidthArgNames[] = {
9428 "VectorWidth",};
9429 struct ParsedAttrInfoMinVectorWidth final : public ParsedAttrInfo {
9430   constexpr ParsedAttrInfoMinVectorWidth() : ParsedAttrInfo(
9431     /*AttrKind=*/ParsedAttr::AT_MinVectorWidth,
9432     /*NumArgs=*/1,
9433     /*OptArgs=*/0,
9434     /*NumArgMembers=*/1,
9435     /*HasCustomParsing=*/0,
9436     /*AcceptsExprPack=*/0,
9437     /*IsTargetSpecific=*/0,
9438     /*IsType=*/0,
9439     /*IsStmt=*/0,
9440     /*IsKnownToGCC=*/0,
9441     /*IsSupportedByPragmaAttribute=*/1,
9442     /*Spellings=*/MinVectorWidthSpellings,
9443     /*ArgNames=*/MinVectorWidthArgNames) {}
9444 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9445   if (!isa<FunctionDecl>(D)) {
9446     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9447       << Attr << Attr.isRegularKeywordAttribute() << "functions";
9448     return false;
9449   }
9450   return true;
9451 }
9452 
9453 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9454   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9455     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9456   return false;
9457 }
9458 
9459 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9460   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9461 }
9462 
9463 bool isParamExpr(size_t N) const override {
9464   return false;
9465 }
9466 
9467 static const ParsedAttrInfoMinVectorWidth Instance;
9468 };
9469 const ParsedAttrInfoMinVectorWidth ParsedAttrInfoMinVectorWidth::Instance;
9470 static constexpr ParsedAttrInfo::Spelling Mips16Spellings[] = {
9471   {AttributeCommonInfo::AS_GNU, "mips16"},
9472   {AttributeCommonInfo::AS_CXX11, "gnu::mips16"},
9473   {AttributeCommonInfo::AS_C23, "gnu::mips16"},
9474 };
9475 struct ParsedAttrInfoMips16 final : public ParsedAttrInfo {
9476   constexpr ParsedAttrInfoMips16() : ParsedAttrInfo(
9477     /*AttrKind=*/ParsedAttr::AT_Mips16,
9478     /*NumArgs=*/0,
9479     /*OptArgs=*/0,
9480     /*NumArgMembers=*/0,
9481     /*HasCustomParsing=*/0,
9482     /*AcceptsExprPack=*/0,
9483     /*IsTargetSpecific=*/1,
9484     /*IsType=*/0,
9485     /*IsStmt=*/0,
9486     /*IsKnownToGCC=*/1,
9487     /*IsSupportedByPragmaAttribute=*/1,
9488     /*Spellings=*/Mips16Spellings,
9489     /*ArgNames=*/{}) {}
9490 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9491   if (!isa<FunctionDecl>(D)) {
9492     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9493       << Attr << Attr.isRegularKeywordAttribute() << "functions";
9494     return false;
9495   }
9496   return true;
9497 }
9498 
9499 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9500   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9501     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9502   return false;
9503 }
9504 
9505   using ParsedAttrInfo::diagMutualExclusion;
9506 
9507   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
9508     if (const auto *A = D->getAttr<MipsInterruptAttr>()) {
9509       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
9510       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
9511 return false;
9512     }
9513     if (const auto *A = D->getAttr<MicroMipsAttr>()) {
9514       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
9515       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
9516 return false;
9517     }
9518     return true;
9519   }
9520 
9521 bool existsInTarget(const TargetInfo &Target) const override {
9522   const llvm::Triple &T = Target.getTriple(); (void)T;
9523   return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel);
9524 }
9525 
9526 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9527   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9528 }
9529 
9530 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9531   D->addAttr(::new (S.Context) Mips16Attr(S.Context, Attr));
9532   return AttributeApplied;
9533 }
9534 
9535 bool isParamExpr(size_t N) const override {
9536   return false;
9537 }
9538 
9539 static const ParsedAttrInfoMips16 Instance;
9540 };
9541 const ParsedAttrInfoMips16 ParsedAttrInfoMips16::Instance;
9542 static constexpr ParsedAttrInfo::Spelling MipsLongCallSpellings[] = {
9543   {AttributeCommonInfo::AS_GNU, "long_call"},
9544   {AttributeCommonInfo::AS_CXX11, "gnu::long_call"},
9545   {AttributeCommonInfo::AS_C23, "gnu::long_call"},
9546   {AttributeCommonInfo::AS_GNU, "far"},
9547   {AttributeCommonInfo::AS_CXX11, "gnu::far"},
9548   {AttributeCommonInfo::AS_C23, "gnu::far"},
9549 };
9550 struct ParsedAttrInfoMipsLongCall final : public ParsedAttrInfo {
9551   constexpr ParsedAttrInfoMipsLongCall() : ParsedAttrInfo(
9552     /*AttrKind=*/ParsedAttr::AT_MipsLongCall,
9553     /*NumArgs=*/0,
9554     /*OptArgs=*/0,
9555     /*NumArgMembers=*/0,
9556     /*HasCustomParsing=*/0,
9557     /*AcceptsExprPack=*/0,
9558     /*IsTargetSpecific=*/1,
9559     /*IsType=*/0,
9560     /*IsStmt=*/0,
9561     /*IsKnownToGCC=*/1,
9562     /*IsSupportedByPragmaAttribute=*/1,
9563     /*Spellings=*/MipsLongCallSpellings,
9564     /*ArgNames=*/{}) {}
9565 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9566   if (!isa<FunctionDecl>(D)) {
9567     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9568       << Attr << Attr.isRegularKeywordAttribute() << "functions";
9569     return false;
9570   }
9571   return true;
9572 }
9573 
9574 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9575   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9576     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9577   return false;
9578 }
9579 
9580   using ParsedAttrInfo::diagMutualExclusion;
9581 
9582   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
9583     if (const auto *A = D->getAttr<MipsShortCallAttr>()) {
9584       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
9585       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
9586 return false;
9587     }
9588     return true;
9589   }
9590 
9591 bool existsInTarget(const TargetInfo &Target) const override {
9592   const llvm::Triple &T = Target.getTriple(); (void)T;
9593   return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel || T.getArch() == llvm::Triple::mips64 || T.getArch() == llvm::Triple::mips64el);
9594 }
9595 
9596 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
9597   enum Spelling {
9598     GNU_long_call = 0,
9599     CXX11_gnu_long_call = 1,
9600     C23_gnu_long_call = 2,
9601     GNU_far = 3,
9602     CXX11_gnu_far = 4,
9603     C23_gnu_far = 5,
9604   SpellingNotCalculated = 15
9605 
9606   };
9607 
9608   unsigned Idx = Attr.getAttributeSpellingListIndex();
9609   switch (Idx) {
9610     default: llvm_unreachable("Unknown spelling list index");
9611     case 0: return GNU_long_call;
9612     case 1: return CXX11_gnu_long_call;
9613     case 2: return C23_gnu_long_call;
9614     case 3: return GNU_far;
9615     case 4: return CXX11_gnu_far;
9616     case 5: return C23_gnu_far;
9617   }
9618 }
9619 
9620 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9621   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9622 }
9623 
9624 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9625   D->addAttr(::new (S.Context) MipsLongCallAttr(S.Context, Attr));
9626   return AttributeApplied;
9627 }
9628 
9629 bool isParamExpr(size_t N) const override {
9630   return false;
9631 }
9632 
9633 static const ParsedAttrInfoMipsLongCall Instance;
9634 };
9635 const ParsedAttrInfoMipsLongCall ParsedAttrInfoMipsLongCall::Instance;
9636 static constexpr ParsedAttrInfo::Spelling MipsShortCallSpellings[] = {
9637   {AttributeCommonInfo::AS_GNU, "short_call"},
9638   {AttributeCommonInfo::AS_CXX11, "gnu::short_call"},
9639   {AttributeCommonInfo::AS_C23, "gnu::short_call"},
9640   {AttributeCommonInfo::AS_GNU, "near"},
9641   {AttributeCommonInfo::AS_CXX11, "gnu::near"},
9642   {AttributeCommonInfo::AS_C23, "gnu::near"},
9643 };
9644 struct ParsedAttrInfoMipsShortCall final : public ParsedAttrInfo {
9645   constexpr ParsedAttrInfoMipsShortCall() : ParsedAttrInfo(
9646     /*AttrKind=*/ParsedAttr::AT_MipsShortCall,
9647     /*NumArgs=*/0,
9648     /*OptArgs=*/0,
9649     /*NumArgMembers=*/0,
9650     /*HasCustomParsing=*/0,
9651     /*AcceptsExprPack=*/0,
9652     /*IsTargetSpecific=*/1,
9653     /*IsType=*/0,
9654     /*IsStmt=*/0,
9655     /*IsKnownToGCC=*/1,
9656     /*IsSupportedByPragmaAttribute=*/1,
9657     /*Spellings=*/MipsShortCallSpellings,
9658     /*ArgNames=*/{}) {}
9659 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9660   if (!isa<FunctionDecl>(D)) {
9661     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9662       << Attr << Attr.isRegularKeywordAttribute() << "functions";
9663     return false;
9664   }
9665   return true;
9666 }
9667 
9668 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9669   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9670     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9671   return false;
9672 }
9673 
9674   using ParsedAttrInfo::diagMutualExclusion;
9675 
9676   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
9677     if (const auto *A = D->getAttr<MipsLongCallAttr>()) {
9678       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
9679       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
9680 return false;
9681     }
9682     return true;
9683   }
9684 
9685 bool existsInTarget(const TargetInfo &Target) const override {
9686   const llvm::Triple &T = Target.getTriple(); (void)T;
9687   return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel || T.getArch() == llvm::Triple::mips64 || T.getArch() == llvm::Triple::mips64el);
9688 }
9689 
9690 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
9691   enum Spelling {
9692     GNU_short_call = 0,
9693     CXX11_gnu_short_call = 1,
9694     C23_gnu_short_call = 2,
9695     GNU_near = 3,
9696     CXX11_gnu_near = 4,
9697     C23_gnu_near = 5,
9698   SpellingNotCalculated = 15
9699 
9700   };
9701 
9702   unsigned Idx = Attr.getAttributeSpellingListIndex();
9703   switch (Idx) {
9704     default: llvm_unreachable("Unknown spelling list index");
9705     case 0: return GNU_short_call;
9706     case 1: return CXX11_gnu_short_call;
9707     case 2: return C23_gnu_short_call;
9708     case 3: return GNU_near;
9709     case 4: return CXX11_gnu_near;
9710     case 5: return C23_gnu_near;
9711   }
9712 }
9713 
9714 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9715   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
9716 }
9717 
9718 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9719   D->addAttr(::new (S.Context) MipsShortCallAttr(S.Context, Attr));
9720   return AttributeApplied;
9721 }
9722 
9723 bool isParamExpr(size_t N) const override {
9724   return false;
9725 }
9726 
9727 static const ParsedAttrInfoMipsShortCall Instance;
9728 };
9729 const ParsedAttrInfoMipsShortCall ParsedAttrInfoMipsShortCall::Instance;
9730 static constexpr ParsedAttrInfo::Spelling ModeSpellings[] = {
9731   {AttributeCommonInfo::AS_GNU, "mode"},
9732   {AttributeCommonInfo::AS_CXX11, "gnu::mode"},
9733   {AttributeCommonInfo::AS_C23, "gnu::mode"},
9734 };
9735 static constexpr const char *ModeArgNames[] = {
9736 "Mode",};
9737 struct ParsedAttrInfoMode final : public ParsedAttrInfo {
9738   constexpr ParsedAttrInfoMode() : ParsedAttrInfo(
9739     /*AttrKind=*/ParsedAttr::AT_Mode,
9740     /*NumArgs=*/1,
9741     /*OptArgs=*/0,
9742     /*NumArgMembers=*/1,
9743     /*HasCustomParsing=*/0,
9744     /*AcceptsExprPack=*/0,
9745     /*IsTargetSpecific=*/0,
9746     /*IsType=*/0,
9747     /*IsStmt=*/0,
9748     /*IsKnownToGCC=*/1,
9749     /*IsSupportedByPragmaAttribute=*/0,
9750     /*Spellings=*/ModeSpellings,
9751     /*ArgNames=*/ModeArgNames) {}
9752 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9753   if (!isa<VarDecl>(D) && !isa<EnumDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<FieldDecl>(D)) {
9754     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9755       << Attr << Attr.isRegularKeywordAttribute() << "variables, enums, typedefs, and non-static data members";
9756     return false;
9757   }
9758   return true;
9759 }
9760 
9761 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9762   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9763     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9764   return false;
9765 }
9766 
9767 bool isParamExpr(size_t N) const override {
9768   return false;
9769 }
9770 
9771 static const ParsedAttrInfoMode Instance;
9772 };
9773 const ParsedAttrInfoMode ParsedAttrInfoMode::Instance;
9774 static constexpr ParsedAttrInfo::Spelling MustTailSpellings[] = {
9775   {AttributeCommonInfo::AS_GNU, "musttail"},
9776   {AttributeCommonInfo::AS_CXX11, "clang::musttail"},
9777   {AttributeCommonInfo::AS_C23, "clang::musttail"},
9778 };
9779 struct ParsedAttrInfoMustTail final : public ParsedAttrInfo {
9780   constexpr ParsedAttrInfoMustTail() : ParsedAttrInfo(
9781     /*AttrKind=*/ParsedAttr::AT_MustTail,
9782     /*NumArgs=*/0,
9783     /*OptArgs=*/0,
9784     /*NumArgMembers=*/0,
9785     /*HasCustomParsing=*/0,
9786     /*AcceptsExprPack=*/0,
9787     /*IsTargetSpecific=*/0,
9788     /*IsType=*/0,
9789     /*IsStmt=*/1,
9790     /*IsKnownToGCC=*/0,
9791     /*IsSupportedByPragmaAttribute=*/0,
9792     /*Spellings=*/MustTailSpellings,
9793     /*ArgNames=*/{}) {}
9794 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
9795   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
9796     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
9797   return false;
9798 }
9799 
9800 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
9801   if (!isa<ReturnStmt>(St)) {
9802     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9803       << Attr << Attr.isRegularKeywordAttribute() << "return statements";
9804     return false;
9805   }
9806   return true;
9807 }
9808 
9809 bool isParamExpr(size_t N) const override {
9810   return false;
9811 }
9812 
9813 static const ParsedAttrInfoMustTail Instance;
9814 };
9815 const ParsedAttrInfoMustTail ParsedAttrInfoMustTail::Instance;
9816 static constexpr ParsedAttrInfo::Spelling NSConsumedSpellings[] = {
9817   {AttributeCommonInfo::AS_GNU, "ns_consumed"},
9818   {AttributeCommonInfo::AS_CXX11, "clang::ns_consumed"},
9819   {AttributeCommonInfo::AS_C23, "clang::ns_consumed"},
9820 };
9821 struct ParsedAttrInfoNSConsumed final : public ParsedAttrInfo {
9822   constexpr ParsedAttrInfoNSConsumed() : ParsedAttrInfo(
9823     /*AttrKind=*/ParsedAttr::AT_NSConsumed,
9824     /*NumArgs=*/0,
9825     /*OptArgs=*/0,
9826     /*NumArgMembers=*/0,
9827     /*HasCustomParsing=*/0,
9828     /*AcceptsExprPack=*/0,
9829     /*IsTargetSpecific=*/0,
9830     /*IsType=*/0,
9831     /*IsStmt=*/0,
9832     /*IsKnownToGCC=*/0,
9833     /*IsSupportedByPragmaAttribute=*/1,
9834     /*Spellings=*/NSConsumedSpellings,
9835     /*ArgNames=*/{}) {}
9836 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9837   if (!isa<ParmVarDecl>(D)) {
9838     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9839       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
9840     return false;
9841   }
9842   return true;
9843 }
9844 
9845 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9846   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9847     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9848   return false;
9849 }
9850 
9851 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9852   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
9853 }
9854 
9855 bool isParamExpr(size_t N) const override {
9856   return false;
9857 }
9858 
9859 static const ParsedAttrInfoNSConsumed Instance;
9860 };
9861 const ParsedAttrInfoNSConsumed ParsedAttrInfoNSConsumed::Instance;
9862 static constexpr ParsedAttrInfo::Spelling NSConsumesSelfSpellings[] = {
9863   {AttributeCommonInfo::AS_GNU, "ns_consumes_self"},
9864   {AttributeCommonInfo::AS_CXX11, "clang::ns_consumes_self"},
9865   {AttributeCommonInfo::AS_C23, "clang::ns_consumes_self"},
9866 };
9867 struct ParsedAttrInfoNSConsumesSelf final : public ParsedAttrInfo {
9868   constexpr ParsedAttrInfoNSConsumesSelf() : ParsedAttrInfo(
9869     /*AttrKind=*/ParsedAttr::AT_NSConsumesSelf,
9870     /*NumArgs=*/0,
9871     /*OptArgs=*/0,
9872     /*NumArgMembers=*/0,
9873     /*HasCustomParsing=*/0,
9874     /*AcceptsExprPack=*/0,
9875     /*IsTargetSpecific=*/0,
9876     /*IsType=*/0,
9877     /*IsStmt=*/0,
9878     /*IsKnownToGCC=*/0,
9879     /*IsSupportedByPragmaAttribute=*/1,
9880     /*Spellings=*/NSConsumesSelfSpellings,
9881     /*ArgNames=*/{}) {}
9882 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9883   if (!isa<ObjCMethodDecl>(D)) {
9884     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
9885       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods";
9886     return false;
9887   }
9888   return true;
9889 }
9890 
9891 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9892   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9893     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9894   return false;
9895 }
9896 
9897 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9898   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
9899 }
9900 
9901 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
9902   D->addAttr(::new (S.Context) NSConsumesSelfAttr(S.Context, Attr));
9903   return AttributeApplied;
9904 }
9905 
9906 bool isParamExpr(size_t N) const override {
9907   return false;
9908 }
9909 
9910 static const ParsedAttrInfoNSConsumesSelf Instance;
9911 };
9912 const ParsedAttrInfoNSConsumesSelf ParsedAttrInfoNSConsumesSelf::Instance;
9913 static constexpr ParsedAttrInfo::Spelling NSErrorDomainSpellings[] = {
9914   {AttributeCommonInfo::AS_GNU, "ns_error_domain"},
9915 };
9916 static constexpr const char *NSErrorDomainArgNames[] = {
9917 "ErrorDomain",};
9918 struct ParsedAttrInfoNSErrorDomain final : public ParsedAttrInfo {
9919   constexpr ParsedAttrInfoNSErrorDomain() : ParsedAttrInfo(
9920     /*AttrKind=*/ParsedAttr::AT_NSErrorDomain,
9921     /*NumArgs=*/1,
9922     /*OptArgs=*/0,
9923     /*NumArgMembers=*/1,
9924     /*HasCustomParsing=*/0,
9925     /*AcceptsExprPack=*/0,
9926     /*IsTargetSpecific=*/0,
9927     /*IsType=*/0,
9928     /*IsStmt=*/0,
9929     /*IsKnownToGCC=*/0,
9930     /*IsSupportedByPragmaAttribute=*/1,
9931     /*Spellings=*/NSErrorDomainSpellings,
9932     /*ArgNames=*/NSErrorDomainArgNames) {}
9933 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
9934   if (!isa<EnumDecl>(D)) {
9935     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
9936       << Attr << Attr.isRegularKeywordAttribute() << "enums";
9937     return false;
9938   }
9939   return true;
9940 }
9941 
9942 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
9943   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
9944     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
9945   return false;
9946 }
9947 
9948 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
9949   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
9950 }
9951 
9952 bool isParamExpr(size_t N) const override {
9953   return false;
9954 }
9955 
9956 static const ParsedAttrInfoNSErrorDomain Instance;
9957 };
9958 const ParsedAttrInfoNSErrorDomain ParsedAttrInfoNSErrorDomain::Instance;
9959 static constexpr ParsedAttrInfo::Spelling NSReturnsAutoreleasedSpellings[] = {
9960   {AttributeCommonInfo::AS_GNU, "ns_returns_autoreleased"},
9961   {AttributeCommonInfo::AS_CXX11, "clang::ns_returns_autoreleased"},
9962   {AttributeCommonInfo::AS_C23, "clang::ns_returns_autoreleased"},
9963 };
9964 struct ParsedAttrInfoNSReturnsAutoreleased final : public ParsedAttrInfo {
9965   constexpr ParsedAttrInfoNSReturnsAutoreleased() : ParsedAttrInfo(
9966     /*AttrKind=*/ParsedAttr::AT_NSReturnsAutoreleased,
9967     /*NumArgs=*/0,
9968     /*OptArgs=*/0,
9969     /*NumArgMembers=*/0,
9970     /*HasCustomParsing=*/0,
9971     /*AcceptsExprPack=*/0,
9972     /*IsTargetSpecific=*/0,
9973     /*IsType=*/0,
9974     /*IsStmt=*/0,
9975     /*IsKnownToGCC=*/0,
9976     /*IsSupportedByPragmaAttribute=*/0,
9977     /*Spellings=*/NSReturnsAutoreleasedSpellings,
9978     /*ArgNames=*/{}) {}
9979 bool isParamExpr(size_t N) const override {
9980   return false;
9981 }
9982 
9983 static const ParsedAttrInfoNSReturnsAutoreleased Instance;
9984 };
9985 const ParsedAttrInfoNSReturnsAutoreleased ParsedAttrInfoNSReturnsAutoreleased::Instance;
9986 static constexpr ParsedAttrInfo::Spelling NSReturnsNotRetainedSpellings[] = {
9987   {AttributeCommonInfo::AS_GNU, "ns_returns_not_retained"},
9988   {AttributeCommonInfo::AS_CXX11, "clang::ns_returns_not_retained"},
9989   {AttributeCommonInfo::AS_C23, "clang::ns_returns_not_retained"},
9990 };
9991 struct ParsedAttrInfoNSReturnsNotRetained final : public ParsedAttrInfo {
9992   constexpr ParsedAttrInfoNSReturnsNotRetained() : ParsedAttrInfo(
9993     /*AttrKind=*/ParsedAttr::AT_NSReturnsNotRetained,
9994     /*NumArgs=*/0,
9995     /*OptArgs=*/0,
9996     /*NumArgMembers=*/0,
9997     /*HasCustomParsing=*/0,
9998     /*AcceptsExprPack=*/0,
9999     /*IsTargetSpecific=*/0,
10000     /*IsType=*/0,
10001     /*IsStmt=*/0,
10002     /*IsKnownToGCC=*/0,
10003     /*IsSupportedByPragmaAttribute=*/0,
10004     /*Spellings=*/NSReturnsNotRetainedSpellings,
10005     /*ArgNames=*/{}) {}
10006 bool isParamExpr(size_t N) const override {
10007   return false;
10008 }
10009 
10010 static const ParsedAttrInfoNSReturnsNotRetained Instance;
10011 };
10012 const ParsedAttrInfoNSReturnsNotRetained ParsedAttrInfoNSReturnsNotRetained::Instance;
10013 static constexpr ParsedAttrInfo::Spelling NSReturnsRetainedSpellings[] = {
10014   {AttributeCommonInfo::AS_GNU, "ns_returns_retained"},
10015   {AttributeCommonInfo::AS_CXX11, "clang::ns_returns_retained"},
10016   {AttributeCommonInfo::AS_C23, "clang::ns_returns_retained"},
10017 };
10018 struct ParsedAttrInfoNSReturnsRetained final : public ParsedAttrInfo {
10019   constexpr ParsedAttrInfoNSReturnsRetained() : ParsedAttrInfo(
10020     /*AttrKind=*/ParsedAttr::AT_NSReturnsRetained,
10021     /*NumArgs=*/0,
10022     /*OptArgs=*/0,
10023     /*NumArgMembers=*/0,
10024     /*HasCustomParsing=*/0,
10025     /*AcceptsExprPack=*/0,
10026     /*IsTargetSpecific=*/0,
10027     /*IsType=*/1,
10028     /*IsStmt=*/0,
10029     /*IsKnownToGCC=*/0,
10030     /*IsSupportedByPragmaAttribute=*/0,
10031     /*Spellings=*/NSReturnsRetainedSpellings,
10032     /*ArgNames=*/{}) {}
10033 bool isParamExpr(size_t N) const override {
10034   return false;
10035 }
10036 
10037 static const ParsedAttrInfoNSReturnsRetained Instance;
10038 };
10039 const ParsedAttrInfoNSReturnsRetained ParsedAttrInfoNSReturnsRetained::Instance;
10040 static constexpr ParsedAttrInfo::Spelling NVPTXKernelSpellings[] = {
10041   {AttributeCommonInfo::AS_GNU, "nvptx_kernel"},
10042   {AttributeCommonInfo::AS_CXX11, "clang::nvptx_kernel"},
10043   {AttributeCommonInfo::AS_C23, "clang::nvptx_kernel"},
10044 };
10045 struct ParsedAttrInfoNVPTXKernel final : public ParsedAttrInfo {
10046   constexpr ParsedAttrInfoNVPTXKernel() : ParsedAttrInfo(
10047     /*AttrKind=*/ParsedAttr::AT_NVPTXKernel,
10048     /*NumArgs=*/0,
10049     /*OptArgs=*/0,
10050     /*NumArgMembers=*/0,
10051     /*HasCustomParsing=*/0,
10052     /*AcceptsExprPack=*/0,
10053     /*IsTargetSpecific=*/1,
10054     /*IsType=*/0,
10055     /*IsStmt=*/0,
10056     /*IsKnownToGCC=*/0,
10057     /*IsSupportedByPragmaAttribute=*/1,
10058     /*Spellings=*/NVPTXKernelSpellings,
10059     /*ArgNames=*/{}) {}
10060 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10061   if (!isa<FunctionDecl>(D)) {
10062     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10063       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10064     return false;
10065   }
10066   return true;
10067 }
10068 
10069 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10070   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10071     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10072   return false;
10073 }
10074 
10075 bool existsInTarget(const TargetInfo &Target) const override {
10076   const llvm::Triple &T = Target.getTriple(); (void)T;
10077   return true && (T.getArch() == llvm::Triple::nvptx || T.getArch() == llvm::Triple::nvptx64);
10078 }
10079 
10080 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10081   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10082 }
10083 
10084 bool isParamExpr(size_t N) const override {
10085   return false;
10086 }
10087 
10088 static const ParsedAttrInfoNVPTXKernel Instance;
10089 };
10090 const ParsedAttrInfoNVPTXKernel ParsedAttrInfoNVPTXKernel::Instance;
10091 static constexpr ParsedAttrInfo::Spelling NakedSpellings[] = {
10092   {AttributeCommonInfo::AS_GNU, "naked"},
10093   {AttributeCommonInfo::AS_CXX11, "gnu::naked"},
10094   {AttributeCommonInfo::AS_C23, "gnu::naked"},
10095   {AttributeCommonInfo::AS_Declspec, "naked"},
10096 };
10097 struct ParsedAttrInfoNaked final : public ParsedAttrInfo {
10098   constexpr ParsedAttrInfoNaked() : ParsedAttrInfo(
10099     /*AttrKind=*/ParsedAttr::AT_Naked,
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=*/1,
10109     /*IsSupportedByPragmaAttribute=*/1,
10110     /*Spellings=*/NakedSpellings,
10111     /*ArgNames=*/{}) {}
10112 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10113   if (!isa<FunctionDecl>(D)) {
10114     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10115       << Attr << Attr.isRegularKeywordAttribute() << "functions";
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 << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10124   return false;
10125 }
10126 
10127   using ParsedAttrInfo::diagMutualExclusion;
10128 
10129   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
10130     if (const auto *A = D->getAttr<DisableTailCallsAttr>()) {
10131       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
10132       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
10133 return false;
10134     }
10135     return true;
10136   }
10137 
10138 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10139   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10140 }
10141 
10142 bool isParamExpr(size_t N) const override {
10143   return false;
10144 }
10145 
10146 static const ParsedAttrInfoNaked Instance;
10147 };
10148 const ParsedAttrInfoNaked ParsedAttrInfoNaked::Instance;
10149 static constexpr ParsedAttrInfo::Spelling NeonPolyVectorTypeSpellings[] = {
10150   {AttributeCommonInfo::AS_GNU, "neon_polyvector_type"},
10151   {AttributeCommonInfo::AS_CXX11, "clang::neon_polyvector_type"},
10152   {AttributeCommonInfo::AS_C23, "clang::neon_polyvector_type"},
10153 };
10154 static constexpr const char *NeonPolyVectorTypeArgNames[] = {
10155 "NumElements",};
10156 struct ParsedAttrInfoNeonPolyVectorType final : public ParsedAttrInfo {
10157   constexpr ParsedAttrInfoNeonPolyVectorType() : ParsedAttrInfo(
10158     /*AttrKind=*/ParsedAttr::AT_NeonPolyVectorType,
10159     /*NumArgs=*/1,
10160     /*OptArgs=*/0,
10161     /*NumArgMembers=*/1,
10162     /*HasCustomParsing=*/0,
10163     /*AcceptsExprPack=*/0,
10164     /*IsTargetSpecific=*/0,
10165     /*IsType=*/1,
10166     /*IsStmt=*/0,
10167     /*IsKnownToGCC=*/0,
10168     /*IsSupportedByPragmaAttribute=*/0,
10169     /*Spellings=*/NeonPolyVectorTypeSpellings,
10170     /*ArgNames=*/NeonPolyVectorTypeArgNames) {}
10171 bool isParamExpr(size_t N) const override {
10172   return false;
10173 }
10174 
10175 static const ParsedAttrInfoNeonPolyVectorType Instance;
10176 };
10177 const ParsedAttrInfoNeonPolyVectorType ParsedAttrInfoNeonPolyVectorType::Instance;
10178 static constexpr ParsedAttrInfo::Spelling NeonVectorTypeSpellings[] = {
10179   {AttributeCommonInfo::AS_GNU, "neon_vector_type"},
10180   {AttributeCommonInfo::AS_CXX11, "clang::neon_vector_type"},
10181   {AttributeCommonInfo::AS_C23, "clang::neon_vector_type"},
10182 };
10183 static constexpr const char *NeonVectorTypeArgNames[] = {
10184 "NumElements",};
10185 struct ParsedAttrInfoNeonVectorType final : public ParsedAttrInfo {
10186   constexpr ParsedAttrInfoNeonVectorType() : ParsedAttrInfo(
10187     /*AttrKind=*/ParsedAttr::AT_NeonVectorType,
10188     /*NumArgs=*/1,
10189     /*OptArgs=*/0,
10190     /*NumArgMembers=*/1,
10191     /*HasCustomParsing=*/0,
10192     /*AcceptsExprPack=*/0,
10193     /*IsTargetSpecific=*/0,
10194     /*IsType=*/1,
10195     /*IsStmt=*/0,
10196     /*IsKnownToGCC=*/0,
10197     /*IsSupportedByPragmaAttribute=*/0,
10198     /*Spellings=*/NeonVectorTypeSpellings,
10199     /*ArgNames=*/NeonVectorTypeArgNames) {}
10200 bool isParamExpr(size_t N) const override {
10201   return false;
10202 }
10203 
10204 static const ParsedAttrInfoNeonVectorType Instance;
10205 };
10206 const ParsedAttrInfoNeonVectorType ParsedAttrInfoNeonVectorType::Instance;
10207 static constexpr ParsedAttrInfo::Spelling NoAliasSpellings[] = {
10208   {AttributeCommonInfo::AS_Declspec, "noalias"},
10209 };
10210 struct ParsedAttrInfoNoAlias final : public ParsedAttrInfo {
10211   constexpr ParsedAttrInfoNoAlias() : ParsedAttrInfo(
10212     /*AttrKind=*/ParsedAttr::AT_NoAlias,
10213     /*NumArgs=*/0,
10214     /*OptArgs=*/0,
10215     /*NumArgMembers=*/0,
10216     /*HasCustomParsing=*/0,
10217     /*AcceptsExprPack=*/0,
10218     /*IsTargetSpecific=*/0,
10219     /*IsType=*/0,
10220     /*IsStmt=*/0,
10221     /*IsKnownToGCC=*/0,
10222     /*IsSupportedByPragmaAttribute=*/0,
10223     /*Spellings=*/NoAliasSpellings,
10224     /*ArgNames=*/{}) {}
10225 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10226   if (!isa<FunctionDecl>(D)) {
10227     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10228       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10229     return false;
10230   }
10231   return true;
10232 }
10233 
10234 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10235   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10236     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10237   return false;
10238 }
10239 
10240 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10241   D->addAttr(::new (S.Context) NoAliasAttr(S.Context, Attr));
10242   return AttributeApplied;
10243 }
10244 
10245 bool isParamExpr(size_t N) const override {
10246   return false;
10247 }
10248 
10249 static const ParsedAttrInfoNoAlias Instance;
10250 };
10251 const ParsedAttrInfoNoAlias ParsedAttrInfoNoAlias::Instance;
10252 static constexpr ParsedAttrInfo::Spelling NoBuiltinSpellings[] = {
10253   {AttributeCommonInfo::AS_GNU, "no_builtin"},
10254   {AttributeCommonInfo::AS_CXX11, "clang::no_builtin"},
10255   {AttributeCommonInfo::AS_C23, "clang::no_builtin"},
10256 };
10257 static constexpr const char *NoBuiltinArgNames[] = {
10258 "BuiltinNames...",};
10259 struct ParsedAttrInfoNoBuiltin final : public ParsedAttrInfo {
10260   constexpr ParsedAttrInfoNoBuiltin() : ParsedAttrInfo(
10261     /*AttrKind=*/ParsedAttr::AT_NoBuiltin,
10262     /*NumArgs=*/0,
10263     /*OptArgs=*/15,
10264     /*NumArgMembers=*/1,
10265     /*HasCustomParsing=*/0,
10266     /*AcceptsExprPack=*/0,
10267     /*IsTargetSpecific=*/0,
10268     /*IsType=*/0,
10269     /*IsStmt=*/0,
10270     /*IsKnownToGCC=*/0,
10271     /*IsSupportedByPragmaAttribute=*/1,
10272     /*Spellings=*/NoBuiltinSpellings,
10273     /*ArgNames=*/NoBuiltinArgNames) {}
10274 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10275   if (!isa<FunctionDecl>(D)) {
10276     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10277       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10278     return false;
10279   }
10280   return true;
10281 }
10282 
10283 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10284   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10285     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10286   return false;
10287 }
10288 
10289 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10290   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10291 }
10292 
10293 bool isParamExpr(size_t N) const override {
10294   return false;
10295 }
10296 
10297 static const ParsedAttrInfoNoBuiltin Instance;
10298 };
10299 const ParsedAttrInfoNoBuiltin ParsedAttrInfoNoBuiltin::Instance;
10300 static constexpr ParsedAttrInfo::Spelling NoCommonSpellings[] = {
10301   {AttributeCommonInfo::AS_GNU, "nocommon"},
10302   {AttributeCommonInfo::AS_CXX11, "gnu::nocommon"},
10303   {AttributeCommonInfo::AS_C23, "gnu::nocommon"},
10304 };
10305 struct ParsedAttrInfoNoCommon final : public ParsedAttrInfo {
10306   constexpr ParsedAttrInfoNoCommon() : ParsedAttrInfo(
10307     /*AttrKind=*/ParsedAttr::AT_NoCommon,
10308     /*NumArgs=*/0,
10309     /*OptArgs=*/0,
10310     /*NumArgMembers=*/0,
10311     /*HasCustomParsing=*/0,
10312     /*AcceptsExprPack=*/0,
10313     /*IsTargetSpecific=*/0,
10314     /*IsType=*/0,
10315     /*IsStmt=*/0,
10316     /*IsKnownToGCC=*/1,
10317     /*IsSupportedByPragmaAttribute=*/1,
10318     /*Spellings=*/NoCommonSpellings,
10319     /*ArgNames=*/{}) {}
10320 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10321   if (!isa<VarDecl>(D)) {
10322     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10323       << Attr << Attr.isRegularKeywordAttribute() << "variables";
10324     return false;
10325   }
10326   return true;
10327 }
10328 
10329 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10330   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10331     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10332   return false;
10333 }
10334 
10335 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10336   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
10337 }
10338 
10339 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10340   D->addAttr(::new (S.Context) NoCommonAttr(S.Context, Attr));
10341   return AttributeApplied;
10342 }
10343 
10344 bool isParamExpr(size_t N) const override {
10345   return false;
10346 }
10347 
10348 static const ParsedAttrInfoNoCommon Instance;
10349 };
10350 const ParsedAttrInfoNoCommon ParsedAttrInfoNoCommon::Instance;
10351 static constexpr ParsedAttrInfo::Spelling NoConvergentSpellings[] = {
10352   {AttributeCommonInfo::AS_GNU, "noconvergent"},
10353   {AttributeCommonInfo::AS_CXX11, "clang::noconvergent"},
10354   {AttributeCommonInfo::AS_C23, "clang::noconvergent"},
10355   {AttributeCommonInfo::AS_Declspec, "noconvergent"},
10356 };
10357 struct ParsedAttrInfoNoConvergent final : public ParsedAttrInfo {
10358   constexpr ParsedAttrInfoNoConvergent() : ParsedAttrInfo(
10359     /*AttrKind=*/ParsedAttr::AT_NoConvergent,
10360     /*NumArgs=*/0,
10361     /*OptArgs=*/0,
10362     /*NumArgMembers=*/0,
10363     /*HasCustomParsing=*/0,
10364     /*AcceptsExprPack=*/0,
10365     /*IsTargetSpecific=*/0,
10366     /*IsType=*/0,
10367     /*IsStmt=*/0,
10368     /*IsKnownToGCC=*/0,
10369     /*IsSupportedByPragmaAttribute=*/1,
10370     /*Spellings=*/NoConvergentSpellings,
10371     /*ArgNames=*/{}) {}
10372 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10373   if (!isa<FunctionDecl>(D)) {
10374     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10375       << Attr << Attr.isRegularKeywordAttribute() << "functions and statements";
10376     return false;
10377   }
10378   return true;
10379 }
10380 
10381 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
10382   if (!isa<Stmt>(St)) {
10383     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10384       << Attr << Attr.isRegularKeywordAttribute() << "functions and statements";
10385     return false;
10386   }
10387   return true;
10388 }
10389 
10390   using ParsedAttrInfo::diagMutualExclusion;
10391 
10392   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
10393     if (const auto *A = D->getAttr<ConvergentAttr>()) {
10394       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
10395       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
10396 return false;
10397     }
10398     return true;
10399   }
10400 
10401 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
10402   return LangOpts.CUDA;
10403 }
10404 
10405 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10406   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10407 }
10408 
10409 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10410   D->addAttr(::new (S.Context) NoConvergentAttr(S.Context, Attr));
10411   return AttributeApplied;
10412 }
10413 
10414 bool isParamExpr(size_t N) const override {
10415   return false;
10416 }
10417 
10418 static const ParsedAttrInfoNoConvergent Instance;
10419 };
10420 const ParsedAttrInfoNoConvergent ParsedAttrInfoNoConvergent::Instance;
10421 static constexpr ParsedAttrInfo::Spelling NoDebugSpellings[] = {
10422   {AttributeCommonInfo::AS_GNU, "nodebug"},
10423   {AttributeCommonInfo::AS_CXX11, "gnu::nodebug"},
10424   {AttributeCommonInfo::AS_C23, "gnu::nodebug"},
10425 };
10426 struct ParsedAttrInfoNoDebug final : public ParsedAttrInfo {
10427   constexpr ParsedAttrInfoNoDebug() : ParsedAttrInfo(
10428     /*AttrKind=*/ParsedAttr::AT_NoDebug,
10429     /*NumArgs=*/0,
10430     /*OptArgs=*/0,
10431     /*NumArgMembers=*/0,
10432     /*HasCustomParsing=*/0,
10433     /*AcceptsExprPack=*/0,
10434     /*IsTargetSpecific=*/0,
10435     /*IsType=*/0,
10436     /*IsStmt=*/0,
10437     /*IsKnownToGCC=*/1,
10438     /*IsSupportedByPragmaAttribute=*/1,
10439     /*Spellings=*/NoDebugSpellings,
10440     /*ArgNames=*/{}) {}
10441 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10442   if (!isa<TypedefNameDecl>(D) && !isFunctionLike(D) && !isa<ObjCMethodDecl>(D) && !isNonParmVar(D)) {
10443     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10444       << Attr << Attr.isRegularKeywordAttribute() << "typedefs, functions, function pointers, Objective-C methods, and variables";
10445     return false;
10446   }
10447   return true;
10448 }
10449 
10450 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10451   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10452     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10453   return false;
10454 }
10455 
10456 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10457   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
10458   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
10459   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
10460   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_not_is_parameter, /*IsSupported=*/true));
10461 }
10462 
10463 bool isParamExpr(size_t N) const override {
10464   return false;
10465 }
10466 
10467 static const ParsedAttrInfoNoDebug Instance;
10468 };
10469 const ParsedAttrInfoNoDebug ParsedAttrInfoNoDebug::Instance;
10470 static constexpr ParsedAttrInfo::Spelling NoDerefSpellings[] = {
10471   {AttributeCommonInfo::AS_GNU, "noderef"},
10472   {AttributeCommonInfo::AS_CXX11, "clang::noderef"},
10473   {AttributeCommonInfo::AS_C23, "clang::noderef"},
10474 };
10475 struct ParsedAttrInfoNoDeref final : public ParsedAttrInfo {
10476   constexpr ParsedAttrInfoNoDeref() : ParsedAttrInfo(
10477     /*AttrKind=*/ParsedAttr::AT_NoDeref,
10478     /*NumArgs=*/0,
10479     /*OptArgs=*/0,
10480     /*NumArgMembers=*/0,
10481     /*HasCustomParsing=*/0,
10482     /*AcceptsExprPack=*/0,
10483     /*IsTargetSpecific=*/0,
10484     /*IsType=*/1,
10485     /*IsStmt=*/0,
10486     /*IsKnownToGCC=*/0,
10487     /*IsSupportedByPragmaAttribute=*/0,
10488     /*Spellings=*/NoDerefSpellings,
10489     /*ArgNames=*/{}) {}
10490 bool isParamExpr(size_t N) const override {
10491   return false;
10492 }
10493 
10494 static const ParsedAttrInfoNoDeref Instance;
10495 };
10496 const ParsedAttrInfoNoDeref ParsedAttrInfoNoDeref::Instance;
10497 static constexpr ParsedAttrInfo::Spelling NoDestroySpellings[] = {
10498   {AttributeCommonInfo::AS_GNU, "no_destroy"},
10499   {AttributeCommonInfo::AS_CXX11, "clang::no_destroy"},
10500 };
10501 struct ParsedAttrInfoNoDestroy final : public ParsedAttrInfo {
10502   constexpr ParsedAttrInfoNoDestroy() : ParsedAttrInfo(
10503     /*AttrKind=*/ParsedAttr::AT_NoDestroy,
10504     /*NumArgs=*/0,
10505     /*OptArgs=*/0,
10506     /*NumArgMembers=*/0,
10507     /*HasCustomParsing=*/0,
10508     /*AcceptsExprPack=*/0,
10509     /*IsTargetSpecific=*/0,
10510     /*IsType=*/0,
10511     /*IsStmt=*/0,
10512     /*IsKnownToGCC=*/0,
10513     /*IsSupportedByPragmaAttribute=*/1,
10514     /*Spellings=*/NoDestroySpellings,
10515     /*ArgNames=*/{}) {}
10516 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10517   if (!isa<VarDecl>(D)) {
10518     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10519       << Attr << Attr.isRegularKeywordAttribute() << "variables";
10520     return false;
10521   }
10522   return true;
10523 }
10524 
10525 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10526   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10527     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10528   return false;
10529 }
10530 
10531   using ParsedAttrInfo::diagMutualExclusion;
10532 
10533   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
10534     if (const auto *A = D->getAttr<AlwaysDestroyAttr>()) {
10535       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
10536       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
10537 return false;
10538     }
10539     return true;
10540   }
10541 
10542 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10543   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
10544 }
10545 
10546 bool isParamExpr(size_t N) const override {
10547   return false;
10548 }
10549 
10550 static const ParsedAttrInfoNoDestroy Instance;
10551 };
10552 const ParsedAttrInfoNoDestroy ParsedAttrInfoNoDestroy::Instance;
10553 static constexpr ParsedAttrInfo::Spelling NoDuplicateSpellings[] = {
10554   {AttributeCommonInfo::AS_GNU, "noduplicate"},
10555   {AttributeCommonInfo::AS_CXX11, "clang::noduplicate"},
10556   {AttributeCommonInfo::AS_C23, "clang::noduplicate"},
10557 };
10558 struct ParsedAttrInfoNoDuplicate final : public ParsedAttrInfo {
10559   constexpr ParsedAttrInfoNoDuplicate() : ParsedAttrInfo(
10560     /*AttrKind=*/ParsedAttr::AT_NoDuplicate,
10561     /*NumArgs=*/0,
10562     /*OptArgs=*/0,
10563     /*NumArgMembers=*/0,
10564     /*HasCustomParsing=*/0,
10565     /*AcceptsExprPack=*/0,
10566     /*IsTargetSpecific=*/0,
10567     /*IsType=*/0,
10568     /*IsStmt=*/0,
10569     /*IsKnownToGCC=*/0,
10570     /*IsSupportedByPragmaAttribute=*/1,
10571     /*Spellings=*/NoDuplicateSpellings,
10572     /*ArgNames=*/{}) {}
10573 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10574   if (!isa<FunctionDecl>(D)) {
10575     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10576       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10577     return false;
10578   }
10579   return true;
10580 }
10581 
10582 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10583   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10584     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10585   return false;
10586 }
10587 
10588 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10589   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10590 }
10591 
10592 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10593   D->addAttr(::new (S.Context) NoDuplicateAttr(S.Context, Attr));
10594   return AttributeApplied;
10595 }
10596 
10597 bool isParamExpr(size_t N) const override {
10598   return false;
10599 }
10600 
10601 static const ParsedAttrInfoNoDuplicate Instance;
10602 };
10603 const ParsedAttrInfoNoDuplicate ParsedAttrInfoNoDuplicate::Instance;
10604 static constexpr ParsedAttrInfo::Spelling NoEscapeSpellings[] = {
10605   {AttributeCommonInfo::AS_GNU, "noescape"},
10606   {AttributeCommonInfo::AS_CXX11, "clang::noescape"},
10607   {AttributeCommonInfo::AS_C23, "clang::noescape"},
10608 };
10609 struct ParsedAttrInfoNoEscape final : public ParsedAttrInfo {
10610   constexpr ParsedAttrInfoNoEscape() : ParsedAttrInfo(
10611     /*AttrKind=*/ParsedAttr::AT_NoEscape,
10612     /*NumArgs=*/0,
10613     /*OptArgs=*/0,
10614     /*NumArgMembers=*/0,
10615     /*HasCustomParsing=*/0,
10616     /*AcceptsExprPack=*/0,
10617     /*IsTargetSpecific=*/0,
10618     /*IsType=*/0,
10619     /*IsStmt=*/0,
10620     /*IsKnownToGCC=*/0,
10621     /*IsSupportedByPragmaAttribute=*/1,
10622     /*Spellings=*/NoEscapeSpellings,
10623     /*ArgNames=*/{}) {}
10624 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10625   if (!isa<ParmVarDecl>(D)) {
10626     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10627       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
10628     return false;
10629   }
10630   return true;
10631 }
10632 
10633 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10634   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10635     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10636   return false;
10637 }
10638 
10639 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10640   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
10641 }
10642 
10643 bool isParamExpr(size_t N) const override {
10644   return false;
10645 }
10646 
10647 static const ParsedAttrInfoNoEscape Instance;
10648 };
10649 const ParsedAttrInfoNoEscape ParsedAttrInfoNoEscape::Instance;
10650 static constexpr ParsedAttrInfo::Spelling NoInlineSpellings[] = {
10651   {AttributeCommonInfo::AS_Keyword, "__noinline__"},
10652   {AttributeCommonInfo::AS_GNU, "noinline"},
10653   {AttributeCommonInfo::AS_CXX11, "gnu::noinline"},
10654   {AttributeCommonInfo::AS_C23, "gnu::noinline"},
10655   {AttributeCommonInfo::AS_CXX11, "clang::noinline"},
10656   {AttributeCommonInfo::AS_C23, "clang::noinline"},
10657   {AttributeCommonInfo::AS_CXX11, "msvc::noinline"},
10658   {AttributeCommonInfo::AS_C23, "msvc::noinline"},
10659   {AttributeCommonInfo::AS_Declspec, "noinline"},
10660 };
10661 struct ParsedAttrInfoNoInline final : public ParsedAttrInfo {
10662   constexpr ParsedAttrInfoNoInline() : ParsedAttrInfo(
10663     /*AttrKind=*/ParsedAttr::AT_NoInline,
10664     /*NumArgs=*/0,
10665     /*OptArgs=*/0,
10666     /*NumArgMembers=*/0,
10667     /*HasCustomParsing=*/0,
10668     /*AcceptsExprPack=*/0,
10669     /*IsTargetSpecific=*/0,
10670     /*IsType=*/0,
10671     /*IsStmt=*/1,
10672     /*IsKnownToGCC=*/1,
10673     /*IsSupportedByPragmaAttribute=*/1,
10674     /*Spellings=*/NoInlineSpellings,
10675     /*ArgNames=*/{}) {}
10676 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10677   if (!isa<FunctionDecl>(D)) {
10678     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10679       << Attr << Attr.isRegularKeywordAttribute() << "functions and statements";
10680     return false;
10681   }
10682   return true;
10683 }
10684 
10685 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
10686   if (!isa<Stmt>(St)) {
10687     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10688       << Attr << Attr.isRegularKeywordAttribute() << "functions and statements";
10689     return false;
10690   }
10691   return true;
10692 }
10693 
10694 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10695   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10696 }
10697 
10698 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10699   D->addAttr(::new (S.Context) NoInlineAttr(S.Context, Attr));
10700   return AttributeApplied;
10701 }
10702 
10703 bool isParamExpr(size_t N) const override {
10704   return false;
10705 }
10706 
10707 static const ParsedAttrInfoNoInline Instance;
10708 };
10709 const ParsedAttrInfoNoInline ParsedAttrInfoNoInline::Instance;
10710 static constexpr ParsedAttrInfo::Spelling NoInstrumentFunctionSpellings[] = {
10711   {AttributeCommonInfo::AS_GNU, "no_instrument_function"},
10712   {AttributeCommonInfo::AS_CXX11, "gnu::no_instrument_function"},
10713   {AttributeCommonInfo::AS_C23, "gnu::no_instrument_function"},
10714 };
10715 struct ParsedAttrInfoNoInstrumentFunction final : public ParsedAttrInfo {
10716   constexpr ParsedAttrInfoNoInstrumentFunction() : ParsedAttrInfo(
10717     /*AttrKind=*/ParsedAttr::AT_NoInstrumentFunction,
10718     /*NumArgs=*/0,
10719     /*OptArgs=*/0,
10720     /*NumArgMembers=*/0,
10721     /*HasCustomParsing=*/0,
10722     /*AcceptsExprPack=*/0,
10723     /*IsTargetSpecific=*/0,
10724     /*IsType=*/0,
10725     /*IsStmt=*/0,
10726     /*IsKnownToGCC=*/1,
10727     /*IsSupportedByPragmaAttribute=*/1,
10728     /*Spellings=*/NoInstrumentFunctionSpellings,
10729     /*ArgNames=*/{}) {}
10730 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10731   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
10732     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10733       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
10734     return false;
10735   }
10736   return true;
10737 }
10738 
10739 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10740   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10741     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10742   return false;
10743 }
10744 
10745 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10746   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10747   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
10748 }
10749 
10750 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10751   D->addAttr(::new (S.Context) NoInstrumentFunctionAttr(S.Context, Attr));
10752   return AttributeApplied;
10753 }
10754 
10755 bool isParamExpr(size_t N) const override {
10756   return false;
10757 }
10758 
10759 static const ParsedAttrInfoNoInstrumentFunction Instance;
10760 };
10761 const ParsedAttrInfoNoInstrumentFunction ParsedAttrInfoNoInstrumentFunction::Instance;
10762 static constexpr ParsedAttrInfo::Spelling NoMergeSpellings[] = {
10763   {AttributeCommonInfo::AS_GNU, "nomerge"},
10764   {AttributeCommonInfo::AS_CXX11, "clang::nomerge"},
10765   {AttributeCommonInfo::AS_C23, "clang::nomerge"},
10766 };
10767 struct ParsedAttrInfoNoMerge final : public ParsedAttrInfo {
10768   constexpr ParsedAttrInfoNoMerge() : ParsedAttrInfo(
10769     /*AttrKind=*/ParsedAttr::AT_NoMerge,
10770     /*NumArgs=*/0,
10771     /*OptArgs=*/0,
10772     /*NumArgMembers=*/0,
10773     /*HasCustomParsing=*/0,
10774     /*AcceptsExprPack=*/0,
10775     /*IsTargetSpecific=*/0,
10776     /*IsType=*/0,
10777     /*IsStmt=*/1,
10778     /*IsKnownToGCC=*/0,
10779     /*IsSupportedByPragmaAttribute=*/1,
10780     /*Spellings=*/NoMergeSpellings,
10781     /*ArgNames=*/{}) {}
10782 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10783   if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
10784     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
10785       << Attr << Attr.isRegularKeywordAttribute() << "functions, statements and variables";
10786     return false;
10787   }
10788   return true;
10789 }
10790 
10791 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
10792   if (!isa<Stmt>(St)) {
10793     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
10794       << Attr << Attr.isRegularKeywordAttribute() << "functions, statements and variables";
10795     return false;
10796   }
10797   return true;
10798 }
10799 
10800 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10801   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10802   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
10803 }
10804 
10805 bool isParamExpr(size_t N) const override {
10806   return false;
10807 }
10808 
10809 static const ParsedAttrInfoNoMerge Instance;
10810 };
10811 const ParsedAttrInfoNoMerge ParsedAttrInfoNoMerge::Instance;
10812 static constexpr ParsedAttrInfo::Spelling NoMicroMipsSpellings[] = {
10813   {AttributeCommonInfo::AS_GNU, "nomicromips"},
10814   {AttributeCommonInfo::AS_CXX11, "gnu::nomicromips"},
10815   {AttributeCommonInfo::AS_C23, "gnu::nomicromips"},
10816 };
10817 struct ParsedAttrInfoNoMicroMips final : public ParsedAttrInfo {
10818   constexpr ParsedAttrInfoNoMicroMips() : ParsedAttrInfo(
10819     /*AttrKind=*/ParsedAttr::AT_NoMicroMips,
10820     /*NumArgs=*/0,
10821     /*OptArgs=*/0,
10822     /*NumArgMembers=*/0,
10823     /*HasCustomParsing=*/0,
10824     /*AcceptsExprPack=*/0,
10825     /*IsTargetSpecific=*/1,
10826     /*IsType=*/0,
10827     /*IsStmt=*/0,
10828     /*IsKnownToGCC=*/1,
10829     /*IsSupportedByPragmaAttribute=*/1,
10830     /*Spellings=*/NoMicroMipsSpellings,
10831     /*ArgNames=*/{}) {}
10832 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10833   if (!isa<FunctionDecl>(D)) {
10834     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
10835       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10836     return false;
10837   }
10838   return true;
10839 }
10840 
10841 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10842   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10843     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10844   return false;
10845 }
10846 
10847 bool existsInTarget(const TargetInfo &Target) const override {
10848   const llvm::Triple &T = Target.getTriple(); (void)T;
10849   return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel);
10850 }
10851 
10852 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10853   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10854 }
10855 
10856 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10857   D->addAttr(::new (S.Context) NoMicroMipsAttr(S.Context, Attr));
10858   return AttributeApplied;
10859 }
10860 
10861 bool isParamExpr(size_t N) const override {
10862   return false;
10863 }
10864 
10865 static const ParsedAttrInfoNoMicroMips Instance;
10866 };
10867 const ParsedAttrInfoNoMicroMips ParsedAttrInfoNoMicroMips::Instance;
10868 static constexpr ParsedAttrInfo::Spelling NoMips16Spellings[] = {
10869   {AttributeCommonInfo::AS_GNU, "nomips16"},
10870   {AttributeCommonInfo::AS_CXX11, "gnu::nomips16"},
10871   {AttributeCommonInfo::AS_C23, "gnu::nomips16"},
10872 };
10873 struct ParsedAttrInfoNoMips16 final : public ParsedAttrInfo {
10874   constexpr ParsedAttrInfoNoMips16() : ParsedAttrInfo(
10875     /*AttrKind=*/ParsedAttr::AT_NoMips16,
10876     /*NumArgs=*/0,
10877     /*OptArgs=*/0,
10878     /*NumArgMembers=*/0,
10879     /*HasCustomParsing=*/0,
10880     /*AcceptsExprPack=*/0,
10881     /*IsTargetSpecific=*/1,
10882     /*IsType=*/0,
10883     /*IsStmt=*/0,
10884     /*IsKnownToGCC=*/1,
10885     /*IsSupportedByPragmaAttribute=*/1,
10886     /*Spellings=*/NoMips16Spellings,
10887     /*ArgNames=*/{}) {}
10888 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10889   if (!isa<FunctionDecl>(D)) {
10890     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
10891       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10892     return false;
10893   }
10894   return true;
10895 }
10896 
10897 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10898   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10899     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10900   return false;
10901 }
10902 
10903 bool existsInTarget(const TargetInfo &Target) const override {
10904   const llvm::Triple &T = Target.getTriple(); (void)T;
10905   return true && (T.getArch() == llvm::Triple::mips || T.getArch() == llvm::Triple::mipsel);
10906 }
10907 
10908 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10909   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10910 }
10911 
10912 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10913   D->addAttr(::new (S.Context) NoMips16Attr(S.Context, Attr));
10914   return AttributeApplied;
10915 }
10916 
10917 bool isParamExpr(size_t N) const override {
10918   return false;
10919 }
10920 
10921 static const ParsedAttrInfoNoMips16 Instance;
10922 };
10923 const ParsedAttrInfoNoMips16 ParsedAttrInfoNoMips16::Instance;
10924 static constexpr ParsedAttrInfo::Spelling NoProfileFunctionSpellings[] = {
10925   {AttributeCommonInfo::AS_GNU, "no_profile_instrument_function"},
10926   {AttributeCommonInfo::AS_CXX11, "gnu::no_profile_instrument_function"},
10927   {AttributeCommonInfo::AS_C23, "gnu::no_profile_instrument_function"},
10928 };
10929 struct ParsedAttrInfoNoProfileFunction final : public ParsedAttrInfo {
10930   constexpr ParsedAttrInfoNoProfileFunction() : ParsedAttrInfo(
10931     /*AttrKind=*/ParsedAttr::AT_NoProfileFunction,
10932     /*NumArgs=*/0,
10933     /*OptArgs=*/0,
10934     /*NumArgMembers=*/0,
10935     /*HasCustomParsing=*/0,
10936     /*AcceptsExprPack=*/0,
10937     /*IsTargetSpecific=*/0,
10938     /*IsType=*/0,
10939     /*IsStmt=*/0,
10940     /*IsKnownToGCC=*/1,
10941     /*IsSupportedByPragmaAttribute=*/1,
10942     /*Spellings=*/NoProfileFunctionSpellings,
10943     /*ArgNames=*/{}) {}
10944 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10945   if (!isa<FunctionDecl>(D)) {
10946     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10947       << Attr << Attr.isRegularKeywordAttribute() << "functions";
10948     return false;
10949   }
10950   return true;
10951 }
10952 
10953 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
10954   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
10955     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
10956   return false;
10957 }
10958 
10959 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
10960   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
10961 }
10962 
10963 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
10964   D->addAttr(::new (S.Context) NoProfileFunctionAttr(S.Context, Attr));
10965   return AttributeApplied;
10966 }
10967 
10968 bool isParamExpr(size_t N) const override {
10969   return false;
10970 }
10971 
10972 static const ParsedAttrInfoNoProfileFunction Instance;
10973 };
10974 const ParsedAttrInfoNoProfileFunction ParsedAttrInfoNoProfileFunction::Instance;
10975 static constexpr ParsedAttrInfo::Spelling NoRandomizeLayoutSpellings[] = {
10976   {AttributeCommonInfo::AS_GNU, "no_randomize_layout"},
10977   {AttributeCommonInfo::AS_CXX11, "gnu::no_randomize_layout"},
10978   {AttributeCommonInfo::AS_C23, "gnu::no_randomize_layout"},
10979 };
10980 struct ParsedAttrInfoNoRandomizeLayout final : public ParsedAttrInfo {
10981   constexpr ParsedAttrInfoNoRandomizeLayout() : ParsedAttrInfo(
10982     /*AttrKind=*/ParsedAttr::AT_NoRandomizeLayout,
10983     /*NumArgs=*/0,
10984     /*OptArgs=*/0,
10985     /*NumArgMembers=*/0,
10986     /*HasCustomParsing=*/0,
10987     /*AcceptsExprPack=*/0,
10988     /*IsTargetSpecific=*/0,
10989     /*IsType=*/0,
10990     /*IsStmt=*/0,
10991     /*IsKnownToGCC=*/1,
10992     /*IsSupportedByPragmaAttribute=*/1,
10993     /*Spellings=*/NoRandomizeLayoutSpellings,
10994     /*ArgNames=*/{}) {}
10995 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
10996   if (!isa<RecordDecl>(D)) {
10997     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
10998       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
10999     return false;
11000   }
11001   return true;
11002 }
11003 
11004 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11005   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11006     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11007   return false;
11008 }
11009 
11010   using ParsedAttrInfo::diagMutualExclusion;
11011 
11012   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
11013     if (const auto *A = D->getAttr<RandomizeLayoutAttr>()) {
11014       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
11015       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
11016 return false;
11017     }
11018     return true;
11019   }
11020 
11021 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
11022   return (!LangOpts.CPlusPlus);
11023 }
11024 
11025 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11026   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
11027 }
11028 
11029 bool isParamExpr(size_t N) const override {
11030   return false;
11031 }
11032 
11033 static const ParsedAttrInfoNoRandomizeLayout Instance;
11034 };
11035 const ParsedAttrInfoNoRandomizeLayout ParsedAttrInfoNoRandomizeLayout::Instance;
11036 static constexpr ParsedAttrInfo::Spelling NoReturnSpellings[] = {
11037   {AttributeCommonInfo::AS_GNU, "noreturn"},
11038   {AttributeCommonInfo::AS_CXX11, "gnu::noreturn"},
11039   {AttributeCommonInfo::AS_C23, "gnu::noreturn"},
11040   {AttributeCommonInfo::AS_Declspec, "noreturn"},
11041 };
11042 struct ParsedAttrInfoNoReturn final : public ParsedAttrInfo {
11043   constexpr ParsedAttrInfoNoReturn() : ParsedAttrInfo(
11044     /*AttrKind=*/ParsedAttr::AT_NoReturn,
11045     /*NumArgs=*/0,
11046     /*OptArgs=*/0,
11047     /*NumArgMembers=*/0,
11048     /*HasCustomParsing=*/0,
11049     /*AcceptsExprPack=*/0,
11050     /*IsTargetSpecific=*/0,
11051     /*IsType=*/0,
11052     /*IsStmt=*/0,
11053     /*IsKnownToGCC=*/1,
11054     /*IsSupportedByPragmaAttribute=*/0,
11055     /*Spellings=*/NoReturnSpellings,
11056     /*ArgNames=*/{}) {}
11057 bool isParamExpr(size_t N) const override {
11058   return false;
11059 }
11060 
11061 static const ParsedAttrInfoNoReturn Instance;
11062 };
11063 const ParsedAttrInfoNoReturn ParsedAttrInfoNoReturn::Instance;
11064 static constexpr ParsedAttrInfo::Spelling NoSanitizeSpellings[] = {
11065   {AttributeCommonInfo::AS_GNU, "no_sanitize"},
11066   {AttributeCommonInfo::AS_CXX11, "clang::no_sanitize"},
11067   {AttributeCommonInfo::AS_C23, "clang::no_sanitize"},
11068 };
11069 static constexpr const char *NoSanitizeArgNames[] = {
11070 "Sanitizers...",};
11071 struct ParsedAttrInfoNoSanitize final : public ParsedAttrInfo {
11072   constexpr ParsedAttrInfoNoSanitize() : ParsedAttrInfo(
11073     /*AttrKind=*/ParsedAttr::AT_NoSanitize,
11074     /*NumArgs=*/0,
11075     /*OptArgs=*/15,
11076     /*NumArgMembers=*/1,
11077     /*HasCustomParsing=*/0,
11078     /*AcceptsExprPack=*/0,
11079     /*IsTargetSpecific=*/0,
11080     /*IsType=*/0,
11081     /*IsStmt=*/0,
11082     /*IsKnownToGCC=*/0,
11083     /*IsSupportedByPragmaAttribute=*/1,
11084     /*Spellings=*/NoSanitizeSpellings,
11085     /*ArgNames=*/NoSanitizeArgNames) {}
11086 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11087   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isGlobalVar(D)) {
11088     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
11089       << Attr << Attr.isRegularKeywordAttribute() << "functions, Objective-C methods, and global variables";
11090     return false;
11091   }
11092   return true;
11093 }
11094 
11095 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11096   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11097     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11098   return false;
11099 }
11100 
11101 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11102   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11103   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
11104   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
11105 }
11106 
11107 bool isParamExpr(size_t N) const override {
11108   return false;
11109 }
11110 
11111 static const ParsedAttrInfoNoSanitize Instance;
11112 };
11113 const ParsedAttrInfoNoSanitize ParsedAttrInfoNoSanitize::Instance;
11114 static constexpr ParsedAttrInfo::Spelling NoSanitizeSpecificSpellings[] = {
11115   {AttributeCommonInfo::AS_GNU, "no_address_safety_analysis"},
11116   {AttributeCommonInfo::AS_CXX11, "gnu::no_address_safety_analysis"},
11117   {AttributeCommonInfo::AS_C23, "gnu::no_address_safety_analysis"},
11118   {AttributeCommonInfo::AS_GNU, "no_sanitize_address"},
11119   {AttributeCommonInfo::AS_CXX11, "gnu::no_sanitize_address"},
11120   {AttributeCommonInfo::AS_C23, "gnu::no_sanitize_address"},
11121   {AttributeCommonInfo::AS_GNU, "no_sanitize_thread"},
11122   {AttributeCommonInfo::AS_CXX11, "gnu::no_sanitize_thread"},
11123   {AttributeCommonInfo::AS_C23, "gnu::no_sanitize_thread"},
11124   {AttributeCommonInfo::AS_GNU, "no_sanitize_memory"},
11125   {AttributeCommonInfo::AS_CXX11, "clang::no_sanitize_memory"},
11126   {AttributeCommonInfo::AS_C23, "clang::no_sanitize_memory"},
11127 };
11128 struct ParsedAttrInfoNoSanitizeSpecific final : public ParsedAttrInfo {
11129   constexpr ParsedAttrInfoNoSanitizeSpecific() : ParsedAttrInfo(
11130     /*AttrKind=*/ParsedAttr::AT_NoSanitizeSpecific,
11131     /*NumArgs=*/0,
11132     /*OptArgs=*/0,
11133     /*NumArgMembers=*/0,
11134     /*HasCustomParsing=*/0,
11135     /*AcceptsExprPack=*/0,
11136     /*IsTargetSpecific=*/0,
11137     /*IsType=*/0,
11138     /*IsStmt=*/0,
11139     /*IsKnownToGCC=*/1,
11140     /*IsSupportedByPragmaAttribute=*/1,
11141     /*Spellings=*/NoSanitizeSpecificSpellings,
11142     /*ArgNames=*/{}) {}
11143 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11144   if (!isa<FunctionDecl>(D) && !isGlobalVar(D)) {
11145     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
11146       << Attr << Attr.isRegularKeywordAttribute() << "functions and global variables";
11147     return false;
11148   }
11149   return true;
11150 }
11151 
11152 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11153   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11154     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11155   return false;
11156 }
11157 
11158 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11159   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11160   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
11161 }
11162 
11163 bool isParamExpr(size_t N) const override {
11164   return false;
11165 }
11166 
11167 static const ParsedAttrInfoNoSanitizeSpecific Instance;
11168 };
11169 const ParsedAttrInfoNoSanitizeSpecific ParsedAttrInfoNoSanitizeSpecific::Instance;
11170 static constexpr ParsedAttrInfo::Spelling NoSpecializationsSpellings[] = {
11171   {AttributeCommonInfo::AS_GNU, "no_specializations"},
11172   {AttributeCommonInfo::AS_CXX11, "clang::no_specializations"},
11173 };
11174 static constexpr const char *NoSpecializationsArgNames[] = {
11175 "Message",};
11176 struct ParsedAttrInfoNoSpecializations final : public ParsedAttrInfo {
11177   constexpr ParsedAttrInfoNoSpecializations() : ParsedAttrInfo(
11178     /*AttrKind=*/ParsedAttr::AT_NoSpecializations,
11179     /*NumArgs=*/0,
11180     /*OptArgs=*/1,
11181     /*NumArgMembers=*/1,
11182     /*HasCustomParsing=*/0,
11183     /*AcceptsExprPack=*/0,
11184     /*IsTargetSpecific=*/0,
11185     /*IsType=*/0,
11186     /*IsStmt=*/0,
11187     /*IsKnownToGCC=*/0,
11188     /*IsSupportedByPragmaAttribute=*/0,
11189     /*Spellings=*/NoSpecializationsSpellings,
11190     /*ArgNames=*/NoSpecializationsArgNames) {}
11191 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11192   if (!isClassTmpl(D) && !isFunctionTmpl(D) && !isVarTmpl(D)) {
11193     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11194       << Attr << Attr.isRegularKeywordAttribute() << "class templates, function templates, and variable templates";
11195     return false;
11196   }
11197   return true;
11198 }
11199 
11200 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11201   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11202     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11203   return false;
11204 }
11205 
11206 bool isParamExpr(size_t N) const override {
11207   return false;
11208 }
11209 
11210 static const ParsedAttrInfoNoSpecializations Instance;
11211 };
11212 const ParsedAttrInfoNoSpecializations ParsedAttrInfoNoSpecializations::Instance;
11213 static constexpr ParsedAttrInfo::Spelling NoSpeculativeLoadHardeningSpellings[] = {
11214   {AttributeCommonInfo::AS_GNU, "no_speculative_load_hardening"},
11215   {AttributeCommonInfo::AS_CXX11, "clang::no_speculative_load_hardening"},
11216   {AttributeCommonInfo::AS_C23, "clang::no_speculative_load_hardening"},
11217 };
11218 struct ParsedAttrInfoNoSpeculativeLoadHardening final : public ParsedAttrInfo {
11219   constexpr ParsedAttrInfoNoSpeculativeLoadHardening() : ParsedAttrInfo(
11220     /*AttrKind=*/ParsedAttr::AT_NoSpeculativeLoadHardening,
11221     /*NumArgs=*/0,
11222     /*OptArgs=*/0,
11223     /*NumArgMembers=*/0,
11224     /*HasCustomParsing=*/0,
11225     /*AcceptsExprPack=*/0,
11226     /*IsTargetSpecific=*/0,
11227     /*IsType=*/0,
11228     /*IsStmt=*/0,
11229     /*IsKnownToGCC=*/0,
11230     /*IsSupportedByPragmaAttribute=*/1,
11231     /*Spellings=*/NoSpeculativeLoadHardeningSpellings,
11232     /*ArgNames=*/{}) {}
11233 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11234   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
11235     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
11236       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
11237     return false;
11238   }
11239   return true;
11240 }
11241 
11242 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11243   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11244     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11245   return false;
11246 }
11247 
11248   using ParsedAttrInfo::diagMutualExclusion;
11249 
11250   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
11251     if (const auto *A = D->getAttr<SpeculativeLoadHardeningAttr>()) {
11252       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
11253       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
11254 return false;
11255     }
11256     return true;
11257   }
11258 
11259 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11260   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11261   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
11262 }
11263 
11264 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11265   D->addAttr(::new (S.Context) NoSpeculativeLoadHardeningAttr(S.Context, Attr));
11266   return AttributeApplied;
11267 }
11268 
11269 bool isParamExpr(size_t N) const override {
11270   return false;
11271 }
11272 
11273 static const ParsedAttrInfoNoSpeculativeLoadHardening Instance;
11274 };
11275 const ParsedAttrInfoNoSpeculativeLoadHardening ParsedAttrInfoNoSpeculativeLoadHardening::Instance;
11276 static constexpr ParsedAttrInfo::Spelling NoSplitStackSpellings[] = {
11277   {AttributeCommonInfo::AS_GNU, "no_split_stack"},
11278   {AttributeCommonInfo::AS_CXX11, "gnu::no_split_stack"},
11279   {AttributeCommonInfo::AS_C23, "gnu::no_split_stack"},
11280 };
11281 struct ParsedAttrInfoNoSplitStack final : public ParsedAttrInfo {
11282   constexpr ParsedAttrInfoNoSplitStack() : ParsedAttrInfo(
11283     /*AttrKind=*/ParsedAttr::AT_NoSplitStack,
11284     /*NumArgs=*/0,
11285     /*OptArgs=*/0,
11286     /*NumArgMembers=*/0,
11287     /*HasCustomParsing=*/0,
11288     /*AcceptsExprPack=*/0,
11289     /*IsTargetSpecific=*/0,
11290     /*IsType=*/0,
11291     /*IsStmt=*/0,
11292     /*IsKnownToGCC=*/1,
11293     /*IsSupportedByPragmaAttribute=*/1,
11294     /*Spellings=*/NoSplitStackSpellings,
11295     /*ArgNames=*/{}) {}
11296 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11297   if (!isa<FunctionDecl>(D)) {
11298     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
11299       << Attr << Attr.isRegularKeywordAttribute() << "functions";
11300     return false;
11301   }
11302   return true;
11303 }
11304 
11305 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11306   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11307     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11308   return false;
11309 }
11310 
11311 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11312   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11313 }
11314 
11315 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11316   D->addAttr(::new (S.Context) NoSplitStackAttr(S.Context, Attr));
11317   return AttributeApplied;
11318 }
11319 
11320 bool isParamExpr(size_t N) const override {
11321   return false;
11322 }
11323 
11324 static const ParsedAttrInfoNoSplitStack Instance;
11325 };
11326 const ParsedAttrInfoNoSplitStack ParsedAttrInfoNoSplitStack::Instance;
11327 static constexpr ParsedAttrInfo::Spelling NoStackProtectorSpellings[] = {
11328   {AttributeCommonInfo::AS_GNU, "no_stack_protector"},
11329   {AttributeCommonInfo::AS_CXX11, "clang::no_stack_protector"},
11330   {AttributeCommonInfo::AS_C23, "clang::no_stack_protector"},
11331   {AttributeCommonInfo::AS_CXX11, "gnu::no_stack_protector"},
11332   {AttributeCommonInfo::AS_C23, "gnu::no_stack_protector"},
11333   {AttributeCommonInfo::AS_Declspec, "safebuffers"},
11334 };
11335 struct ParsedAttrInfoNoStackProtector final : public ParsedAttrInfo {
11336   constexpr ParsedAttrInfoNoStackProtector() : ParsedAttrInfo(
11337     /*AttrKind=*/ParsedAttr::AT_NoStackProtector,
11338     /*NumArgs=*/0,
11339     /*OptArgs=*/0,
11340     /*NumArgMembers=*/0,
11341     /*HasCustomParsing=*/0,
11342     /*AcceptsExprPack=*/0,
11343     /*IsTargetSpecific=*/0,
11344     /*IsType=*/0,
11345     /*IsStmt=*/0,
11346     /*IsKnownToGCC=*/0,
11347     /*IsSupportedByPragmaAttribute=*/1,
11348     /*Spellings=*/NoStackProtectorSpellings,
11349     /*ArgNames=*/{}) {}
11350 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11351   if (!isa<FunctionDecl>(D)) {
11352     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11353       << Attr << Attr.isRegularKeywordAttribute() << "functions";
11354     return false;
11355   }
11356   return true;
11357 }
11358 
11359 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11360   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11361     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11362   return false;
11363 }
11364 
11365 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
11366   enum Spelling {
11367     GNU_no_stack_protector = 0,
11368     CXX11_clang_no_stack_protector = 1,
11369     C23_clang_no_stack_protector = 2,
11370     CXX11_gnu_no_stack_protector = 3,
11371     C23_gnu_no_stack_protector = 4,
11372     Declspec_safebuffers = 5,
11373   SpellingNotCalculated = 15
11374 
11375   };
11376 
11377   unsigned Idx = Attr.getAttributeSpellingListIndex();
11378   switch (Idx) {
11379     default: llvm_unreachable("Unknown spelling list index");
11380     case 0: return GNU_no_stack_protector;
11381     case 1: return CXX11_clang_no_stack_protector;
11382     case 2: return C23_clang_no_stack_protector;
11383     case 3: return CXX11_gnu_no_stack_protector;
11384     case 4: return C23_gnu_no_stack_protector;
11385     case 5: return Declspec_safebuffers;
11386   }
11387 }
11388 
11389 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11390   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11391 }
11392 
11393 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11394   D->addAttr(::new (S.Context) NoStackProtectorAttr(S.Context, Attr));
11395   return AttributeApplied;
11396 }
11397 
11398 bool isParamExpr(size_t N) const override {
11399   return false;
11400 }
11401 
11402 static const ParsedAttrInfoNoStackProtector Instance;
11403 };
11404 const ParsedAttrInfoNoStackProtector ParsedAttrInfoNoStackProtector::Instance;
11405 static constexpr ParsedAttrInfo::Spelling NoThreadSafetyAnalysisSpellings[] = {
11406   {AttributeCommonInfo::AS_GNU, "no_thread_safety_analysis"},
11407   {AttributeCommonInfo::AS_CXX11, "clang::no_thread_safety_analysis"},
11408   {AttributeCommonInfo::AS_C23, "clang::no_thread_safety_analysis"},
11409 };
11410 struct ParsedAttrInfoNoThreadSafetyAnalysis final : public ParsedAttrInfo {
11411   constexpr ParsedAttrInfoNoThreadSafetyAnalysis() : ParsedAttrInfo(
11412     /*AttrKind=*/ParsedAttr::AT_NoThreadSafetyAnalysis,
11413     /*NumArgs=*/0,
11414     /*OptArgs=*/0,
11415     /*NumArgMembers=*/0,
11416     /*HasCustomParsing=*/0,
11417     /*AcceptsExprPack=*/0,
11418     /*IsTargetSpecific=*/0,
11419     /*IsType=*/0,
11420     /*IsStmt=*/0,
11421     /*IsKnownToGCC=*/0,
11422     /*IsSupportedByPragmaAttribute=*/1,
11423     /*Spellings=*/NoThreadSafetyAnalysisSpellings,
11424     /*ArgNames=*/{}) {}
11425 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11426   if (!isa<FunctionDecl>(D)) {
11427     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11428       << Attr << Attr.isRegularKeywordAttribute() << "functions";
11429     return false;
11430   }
11431   return true;
11432 }
11433 
11434 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11435   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11436     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11437   return false;
11438 }
11439 
11440 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11441   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11442 }
11443 
11444 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11445   D->addAttr(::new (S.Context) NoThreadSafetyAnalysisAttr(S.Context, Attr));
11446   return AttributeApplied;
11447 }
11448 
11449 bool isParamExpr(size_t N) const override {
11450   return false;
11451 }
11452 
11453 static const ParsedAttrInfoNoThreadSafetyAnalysis Instance;
11454 };
11455 const ParsedAttrInfoNoThreadSafetyAnalysis ParsedAttrInfoNoThreadSafetyAnalysis::Instance;
11456 static constexpr ParsedAttrInfo::Spelling NoThrowSpellings[] = {
11457   {AttributeCommonInfo::AS_GNU, "nothrow"},
11458   {AttributeCommonInfo::AS_CXX11, "gnu::nothrow"},
11459   {AttributeCommonInfo::AS_C23, "gnu::nothrow"},
11460   {AttributeCommonInfo::AS_Declspec, "nothrow"},
11461 };
11462 struct ParsedAttrInfoNoThrow final : public ParsedAttrInfo {
11463   constexpr ParsedAttrInfoNoThrow() : ParsedAttrInfo(
11464     /*AttrKind=*/ParsedAttr::AT_NoThrow,
11465     /*NumArgs=*/0,
11466     /*OptArgs=*/0,
11467     /*NumArgMembers=*/0,
11468     /*HasCustomParsing=*/0,
11469     /*AcceptsExprPack=*/0,
11470     /*IsTargetSpecific=*/0,
11471     /*IsType=*/0,
11472     /*IsStmt=*/0,
11473     /*IsKnownToGCC=*/1,
11474     /*IsSupportedByPragmaAttribute=*/1,
11475     /*Spellings=*/NoThrowSpellings,
11476     /*ArgNames=*/{}) {}
11477 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11478   if (!isFunctionLike(D)) {
11479     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11480       << Attr << Attr.isRegularKeywordAttribute() << "functions and function pointers";
11481     return false;
11482   }
11483   return true;
11484 }
11485 
11486 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11487   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11488     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11489   return false;
11490 }
11491 
11492 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11493   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
11494 }
11495 
11496 bool isParamExpr(size_t N) const override {
11497   return false;
11498 }
11499 
11500 static const ParsedAttrInfoNoThrow Instance;
11501 };
11502 const ParsedAttrInfoNoThrow ParsedAttrInfoNoThrow::Instance;
11503 static constexpr ParsedAttrInfo::Spelling NoTrivialAutoVarInitSpellings[] = {
11504   {AttributeCommonInfo::AS_Declspec, "no_init_all"},
11505 };
11506 struct ParsedAttrInfoNoTrivialAutoVarInit final : public ParsedAttrInfo {
11507   constexpr ParsedAttrInfoNoTrivialAutoVarInit() : ParsedAttrInfo(
11508     /*AttrKind=*/ParsedAttr::AT_NoTrivialAutoVarInit,
11509     /*NumArgs=*/0,
11510     /*OptArgs=*/0,
11511     /*NumArgMembers=*/0,
11512     /*HasCustomParsing=*/0,
11513     /*AcceptsExprPack=*/0,
11514     /*IsTargetSpecific=*/0,
11515     /*IsType=*/0,
11516     /*IsStmt=*/0,
11517     /*IsKnownToGCC=*/0,
11518     /*IsSupportedByPragmaAttribute=*/0,
11519     /*Spellings=*/NoTrivialAutoVarInitSpellings,
11520     /*ArgNames=*/{}) {}
11521 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11522   if (!isa<FunctionDecl>(D) && !isa<TagDecl>(D)) {
11523     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11524       << Attr << Attr.isRegularKeywordAttribute() << "functions and tag types";
11525     return false;
11526   }
11527   return true;
11528 }
11529 
11530 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11531   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11532     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11533   return false;
11534 }
11535 
11536 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11537   D->addAttr(::new (S.Context) NoTrivialAutoVarInitAttr(S.Context, Attr));
11538   return AttributeApplied;
11539 }
11540 
11541 bool isParamExpr(size_t N) const override {
11542   return false;
11543 }
11544 
11545 static const ParsedAttrInfoNoTrivialAutoVarInit Instance;
11546 };
11547 const ParsedAttrInfoNoTrivialAutoVarInit ParsedAttrInfoNoTrivialAutoVarInit::Instance;
11548 static constexpr ParsedAttrInfo::Spelling NoUniqueAddressSpellings[] = {
11549   {AttributeCommonInfo::AS_CXX11, "no_unique_address"},
11550   {AttributeCommonInfo::AS_CXX11, "msvc::no_unique_address"},
11551 };
11552 struct ParsedAttrInfoNoUniqueAddress final : public ParsedAttrInfo {
11553   constexpr ParsedAttrInfoNoUniqueAddress() : ParsedAttrInfo(
11554     /*AttrKind=*/ParsedAttr::AT_NoUniqueAddress,
11555     /*NumArgs=*/0,
11556     /*OptArgs=*/0,
11557     /*NumArgMembers=*/0,
11558     /*HasCustomParsing=*/0,
11559     /*AcceptsExprPack=*/0,
11560     /*IsTargetSpecific=*/0,
11561     /*IsType=*/0,
11562     /*IsStmt=*/0,
11563     /*IsKnownToGCC=*/0,
11564     /*IsSupportedByPragmaAttribute=*/0,
11565     /*Spellings=*/NoUniqueAddressSpellings,
11566     /*ArgNames=*/{}) {}
11567 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11568   if (!isNonBitField(D)) {
11569     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
11570       << Attr << Attr.isRegularKeywordAttribute() << "non-bit-field non-static data members";
11571     return false;
11572   }
11573   return true;
11574 }
11575 
11576 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11577   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11578     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11579   return false;
11580 }
11581 
11582 bool spellingExistsInTarget(const TargetInfo &Target,
11583                             const unsigned SpellingListIndex) const override {
11584   const llvm::Triple &T = Target.getTriple(); (void)T;
11585   return ((SpellingListIndex == 0) && true && ( Target.getCXXABI().isItaniumFamily() )) || ((SpellingListIndex == 1) && 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() ));
11586 }
11587 
11588 bool isParamExpr(size_t N) const override {
11589   return false;
11590 }
11591 
11592 static const ParsedAttrInfoNoUniqueAddress Instance;
11593 };
11594 const ParsedAttrInfoNoUniqueAddress ParsedAttrInfoNoUniqueAddress::Instance;
11595 static constexpr ParsedAttrInfo::Spelling NoUwtableSpellings[] = {
11596   {AttributeCommonInfo::AS_GNU, "nouwtable"},
11597   {AttributeCommonInfo::AS_CXX11, "clang::nouwtable"},
11598   {AttributeCommonInfo::AS_C23, "clang::nouwtable"},
11599 };
11600 struct ParsedAttrInfoNoUwtable final : public ParsedAttrInfo {
11601   constexpr ParsedAttrInfoNoUwtable() : ParsedAttrInfo(
11602     /*AttrKind=*/ParsedAttr::AT_NoUwtable,
11603     /*NumArgs=*/0,
11604     /*OptArgs=*/0,
11605     /*NumArgMembers=*/0,
11606     /*HasCustomParsing=*/0,
11607     /*AcceptsExprPack=*/0,
11608     /*IsTargetSpecific=*/0,
11609     /*IsType=*/0,
11610     /*IsStmt=*/0,
11611     /*IsKnownToGCC=*/0,
11612     /*IsSupportedByPragmaAttribute=*/1,
11613     /*Spellings=*/NoUwtableSpellings,
11614     /*ArgNames=*/{}) {}
11615 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11616   if (!isFunctionLike(D)) {
11617     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11618       << Attr << Attr.isRegularKeywordAttribute() << "functions and function pointers";
11619     return false;
11620   }
11621   return true;
11622 }
11623 
11624 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11625   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11626     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11627   return false;
11628 }
11629 
11630 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11631   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
11632 }
11633 
11634 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11635   D->addAttr(::new (S.Context) NoUwtableAttr(S.Context, Attr));
11636   return AttributeApplied;
11637 }
11638 
11639 bool isParamExpr(size_t N) const override {
11640   return false;
11641 }
11642 
11643 static const ParsedAttrInfoNoUwtable Instance;
11644 };
11645 const ParsedAttrInfoNoUwtable ParsedAttrInfoNoUwtable::Instance;
11646 static constexpr ParsedAttrInfo::Spelling NonAllocatingSpellings[] = {
11647   {AttributeCommonInfo::AS_GNU, "nonallocating"},
11648   {AttributeCommonInfo::AS_CXX11, "clang::nonallocating"},
11649   {AttributeCommonInfo::AS_C23, "clang::nonallocating"},
11650 };
11651 static constexpr const char *NonAllocatingArgNames[] = {
11652 "Cond",};
11653 struct ParsedAttrInfoNonAllocating final : public ParsedAttrInfo {
11654   constexpr ParsedAttrInfoNonAllocating() : ParsedAttrInfo(
11655     /*AttrKind=*/ParsedAttr::AT_NonAllocating,
11656     /*NumArgs=*/0,
11657     /*OptArgs=*/1,
11658     /*NumArgMembers=*/1,
11659     /*HasCustomParsing=*/0,
11660     /*AcceptsExprPack=*/0,
11661     /*IsTargetSpecific=*/0,
11662     /*IsType=*/1,
11663     /*IsStmt=*/0,
11664     /*IsKnownToGCC=*/0,
11665     /*IsSupportedByPragmaAttribute=*/0,
11666     /*Spellings=*/NonAllocatingSpellings,
11667     /*ArgNames=*/NonAllocatingArgNames) {}
11668 bool isParamExpr(size_t N) const override {
11669   return (N == 0) || false;
11670 }
11671 
11672 static const ParsedAttrInfoNonAllocating Instance;
11673 };
11674 const ParsedAttrInfoNonAllocating ParsedAttrInfoNonAllocating::Instance;
11675 static constexpr ParsedAttrInfo::Spelling NonBlockingSpellings[] = {
11676   {AttributeCommonInfo::AS_GNU, "nonblocking"},
11677   {AttributeCommonInfo::AS_CXX11, "clang::nonblocking"},
11678   {AttributeCommonInfo::AS_C23, "clang::nonblocking"},
11679 };
11680 static constexpr const char *NonBlockingArgNames[] = {
11681 "Cond",};
11682 struct ParsedAttrInfoNonBlocking final : public ParsedAttrInfo {
11683   constexpr ParsedAttrInfoNonBlocking() : ParsedAttrInfo(
11684     /*AttrKind=*/ParsedAttr::AT_NonBlocking,
11685     /*NumArgs=*/0,
11686     /*OptArgs=*/1,
11687     /*NumArgMembers=*/1,
11688     /*HasCustomParsing=*/0,
11689     /*AcceptsExprPack=*/0,
11690     /*IsTargetSpecific=*/0,
11691     /*IsType=*/1,
11692     /*IsStmt=*/0,
11693     /*IsKnownToGCC=*/0,
11694     /*IsSupportedByPragmaAttribute=*/0,
11695     /*Spellings=*/NonBlockingSpellings,
11696     /*ArgNames=*/NonBlockingArgNames) {}
11697 bool isParamExpr(size_t N) const override {
11698   return (N == 0) || false;
11699 }
11700 
11701 static const ParsedAttrInfoNonBlocking Instance;
11702 };
11703 const ParsedAttrInfoNonBlocking ParsedAttrInfoNonBlocking::Instance;
11704 static constexpr ParsedAttrInfo::Spelling NonNullSpellings[] = {
11705   {AttributeCommonInfo::AS_GNU, "nonnull"},
11706   {AttributeCommonInfo::AS_CXX11, "gnu::nonnull"},
11707   {AttributeCommonInfo::AS_C23, "gnu::nonnull"},
11708 };
11709 static constexpr const char *NonNullArgNames[] = {
11710 "Args...",};
11711 struct ParsedAttrInfoNonNull final : public ParsedAttrInfo {
11712   constexpr ParsedAttrInfoNonNull() : ParsedAttrInfo(
11713     /*AttrKind=*/ParsedAttr::AT_NonNull,
11714     /*NumArgs=*/0,
11715     /*OptArgs=*/15,
11716     /*NumArgMembers=*/1,
11717     /*HasCustomParsing=*/0,
11718     /*AcceptsExprPack=*/0,
11719     /*IsTargetSpecific=*/0,
11720     /*IsType=*/0,
11721     /*IsStmt=*/0,
11722     /*IsKnownToGCC=*/1,
11723     /*IsSupportedByPragmaAttribute=*/0,
11724     /*Spellings=*/NonNullSpellings,
11725     /*ArgNames=*/NonNullArgNames) {}
11726 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11727   if (!isa<ObjCMethodDecl>(D) && !isHasFunctionProto(D) && !isa<ParmVarDecl>(D)) {
11728     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11729       << Attr << Attr.isRegularKeywordAttribute() << "functions, methods, and parameters";
11730     return false;
11731   }
11732   return true;
11733 }
11734 
11735 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11736   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11737     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11738   return false;
11739 }
11740 
11741 bool isParamExpr(size_t N) const override {
11742   return false;
11743 }
11744 
11745 static const ParsedAttrInfoNonNull Instance;
11746 };
11747 const ParsedAttrInfoNonNull ParsedAttrInfoNonNull::Instance;
11748 static constexpr ParsedAttrInfo::Spelling NotTailCalledSpellings[] = {
11749   {AttributeCommonInfo::AS_GNU, "not_tail_called"},
11750   {AttributeCommonInfo::AS_CXX11, "clang::not_tail_called"},
11751   {AttributeCommonInfo::AS_C23, "clang::not_tail_called"},
11752 };
11753 struct ParsedAttrInfoNotTailCalled final : public ParsedAttrInfo {
11754   constexpr ParsedAttrInfoNotTailCalled() : ParsedAttrInfo(
11755     /*AttrKind=*/ParsedAttr::AT_NotTailCalled,
11756     /*NumArgs=*/0,
11757     /*OptArgs=*/0,
11758     /*NumArgMembers=*/0,
11759     /*HasCustomParsing=*/0,
11760     /*AcceptsExprPack=*/0,
11761     /*IsTargetSpecific=*/0,
11762     /*IsType=*/0,
11763     /*IsStmt=*/0,
11764     /*IsKnownToGCC=*/0,
11765     /*IsSupportedByPragmaAttribute=*/1,
11766     /*Spellings=*/NotTailCalledSpellings,
11767     /*ArgNames=*/{}) {}
11768 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11769   if (!isa<FunctionDecl>(D)) {
11770     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11771       << Attr << Attr.isRegularKeywordAttribute() << "functions";
11772     return false;
11773   }
11774   return true;
11775 }
11776 
11777 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11778   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11779     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11780   return false;
11781 }
11782 
11783   using ParsedAttrInfo::diagMutualExclusion;
11784 
11785   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
11786     if (const auto *A = D->getAttr<AlwaysInlineAttr>()) {
11787       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
11788       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
11789 return false;
11790     }
11791     return true;
11792   }
11793 
11794 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11795   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11796 }
11797 
11798 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11799   D->addAttr(::new (S.Context) NotTailCalledAttr(S.Context, Attr));
11800   return AttributeApplied;
11801 }
11802 
11803 bool isParamExpr(size_t N) const override {
11804   return false;
11805 }
11806 
11807 static const ParsedAttrInfoNotTailCalled Instance;
11808 };
11809 const ParsedAttrInfoNotTailCalled ParsedAttrInfoNotTailCalled::Instance;
11810 static constexpr ParsedAttrInfo::Spelling OMPAssumeSpellings[] = {
11811   {AttributeCommonInfo::AS_CXX11, "omp::assume"},
11812 };
11813 static constexpr const char *OMPAssumeArgNames[] = {
11814 "Assumption",};
11815 struct ParsedAttrInfoOMPAssume final : public ParsedAttrInfo {
11816   constexpr ParsedAttrInfoOMPAssume() : ParsedAttrInfo(
11817     /*AttrKind=*/ParsedAttr::AT_OMPAssume,
11818     /*NumArgs=*/1,
11819     /*OptArgs=*/0,
11820     /*NumArgMembers=*/1,
11821     /*HasCustomParsing=*/0,
11822     /*AcceptsExprPack=*/0,
11823     /*IsTargetSpecific=*/0,
11824     /*IsType=*/0,
11825     /*IsStmt=*/0,
11826     /*IsKnownToGCC=*/0,
11827     /*IsSupportedByPragmaAttribute=*/1,
11828     /*Spellings=*/OMPAssumeSpellings,
11829     /*ArgNames=*/OMPAssumeArgNames) {}
11830 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11831   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
11832     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11833       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
11834     return false;
11835   }
11836   return true;
11837 }
11838 
11839 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11840   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11841     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11842   return false;
11843 }
11844 
11845 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11846   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11847   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
11848 }
11849 
11850 bool isParamExpr(size_t N) const override {
11851   return false;
11852 }
11853 
11854 static const ParsedAttrInfoOMPAssume Instance;
11855 };
11856 const ParsedAttrInfoOMPAssume ParsedAttrInfoOMPAssume::Instance;
11857 static constexpr ParsedAttrInfo::Spelling OSConsumedSpellings[] = {
11858   {AttributeCommonInfo::AS_GNU, "os_consumed"},
11859   {AttributeCommonInfo::AS_CXX11, "clang::os_consumed"},
11860   {AttributeCommonInfo::AS_C23, "clang::os_consumed"},
11861 };
11862 struct ParsedAttrInfoOSConsumed final : public ParsedAttrInfo {
11863   constexpr ParsedAttrInfoOSConsumed() : ParsedAttrInfo(
11864     /*AttrKind=*/ParsedAttr::AT_OSConsumed,
11865     /*NumArgs=*/0,
11866     /*OptArgs=*/0,
11867     /*NumArgMembers=*/0,
11868     /*HasCustomParsing=*/0,
11869     /*AcceptsExprPack=*/0,
11870     /*IsTargetSpecific=*/0,
11871     /*IsType=*/0,
11872     /*IsStmt=*/0,
11873     /*IsKnownToGCC=*/0,
11874     /*IsSupportedByPragmaAttribute=*/1,
11875     /*Spellings=*/OSConsumedSpellings,
11876     /*ArgNames=*/{}) {}
11877 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11878   if (!isa<ParmVarDecl>(D)) {
11879     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11880       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
11881     return false;
11882   }
11883   return true;
11884 }
11885 
11886 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11887   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11888     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11889   return false;
11890 }
11891 
11892 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11893   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
11894 }
11895 
11896 bool isParamExpr(size_t N) const override {
11897   return false;
11898 }
11899 
11900 static const ParsedAttrInfoOSConsumed Instance;
11901 };
11902 const ParsedAttrInfoOSConsumed ParsedAttrInfoOSConsumed::Instance;
11903 static constexpr ParsedAttrInfo::Spelling OSConsumesThisSpellings[] = {
11904   {AttributeCommonInfo::AS_GNU, "os_consumes_this"},
11905   {AttributeCommonInfo::AS_CXX11, "clang::os_consumes_this"},
11906   {AttributeCommonInfo::AS_C23, "clang::os_consumes_this"},
11907 };
11908 struct ParsedAttrInfoOSConsumesThis final : public ParsedAttrInfo {
11909   constexpr ParsedAttrInfoOSConsumesThis() : ParsedAttrInfo(
11910     /*AttrKind=*/ParsedAttr::AT_OSConsumesThis,
11911     /*NumArgs=*/0,
11912     /*OptArgs=*/0,
11913     /*NumArgMembers=*/0,
11914     /*HasCustomParsing=*/0,
11915     /*AcceptsExprPack=*/0,
11916     /*IsTargetSpecific=*/0,
11917     /*IsType=*/0,
11918     /*IsStmt=*/0,
11919     /*IsKnownToGCC=*/0,
11920     /*IsSupportedByPragmaAttribute=*/0,
11921     /*Spellings=*/OSConsumesThisSpellings,
11922     /*ArgNames=*/{}) {}
11923 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11924   if (!isNonStaticCXXMethod(D)) {
11925     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11926       << Attr << Attr.isRegularKeywordAttribute() << "non-static member functions";
11927     return false;
11928   }
11929   return true;
11930 }
11931 
11932 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11933   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11934     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11935   return false;
11936 }
11937 
11938 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
11939   D->addAttr(::new (S.Context) OSConsumesThisAttr(S.Context, Attr));
11940   return AttributeApplied;
11941 }
11942 
11943 bool isParamExpr(size_t N) const override {
11944   return false;
11945 }
11946 
11947 static const ParsedAttrInfoOSConsumesThis Instance;
11948 };
11949 const ParsedAttrInfoOSConsumesThis ParsedAttrInfoOSConsumesThis::Instance;
11950 static constexpr ParsedAttrInfo::Spelling OSReturnsNotRetainedSpellings[] = {
11951   {AttributeCommonInfo::AS_GNU, "os_returns_not_retained"},
11952   {AttributeCommonInfo::AS_CXX11, "clang::os_returns_not_retained"},
11953   {AttributeCommonInfo::AS_C23, "clang::os_returns_not_retained"},
11954 };
11955 struct ParsedAttrInfoOSReturnsNotRetained final : public ParsedAttrInfo {
11956   constexpr ParsedAttrInfoOSReturnsNotRetained() : ParsedAttrInfo(
11957     /*AttrKind=*/ParsedAttr::AT_OSReturnsNotRetained,
11958     /*NumArgs=*/0,
11959     /*OptArgs=*/0,
11960     /*NumArgMembers=*/0,
11961     /*HasCustomParsing=*/0,
11962     /*AcceptsExprPack=*/0,
11963     /*IsTargetSpecific=*/0,
11964     /*IsType=*/0,
11965     /*IsStmt=*/0,
11966     /*IsKnownToGCC=*/0,
11967     /*IsSupportedByPragmaAttribute=*/1,
11968     /*Spellings=*/OSReturnsNotRetainedSpellings,
11969     /*ArgNames=*/{}) {}
11970 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
11971   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D) && !isa<ParmVarDecl>(D)) {
11972     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
11973       << Attr << Attr.isRegularKeywordAttribute() << "functions, Objective-C methods, Objective-C properties, and parameters";
11974     return false;
11975   }
11976   return true;
11977 }
11978 
11979 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
11980   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
11981     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
11982   return false;
11983 }
11984 
11985 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
11986   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
11987   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
11988   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC));
11989   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
11990 }
11991 
11992 bool isParamExpr(size_t N) const override {
11993   return false;
11994 }
11995 
11996 static const ParsedAttrInfoOSReturnsNotRetained Instance;
11997 };
11998 const ParsedAttrInfoOSReturnsNotRetained ParsedAttrInfoOSReturnsNotRetained::Instance;
11999 static constexpr ParsedAttrInfo::Spelling OSReturnsRetainedSpellings[] = {
12000   {AttributeCommonInfo::AS_GNU, "os_returns_retained"},
12001   {AttributeCommonInfo::AS_CXX11, "clang::os_returns_retained"},
12002   {AttributeCommonInfo::AS_C23, "clang::os_returns_retained"},
12003 };
12004 struct ParsedAttrInfoOSReturnsRetained final : public ParsedAttrInfo {
12005   constexpr ParsedAttrInfoOSReturnsRetained() : ParsedAttrInfo(
12006     /*AttrKind=*/ParsedAttr::AT_OSReturnsRetained,
12007     /*NumArgs=*/0,
12008     /*OptArgs=*/0,
12009     /*NumArgMembers=*/0,
12010     /*HasCustomParsing=*/0,
12011     /*AcceptsExprPack=*/0,
12012     /*IsTargetSpecific=*/0,
12013     /*IsType=*/0,
12014     /*IsStmt=*/0,
12015     /*IsKnownToGCC=*/0,
12016     /*IsSupportedByPragmaAttribute=*/1,
12017     /*Spellings=*/OSReturnsRetainedSpellings,
12018     /*ArgNames=*/{}) {}
12019 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12020   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D) && !isa<ParmVarDecl>(D)) {
12021     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
12022       << Attr << Attr.isRegularKeywordAttribute() << "functions, Objective-C methods, Objective-C properties, and parameters";
12023     return false;
12024   }
12025   return true;
12026 }
12027 
12028 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12029   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12030     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12031   return false;
12032 }
12033 
12034 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12035   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
12036   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
12037   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC));
12038   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
12039 }
12040 
12041 bool isParamExpr(size_t N) const override {
12042   return false;
12043 }
12044 
12045 static const ParsedAttrInfoOSReturnsRetained Instance;
12046 };
12047 const ParsedAttrInfoOSReturnsRetained ParsedAttrInfoOSReturnsRetained::Instance;
12048 static constexpr ParsedAttrInfo::Spelling OSReturnsRetainedOnNonZeroSpellings[] = {
12049   {AttributeCommonInfo::AS_GNU, "os_returns_retained_on_non_zero"},
12050   {AttributeCommonInfo::AS_CXX11, "clang::os_returns_retained_on_non_zero"},
12051   {AttributeCommonInfo::AS_C23, "clang::os_returns_retained_on_non_zero"},
12052 };
12053 struct ParsedAttrInfoOSReturnsRetainedOnNonZero final : public ParsedAttrInfo {
12054   constexpr ParsedAttrInfoOSReturnsRetainedOnNonZero() : ParsedAttrInfo(
12055     /*AttrKind=*/ParsedAttr::AT_OSReturnsRetainedOnNonZero,
12056     /*NumArgs=*/0,
12057     /*OptArgs=*/0,
12058     /*NumArgMembers=*/0,
12059     /*HasCustomParsing=*/0,
12060     /*AcceptsExprPack=*/0,
12061     /*IsTargetSpecific=*/0,
12062     /*IsType=*/0,
12063     /*IsStmt=*/0,
12064     /*IsKnownToGCC=*/0,
12065     /*IsSupportedByPragmaAttribute=*/1,
12066     /*Spellings=*/OSReturnsRetainedOnNonZeroSpellings,
12067     /*ArgNames=*/{}) {}
12068 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12069   if (!isa<ParmVarDecl>(D)) {
12070     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
12071       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
12072     return false;
12073   }
12074   return true;
12075 }
12076 
12077 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12078   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12079     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12080   return false;
12081 }
12082 
12083 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12084   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
12085 }
12086 
12087 bool isParamExpr(size_t N) const override {
12088   return false;
12089 }
12090 
12091 static const ParsedAttrInfoOSReturnsRetainedOnNonZero Instance;
12092 };
12093 const ParsedAttrInfoOSReturnsRetainedOnNonZero ParsedAttrInfoOSReturnsRetainedOnNonZero::Instance;
12094 static constexpr ParsedAttrInfo::Spelling OSReturnsRetainedOnZeroSpellings[] = {
12095   {AttributeCommonInfo::AS_GNU, "os_returns_retained_on_zero"},
12096   {AttributeCommonInfo::AS_CXX11, "clang::os_returns_retained_on_zero"},
12097   {AttributeCommonInfo::AS_C23, "clang::os_returns_retained_on_zero"},
12098 };
12099 struct ParsedAttrInfoOSReturnsRetainedOnZero final : public ParsedAttrInfo {
12100   constexpr ParsedAttrInfoOSReturnsRetainedOnZero() : ParsedAttrInfo(
12101     /*AttrKind=*/ParsedAttr::AT_OSReturnsRetainedOnZero,
12102     /*NumArgs=*/0,
12103     /*OptArgs=*/0,
12104     /*NumArgMembers=*/0,
12105     /*HasCustomParsing=*/0,
12106     /*AcceptsExprPack=*/0,
12107     /*IsTargetSpecific=*/0,
12108     /*IsType=*/0,
12109     /*IsStmt=*/0,
12110     /*IsKnownToGCC=*/0,
12111     /*IsSupportedByPragmaAttribute=*/1,
12112     /*Spellings=*/OSReturnsRetainedOnZeroSpellings,
12113     /*ArgNames=*/{}) {}
12114 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12115   if (!isa<ParmVarDecl>(D)) {
12116     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
12117       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
12118     return false;
12119   }
12120   return true;
12121 }
12122 
12123 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12124   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12125     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12126   return false;
12127 }
12128 
12129 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12130   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
12131 }
12132 
12133 bool isParamExpr(size_t N) const override {
12134   return false;
12135 }
12136 
12137 static const ParsedAttrInfoOSReturnsRetainedOnZero Instance;
12138 };
12139 const ParsedAttrInfoOSReturnsRetainedOnZero ParsedAttrInfoOSReturnsRetainedOnZero::Instance;
12140 static constexpr ParsedAttrInfo::Spelling ObjCBoxableSpellings[] = {
12141   {AttributeCommonInfo::AS_GNU, "objc_boxable"},
12142   {AttributeCommonInfo::AS_CXX11, "clang::objc_boxable"},
12143   {AttributeCommonInfo::AS_C23, "clang::objc_boxable"},
12144 };
12145 struct ParsedAttrInfoObjCBoxable final : public ParsedAttrInfo {
12146   constexpr ParsedAttrInfoObjCBoxable() : ParsedAttrInfo(
12147     /*AttrKind=*/ParsedAttr::AT_ObjCBoxable,
12148     /*NumArgs=*/0,
12149     /*OptArgs=*/0,
12150     /*NumArgMembers=*/0,
12151     /*HasCustomParsing=*/0,
12152     /*AcceptsExprPack=*/0,
12153     /*IsTargetSpecific=*/0,
12154     /*IsType=*/0,
12155     /*IsStmt=*/0,
12156     /*IsKnownToGCC=*/0,
12157     /*IsSupportedByPragmaAttribute=*/1,
12158     /*Spellings=*/ObjCBoxableSpellings,
12159     /*ArgNames=*/{}) {}
12160 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12161   if (!isa<RecordDecl>(D)) {
12162     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12163       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
12164     return false;
12165   }
12166   return true;
12167 }
12168 
12169 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12170   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12171     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12172   return false;
12173 }
12174 
12175 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12176   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
12177 }
12178 
12179 bool isParamExpr(size_t N) const override {
12180   return false;
12181 }
12182 
12183 static const ParsedAttrInfoObjCBoxable Instance;
12184 };
12185 const ParsedAttrInfoObjCBoxable ParsedAttrInfoObjCBoxable::Instance;
12186 static constexpr ParsedAttrInfo::Spelling ObjCBridgeSpellings[] = {
12187   {AttributeCommonInfo::AS_GNU, "objc_bridge"},
12188   {AttributeCommonInfo::AS_CXX11, "clang::objc_bridge"},
12189   {AttributeCommonInfo::AS_C23, "clang::objc_bridge"},
12190 };
12191 static constexpr const char *ObjCBridgeArgNames[] = {
12192 "BridgedType",};
12193 struct ParsedAttrInfoObjCBridge final : public ParsedAttrInfo {
12194   constexpr ParsedAttrInfoObjCBridge() : ParsedAttrInfo(
12195     /*AttrKind=*/ParsedAttr::AT_ObjCBridge,
12196     /*NumArgs=*/1,
12197     /*OptArgs=*/0,
12198     /*NumArgMembers=*/1,
12199     /*HasCustomParsing=*/0,
12200     /*AcceptsExprPack=*/0,
12201     /*IsTargetSpecific=*/0,
12202     /*IsType=*/0,
12203     /*IsStmt=*/0,
12204     /*IsKnownToGCC=*/0,
12205     /*IsSupportedByPragmaAttribute=*/1,
12206     /*Spellings=*/ObjCBridgeSpellings,
12207     /*ArgNames=*/ObjCBridgeArgNames) {}
12208 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12209   if (!isa<RecordDecl>(D) && !isa<TypedefNameDecl>(D)) {
12210     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12211       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, classes, and typedefs";
12212     return false;
12213   }
12214   return true;
12215 }
12216 
12217 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12218   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12219     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12220   return false;
12221 }
12222 
12223 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12224   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
12225   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
12226 }
12227 
12228 bool isParamExpr(size_t N) const override {
12229   return false;
12230 }
12231 
12232 static const ParsedAttrInfoObjCBridge Instance;
12233 };
12234 const ParsedAttrInfoObjCBridge ParsedAttrInfoObjCBridge::Instance;
12235 static constexpr ParsedAttrInfo::Spelling ObjCBridgeMutableSpellings[] = {
12236   {AttributeCommonInfo::AS_GNU, "objc_bridge_mutable"},
12237   {AttributeCommonInfo::AS_CXX11, "clang::objc_bridge_mutable"},
12238   {AttributeCommonInfo::AS_C23, "clang::objc_bridge_mutable"},
12239 };
12240 static constexpr const char *ObjCBridgeMutableArgNames[] = {
12241 "BridgedType",};
12242 struct ParsedAttrInfoObjCBridgeMutable final : public ParsedAttrInfo {
12243   constexpr ParsedAttrInfoObjCBridgeMutable() : ParsedAttrInfo(
12244     /*AttrKind=*/ParsedAttr::AT_ObjCBridgeMutable,
12245     /*NumArgs=*/1,
12246     /*OptArgs=*/0,
12247     /*NumArgMembers=*/1,
12248     /*HasCustomParsing=*/0,
12249     /*AcceptsExprPack=*/0,
12250     /*IsTargetSpecific=*/0,
12251     /*IsType=*/0,
12252     /*IsStmt=*/0,
12253     /*IsKnownToGCC=*/0,
12254     /*IsSupportedByPragmaAttribute=*/1,
12255     /*Spellings=*/ObjCBridgeMutableSpellings,
12256     /*ArgNames=*/ObjCBridgeMutableArgNames) {}
12257 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12258   if (!isa<RecordDecl>(D)) {
12259     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12260       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
12261     return false;
12262   }
12263   return true;
12264 }
12265 
12266 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12267   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12268     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12269   return false;
12270 }
12271 
12272 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12273   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
12274 }
12275 
12276 bool isParamExpr(size_t N) const override {
12277   return false;
12278 }
12279 
12280 static const ParsedAttrInfoObjCBridgeMutable Instance;
12281 };
12282 const ParsedAttrInfoObjCBridgeMutable ParsedAttrInfoObjCBridgeMutable::Instance;
12283 static constexpr ParsedAttrInfo::Spelling ObjCBridgeRelatedSpellings[] = {
12284   {AttributeCommonInfo::AS_GNU, "objc_bridge_related"},
12285   {AttributeCommonInfo::AS_CXX11, "clang::objc_bridge_related"},
12286   {AttributeCommonInfo::AS_C23, "clang::objc_bridge_related"},
12287 };
12288 static constexpr const char *ObjCBridgeRelatedArgNames[] = {
12289 "RelatedClass","ClassMethod","InstanceMethod",};
12290 struct ParsedAttrInfoObjCBridgeRelated final : public ParsedAttrInfo {
12291   constexpr ParsedAttrInfoObjCBridgeRelated() : ParsedAttrInfo(
12292     /*AttrKind=*/ParsedAttr::AT_ObjCBridgeRelated,
12293     /*NumArgs=*/3,
12294     /*OptArgs=*/0,
12295     /*NumArgMembers=*/3,
12296     /*HasCustomParsing=*/1,
12297     /*AcceptsExprPack=*/0,
12298     /*IsTargetSpecific=*/0,
12299     /*IsType=*/0,
12300     /*IsStmt=*/0,
12301     /*IsKnownToGCC=*/0,
12302     /*IsSupportedByPragmaAttribute=*/1,
12303     /*Spellings=*/ObjCBridgeRelatedSpellings,
12304     /*ArgNames=*/ObjCBridgeRelatedArgNames) {}
12305 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12306   if (!isa<RecordDecl>(D)) {
12307     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12308       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
12309     return false;
12310   }
12311   return true;
12312 }
12313 
12314 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12315   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12316     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12317   return false;
12318 }
12319 
12320 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12321   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
12322 }
12323 
12324 bool isParamExpr(size_t N) const override {
12325   return false;
12326 }
12327 
12328 static const ParsedAttrInfoObjCBridgeRelated Instance;
12329 };
12330 const ParsedAttrInfoObjCBridgeRelated ParsedAttrInfoObjCBridgeRelated::Instance;
12331 static constexpr ParsedAttrInfo::Spelling ObjCClassStubSpellings[] = {
12332   {AttributeCommonInfo::AS_GNU, "objc_class_stub"},
12333   {AttributeCommonInfo::AS_CXX11, "clang::objc_class_stub"},
12334   {AttributeCommonInfo::AS_C23, "clang::objc_class_stub"},
12335 };
12336 struct ParsedAttrInfoObjCClassStub final : public ParsedAttrInfo {
12337   constexpr ParsedAttrInfoObjCClassStub() : ParsedAttrInfo(
12338     /*AttrKind=*/ParsedAttr::AT_ObjCClassStub,
12339     /*NumArgs=*/0,
12340     /*OptArgs=*/0,
12341     /*NumArgMembers=*/0,
12342     /*HasCustomParsing=*/0,
12343     /*AcceptsExprPack=*/0,
12344     /*IsTargetSpecific=*/0,
12345     /*IsType=*/0,
12346     /*IsStmt=*/0,
12347     /*IsKnownToGCC=*/0,
12348     /*IsSupportedByPragmaAttribute=*/1,
12349     /*Spellings=*/ObjCClassStubSpellings,
12350     /*ArgNames=*/{}) {}
12351 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12352   if (!isa<ObjCInterfaceDecl>(D)) {
12353     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12354       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
12355     return false;
12356   }
12357   return true;
12358 }
12359 
12360 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12361   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12362     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12363   return false;
12364 }
12365 
12366 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
12367   return (LangOpts.ObjCRuntime.allowsClassStubs());
12368 }
12369 
12370 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12371   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
12372 }
12373 
12374 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
12375   D->addAttr(::new (S.Context) ObjCClassStubAttr(S.Context, Attr));
12376   return AttributeApplied;
12377 }
12378 
12379 bool isParamExpr(size_t N) const override {
12380   return false;
12381 }
12382 
12383 static const ParsedAttrInfoObjCClassStub Instance;
12384 };
12385 const ParsedAttrInfoObjCClassStub ParsedAttrInfoObjCClassStub::Instance;
12386 static constexpr ParsedAttrInfo::Spelling ObjCDesignatedInitializerSpellings[] = {
12387   {AttributeCommonInfo::AS_GNU, "objc_designated_initializer"},
12388   {AttributeCommonInfo::AS_CXX11, "clang::objc_designated_initializer"},
12389   {AttributeCommonInfo::AS_C23, "clang::objc_designated_initializer"},
12390 };
12391 struct ParsedAttrInfoObjCDesignatedInitializer final : public ParsedAttrInfo {
12392   constexpr ParsedAttrInfoObjCDesignatedInitializer() : ParsedAttrInfo(
12393     /*AttrKind=*/ParsedAttr::AT_ObjCDesignatedInitializer,
12394     /*NumArgs=*/0,
12395     /*OptArgs=*/0,
12396     /*NumArgMembers=*/0,
12397     /*HasCustomParsing=*/0,
12398     /*AcceptsExprPack=*/0,
12399     /*IsTargetSpecific=*/0,
12400     /*IsType=*/0,
12401     /*IsStmt=*/0,
12402     /*IsKnownToGCC=*/0,
12403     /*IsSupportedByPragmaAttribute=*/1,
12404     /*Spellings=*/ObjCDesignatedInitializerSpellings,
12405     /*ArgNames=*/{}) {}
12406 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12407   if (!isa<ObjCMethodDecl>(D)) {
12408     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12409       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods";
12410     return false;
12411   }
12412   return true;
12413 }
12414 
12415 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12416   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12417     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12418   return false;
12419 }
12420 
12421 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12422   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
12423 }
12424 
12425 bool isParamExpr(size_t N) const override {
12426   return false;
12427 }
12428 
12429 static const ParsedAttrInfoObjCDesignatedInitializer Instance;
12430 };
12431 const ParsedAttrInfoObjCDesignatedInitializer ParsedAttrInfoObjCDesignatedInitializer::Instance;
12432 static constexpr ParsedAttrInfo::Spelling ObjCDirectSpellings[] = {
12433   {AttributeCommonInfo::AS_GNU, "objc_direct"},
12434   {AttributeCommonInfo::AS_CXX11, "clang::objc_direct"},
12435   {AttributeCommonInfo::AS_C23, "clang::objc_direct"},
12436 };
12437 struct ParsedAttrInfoObjCDirect final : public ParsedAttrInfo {
12438   constexpr ParsedAttrInfoObjCDirect() : ParsedAttrInfo(
12439     /*AttrKind=*/ParsedAttr::AT_ObjCDirect,
12440     /*NumArgs=*/0,
12441     /*OptArgs=*/0,
12442     /*NumArgMembers=*/0,
12443     /*HasCustomParsing=*/0,
12444     /*AcceptsExprPack=*/0,
12445     /*IsTargetSpecific=*/0,
12446     /*IsType=*/0,
12447     /*IsStmt=*/0,
12448     /*IsKnownToGCC=*/0,
12449     /*IsSupportedByPragmaAttribute=*/1,
12450     /*Spellings=*/ObjCDirectSpellings,
12451     /*ArgNames=*/{}) {}
12452 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12453   if (!isa<ObjCMethodDecl>(D)) {
12454     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12455       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods";
12456     return false;
12457   }
12458   return true;
12459 }
12460 
12461 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12462   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12463     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12464   return false;
12465 }
12466 
12467 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
12468   return LangOpts.ObjC;
12469 }
12470 
12471 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12472   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
12473 }
12474 
12475 bool isParamExpr(size_t N) const override {
12476   return false;
12477 }
12478 
12479 static const ParsedAttrInfoObjCDirect Instance;
12480 };
12481 const ParsedAttrInfoObjCDirect ParsedAttrInfoObjCDirect::Instance;
12482 static constexpr ParsedAttrInfo::Spelling ObjCDirectMembersSpellings[] = {
12483   {AttributeCommonInfo::AS_GNU, "objc_direct_members"},
12484   {AttributeCommonInfo::AS_CXX11, "clang::objc_direct_members"},
12485   {AttributeCommonInfo::AS_C23, "clang::objc_direct_members"},
12486 };
12487 struct ParsedAttrInfoObjCDirectMembers final : public ParsedAttrInfo {
12488   constexpr ParsedAttrInfoObjCDirectMembers() : ParsedAttrInfo(
12489     /*AttrKind=*/ParsedAttr::AT_ObjCDirectMembers,
12490     /*NumArgs=*/0,
12491     /*OptArgs=*/0,
12492     /*NumArgMembers=*/0,
12493     /*HasCustomParsing=*/0,
12494     /*AcceptsExprPack=*/0,
12495     /*IsTargetSpecific=*/0,
12496     /*IsType=*/0,
12497     /*IsStmt=*/0,
12498     /*IsKnownToGCC=*/0,
12499     /*IsSupportedByPragmaAttribute=*/1,
12500     /*Spellings=*/ObjCDirectMembersSpellings,
12501     /*ArgNames=*/{}) {}
12502 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12503   if (!isa<ObjCImplDecl>(D) && !isa<ObjCInterfaceDecl>(D) && !isa<ObjCCategoryDecl>(D)) {
12504     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12505       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C implementation declarations, Objective-C interfaces, and Objective-C containers";
12506     return false;
12507   }
12508   return true;
12509 }
12510 
12511 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12512   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12513     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12514   return false;
12515 }
12516 
12517 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
12518   return LangOpts.ObjC;
12519 }
12520 
12521 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12522   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC));
12523   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
12524   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_category, /*IsSupported=*/LangOpts.ObjC));
12525 }
12526 
12527 bool isParamExpr(size_t N) const override {
12528   return false;
12529 }
12530 
12531 static const ParsedAttrInfoObjCDirectMembers Instance;
12532 };
12533 const ParsedAttrInfoObjCDirectMembers ParsedAttrInfoObjCDirectMembers::Instance;
12534 static constexpr ParsedAttrInfo::Spelling ObjCExceptionSpellings[] = {
12535   {AttributeCommonInfo::AS_GNU, "objc_exception"},
12536   {AttributeCommonInfo::AS_CXX11, "clang::objc_exception"},
12537   {AttributeCommonInfo::AS_C23, "clang::objc_exception"},
12538 };
12539 struct ParsedAttrInfoObjCException final : public ParsedAttrInfo {
12540   constexpr ParsedAttrInfoObjCException() : ParsedAttrInfo(
12541     /*AttrKind=*/ParsedAttr::AT_ObjCException,
12542     /*NumArgs=*/0,
12543     /*OptArgs=*/0,
12544     /*NumArgMembers=*/0,
12545     /*HasCustomParsing=*/0,
12546     /*AcceptsExprPack=*/0,
12547     /*IsTargetSpecific=*/0,
12548     /*IsType=*/0,
12549     /*IsStmt=*/0,
12550     /*IsKnownToGCC=*/0,
12551     /*IsSupportedByPragmaAttribute=*/1,
12552     /*Spellings=*/ObjCExceptionSpellings,
12553     /*ArgNames=*/{}) {}
12554 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12555   if (!isa<ObjCInterfaceDecl>(D)) {
12556     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12557       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
12558     return false;
12559   }
12560   return true;
12561 }
12562 
12563 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12564   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12565     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12566   return false;
12567 }
12568 
12569 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12570   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
12571 }
12572 
12573 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
12574   D->addAttr(::new (S.Context) ObjCExceptionAttr(S.Context, Attr));
12575   return AttributeApplied;
12576 }
12577 
12578 bool isParamExpr(size_t N) const override {
12579   return false;
12580 }
12581 
12582 static const ParsedAttrInfoObjCException Instance;
12583 };
12584 const ParsedAttrInfoObjCException ParsedAttrInfoObjCException::Instance;
12585 static constexpr ParsedAttrInfo::Spelling ObjCExplicitProtocolImplSpellings[] = {
12586   {AttributeCommonInfo::AS_GNU, "objc_protocol_requires_explicit_implementation"},
12587   {AttributeCommonInfo::AS_CXX11, "clang::objc_protocol_requires_explicit_implementation"},
12588   {AttributeCommonInfo::AS_C23, "clang::objc_protocol_requires_explicit_implementation"},
12589 };
12590 struct ParsedAttrInfoObjCExplicitProtocolImpl final : public ParsedAttrInfo {
12591   constexpr ParsedAttrInfoObjCExplicitProtocolImpl() : ParsedAttrInfo(
12592     /*AttrKind=*/ParsedAttr::AT_ObjCExplicitProtocolImpl,
12593     /*NumArgs=*/0,
12594     /*OptArgs=*/0,
12595     /*NumArgMembers=*/0,
12596     /*HasCustomParsing=*/0,
12597     /*AcceptsExprPack=*/0,
12598     /*IsTargetSpecific=*/0,
12599     /*IsType=*/0,
12600     /*IsStmt=*/0,
12601     /*IsKnownToGCC=*/0,
12602     /*IsSupportedByPragmaAttribute=*/1,
12603     /*Spellings=*/ObjCExplicitProtocolImplSpellings,
12604     /*ArgNames=*/{}) {}
12605 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12606   if (!isa<ObjCProtocolDecl>(D)) {
12607     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12608       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C protocols";
12609     return false;
12610   }
12611   return true;
12612 }
12613 
12614 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12615   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12616     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12617   return false;
12618 }
12619 
12620 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12621   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC));
12622 }
12623 
12624 bool isParamExpr(size_t N) const override {
12625   return false;
12626 }
12627 
12628 static const ParsedAttrInfoObjCExplicitProtocolImpl Instance;
12629 };
12630 const ParsedAttrInfoObjCExplicitProtocolImpl ParsedAttrInfoObjCExplicitProtocolImpl::Instance;
12631 static constexpr ParsedAttrInfo::Spelling ObjCExternallyRetainedSpellings[] = {
12632   {AttributeCommonInfo::AS_GNU, "objc_externally_retained"},
12633   {AttributeCommonInfo::AS_CXX11, "clang::objc_externally_retained"},
12634   {AttributeCommonInfo::AS_C23, "clang::objc_externally_retained"},
12635 };
12636 struct ParsedAttrInfoObjCExternallyRetained final : public ParsedAttrInfo {
12637   constexpr ParsedAttrInfoObjCExternallyRetained() : ParsedAttrInfo(
12638     /*AttrKind=*/ParsedAttr::AT_ObjCExternallyRetained,
12639     /*NumArgs=*/0,
12640     /*OptArgs=*/0,
12641     /*NumArgMembers=*/0,
12642     /*HasCustomParsing=*/0,
12643     /*AcceptsExprPack=*/0,
12644     /*IsTargetSpecific=*/0,
12645     /*IsType=*/0,
12646     /*IsStmt=*/0,
12647     /*IsKnownToGCC=*/0,
12648     /*IsSupportedByPragmaAttribute=*/1,
12649     /*Spellings=*/ObjCExternallyRetainedSpellings,
12650     /*ArgNames=*/{}) {}
12651 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12652   if (!isNonParmVar(D) && !isa<FunctionDecl>(D) && !isa<BlockDecl>(D) && !isa<ObjCMethodDecl>(D)) {
12653     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
12654       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, blocks, and Objective-C methods";
12655     return false;
12656   }
12657   return true;
12658 }
12659 
12660 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12661   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12662     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12663   return false;
12664 }
12665 
12666 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
12667   return LangOpts.ObjCAutoRefCount;
12668 }
12669 
12670 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12671   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_not_is_parameter, /*IsSupported=*/true));
12672   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
12673   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_block, /*IsSupported=*/LangOpts.Blocks));
12674   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
12675 }
12676 
12677 bool isParamExpr(size_t N) const override {
12678   return false;
12679 }
12680 
12681 static const ParsedAttrInfoObjCExternallyRetained Instance;
12682 };
12683 const ParsedAttrInfoObjCExternallyRetained ParsedAttrInfoObjCExternallyRetained::Instance;
12684 static constexpr ParsedAttrInfo::Spelling ObjCGCSpellings[] = {
12685   {AttributeCommonInfo::AS_GNU, "objc_gc"},
12686   {AttributeCommonInfo::AS_CXX11, "clang::objc_gc"},
12687   {AttributeCommonInfo::AS_C23, "clang::objc_gc"},
12688 };
12689 static constexpr const char *ObjCGCArgNames[] = {
12690 "Kind",};
12691 struct ParsedAttrInfoObjCGC final : public ParsedAttrInfo {
12692   constexpr ParsedAttrInfoObjCGC() : ParsedAttrInfo(
12693     /*AttrKind=*/ParsedAttr::AT_ObjCGC,
12694     /*NumArgs=*/1,
12695     /*OptArgs=*/0,
12696     /*NumArgMembers=*/1,
12697     /*HasCustomParsing=*/0,
12698     /*AcceptsExprPack=*/0,
12699     /*IsTargetSpecific=*/0,
12700     /*IsType=*/1,
12701     /*IsStmt=*/0,
12702     /*IsKnownToGCC=*/0,
12703     /*IsSupportedByPragmaAttribute=*/0,
12704     /*Spellings=*/ObjCGCSpellings,
12705     /*ArgNames=*/ObjCGCArgNames) {}
12706 bool isParamExpr(size_t N) const override {
12707   return false;
12708 }
12709 
12710 static const ParsedAttrInfoObjCGC Instance;
12711 };
12712 const ParsedAttrInfoObjCGC ParsedAttrInfoObjCGC::Instance;
12713 static constexpr ParsedAttrInfo::Spelling ObjCIndependentClassSpellings[] = {
12714   {AttributeCommonInfo::AS_GNU, "objc_independent_class"},
12715   {AttributeCommonInfo::AS_CXX11, "clang::objc_independent_class"},
12716   {AttributeCommonInfo::AS_C23, "clang::objc_independent_class"},
12717 };
12718 struct ParsedAttrInfoObjCIndependentClass final : public ParsedAttrInfo {
12719   constexpr ParsedAttrInfoObjCIndependentClass() : ParsedAttrInfo(
12720     /*AttrKind=*/ParsedAttr::AT_ObjCIndependentClass,
12721     /*NumArgs=*/0,
12722     /*OptArgs=*/0,
12723     /*NumArgMembers=*/0,
12724     /*HasCustomParsing=*/0,
12725     /*AcceptsExprPack=*/0,
12726     /*IsTargetSpecific=*/0,
12727     /*IsType=*/0,
12728     /*IsStmt=*/0,
12729     /*IsKnownToGCC=*/0,
12730     /*IsSupportedByPragmaAttribute=*/0,
12731     /*Spellings=*/ObjCIndependentClassSpellings,
12732     /*ArgNames=*/{}) {}
12733 bool isParamExpr(size_t N) const override {
12734   return false;
12735 }
12736 
12737 static const ParsedAttrInfoObjCIndependentClass Instance;
12738 };
12739 const ParsedAttrInfoObjCIndependentClass ParsedAttrInfoObjCIndependentClass::Instance;
12740 static constexpr ParsedAttrInfo::Spelling ObjCInertUnsafeUnretainedSpellings[] = {
12741   {AttributeCommonInfo::AS_Keyword, "__unsafe_unretained"},
12742 };
12743 struct ParsedAttrInfoObjCInertUnsafeUnretained final : public ParsedAttrInfo {
12744   constexpr ParsedAttrInfoObjCInertUnsafeUnretained() : ParsedAttrInfo(
12745     /*AttrKind=*/ParsedAttr::AT_ObjCInertUnsafeUnretained,
12746     /*NumArgs=*/0,
12747     /*OptArgs=*/0,
12748     /*NumArgMembers=*/0,
12749     /*HasCustomParsing=*/0,
12750     /*AcceptsExprPack=*/0,
12751     /*IsTargetSpecific=*/0,
12752     /*IsType=*/1,
12753     /*IsStmt=*/0,
12754     /*IsKnownToGCC=*/0,
12755     /*IsSupportedByPragmaAttribute=*/0,
12756     /*Spellings=*/ObjCInertUnsafeUnretainedSpellings,
12757     /*ArgNames=*/{}) {}
12758 bool isParamExpr(size_t N) const override {
12759   return false;
12760 }
12761 
12762 static const ParsedAttrInfoObjCInertUnsafeUnretained Instance;
12763 };
12764 const ParsedAttrInfoObjCInertUnsafeUnretained ParsedAttrInfoObjCInertUnsafeUnretained::Instance;
12765 static constexpr ParsedAttrInfo::Spelling ObjCKindOfSpellings[] = {
12766   {AttributeCommonInfo::AS_Keyword, "__kindof"},
12767 };
12768 struct ParsedAttrInfoObjCKindOf final : public ParsedAttrInfo {
12769   constexpr ParsedAttrInfoObjCKindOf() : ParsedAttrInfo(
12770     /*AttrKind=*/ParsedAttr::AT_ObjCKindOf,
12771     /*NumArgs=*/0,
12772     /*OptArgs=*/0,
12773     /*NumArgMembers=*/0,
12774     /*HasCustomParsing=*/0,
12775     /*AcceptsExprPack=*/0,
12776     /*IsTargetSpecific=*/0,
12777     /*IsType=*/1,
12778     /*IsStmt=*/0,
12779     /*IsKnownToGCC=*/0,
12780     /*IsSupportedByPragmaAttribute=*/0,
12781     /*Spellings=*/ObjCKindOfSpellings,
12782     /*ArgNames=*/{}) {}
12783 bool isParamExpr(size_t N) const override {
12784   return false;
12785 }
12786 
12787 static const ParsedAttrInfoObjCKindOf Instance;
12788 };
12789 const ParsedAttrInfoObjCKindOf ParsedAttrInfoObjCKindOf::Instance;
12790 static constexpr ParsedAttrInfo::Spelling ObjCMethodFamilySpellings[] = {
12791   {AttributeCommonInfo::AS_GNU, "objc_method_family"},
12792   {AttributeCommonInfo::AS_CXX11, "clang::objc_method_family"},
12793   {AttributeCommonInfo::AS_C23, "clang::objc_method_family"},
12794 };
12795 static constexpr const char *ObjCMethodFamilyArgNames[] = {
12796 "Family",};
12797 struct ParsedAttrInfoObjCMethodFamily final : public ParsedAttrInfo {
12798   constexpr ParsedAttrInfoObjCMethodFamily() : ParsedAttrInfo(
12799     /*AttrKind=*/ParsedAttr::AT_ObjCMethodFamily,
12800     /*NumArgs=*/1,
12801     /*OptArgs=*/0,
12802     /*NumArgMembers=*/1,
12803     /*HasCustomParsing=*/0,
12804     /*AcceptsExprPack=*/0,
12805     /*IsTargetSpecific=*/0,
12806     /*IsType=*/0,
12807     /*IsStmt=*/0,
12808     /*IsKnownToGCC=*/0,
12809     /*IsSupportedByPragmaAttribute=*/1,
12810     /*Spellings=*/ObjCMethodFamilySpellings,
12811     /*ArgNames=*/ObjCMethodFamilyArgNames) {}
12812 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12813   if (!isa<ObjCMethodDecl>(D)) {
12814     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12815       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods";
12816     return false;
12817   }
12818   return true;
12819 }
12820 
12821 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12822   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12823     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12824   return false;
12825 }
12826 
12827 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12828   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
12829 }
12830 
12831 bool isParamExpr(size_t N) const override {
12832   return false;
12833 }
12834 
12835 static const ParsedAttrInfoObjCMethodFamily Instance;
12836 };
12837 const ParsedAttrInfoObjCMethodFamily ParsedAttrInfoObjCMethodFamily::Instance;
12838 static constexpr ParsedAttrInfo::Spelling ObjCNSObjectSpellings[] = {
12839   {AttributeCommonInfo::AS_GNU, "NSObject"},
12840   {AttributeCommonInfo::AS_CXX11, "clang::NSObject"},
12841   {AttributeCommonInfo::AS_C23, "clang::NSObject"},
12842 };
12843 struct ParsedAttrInfoObjCNSObject final : public ParsedAttrInfo {
12844   constexpr ParsedAttrInfoObjCNSObject() : ParsedAttrInfo(
12845     /*AttrKind=*/ParsedAttr::AT_ObjCNSObject,
12846     /*NumArgs=*/0,
12847     /*OptArgs=*/0,
12848     /*NumArgMembers=*/0,
12849     /*HasCustomParsing=*/0,
12850     /*AcceptsExprPack=*/0,
12851     /*IsTargetSpecific=*/0,
12852     /*IsType=*/0,
12853     /*IsStmt=*/0,
12854     /*IsKnownToGCC=*/0,
12855     /*IsSupportedByPragmaAttribute=*/0,
12856     /*Spellings=*/ObjCNSObjectSpellings,
12857     /*ArgNames=*/{}) {}
12858 bool isParamExpr(size_t N) const override {
12859   return false;
12860 }
12861 
12862 static const ParsedAttrInfoObjCNSObject Instance;
12863 };
12864 const ParsedAttrInfoObjCNSObject ParsedAttrInfoObjCNSObject::Instance;
12865 static constexpr ParsedAttrInfo::Spelling ObjCNonLazyClassSpellings[] = {
12866   {AttributeCommonInfo::AS_GNU, "objc_nonlazy_class"},
12867   {AttributeCommonInfo::AS_CXX11, "clang::objc_nonlazy_class"},
12868   {AttributeCommonInfo::AS_C23, "clang::objc_nonlazy_class"},
12869 };
12870 struct ParsedAttrInfoObjCNonLazyClass final : public ParsedAttrInfo {
12871   constexpr ParsedAttrInfoObjCNonLazyClass() : ParsedAttrInfo(
12872     /*AttrKind=*/ParsedAttr::AT_ObjCNonLazyClass,
12873     /*NumArgs=*/0,
12874     /*OptArgs=*/0,
12875     /*NumArgMembers=*/0,
12876     /*HasCustomParsing=*/0,
12877     /*AcceptsExprPack=*/0,
12878     /*IsTargetSpecific=*/0,
12879     /*IsType=*/0,
12880     /*IsStmt=*/0,
12881     /*IsKnownToGCC=*/0,
12882     /*IsSupportedByPragmaAttribute=*/1,
12883     /*Spellings=*/ObjCNonLazyClassSpellings,
12884     /*ArgNames=*/{}) {}
12885 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12886   if (!isa<ObjCInterfaceDecl>(D) && !isa<ObjCImplDecl>(D)) {
12887     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12888       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces and Objective-C implementation declarations";
12889     return false;
12890   }
12891   return true;
12892 }
12893 
12894 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12895   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12896     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12897   return false;
12898 }
12899 
12900 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
12901   return LangOpts.ObjC;
12902 }
12903 
12904 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12905   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
12906   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_implementation, /*IsSupported=*/LangOpts.ObjC));
12907 }
12908 
12909 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
12910   D->addAttr(::new (S.Context) ObjCNonLazyClassAttr(S.Context, Attr));
12911   return AttributeApplied;
12912 }
12913 
12914 bool isParamExpr(size_t N) const override {
12915   return false;
12916 }
12917 
12918 static const ParsedAttrInfoObjCNonLazyClass Instance;
12919 };
12920 const ParsedAttrInfoObjCNonLazyClass ParsedAttrInfoObjCNonLazyClass::Instance;
12921 static constexpr ParsedAttrInfo::Spelling ObjCNonRuntimeProtocolSpellings[] = {
12922   {AttributeCommonInfo::AS_GNU, "objc_non_runtime_protocol"},
12923   {AttributeCommonInfo::AS_CXX11, "clang::objc_non_runtime_protocol"},
12924   {AttributeCommonInfo::AS_C23, "clang::objc_non_runtime_protocol"},
12925 };
12926 struct ParsedAttrInfoObjCNonRuntimeProtocol final : public ParsedAttrInfo {
12927   constexpr ParsedAttrInfoObjCNonRuntimeProtocol() : ParsedAttrInfo(
12928     /*AttrKind=*/ParsedAttr::AT_ObjCNonRuntimeProtocol,
12929     /*NumArgs=*/0,
12930     /*OptArgs=*/0,
12931     /*NumArgMembers=*/0,
12932     /*HasCustomParsing=*/0,
12933     /*AcceptsExprPack=*/0,
12934     /*IsTargetSpecific=*/0,
12935     /*IsType=*/0,
12936     /*IsStmt=*/0,
12937     /*IsKnownToGCC=*/0,
12938     /*IsSupportedByPragmaAttribute=*/1,
12939     /*Spellings=*/ObjCNonRuntimeProtocolSpellings,
12940     /*ArgNames=*/{}) {}
12941 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
12942   if (!isa<ObjCProtocolDecl>(D)) {
12943     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
12944       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C protocols";
12945     return false;
12946   }
12947   return true;
12948 }
12949 
12950 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
12951   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
12952     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
12953   return false;
12954 }
12955 
12956 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
12957   return LangOpts.ObjC;
12958 }
12959 
12960 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
12961   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC));
12962 }
12963 
12964 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
12965   D->addAttr(::new (S.Context) ObjCNonRuntimeProtocolAttr(S.Context, Attr));
12966   return AttributeApplied;
12967 }
12968 
12969 bool isParamExpr(size_t N) const override {
12970   return false;
12971 }
12972 
12973 static const ParsedAttrInfoObjCNonRuntimeProtocol Instance;
12974 };
12975 const ParsedAttrInfoObjCNonRuntimeProtocol ParsedAttrInfoObjCNonRuntimeProtocol::Instance;
12976 static constexpr ParsedAttrInfo::Spelling ObjCOwnershipSpellings[] = {
12977   {AttributeCommonInfo::AS_GNU, "objc_ownership"},
12978   {AttributeCommonInfo::AS_CXX11, "clang::objc_ownership"},
12979   {AttributeCommonInfo::AS_C23, "clang::objc_ownership"},
12980 };
12981 static constexpr const char *ObjCOwnershipArgNames[] = {
12982 "Kind",};
12983 struct ParsedAttrInfoObjCOwnership final : public ParsedAttrInfo {
12984   constexpr ParsedAttrInfoObjCOwnership() : ParsedAttrInfo(
12985     /*AttrKind=*/ParsedAttr::AT_ObjCOwnership,
12986     /*NumArgs=*/1,
12987     /*OptArgs=*/0,
12988     /*NumArgMembers=*/1,
12989     /*HasCustomParsing=*/0,
12990     /*AcceptsExprPack=*/0,
12991     /*IsTargetSpecific=*/0,
12992     /*IsType=*/1,
12993     /*IsStmt=*/0,
12994     /*IsKnownToGCC=*/0,
12995     /*IsSupportedByPragmaAttribute=*/0,
12996     /*Spellings=*/ObjCOwnershipSpellings,
12997     /*ArgNames=*/ObjCOwnershipArgNames) {}
12998 bool isParamExpr(size_t N) const override {
12999   return false;
13000 }
13001 
13002 static const ParsedAttrInfoObjCOwnership Instance;
13003 };
13004 const ParsedAttrInfoObjCOwnership ParsedAttrInfoObjCOwnership::Instance;
13005 static constexpr ParsedAttrInfo::Spelling ObjCPreciseLifetimeSpellings[] = {
13006   {AttributeCommonInfo::AS_GNU, "objc_precise_lifetime"},
13007   {AttributeCommonInfo::AS_CXX11, "clang::objc_precise_lifetime"},
13008   {AttributeCommonInfo::AS_C23, "clang::objc_precise_lifetime"},
13009 };
13010 struct ParsedAttrInfoObjCPreciseLifetime final : public ParsedAttrInfo {
13011   constexpr ParsedAttrInfoObjCPreciseLifetime() : ParsedAttrInfo(
13012     /*AttrKind=*/ParsedAttr::AT_ObjCPreciseLifetime,
13013     /*NumArgs=*/0,
13014     /*OptArgs=*/0,
13015     /*NumArgMembers=*/0,
13016     /*HasCustomParsing=*/0,
13017     /*AcceptsExprPack=*/0,
13018     /*IsTargetSpecific=*/0,
13019     /*IsType=*/0,
13020     /*IsStmt=*/0,
13021     /*IsKnownToGCC=*/0,
13022     /*IsSupportedByPragmaAttribute=*/1,
13023     /*Spellings=*/ObjCPreciseLifetimeSpellings,
13024     /*ArgNames=*/{}) {}
13025 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13026   if (!isa<VarDecl>(D)) {
13027     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13028       << Attr << Attr.isRegularKeywordAttribute() << "variables";
13029     return false;
13030   }
13031   return true;
13032 }
13033 
13034 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13035   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13036     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13037   return false;
13038 }
13039 
13040 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13041   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
13042 }
13043 
13044 bool isParamExpr(size_t N) const override {
13045   return false;
13046 }
13047 
13048 static const ParsedAttrInfoObjCPreciseLifetime Instance;
13049 };
13050 const ParsedAttrInfoObjCPreciseLifetime ParsedAttrInfoObjCPreciseLifetime::Instance;
13051 static constexpr ParsedAttrInfo::Spelling ObjCRequiresPropertyDefsSpellings[] = {
13052   {AttributeCommonInfo::AS_GNU, "objc_requires_property_definitions"},
13053   {AttributeCommonInfo::AS_CXX11, "clang::objc_requires_property_definitions"},
13054   {AttributeCommonInfo::AS_C23, "clang::objc_requires_property_definitions"},
13055 };
13056 struct ParsedAttrInfoObjCRequiresPropertyDefs final : public ParsedAttrInfo {
13057   constexpr ParsedAttrInfoObjCRequiresPropertyDefs() : ParsedAttrInfo(
13058     /*AttrKind=*/ParsedAttr::AT_ObjCRequiresPropertyDefs,
13059     /*NumArgs=*/0,
13060     /*OptArgs=*/0,
13061     /*NumArgMembers=*/0,
13062     /*HasCustomParsing=*/0,
13063     /*AcceptsExprPack=*/0,
13064     /*IsTargetSpecific=*/0,
13065     /*IsType=*/0,
13066     /*IsStmt=*/0,
13067     /*IsKnownToGCC=*/0,
13068     /*IsSupportedByPragmaAttribute=*/1,
13069     /*Spellings=*/ObjCRequiresPropertyDefsSpellings,
13070     /*ArgNames=*/{}) {}
13071 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13072   if (!isa<ObjCInterfaceDecl>(D)) {
13073     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13074       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
13075     return false;
13076   }
13077   return true;
13078 }
13079 
13080 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13081   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13082     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13083   return false;
13084 }
13085 
13086 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13087   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
13088 }
13089 
13090 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
13091   D->addAttr(::new (S.Context) ObjCRequiresPropertyDefsAttr(S.Context, Attr));
13092   return AttributeApplied;
13093 }
13094 
13095 bool isParamExpr(size_t N) const override {
13096   return false;
13097 }
13098 
13099 static const ParsedAttrInfoObjCRequiresPropertyDefs Instance;
13100 };
13101 const ParsedAttrInfoObjCRequiresPropertyDefs ParsedAttrInfoObjCRequiresPropertyDefs::Instance;
13102 static constexpr ParsedAttrInfo::Spelling ObjCRequiresSuperSpellings[] = {
13103   {AttributeCommonInfo::AS_GNU, "objc_requires_super"},
13104   {AttributeCommonInfo::AS_CXX11, "clang::objc_requires_super"},
13105   {AttributeCommonInfo::AS_C23, "clang::objc_requires_super"},
13106 };
13107 struct ParsedAttrInfoObjCRequiresSuper final : public ParsedAttrInfo {
13108   constexpr ParsedAttrInfoObjCRequiresSuper() : ParsedAttrInfo(
13109     /*AttrKind=*/ParsedAttr::AT_ObjCRequiresSuper,
13110     /*NumArgs=*/0,
13111     /*OptArgs=*/0,
13112     /*NumArgMembers=*/0,
13113     /*HasCustomParsing=*/0,
13114     /*AcceptsExprPack=*/0,
13115     /*IsTargetSpecific=*/0,
13116     /*IsType=*/0,
13117     /*IsStmt=*/0,
13118     /*IsKnownToGCC=*/0,
13119     /*IsSupportedByPragmaAttribute=*/1,
13120     /*Spellings=*/ObjCRequiresSuperSpellings,
13121     /*ArgNames=*/{}) {}
13122 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13123   if (!isa<ObjCMethodDecl>(D)) {
13124     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13125       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods";
13126     return false;
13127   }
13128   return true;
13129 }
13130 
13131 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13132   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13133     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13134   return false;
13135 }
13136 
13137 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13138   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
13139 }
13140 
13141 bool isParamExpr(size_t N) const override {
13142   return false;
13143 }
13144 
13145 static const ParsedAttrInfoObjCRequiresSuper Instance;
13146 };
13147 const ParsedAttrInfoObjCRequiresSuper ParsedAttrInfoObjCRequiresSuper::Instance;
13148 static constexpr ParsedAttrInfo::Spelling ObjCReturnsInnerPointerSpellings[] = {
13149   {AttributeCommonInfo::AS_GNU, "objc_returns_inner_pointer"},
13150   {AttributeCommonInfo::AS_CXX11, "clang::objc_returns_inner_pointer"},
13151   {AttributeCommonInfo::AS_C23, "clang::objc_returns_inner_pointer"},
13152 };
13153 struct ParsedAttrInfoObjCReturnsInnerPointer final : public ParsedAttrInfo {
13154   constexpr ParsedAttrInfoObjCReturnsInnerPointer() : ParsedAttrInfo(
13155     /*AttrKind=*/ParsedAttr::AT_ObjCReturnsInnerPointer,
13156     /*NumArgs=*/0,
13157     /*OptArgs=*/0,
13158     /*NumArgMembers=*/0,
13159     /*HasCustomParsing=*/0,
13160     /*AcceptsExprPack=*/0,
13161     /*IsTargetSpecific=*/0,
13162     /*IsType=*/0,
13163     /*IsStmt=*/0,
13164     /*IsKnownToGCC=*/0,
13165     /*IsSupportedByPragmaAttribute=*/1,
13166     /*Spellings=*/ObjCReturnsInnerPointerSpellings,
13167     /*ArgNames=*/{}) {}
13168 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13169   if (!isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D)) {
13170     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13171       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods and Objective-C properties";
13172     return false;
13173   }
13174   return true;
13175 }
13176 
13177 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13178   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13179     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13180   return false;
13181 }
13182 
13183 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13184   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
13185   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC));
13186 }
13187 
13188 bool isParamExpr(size_t N) const override {
13189   return false;
13190 }
13191 
13192 static const ParsedAttrInfoObjCReturnsInnerPointer Instance;
13193 };
13194 const ParsedAttrInfoObjCReturnsInnerPointer ParsedAttrInfoObjCReturnsInnerPointer::Instance;
13195 static constexpr ParsedAttrInfo::Spelling ObjCRootClassSpellings[] = {
13196   {AttributeCommonInfo::AS_GNU, "objc_root_class"},
13197   {AttributeCommonInfo::AS_CXX11, "clang::objc_root_class"},
13198   {AttributeCommonInfo::AS_C23, "clang::objc_root_class"},
13199 };
13200 struct ParsedAttrInfoObjCRootClass final : public ParsedAttrInfo {
13201   constexpr ParsedAttrInfoObjCRootClass() : ParsedAttrInfo(
13202     /*AttrKind=*/ParsedAttr::AT_ObjCRootClass,
13203     /*NumArgs=*/0,
13204     /*OptArgs=*/0,
13205     /*NumArgMembers=*/0,
13206     /*HasCustomParsing=*/0,
13207     /*AcceptsExprPack=*/0,
13208     /*IsTargetSpecific=*/0,
13209     /*IsType=*/0,
13210     /*IsStmt=*/0,
13211     /*IsKnownToGCC=*/0,
13212     /*IsSupportedByPragmaAttribute=*/1,
13213     /*Spellings=*/ObjCRootClassSpellings,
13214     /*ArgNames=*/{}) {}
13215 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13216   if (!isa<ObjCInterfaceDecl>(D)) {
13217     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13218       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
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 << AL.isRegularKeywordAttribute() << 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_objc_interface, /*IsSupported=*/LangOpts.ObjC));
13232 }
13233 
13234 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
13235   D->addAttr(::new (S.Context) ObjCRootClassAttr(S.Context, Attr));
13236   return AttributeApplied;
13237 }
13238 
13239 bool isParamExpr(size_t N) const override {
13240   return false;
13241 }
13242 
13243 static const ParsedAttrInfoObjCRootClass Instance;
13244 };
13245 const ParsedAttrInfoObjCRootClass ParsedAttrInfoObjCRootClass::Instance;
13246 static constexpr ParsedAttrInfo::Spelling ObjCRuntimeNameSpellings[] = {
13247   {AttributeCommonInfo::AS_GNU, "objc_runtime_name"},
13248   {AttributeCommonInfo::AS_CXX11, "clang::objc_runtime_name"},
13249   {AttributeCommonInfo::AS_C23, "clang::objc_runtime_name"},
13250 };
13251 static constexpr const char *ObjCRuntimeNameArgNames[] = {
13252 "MetadataName",};
13253 struct ParsedAttrInfoObjCRuntimeName final : public ParsedAttrInfo {
13254   constexpr ParsedAttrInfoObjCRuntimeName() : ParsedAttrInfo(
13255     /*AttrKind=*/ParsedAttr::AT_ObjCRuntimeName,
13256     /*NumArgs=*/1,
13257     /*OptArgs=*/0,
13258     /*NumArgMembers=*/1,
13259     /*HasCustomParsing=*/0,
13260     /*AcceptsExprPack=*/0,
13261     /*IsTargetSpecific=*/0,
13262     /*IsType=*/0,
13263     /*IsStmt=*/0,
13264     /*IsKnownToGCC=*/0,
13265     /*IsSupportedByPragmaAttribute=*/1,
13266     /*Spellings=*/ObjCRuntimeNameSpellings,
13267     /*ArgNames=*/ObjCRuntimeNameArgNames) {}
13268 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13269   if (!isa<ObjCInterfaceDecl>(D) && !isa<ObjCProtocolDecl>(D)) {
13270     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13271       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces and Objective-C protocols";
13272     return false;
13273   }
13274   return true;
13275 }
13276 
13277 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13278   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13279     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13280   return false;
13281 }
13282 
13283 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13284   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
13285   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_protocol, /*IsSupported=*/LangOpts.ObjC));
13286 }
13287 
13288 bool isParamExpr(size_t N) const override {
13289   return false;
13290 }
13291 
13292 static const ParsedAttrInfoObjCRuntimeName Instance;
13293 };
13294 const ParsedAttrInfoObjCRuntimeName ParsedAttrInfoObjCRuntimeName::Instance;
13295 static constexpr ParsedAttrInfo::Spelling ObjCRuntimeVisibleSpellings[] = {
13296   {AttributeCommonInfo::AS_GNU, "objc_runtime_visible"},
13297   {AttributeCommonInfo::AS_CXX11, "clang::objc_runtime_visible"},
13298   {AttributeCommonInfo::AS_C23, "clang::objc_runtime_visible"},
13299 };
13300 struct ParsedAttrInfoObjCRuntimeVisible final : public ParsedAttrInfo {
13301   constexpr ParsedAttrInfoObjCRuntimeVisible() : ParsedAttrInfo(
13302     /*AttrKind=*/ParsedAttr::AT_ObjCRuntimeVisible,
13303     /*NumArgs=*/0,
13304     /*OptArgs=*/0,
13305     /*NumArgMembers=*/0,
13306     /*HasCustomParsing=*/0,
13307     /*AcceptsExprPack=*/0,
13308     /*IsTargetSpecific=*/0,
13309     /*IsType=*/0,
13310     /*IsStmt=*/0,
13311     /*IsKnownToGCC=*/0,
13312     /*IsSupportedByPragmaAttribute=*/1,
13313     /*Spellings=*/ObjCRuntimeVisibleSpellings,
13314     /*ArgNames=*/{}) {}
13315 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13316   if (!isa<ObjCInterfaceDecl>(D)) {
13317     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13318       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
13319     return false;
13320   }
13321   return true;
13322 }
13323 
13324 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13325   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13326     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13327   return false;
13328 }
13329 
13330 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13331   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
13332 }
13333 
13334 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
13335   D->addAttr(::new (S.Context) ObjCRuntimeVisibleAttr(S.Context, Attr));
13336   return AttributeApplied;
13337 }
13338 
13339 bool isParamExpr(size_t N) const override {
13340   return false;
13341 }
13342 
13343 static const ParsedAttrInfoObjCRuntimeVisible Instance;
13344 };
13345 const ParsedAttrInfoObjCRuntimeVisible ParsedAttrInfoObjCRuntimeVisible::Instance;
13346 static constexpr ParsedAttrInfo::Spelling ObjCSubclassingRestrictedSpellings[] = {
13347   {AttributeCommonInfo::AS_GNU, "objc_subclassing_restricted"},
13348   {AttributeCommonInfo::AS_CXX11, "clang::objc_subclassing_restricted"},
13349   {AttributeCommonInfo::AS_C23, "clang::objc_subclassing_restricted"},
13350 };
13351 struct ParsedAttrInfoObjCSubclassingRestricted final : public ParsedAttrInfo {
13352   constexpr ParsedAttrInfoObjCSubclassingRestricted() : ParsedAttrInfo(
13353     /*AttrKind=*/ParsedAttr::AT_ObjCSubclassingRestricted,
13354     /*NumArgs=*/0,
13355     /*OptArgs=*/0,
13356     /*NumArgMembers=*/0,
13357     /*HasCustomParsing=*/0,
13358     /*AcceptsExprPack=*/0,
13359     /*IsTargetSpecific=*/0,
13360     /*IsType=*/0,
13361     /*IsStmt=*/0,
13362     /*IsKnownToGCC=*/0,
13363     /*IsSupportedByPragmaAttribute=*/1,
13364     /*Spellings=*/ObjCSubclassingRestrictedSpellings,
13365     /*ArgNames=*/{}) {}
13366 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13367   if (!isa<ObjCInterfaceDecl>(D)) {
13368     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13369       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
13370     return false;
13371   }
13372   return true;
13373 }
13374 
13375 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13376   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13377     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13378   return false;
13379 }
13380 
13381 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13382   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
13383 }
13384 
13385 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
13386   D->addAttr(::new (S.Context) ObjCSubclassingRestrictedAttr(S.Context, Attr));
13387   return AttributeApplied;
13388 }
13389 
13390 bool isParamExpr(size_t N) const override {
13391   return false;
13392 }
13393 
13394 static const ParsedAttrInfoObjCSubclassingRestricted Instance;
13395 };
13396 const ParsedAttrInfoObjCSubclassingRestricted ParsedAttrInfoObjCSubclassingRestricted::Instance;
13397 static constexpr ParsedAttrInfo::Spelling OpenCLAccessSpellings[] = {
13398   {AttributeCommonInfo::AS_Keyword, "__read_only"},
13399   {AttributeCommonInfo::AS_Keyword, "read_only"},
13400   {AttributeCommonInfo::AS_Keyword, "__write_only"},
13401   {AttributeCommonInfo::AS_Keyword, "write_only"},
13402   {AttributeCommonInfo::AS_Keyword, "__read_write"},
13403   {AttributeCommonInfo::AS_Keyword, "read_write"},
13404 };
13405 struct ParsedAttrInfoOpenCLAccess final : public ParsedAttrInfo {
13406   constexpr ParsedAttrInfoOpenCLAccess() : ParsedAttrInfo(
13407     /*AttrKind=*/ParsedAttr::AT_OpenCLAccess,
13408     /*NumArgs=*/0,
13409     /*OptArgs=*/0,
13410     /*NumArgMembers=*/0,
13411     /*HasCustomParsing=*/0,
13412     /*AcceptsExprPack=*/0,
13413     /*IsTargetSpecific=*/0,
13414     /*IsType=*/0,
13415     /*IsStmt=*/0,
13416     /*IsKnownToGCC=*/0,
13417     /*IsSupportedByPragmaAttribute=*/0,
13418     /*Spellings=*/OpenCLAccessSpellings,
13419     /*ArgNames=*/{}) {}
13420 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13421   if (!isa<ParmVarDecl>(D) && !isa<TypedefNameDecl>(D)) {
13422     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13423       << Attr << Attr.isRegularKeywordAttribute() << "parameters and typedefs";
13424     return false;
13425   }
13426   return true;
13427 }
13428 
13429 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13430   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13431     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13432   return false;
13433 }
13434 
13435 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
13436   enum Spelling {
13437     Keyword_read_only = 0,
13438     Keyword_write_only = 2,
13439     Keyword_read_write = 4,
13440   SpellingNotCalculated = 15
13441 
13442   };
13443 
13444   unsigned Idx = Attr.getAttributeSpellingListIndex();
13445   switch (Idx) {
13446     default: llvm_unreachable("Unknown spelling list index");
13447     case 0: return Keyword_read_only;
13448     case 1: return Keyword_read_only;
13449     case 2: return Keyword_write_only;
13450     case 3: return Keyword_write_only;
13451     case 4: return Keyword_read_write;
13452     case 5: return Keyword_read_write;
13453   }
13454 }
13455 
13456 bool isParamExpr(size_t N) const override {
13457   return false;
13458 }
13459 
13460 static const ParsedAttrInfoOpenCLAccess Instance;
13461 };
13462 const ParsedAttrInfoOpenCLAccess ParsedAttrInfoOpenCLAccess::Instance;
13463 static constexpr ParsedAttrInfo::Spelling OpenCLConstantAddressSpaceSpellings[] = {
13464   {AttributeCommonInfo::AS_Keyword, "__constant"},
13465   {AttributeCommonInfo::AS_Keyword, "constant"},
13466   {AttributeCommonInfo::AS_GNU, "opencl_constant"},
13467   {AttributeCommonInfo::AS_CXX11, "clang::opencl_constant"},
13468   {AttributeCommonInfo::AS_C23, "clang::opencl_constant"},
13469 };
13470 struct ParsedAttrInfoOpenCLConstantAddressSpace final : public ParsedAttrInfo {
13471   constexpr ParsedAttrInfoOpenCLConstantAddressSpace() : ParsedAttrInfo(
13472     /*AttrKind=*/ParsedAttr::AT_OpenCLConstantAddressSpace,
13473     /*NumArgs=*/0,
13474     /*OptArgs=*/0,
13475     /*NumArgMembers=*/0,
13476     /*HasCustomParsing=*/0,
13477     /*AcceptsExprPack=*/0,
13478     /*IsTargetSpecific=*/0,
13479     /*IsType=*/1,
13480     /*IsStmt=*/0,
13481     /*IsKnownToGCC=*/0,
13482     /*IsSupportedByPragmaAttribute=*/0,
13483     /*Spellings=*/OpenCLConstantAddressSpaceSpellings,
13484     /*ArgNames=*/{}) {}
13485 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
13486   enum Spelling {
13487     Keyword_constant = 0,
13488     GNU_opencl_constant = 2,
13489     CXX11_clang_opencl_constant = 3,
13490     C23_clang_opencl_constant = 4,
13491   SpellingNotCalculated = 15
13492 
13493   };
13494 
13495   unsigned Idx = Attr.getAttributeSpellingListIndex();
13496   switch (Idx) {
13497     default: llvm_unreachable("Unknown spelling list index");
13498     case 0: return Keyword_constant;
13499     case 1: return Keyword_constant;
13500     case 2: return GNU_opencl_constant;
13501     case 3: return CXX11_clang_opencl_constant;
13502     case 4: return C23_clang_opencl_constant;
13503   }
13504 }
13505 
13506 bool isParamExpr(size_t N) const override {
13507   return false;
13508 }
13509 
13510 static const ParsedAttrInfoOpenCLConstantAddressSpace Instance;
13511 };
13512 const ParsedAttrInfoOpenCLConstantAddressSpace ParsedAttrInfoOpenCLConstantAddressSpace::Instance;
13513 static constexpr ParsedAttrInfo::Spelling OpenCLGenericAddressSpaceSpellings[] = {
13514   {AttributeCommonInfo::AS_Keyword, "__generic"},
13515   {AttributeCommonInfo::AS_Keyword, "generic"},
13516   {AttributeCommonInfo::AS_GNU, "opencl_generic"},
13517   {AttributeCommonInfo::AS_CXX11, "clang::opencl_generic"},
13518   {AttributeCommonInfo::AS_C23, "clang::opencl_generic"},
13519 };
13520 struct ParsedAttrInfoOpenCLGenericAddressSpace final : public ParsedAttrInfo {
13521   constexpr ParsedAttrInfoOpenCLGenericAddressSpace() : ParsedAttrInfo(
13522     /*AttrKind=*/ParsedAttr::AT_OpenCLGenericAddressSpace,
13523     /*NumArgs=*/0,
13524     /*OptArgs=*/0,
13525     /*NumArgMembers=*/0,
13526     /*HasCustomParsing=*/0,
13527     /*AcceptsExprPack=*/0,
13528     /*IsTargetSpecific=*/0,
13529     /*IsType=*/1,
13530     /*IsStmt=*/0,
13531     /*IsKnownToGCC=*/0,
13532     /*IsSupportedByPragmaAttribute=*/0,
13533     /*Spellings=*/OpenCLGenericAddressSpaceSpellings,
13534     /*ArgNames=*/{}) {}
13535 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
13536   enum Spelling {
13537     Keyword_generic = 0,
13538     GNU_opencl_generic = 2,
13539     CXX11_clang_opencl_generic = 3,
13540     C23_clang_opencl_generic = 4,
13541   SpellingNotCalculated = 15
13542 
13543   };
13544 
13545   unsigned Idx = Attr.getAttributeSpellingListIndex();
13546   switch (Idx) {
13547     default: llvm_unreachable("Unknown spelling list index");
13548     case 0: return Keyword_generic;
13549     case 1: return Keyword_generic;
13550     case 2: return GNU_opencl_generic;
13551     case 3: return CXX11_clang_opencl_generic;
13552     case 4: return C23_clang_opencl_generic;
13553   }
13554 }
13555 
13556 bool isParamExpr(size_t N) const override {
13557   return false;
13558 }
13559 
13560 static const ParsedAttrInfoOpenCLGenericAddressSpace Instance;
13561 };
13562 const ParsedAttrInfoOpenCLGenericAddressSpace ParsedAttrInfoOpenCLGenericAddressSpace::Instance;
13563 static constexpr ParsedAttrInfo::Spelling OpenCLGlobalAddressSpaceSpellings[] = {
13564   {AttributeCommonInfo::AS_Keyword, "__global"},
13565   {AttributeCommonInfo::AS_Keyword, "global"},
13566   {AttributeCommonInfo::AS_GNU, "opencl_global"},
13567   {AttributeCommonInfo::AS_CXX11, "clang::opencl_global"},
13568   {AttributeCommonInfo::AS_C23, "clang::opencl_global"},
13569 };
13570 struct ParsedAttrInfoOpenCLGlobalAddressSpace final : public ParsedAttrInfo {
13571   constexpr ParsedAttrInfoOpenCLGlobalAddressSpace() : ParsedAttrInfo(
13572     /*AttrKind=*/ParsedAttr::AT_OpenCLGlobalAddressSpace,
13573     /*NumArgs=*/0,
13574     /*OptArgs=*/0,
13575     /*NumArgMembers=*/0,
13576     /*HasCustomParsing=*/0,
13577     /*AcceptsExprPack=*/0,
13578     /*IsTargetSpecific=*/0,
13579     /*IsType=*/1,
13580     /*IsStmt=*/0,
13581     /*IsKnownToGCC=*/0,
13582     /*IsSupportedByPragmaAttribute=*/0,
13583     /*Spellings=*/OpenCLGlobalAddressSpaceSpellings,
13584     /*ArgNames=*/{}) {}
13585 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
13586   enum Spelling {
13587     Keyword_global = 0,
13588     GNU_opencl_global = 2,
13589     CXX11_clang_opencl_global = 3,
13590     C23_clang_opencl_global = 4,
13591   SpellingNotCalculated = 15
13592 
13593   };
13594 
13595   unsigned Idx = Attr.getAttributeSpellingListIndex();
13596   switch (Idx) {
13597     default: llvm_unreachable("Unknown spelling list index");
13598     case 0: return Keyword_global;
13599     case 1: return Keyword_global;
13600     case 2: return GNU_opencl_global;
13601     case 3: return CXX11_clang_opencl_global;
13602     case 4: return C23_clang_opencl_global;
13603   }
13604 }
13605 
13606 bool isParamExpr(size_t N) const override {
13607   return false;
13608 }
13609 
13610 static const ParsedAttrInfoOpenCLGlobalAddressSpace Instance;
13611 };
13612 const ParsedAttrInfoOpenCLGlobalAddressSpace ParsedAttrInfoOpenCLGlobalAddressSpace::Instance;
13613 static constexpr ParsedAttrInfo::Spelling OpenCLGlobalDeviceAddressSpaceSpellings[] = {
13614   {AttributeCommonInfo::AS_GNU, "opencl_global_device"},
13615   {AttributeCommonInfo::AS_CXX11, "clang::opencl_global_device"},
13616   {AttributeCommonInfo::AS_C23, "clang::opencl_global_device"},
13617 };
13618 struct ParsedAttrInfoOpenCLGlobalDeviceAddressSpace final : public ParsedAttrInfo {
13619   constexpr ParsedAttrInfoOpenCLGlobalDeviceAddressSpace() : ParsedAttrInfo(
13620     /*AttrKind=*/ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace,
13621     /*NumArgs=*/0,
13622     /*OptArgs=*/0,
13623     /*NumArgMembers=*/0,
13624     /*HasCustomParsing=*/0,
13625     /*AcceptsExprPack=*/0,
13626     /*IsTargetSpecific=*/0,
13627     /*IsType=*/1,
13628     /*IsStmt=*/0,
13629     /*IsKnownToGCC=*/0,
13630     /*IsSupportedByPragmaAttribute=*/0,
13631     /*Spellings=*/OpenCLGlobalDeviceAddressSpaceSpellings,
13632     /*ArgNames=*/{}) {}
13633 bool isParamExpr(size_t N) const override {
13634   return false;
13635 }
13636 
13637 static const ParsedAttrInfoOpenCLGlobalDeviceAddressSpace Instance;
13638 };
13639 const ParsedAttrInfoOpenCLGlobalDeviceAddressSpace ParsedAttrInfoOpenCLGlobalDeviceAddressSpace::Instance;
13640 static constexpr ParsedAttrInfo::Spelling OpenCLGlobalHostAddressSpaceSpellings[] = {
13641   {AttributeCommonInfo::AS_GNU, "opencl_global_host"},
13642   {AttributeCommonInfo::AS_CXX11, "clang::opencl_global_host"},
13643   {AttributeCommonInfo::AS_C23, "clang::opencl_global_host"},
13644 };
13645 struct ParsedAttrInfoOpenCLGlobalHostAddressSpace final : public ParsedAttrInfo {
13646   constexpr ParsedAttrInfoOpenCLGlobalHostAddressSpace() : ParsedAttrInfo(
13647     /*AttrKind=*/ParsedAttr::AT_OpenCLGlobalHostAddressSpace,
13648     /*NumArgs=*/0,
13649     /*OptArgs=*/0,
13650     /*NumArgMembers=*/0,
13651     /*HasCustomParsing=*/0,
13652     /*AcceptsExprPack=*/0,
13653     /*IsTargetSpecific=*/0,
13654     /*IsType=*/1,
13655     /*IsStmt=*/0,
13656     /*IsKnownToGCC=*/0,
13657     /*IsSupportedByPragmaAttribute=*/0,
13658     /*Spellings=*/OpenCLGlobalHostAddressSpaceSpellings,
13659     /*ArgNames=*/{}) {}
13660 bool isParamExpr(size_t N) const override {
13661   return false;
13662 }
13663 
13664 static const ParsedAttrInfoOpenCLGlobalHostAddressSpace Instance;
13665 };
13666 const ParsedAttrInfoOpenCLGlobalHostAddressSpace ParsedAttrInfoOpenCLGlobalHostAddressSpace::Instance;
13667 static constexpr ParsedAttrInfo::Spelling OpenCLIntelReqdSubGroupSizeSpellings[] = {
13668   {AttributeCommonInfo::AS_GNU, "intel_reqd_sub_group_size"},
13669 };
13670 static constexpr const char *OpenCLIntelReqdSubGroupSizeArgNames[] = {
13671 "SubGroupSize",};
13672 struct ParsedAttrInfoOpenCLIntelReqdSubGroupSize final : public ParsedAttrInfo {
13673   constexpr ParsedAttrInfoOpenCLIntelReqdSubGroupSize() : ParsedAttrInfo(
13674     /*AttrKind=*/ParsedAttr::AT_OpenCLIntelReqdSubGroupSize,
13675     /*NumArgs=*/1,
13676     /*OptArgs=*/0,
13677     /*NumArgMembers=*/1,
13678     /*HasCustomParsing=*/0,
13679     /*AcceptsExprPack=*/0,
13680     /*IsTargetSpecific=*/0,
13681     /*IsType=*/0,
13682     /*IsStmt=*/0,
13683     /*IsKnownToGCC=*/0,
13684     /*IsSupportedByPragmaAttribute=*/1,
13685     /*Spellings=*/OpenCLIntelReqdSubGroupSizeSpellings,
13686     /*ArgNames=*/OpenCLIntelReqdSubGroupSizeArgNames) {}
13687 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13688   if (!isa<FunctionDecl>(D)) {
13689     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13690       << Attr << Attr.isRegularKeywordAttribute() << "functions";
13691     return false;
13692   }
13693   return true;
13694 }
13695 
13696 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13697   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13698     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13699   return false;
13700 }
13701 
13702 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13703   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
13704 }
13705 
13706 bool isParamExpr(size_t N) const override {
13707   return false;
13708 }
13709 
13710 static const ParsedAttrInfoOpenCLIntelReqdSubGroupSize Instance;
13711 };
13712 const ParsedAttrInfoOpenCLIntelReqdSubGroupSize ParsedAttrInfoOpenCLIntelReqdSubGroupSize::Instance;
13713 static constexpr ParsedAttrInfo::Spelling OpenCLKernelSpellings[] = {
13714   {AttributeCommonInfo::AS_Keyword, "__kernel"},
13715   {AttributeCommonInfo::AS_Keyword, "kernel"},
13716 };
13717 struct ParsedAttrInfoOpenCLKernel final : public ParsedAttrInfo {
13718   constexpr ParsedAttrInfoOpenCLKernel() : ParsedAttrInfo(
13719     /*AttrKind=*/ParsedAttr::AT_OpenCLKernel,
13720     /*NumArgs=*/0,
13721     /*OptArgs=*/0,
13722     /*NumArgMembers=*/0,
13723     /*HasCustomParsing=*/0,
13724     /*AcceptsExprPack=*/0,
13725     /*IsTargetSpecific=*/0,
13726     /*IsType=*/0,
13727     /*IsStmt=*/0,
13728     /*IsKnownToGCC=*/0,
13729     /*IsSupportedByPragmaAttribute=*/0,
13730     /*Spellings=*/OpenCLKernelSpellings,
13731     /*ArgNames=*/{}) {}
13732 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13733   if (!isa<FunctionDecl>(D)) {
13734     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13735       << Attr << Attr.isRegularKeywordAttribute() << "functions";
13736     return false;
13737   }
13738   return true;
13739 }
13740 
13741 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13742   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13743     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13744   return false;
13745 }
13746 
13747 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
13748   D->addAttr(::new (S.Context) OpenCLKernelAttr(S.Context, Attr));
13749   return AttributeApplied;
13750 }
13751 
13752 bool isParamExpr(size_t N) const override {
13753   return false;
13754 }
13755 
13756 static const ParsedAttrInfoOpenCLKernel Instance;
13757 };
13758 const ParsedAttrInfoOpenCLKernel ParsedAttrInfoOpenCLKernel::Instance;
13759 static constexpr ParsedAttrInfo::Spelling OpenCLLocalAddressSpaceSpellings[] = {
13760   {AttributeCommonInfo::AS_Keyword, "__local"},
13761   {AttributeCommonInfo::AS_Keyword, "local"},
13762   {AttributeCommonInfo::AS_GNU, "opencl_local"},
13763   {AttributeCommonInfo::AS_CXX11, "clang::opencl_local"},
13764   {AttributeCommonInfo::AS_C23, "clang::opencl_local"},
13765 };
13766 struct ParsedAttrInfoOpenCLLocalAddressSpace final : public ParsedAttrInfo {
13767   constexpr ParsedAttrInfoOpenCLLocalAddressSpace() : ParsedAttrInfo(
13768     /*AttrKind=*/ParsedAttr::AT_OpenCLLocalAddressSpace,
13769     /*NumArgs=*/0,
13770     /*OptArgs=*/0,
13771     /*NumArgMembers=*/0,
13772     /*HasCustomParsing=*/0,
13773     /*AcceptsExprPack=*/0,
13774     /*IsTargetSpecific=*/0,
13775     /*IsType=*/1,
13776     /*IsStmt=*/0,
13777     /*IsKnownToGCC=*/0,
13778     /*IsSupportedByPragmaAttribute=*/0,
13779     /*Spellings=*/OpenCLLocalAddressSpaceSpellings,
13780     /*ArgNames=*/{}) {}
13781 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
13782   enum Spelling {
13783     Keyword_local = 0,
13784     GNU_opencl_local = 2,
13785     CXX11_clang_opencl_local = 3,
13786     C23_clang_opencl_local = 4,
13787   SpellingNotCalculated = 15
13788 
13789   };
13790 
13791   unsigned Idx = Attr.getAttributeSpellingListIndex();
13792   switch (Idx) {
13793     default: llvm_unreachable("Unknown spelling list index");
13794     case 0: return Keyword_local;
13795     case 1: return Keyword_local;
13796     case 2: return GNU_opencl_local;
13797     case 3: return CXX11_clang_opencl_local;
13798     case 4: return C23_clang_opencl_local;
13799   }
13800 }
13801 
13802 bool isParamExpr(size_t N) const override {
13803   return false;
13804 }
13805 
13806 static const ParsedAttrInfoOpenCLLocalAddressSpace Instance;
13807 };
13808 const ParsedAttrInfoOpenCLLocalAddressSpace ParsedAttrInfoOpenCLLocalAddressSpace::Instance;
13809 static constexpr ParsedAttrInfo::Spelling OpenCLNoSVMSpellings[] = {
13810   {AttributeCommonInfo::AS_GNU, "nosvm"},
13811 };
13812 struct ParsedAttrInfoOpenCLNoSVM final : public ParsedAttrInfo {
13813   constexpr ParsedAttrInfoOpenCLNoSVM() : ParsedAttrInfo(
13814     /*AttrKind=*/ParsedAttr::AT_OpenCLNoSVM,
13815     /*NumArgs=*/0,
13816     /*OptArgs=*/0,
13817     /*NumArgMembers=*/0,
13818     /*HasCustomParsing=*/0,
13819     /*AcceptsExprPack=*/0,
13820     /*IsTargetSpecific=*/0,
13821     /*IsType=*/0,
13822     /*IsStmt=*/0,
13823     /*IsKnownToGCC=*/0,
13824     /*IsSupportedByPragmaAttribute=*/1,
13825     /*Spellings=*/OpenCLNoSVMSpellings,
13826     /*ArgNames=*/{}) {}
13827 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13828   if (!isa<VarDecl>(D)) {
13829     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
13830       << Attr << Attr.isRegularKeywordAttribute() << "variables";
13831     return false;
13832   }
13833   return true;
13834 }
13835 
13836 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13837   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13838     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13839   return false;
13840 }
13841 
13842 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
13843   return LangOpts.OpenCL;
13844 }
13845 
13846 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13847   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
13848 }
13849 
13850 bool isParamExpr(size_t N) const override {
13851   return false;
13852 }
13853 
13854 static const ParsedAttrInfoOpenCLNoSVM Instance;
13855 };
13856 const ParsedAttrInfoOpenCLNoSVM ParsedAttrInfoOpenCLNoSVM::Instance;
13857 static constexpr ParsedAttrInfo::Spelling OpenCLPrivateAddressSpaceSpellings[] = {
13858   {AttributeCommonInfo::AS_Keyword, "__private"},
13859   {AttributeCommonInfo::AS_Keyword, "private"},
13860   {AttributeCommonInfo::AS_GNU, "opencl_private"},
13861   {AttributeCommonInfo::AS_CXX11, "clang::opencl_private"},
13862   {AttributeCommonInfo::AS_C23, "clang::opencl_private"},
13863 };
13864 struct ParsedAttrInfoOpenCLPrivateAddressSpace final : public ParsedAttrInfo {
13865   constexpr ParsedAttrInfoOpenCLPrivateAddressSpace() : ParsedAttrInfo(
13866     /*AttrKind=*/ParsedAttr::AT_OpenCLPrivateAddressSpace,
13867     /*NumArgs=*/0,
13868     /*OptArgs=*/0,
13869     /*NumArgMembers=*/0,
13870     /*HasCustomParsing=*/0,
13871     /*AcceptsExprPack=*/0,
13872     /*IsTargetSpecific=*/0,
13873     /*IsType=*/1,
13874     /*IsStmt=*/0,
13875     /*IsKnownToGCC=*/0,
13876     /*IsSupportedByPragmaAttribute=*/0,
13877     /*Spellings=*/OpenCLPrivateAddressSpaceSpellings,
13878     /*ArgNames=*/{}) {}
13879 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
13880   enum Spelling {
13881     Keyword_private = 0,
13882     GNU_opencl_private = 2,
13883     CXX11_clang_opencl_private = 3,
13884     C23_clang_opencl_private = 4,
13885   SpellingNotCalculated = 15
13886 
13887   };
13888 
13889   unsigned Idx = Attr.getAttributeSpellingListIndex();
13890   switch (Idx) {
13891     default: llvm_unreachable("Unknown spelling list index");
13892     case 0: return Keyword_private;
13893     case 1: return Keyword_private;
13894     case 2: return GNU_opencl_private;
13895     case 3: return CXX11_clang_opencl_private;
13896     case 4: return C23_clang_opencl_private;
13897   }
13898 }
13899 
13900 bool isParamExpr(size_t N) const override {
13901   return false;
13902 }
13903 
13904 static const ParsedAttrInfoOpenCLPrivateAddressSpace Instance;
13905 };
13906 const ParsedAttrInfoOpenCLPrivateAddressSpace ParsedAttrInfoOpenCLPrivateAddressSpace::Instance;
13907 static constexpr ParsedAttrInfo::Spelling OpenCLUnrollHintSpellings[] = {
13908   {AttributeCommonInfo::AS_GNU, "opencl_unroll_hint"},
13909 };
13910 static constexpr const char *OpenCLUnrollHintArgNames[] = {
13911 "UnrollHint",};
13912 struct ParsedAttrInfoOpenCLUnrollHint final : public ParsedAttrInfo {
13913   constexpr ParsedAttrInfoOpenCLUnrollHint() : ParsedAttrInfo(
13914     /*AttrKind=*/ParsedAttr::AT_OpenCLUnrollHint,
13915     /*NumArgs=*/0,
13916     /*OptArgs=*/1,
13917     /*NumArgMembers=*/1,
13918     /*HasCustomParsing=*/0,
13919     /*AcceptsExprPack=*/0,
13920     /*IsTargetSpecific=*/0,
13921     /*IsType=*/0,
13922     /*IsStmt=*/1,
13923     /*IsKnownToGCC=*/0,
13924     /*IsSupportedByPragmaAttribute=*/0,
13925     /*Spellings=*/OpenCLUnrollHintSpellings,
13926     /*ArgNames=*/OpenCLUnrollHintArgNames) {}
13927 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
13928   S.Diag(AL.getLoc(), diag::err_attribute_invalid_on_decl)
13929     << AL << AL.isRegularKeywordAttribute() << D->getLocation();
13930   return false;
13931 }
13932 
13933 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
13934   if (!isa<ForStmt>(St) && !isa<CXXForRangeStmt>(St) && !isa<WhileStmt>(St) && !isa<DoStmt>(St)) {
13935     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
13936       << Attr << Attr.isRegularKeywordAttribute() << "'for', 'while', and 'do' statements";
13937     return false;
13938   }
13939   return true;
13940 }
13941 
13942 bool isParamExpr(size_t N) const override {
13943   return false;
13944 }
13945 
13946 static const ParsedAttrInfoOpenCLUnrollHint Instance;
13947 };
13948 const ParsedAttrInfoOpenCLUnrollHint ParsedAttrInfoOpenCLUnrollHint::Instance;
13949 static constexpr ParsedAttrInfo::Spelling OptimizeNoneSpellings[] = {
13950   {AttributeCommonInfo::AS_GNU, "optnone"},
13951   {AttributeCommonInfo::AS_CXX11, "clang::optnone"},
13952   {AttributeCommonInfo::AS_C23, "clang::optnone"},
13953 };
13954 struct ParsedAttrInfoOptimizeNone final : public ParsedAttrInfo {
13955   constexpr ParsedAttrInfoOptimizeNone() : ParsedAttrInfo(
13956     /*AttrKind=*/ParsedAttr::AT_OptimizeNone,
13957     /*NumArgs=*/0,
13958     /*OptArgs=*/0,
13959     /*NumArgMembers=*/0,
13960     /*HasCustomParsing=*/0,
13961     /*AcceptsExprPack=*/0,
13962     /*IsTargetSpecific=*/0,
13963     /*IsType=*/0,
13964     /*IsStmt=*/0,
13965     /*IsKnownToGCC=*/0,
13966     /*IsSupportedByPragmaAttribute=*/1,
13967     /*Spellings=*/OptimizeNoneSpellings,
13968     /*ArgNames=*/{}) {}
13969 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
13970   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
13971     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
13972       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
13973     return false;
13974   }
13975   return true;
13976 }
13977 
13978 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
13979   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
13980     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
13981   return false;
13982 }
13983 
13984 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
13985   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
13986   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
13987 }
13988 
13989 bool isParamExpr(size_t N) const override {
13990   return false;
13991 }
13992 
13993 static const ParsedAttrInfoOptimizeNone Instance;
13994 };
13995 const ParsedAttrInfoOptimizeNone ParsedAttrInfoOptimizeNone::Instance;
13996 static constexpr ParsedAttrInfo::Spelling OverloadableSpellings[] = {
13997   {AttributeCommonInfo::AS_GNU, "overloadable"},
13998   {AttributeCommonInfo::AS_CXX11, "clang::overloadable"},
13999   {AttributeCommonInfo::AS_C23, "clang::overloadable"},
14000 };
14001 struct ParsedAttrInfoOverloadable final : public ParsedAttrInfo {
14002   constexpr ParsedAttrInfoOverloadable() : ParsedAttrInfo(
14003     /*AttrKind=*/ParsedAttr::AT_Overloadable,
14004     /*NumArgs=*/0,
14005     /*OptArgs=*/0,
14006     /*NumArgMembers=*/0,
14007     /*HasCustomParsing=*/0,
14008     /*AcceptsExprPack=*/0,
14009     /*IsTargetSpecific=*/0,
14010     /*IsType=*/0,
14011     /*IsStmt=*/0,
14012     /*IsKnownToGCC=*/0,
14013     /*IsSupportedByPragmaAttribute=*/1,
14014     /*Spellings=*/OverloadableSpellings,
14015     /*ArgNames=*/{}) {}
14016 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14017   if (!isa<FunctionDecl>(D)) {
14018     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14019       << Attr << Attr.isRegularKeywordAttribute() << "functions";
14020     return false;
14021   }
14022   return true;
14023 }
14024 
14025 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14026   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14027     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14028   return false;
14029 }
14030 
14031 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14032   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
14033 }
14034 
14035 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
14036   D->addAttr(::new (S.Context) OverloadableAttr(S.Context, Attr));
14037   return AttributeApplied;
14038 }
14039 
14040 bool isParamExpr(size_t N) const override {
14041   return false;
14042 }
14043 
14044 static const ParsedAttrInfoOverloadable Instance;
14045 };
14046 const ParsedAttrInfoOverloadable ParsedAttrInfoOverloadable::Instance;
14047 static constexpr ParsedAttrInfo::Spelling OwnerSpellings[] = {
14048   {AttributeCommonInfo::AS_CXX11, "gsl::Owner"},
14049 };
14050 static constexpr const char *OwnerArgNames[] = {
14051 "DerefType",};
14052 struct ParsedAttrInfoOwner final : public ParsedAttrInfo {
14053   constexpr ParsedAttrInfoOwner() : ParsedAttrInfo(
14054     /*AttrKind=*/ParsedAttr::AT_Owner,
14055     /*NumArgs=*/0,
14056     /*OptArgs=*/1,
14057     /*NumArgMembers=*/1,
14058     /*HasCustomParsing=*/0,
14059     /*AcceptsExprPack=*/0,
14060     /*IsTargetSpecific=*/0,
14061     /*IsType=*/0,
14062     /*IsStmt=*/0,
14063     /*IsKnownToGCC=*/0,
14064     /*IsSupportedByPragmaAttribute=*/1,
14065     /*Spellings=*/OwnerSpellings,
14066     /*ArgNames=*/OwnerArgNames) {}
14067 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14068   if (!isStruct(D)) {
14069     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14070       << Attr << Attr.isRegularKeywordAttribute() << "structs";
14071     return false;
14072   }
14073   return true;
14074 }
14075 
14076 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14077   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14078     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14079   return false;
14080 }
14081 
14082   using ParsedAttrInfo::diagMutualExclusion;
14083 
14084   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
14085     if (const auto *A = D->getAttr<PointerAttr>()) {
14086       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
14087       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
14088 return false;
14089     }
14090     return true;
14091   }
14092 
14093 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14094   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true));
14095 }
14096 
14097 bool isParamExpr(size_t N) const override {
14098   return false;
14099 }
14100 
14101 static const ParsedAttrInfoOwner Instance;
14102 };
14103 const ParsedAttrInfoOwner ParsedAttrInfoOwner::Instance;
14104 static constexpr ParsedAttrInfo::Spelling OwnershipSpellings[] = {
14105   {AttributeCommonInfo::AS_GNU, "ownership_holds"},
14106   {AttributeCommonInfo::AS_CXX11, "clang::ownership_holds"},
14107   {AttributeCommonInfo::AS_C23, "clang::ownership_holds"},
14108   {AttributeCommonInfo::AS_GNU, "ownership_returns"},
14109   {AttributeCommonInfo::AS_CXX11, "clang::ownership_returns"},
14110   {AttributeCommonInfo::AS_C23, "clang::ownership_returns"},
14111   {AttributeCommonInfo::AS_GNU, "ownership_takes"},
14112   {AttributeCommonInfo::AS_CXX11, "clang::ownership_takes"},
14113   {AttributeCommonInfo::AS_C23, "clang::ownership_takes"},
14114 };
14115 static constexpr const char *OwnershipArgNames[] = {
14116 "Module","Args...",};
14117 struct ParsedAttrInfoOwnership final : public ParsedAttrInfo {
14118   constexpr ParsedAttrInfoOwnership() : ParsedAttrInfo(
14119     /*AttrKind=*/ParsedAttr::AT_Ownership,
14120     /*NumArgs=*/1,
14121     /*OptArgs=*/15,
14122     /*NumArgMembers=*/2,
14123     /*HasCustomParsing=*/0,
14124     /*AcceptsExprPack=*/0,
14125     /*IsTargetSpecific=*/0,
14126     /*IsType=*/0,
14127     /*IsStmt=*/0,
14128     /*IsKnownToGCC=*/0,
14129     /*IsSupportedByPragmaAttribute=*/0,
14130     /*Spellings=*/OwnershipSpellings,
14131     /*ArgNames=*/OwnershipArgNames) {}
14132 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14133   if (!isHasFunctionProto(D)) {
14134     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14135       << Attr << Attr.isRegularKeywordAttribute() << "non-K&R-style functions";
14136     return false;
14137   }
14138   return true;
14139 }
14140 
14141 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14142   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14143     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14144   return false;
14145 }
14146 
14147 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
14148   enum Spelling {
14149     GNU_ownership_holds = 0,
14150     CXX11_clang_ownership_holds = 1,
14151     C23_clang_ownership_holds = 2,
14152     GNU_ownership_returns = 3,
14153     CXX11_clang_ownership_returns = 4,
14154     C23_clang_ownership_returns = 5,
14155     GNU_ownership_takes = 6,
14156     CXX11_clang_ownership_takes = 7,
14157     C23_clang_ownership_takes = 8,
14158   SpellingNotCalculated = 15
14159 
14160   };
14161 
14162   unsigned Idx = Attr.getAttributeSpellingListIndex();
14163   switch (Idx) {
14164     default: llvm_unreachable("Unknown spelling list index");
14165     case 0: return GNU_ownership_holds;
14166     case 1: return CXX11_clang_ownership_holds;
14167     case 2: return C23_clang_ownership_holds;
14168     case 3: return GNU_ownership_returns;
14169     case 4: return CXX11_clang_ownership_returns;
14170     case 5: return C23_clang_ownership_returns;
14171     case 6: return GNU_ownership_takes;
14172     case 7: return CXX11_clang_ownership_takes;
14173     case 8: return C23_clang_ownership_takes;
14174   }
14175 }
14176 
14177 bool isParamExpr(size_t N) const override {
14178   return false;
14179 }
14180 
14181 static const ParsedAttrInfoOwnership Instance;
14182 };
14183 const ParsedAttrInfoOwnership ParsedAttrInfoOwnership::Instance;
14184 static constexpr ParsedAttrInfo::Spelling PackedSpellings[] = {
14185   {AttributeCommonInfo::AS_GNU, "packed"},
14186   {AttributeCommonInfo::AS_CXX11, "gnu::packed"},
14187   {AttributeCommonInfo::AS_C23, "gnu::packed"},
14188 };
14189 struct ParsedAttrInfoPacked final : public ParsedAttrInfo {
14190   constexpr ParsedAttrInfoPacked() : ParsedAttrInfo(
14191     /*AttrKind=*/ParsedAttr::AT_Packed,
14192     /*NumArgs=*/0,
14193     /*OptArgs=*/0,
14194     /*NumArgMembers=*/0,
14195     /*HasCustomParsing=*/0,
14196     /*AcceptsExprPack=*/0,
14197     /*IsTargetSpecific=*/0,
14198     /*IsType=*/0,
14199     /*IsStmt=*/0,
14200     /*IsKnownToGCC=*/1,
14201     /*IsSupportedByPragmaAttribute=*/0,
14202     /*Spellings=*/PackedSpellings,
14203     /*ArgNames=*/{}) {}
14204 bool isParamExpr(size_t N) const override {
14205   return false;
14206 }
14207 
14208 static const ParsedAttrInfoPacked Instance;
14209 };
14210 const ParsedAttrInfoPacked ParsedAttrInfoPacked::Instance;
14211 static constexpr ParsedAttrInfo::Spelling ParamTypestateSpellings[] = {
14212   {AttributeCommonInfo::AS_GNU, "param_typestate"},
14213   {AttributeCommonInfo::AS_CXX11, "clang::param_typestate"},
14214 };
14215 static constexpr const char *ParamTypestateArgNames[] = {
14216 "ParamState",};
14217 struct ParsedAttrInfoParamTypestate final : public ParsedAttrInfo {
14218   constexpr ParsedAttrInfoParamTypestate() : ParsedAttrInfo(
14219     /*AttrKind=*/ParsedAttr::AT_ParamTypestate,
14220     /*NumArgs=*/1,
14221     /*OptArgs=*/0,
14222     /*NumArgMembers=*/1,
14223     /*HasCustomParsing=*/0,
14224     /*AcceptsExprPack=*/0,
14225     /*IsTargetSpecific=*/0,
14226     /*IsType=*/0,
14227     /*IsStmt=*/0,
14228     /*IsKnownToGCC=*/0,
14229     /*IsSupportedByPragmaAttribute=*/1,
14230     /*Spellings=*/ParamTypestateSpellings,
14231     /*ArgNames=*/ParamTypestateArgNames) {}
14232 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14233   if (!isa<ParmVarDecl>(D)) {
14234     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14235       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
14236     return false;
14237   }
14238   return true;
14239 }
14240 
14241 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14242   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14243     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14244   return false;
14245 }
14246 
14247 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14248   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
14249 }
14250 
14251 bool isParamExpr(size_t N) const override {
14252   return false;
14253 }
14254 
14255 static const ParsedAttrInfoParamTypestate Instance;
14256 };
14257 const ParsedAttrInfoParamTypestate ParsedAttrInfoParamTypestate::Instance;
14258 static constexpr ParsedAttrInfo::Spelling PascalSpellings[] = {
14259   {AttributeCommonInfo::AS_GNU, "pascal"},
14260   {AttributeCommonInfo::AS_CXX11, "clang::pascal"},
14261   {AttributeCommonInfo::AS_C23, "clang::pascal"},
14262   {AttributeCommonInfo::AS_Keyword, "__pascal"},
14263   {AttributeCommonInfo::AS_Keyword, "_pascal"},
14264 };
14265 struct ParsedAttrInfoPascal final : public ParsedAttrInfo {
14266   constexpr ParsedAttrInfoPascal() : ParsedAttrInfo(
14267     /*AttrKind=*/ParsedAttr::AT_Pascal,
14268     /*NumArgs=*/0,
14269     /*OptArgs=*/0,
14270     /*NumArgMembers=*/0,
14271     /*HasCustomParsing=*/0,
14272     /*AcceptsExprPack=*/0,
14273     /*IsTargetSpecific=*/0,
14274     /*IsType=*/1,
14275     /*IsStmt=*/0,
14276     /*IsKnownToGCC=*/0,
14277     /*IsSupportedByPragmaAttribute=*/0,
14278     /*Spellings=*/PascalSpellings,
14279     /*ArgNames=*/{}) {}
14280 bool isParamExpr(size_t N) const override {
14281   return false;
14282 }
14283 
14284 static const ParsedAttrInfoPascal Instance;
14285 };
14286 const ParsedAttrInfoPascal ParsedAttrInfoPascal::Instance;
14287 static constexpr ParsedAttrInfo::Spelling PassObjectSizeSpellings[] = {
14288   {AttributeCommonInfo::AS_GNU, "pass_object_size"},
14289   {AttributeCommonInfo::AS_CXX11, "clang::pass_object_size"},
14290   {AttributeCommonInfo::AS_C23, "clang::pass_object_size"},
14291   {AttributeCommonInfo::AS_GNU, "pass_dynamic_object_size"},
14292   {AttributeCommonInfo::AS_CXX11, "clang::pass_dynamic_object_size"},
14293   {AttributeCommonInfo::AS_C23, "clang::pass_dynamic_object_size"},
14294 };
14295 static constexpr const char *PassObjectSizeArgNames[] = {
14296 "Type",};
14297 struct ParsedAttrInfoPassObjectSize final : public ParsedAttrInfo {
14298   constexpr ParsedAttrInfoPassObjectSize() : ParsedAttrInfo(
14299     /*AttrKind=*/ParsedAttr::AT_PassObjectSize,
14300     /*NumArgs=*/1,
14301     /*OptArgs=*/0,
14302     /*NumArgMembers=*/1,
14303     /*HasCustomParsing=*/0,
14304     /*AcceptsExprPack=*/0,
14305     /*IsTargetSpecific=*/0,
14306     /*IsType=*/0,
14307     /*IsStmt=*/0,
14308     /*IsKnownToGCC=*/0,
14309     /*IsSupportedByPragmaAttribute=*/1,
14310     /*Spellings=*/PassObjectSizeSpellings,
14311     /*ArgNames=*/PassObjectSizeArgNames) {}
14312 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14313   if (!isa<ParmVarDecl>(D)) {
14314     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14315       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
14316     return false;
14317   }
14318   return true;
14319 }
14320 
14321 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14322   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14323     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14324   return false;
14325 }
14326 
14327 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
14328   enum Spelling {
14329     GNU_pass_object_size = 0,
14330     CXX11_clang_pass_object_size = 1,
14331     C23_clang_pass_object_size = 2,
14332     GNU_pass_dynamic_object_size = 3,
14333     CXX11_clang_pass_dynamic_object_size = 4,
14334     C23_clang_pass_dynamic_object_size = 5,
14335   SpellingNotCalculated = 15
14336 
14337   };
14338 
14339   unsigned Idx = Attr.getAttributeSpellingListIndex();
14340   switch (Idx) {
14341     default: llvm_unreachable("Unknown spelling list index");
14342     case 0: return GNU_pass_object_size;
14343     case 1: return CXX11_clang_pass_object_size;
14344     case 2: return C23_clang_pass_object_size;
14345     case 3: return GNU_pass_dynamic_object_size;
14346     case 4: return CXX11_clang_pass_dynamic_object_size;
14347     case 5: return C23_clang_pass_dynamic_object_size;
14348   }
14349 }
14350 
14351 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14352   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
14353 }
14354 
14355 bool isParamExpr(size_t N) const override {
14356   return false;
14357 }
14358 
14359 static const ParsedAttrInfoPassObjectSize Instance;
14360 };
14361 const ParsedAttrInfoPassObjectSize ParsedAttrInfoPassObjectSize::Instance;
14362 static constexpr ParsedAttrInfo::Spelling PatchableFunctionEntrySpellings[] = {
14363   {AttributeCommonInfo::AS_GNU, "patchable_function_entry"},
14364   {AttributeCommonInfo::AS_CXX11, "gnu::patchable_function_entry"},
14365   {AttributeCommonInfo::AS_C23, "gnu::patchable_function_entry"},
14366 };
14367 static constexpr const char *PatchableFunctionEntryArgNames[] = {
14368 "Count","Offset",};
14369 struct ParsedAttrInfoPatchableFunctionEntry final : public ParsedAttrInfo {
14370   constexpr ParsedAttrInfoPatchableFunctionEntry() : ParsedAttrInfo(
14371     /*AttrKind=*/ParsedAttr::AT_PatchableFunctionEntry,
14372     /*NumArgs=*/1,
14373     /*OptArgs=*/1,
14374     /*NumArgMembers=*/2,
14375     /*HasCustomParsing=*/0,
14376     /*AcceptsExprPack=*/0,
14377     /*IsTargetSpecific=*/1,
14378     /*IsType=*/0,
14379     /*IsStmt=*/0,
14380     /*IsKnownToGCC=*/1,
14381     /*IsSupportedByPragmaAttribute=*/1,
14382     /*Spellings=*/PatchableFunctionEntrySpellings,
14383     /*ArgNames=*/PatchableFunctionEntryArgNames) {}
14384 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14385   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
14386     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14387       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
14388     return false;
14389   }
14390   return true;
14391 }
14392 
14393 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14394   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14395     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14396   return false;
14397 }
14398 
14399 bool existsInTarget(const TargetInfo &Target) const override {
14400   const llvm::Triple &T = Target.getTriple(); (void)T;
14401   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::loongarch32 || T.getArch() == llvm::Triple::loongarch64 || T.getArch() == llvm::Triple::riscv32 || T.getArch() == llvm::Triple::riscv64 || T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64 || T.getArch() == llvm::Triple::ppc || T.getArch() == llvm::Triple::ppc64);
14402 }
14403 
14404 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14405   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
14406   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
14407 }
14408 
14409 bool isParamExpr(size_t N) const override {
14410   return false;
14411 }
14412 
14413 static const ParsedAttrInfoPatchableFunctionEntry Instance;
14414 };
14415 const ParsedAttrInfoPatchableFunctionEntry ParsedAttrInfoPatchableFunctionEntry::Instance;
14416 static constexpr ParsedAttrInfo::Spelling PcsSpellings[] = {
14417   {AttributeCommonInfo::AS_GNU, "pcs"},
14418   {AttributeCommonInfo::AS_CXX11, "gnu::pcs"},
14419   {AttributeCommonInfo::AS_C23, "gnu::pcs"},
14420 };
14421 static constexpr const char *PcsArgNames[] = {
14422 "PCS",};
14423 struct ParsedAttrInfoPcs final : public ParsedAttrInfo {
14424   constexpr ParsedAttrInfoPcs() : ParsedAttrInfo(
14425     /*AttrKind=*/ParsedAttr::AT_Pcs,
14426     /*NumArgs=*/1,
14427     /*OptArgs=*/0,
14428     /*NumArgMembers=*/1,
14429     /*HasCustomParsing=*/0,
14430     /*AcceptsExprPack=*/0,
14431     /*IsTargetSpecific=*/0,
14432     /*IsType=*/1,
14433     /*IsStmt=*/0,
14434     /*IsKnownToGCC=*/1,
14435     /*IsSupportedByPragmaAttribute=*/0,
14436     /*Spellings=*/PcsSpellings,
14437     /*ArgNames=*/PcsArgNames) {}
14438 bool isParamExpr(size_t N) const override {
14439   return false;
14440 }
14441 
14442 static const ParsedAttrInfoPcs Instance;
14443 };
14444 const ParsedAttrInfoPcs ParsedAttrInfoPcs::Instance;
14445 static constexpr ParsedAttrInfo::Spelling PointerSpellings[] = {
14446   {AttributeCommonInfo::AS_CXX11, "gsl::Pointer"},
14447 };
14448 static constexpr const char *PointerArgNames[] = {
14449 "DerefType",};
14450 struct ParsedAttrInfoPointer final : public ParsedAttrInfo {
14451   constexpr ParsedAttrInfoPointer() : ParsedAttrInfo(
14452     /*AttrKind=*/ParsedAttr::AT_Pointer,
14453     /*NumArgs=*/0,
14454     /*OptArgs=*/1,
14455     /*NumArgMembers=*/1,
14456     /*HasCustomParsing=*/0,
14457     /*AcceptsExprPack=*/0,
14458     /*IsTargetSpecific=*/0,
14459     /*IsType=*/0,
14460     /*IsStmt=*/0,
14461     /*IsKnownToGCC=*/0,
14462     /*IsSupportedByPragmaAttribute=*/1,
14463     /*Spellings=*/PointerSpellings,
14464     /*ArgNames=*/PointerArgNames) {}
14465 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14466   if (!isStruct(D)) {
14467     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14468       << Attr << Attr.isRegularKeywordAttribute() << "structs";
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 << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14477   return false;
14478 }
14479 
14480   using ParsedAttrInfo::diagMutualExclusion;
14481 
14482   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
14483     if (const auto *A = D->getAttr<OwnerAttr>()) {
14484       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
14485       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
14486 return false;
14487     }
14488     return true;
14489   }
14490 
14491 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14492   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record_not_is_union, /*IsSupported=*/true));
14493 }
14494 
14495 bool isParamExpr(size_t N) const override {
14496   return false;
14497 }
14498 
14499 static const ParsedAttrInfoPointer Instance;
14500 };
14501 const ParsedAttrInfoPointer ParsedAttrInfoPointer::Instance;
14502 static constexpr const char *PragmaClangBSSSectionArgNames[] = {
14503 "Name",};
14504 struct ParsedAttrInfoPragmaClangBSSSection final : public ParsedAttrInfo {
14505   constexpr ParsedAttrInfoPragmaClangBSSSection() : ParsedAttrInfo(
14506     /*AttrKind=*/ParsedAttr::AT_PragmaClangBSSSection,
14507     /*NumArgs=*/1,
14508     /*OptArgs=*/0,
14509     /*NumArgMembers=*/1,
14510     /*HasCustomParsing=*/0,
14511     /*AcceptsExprPack=*/0,
14512     /*IsTargetSpecific=*/0,
14513     /*IsType=*/0,
14514     /*IsStmt=*/0,
14515     /*IsKnownToGCC=*/0,
14516     /*IsSupportedByPragmaAttribute=*/0,
14517     /*Spellings=*/{},
14518     /*ArgNames=*/PragmaClangBSSSectionArgNames) {}
14519 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14520   if (!isGlobalVar(D)) {
14521     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14522       << Attr << Attr.isRegularKeywordAttribute() << "global variables";
14523     return false;
14524   }
14525   return true;
14526 }
14527 
14528 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14529   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14530     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14531   return false;
14532 }
14533 
14534 bool isParamExpr(size_t N) const override {
14535   return false;
14536 }
14537 
14538 static const ParsedAttrInfoPragmaClangBSSSection Instance;
14539 };
14540 const ParsedAttrInfoPragmaClangBSSSection ParsedAttrInfoPragmaClangBSSSection::Instance;
14541 static constexpr const char *PragmaClangDataSectionArgNames[] = {
14542 "Name",};
14543 struct ParsedAttrInfoPragmaClangDataSection final : public ParsedAttrInfo {
14544   constexpr ParsedAttrInfoPragmaClangDataSection() : ParsedAttrInfo(
14545     /*AttrKind=*/ParsedAttr::AT_PragmaClangDataSection,
14546     /*NumArgs=*/1,
14547     /*OptArgs=*/0,
14548     /*NumArgMembers=*/1,
14549     /*HasCustomParsing=*/0,
14550     /*AcceptsExprPack=*/0,
14551     /*IsTargetSpecific=*/0,
14552     /*IsType=*/0,
14553     /*IsStmt=*/0,
14554     /*IsKnownToGCC=*/0,
14555     /*IsSupportedByPragmaAttribute=*/0,
14556     /*Spellings=*/{},
14557     /*ArgNames=*/PragmaClangDataSectionArgNames) {}
14558 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14559   if (!isGlobalVar(D)) {
14560     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14561       << Attr << Attr.isRegularKeywordAttribute() << "global variables";
14562     return false;
14563   }
14564   return true;
14565 }
14566 
14567 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14568   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14569     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14570   return false;
14571 }
14572 
14573 bool isParamExpr(size_t N) const override {
14574   return false;
14575 }
14576 
14577 static const ParsedAttrInfoPragmaClangDataSection Instance;
14578 };
14579 const ParsedAttrInfoPragmaClangDataSection ParsedAttrInfoPragmaClangDataSection::Instance;
14580 static constexpr const char *PragmaClangRelroSectionArgNames[] = {
14581 "Name",};
14582 struct ParsedAttrInfoPragmaClangRelroSection final : public ParsedAttrInfo {
14583   constexpr ParsedAttrInfoPragmaClangRelroSection() : ParsedAttrInfo(
14584     /*AttrKind=*/ParsedAttr::AT_PragmaClangRelroSection,
14585     /*NumArgs=*/1,
14586     /*OptArgs=*/0,
14587     /*NumArgMembers=*/1,
14588     /*HasCustomParsing=*/0,
14589     /*AcceptsExprPack=*/0,
14590     /*IsTargetSpecific=*/0,
14591     /*IsType=*/0,
14592     /*IsStmt=*/0,
14593     /*IsKnownToGCC=*/0,
14594     /*IsSupportedByPragmaAttribute=*/0,
14595     /*Spellings=*/{},
14596     /*ArgNames=*/PragmaClangRelroSectionArgNames) {}
14597 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14598   if (!isGlobalVar(D)) {
14599     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14600       << Attr << Attr.isRegularKeywordAttribute() << "global variables";
14601     return false;
14602   }
14603   return true;
14604 }
14605 
14606 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14607   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14608     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14609   return false;
14610 }
14611 
14612 bool isParamExpr(size_t N) const override {
14613   return false;
14614 }
14615 
14616 static const ParsedAttrInfoPragmaClangRelroSection Instance;
14617 };
14618 const ParsedAttrInfoPragmaClangRelroSection ParsedAttrInfoPragmaClangRelroSection::Instance;
14619 static constexpr const char *PragmaClangRodataSectionArgNames[] = {
14620 "Name",};
14621 struct ParsedAttrInfoPragmaClangRodataSection final : public ParsedAttrInfo {
14622   constexpr ParsedAttrInfoPragmaClangRodataSection() : ParsedAttrInfo(
14623     /*AttrKind=*/ParsedAttr::AT_PragmaClangRodataSection,
14624     /*NumArgs=*/1,
14625     /*OptArgs=*/0,
14626     /*NumArgMembers=*/1,
14627     /*HasCustomParsing=*/0,
14628     /*AcceptsExprPack=*/0,
14629     /*IsTargetSpecific=*/0,
14630     /*IsType=*/0,
14631     /*IsStmt=*/0,
14632     /*IsKnownToGCC=*/0,
14633     /*IsSupportedByPragmaAttribute=*/0,
14634     /*Spellings=*/{},
14635     /*ArgNames=*/PragmaClangRodataSectionArgNames) {}
14636 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14637   if (!isGlobalVar(D)) {
14638     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14639       << Attr << Attr.isRegularKeywordAttribute() << "global variables";
14640     return false;
14641   }
14642   return true;
14643 }
14644 
14645 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14646   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14647     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14648   return false;
14649 }
14650 
14651 bool isParamExpr(size_t N) const override {
14652   return false;
14653 }
14654 
14655 static const ParsedAttrInfoPragmaClangRodataSection Instance;
14656 };
14657 const ParsedAttrInfoPragmaClangRodataSection ParsedAttrInfoPragmaClangRodataSection::Instance;
14658 static constexpr const char *PragmaClangTextSectionArgNames[] = {
14659 "Name",};
14660 struct ParsedAttrInfoPragmaClangTextSection final : public ParsedAttrInfo {
14661   constexpr ParsedAttrInfoPragmaClangTextSection() : ParsedAttrInfo(
14662     /*AttrKind=*/ParsedAttr::AT_PragmaClangTextSection,
14663     /*NumArgs=*/1,
14664     /*OptArgs=*/0,
14665     /*NumArgMembers=*/1,
14666     /*HasCustomParsing=*/0,
14667     /*AcceptsExprPack=*/0,
14668     /*IsTargetSpecific=*/0,
14669     /*IsType=*/0,
14670     /*IsStmt=*/0,
14671     /*IsKnownToGCC=*/0,
14672     /*IsSupportedByPragmaAttribute=*/0,
14673     /*Spellings=*/{},
14674     /*ArgNames=*/PragmaClangTextSectionArgNames) {}
14675 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14676   if (!isa<FunctionDecl>(D)) {
14677     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14678       << Attr << Attr.isRegularKeywordAttribute() << "functions";
14679     return false;
14680   }
14681   return true;
14682 }
14683 
14684 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14685   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14686     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14687   return false;
14688 }
14689 
14690 bool isParamExpr(size_t N) const override {
14691   return false;
14692 }
14693 
14694 static const ParsedAttrInfoPragmaClangTextSection Instance;
14695 };
14696 const ParsedAttrInfoPragmaClangTextSection ParsedAttrInfoPragmaClangTextSection::Instance;
14697 static constexpr ParsedAttrInfo::Spelling PreferredNameSpellings[] = {
14698   {AttributeCommonInfo::AS_GNU, "preferred_name"},
14699   {AttributeCommonInfo::AS_CXX11, "clang::preferred_name"},
14700 };
14701 static constexpr const char *PreferredNameArgNames[] = {
14702 "TypedefType",};
14703 struct ParsedAttrInfoPreferredName final : public ParsedAttrInfo {
14704   constexpr ParsedAttrInfoPreferredName() : ParsedAttrInfo(
14705     /*AttrKind=*/ParsedAttr::AT_PreferredName,
14706     /*NumArgs=*/1,
14707     /*OptArgs=*/0,
14708     /*NumArgMembers=*/1,
14709     /*HasCustomParsing=*/0,
14710     /*AcceptsExprPack=*/0,
14711     /*IsTargetSpecific=*/0,
14712     /*IsType=*/0,
14713     /*IsStmt=*/0,
14714     /*IsKnownToGCC=*/0,
14715     /*IsSupportedByPragmaAttribute=*/0,
14716     /*Spellings=*/PreferredNameSpellings,
14717     /*ArgNames=*/PreferredNameArgNames) {}
14718 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14719   if (!isClassTmpl(D)) {
14720     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14721       << Attr << Attr.isRegularKeywordAttribute() << "class templates";
14722     return false;
14723   }
14724   return true;
14725 }
14726 
14727 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14728   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14729     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14730   return false;
14731 }
14732 
14733 bool isParamExpr(size_t N) const override {
14734   return false;
14735 }
14736 
14737 static const ParsedAttrInfoPreferredName Instance;
14738 };
14739 const ParsedAttrInfoPreferredName ParsedAttrInfoPreferredName::Instance;
14740 static constexpr ParsedAttrInfo::Spelling PreferredTypeSpellings[] = {
14741   {AttributeCommonInfo::AS_GNU, "preferred_type"},
14742   {AttributeCommonInfo::AS_CXX11, "clang::preferred_type"},
14743   {AttributeCommonInfo::AS_C23, "clang::preferred_type"},
14744 };
14745 static constexpr const char *PreferredTypeArgNames[] = {
14746 "Type",};
14747 struct ParsedAttrInfoPreferredType final : public ParsedAttrInfo {
14748   constexpr ParsedAttrInfoPreferredType() : ParsedAttrInfo(
14749     /*AttrKind=*/ParsedAttr::AT_PreferredType,
14750     /*NumArgs=*/0,
14751     /*OptArgs=*/1,
14752     /*NumArgMembers=*/1,
14753     /*HasCustomParsing=*/0,
14754     /*AcceptsExprPack=*/0,
14755     /*IsTargetSpecific=*/0,
14756     /*IsType=*/0,
14757     /*IsStmt=*/0,
14758     /*IsKnownToGCC=*/0,
14759     /*IsSupportedByPragmaAttribute=*/0,
14760     /*Spellings=*/PreferredTypeSpellings,
14761     /*ArgNames=*/PreferredTypeArgNames) {}
14762 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14763   if (!isBitField(D)) {
14764     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
14765       << Attr << Attr.isRegularKeywordAttribute() << "bit-field data members";
14766     return false;
14767   }
14768   return true;
14769 }
14770 
14771 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14772   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14773     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14774   return false;
14775 }
14776 
14777 bool isParamExpr(size_t N) const override {
14778   return false;
14779 }
14780 
14781 static const ParsedAttrInfoPreferredType Instance;
14782 };
14783 const ParsedAttrInfoPreferredType ParsedAttrInfoPreferredType::Instance;
14784 static constexpr ParsedAttrInfo::Spelling PreserveAllSpellings[] = {
14785   {AttributeCommonInfo::AS_GNU, "preserve_all"},
14786   {AttributeCommonInfo::AS_CXX11, "clang::preserve_all"},
14787   {AttributeCommonInfo::AS_C23, "clang::preserve_all"},
14788 };
14789 struct ParsedAttrInfoPreserveAll final : public ParsedAttrInfo {
14790   constexpr ParsedAttrInfoPreserveAll() : ParsedAttrInfo(
14791     /*AttrKind=*/ParsedAttr::AT_PreserveAll,
14792     /*NumArgs=*/0,
14793     /*OptArgs=*/0,
14794     /*NumArgMembers=*/0,
14795     /*HasCustomParsing=*/0,
14796     /*AcceptsExprPack=*/0,
14797     /*IsTargetSpecific=*/0,
14798     /*IsType=*/1,
14799     /*IsStmt=*/0,
14800     /*IsKnownToGCC=*/0,
14801     /*IsSupportedByPragmaAttribute=*/0,
14802     /*Spellings=*/PreserveAllSpellings,
14803     /*ArgNames=*/{}) {}
14804 bool isParamExpr(size_t N) const override {
14805   return false;
14806 }
14807 
14808 static const ParsedAttrInfoPreserveAll Instance;
14809 };
14810 const ParsedAttrInfoPreserveAll ParsedAttrInfoPreserveAll::Instance;
14811 static constexpr ParsedAttrInfo::Spelling PreserveMostSpellings[] = {
14812   {AttributeCommonInfo::AS_GNU, "preserve_most"},
14813   {AttributeCommonInfo::AS_CXX11, "clang::preserve_most"},
14814   {AttributeCommonInfo::AS_C23, "clang::preserve_most"},
14815 };
14816 struct ParsedAttrInfoPreserveMost final : public ParsedAttrInfo {
14817   constexpr ParsedAttrInfoPreserveMost() : ParsedAttrInfo(
14818     /*AttrKind=*/ParsedAttr::AT_PreserveMost,
14819     /*NumArgs=*/0,
14820     /*OptArgs=*/0,
14821     /*NumArgMembers=*/0,
14822     /*HasCustomParsing=*/0,
14823     /*AcceptsExprPack=*/0,
14824     /*IsTargetSpecific=*/0,
14825     /*IsType=*/1,
14826     /*IsStmt=*/0,
14827     /*IsKnownToGCC=*/0,
14828     /*IsSupportedByPragmaAttribute=*/0,
14829     /*Spellings=*/PreserveMostSpellings,
14830     /*ArgNames=*/{}) {}
14831 bool isParamExpr(size_t N) const override {
14832   return false;
14833 }
14834 
14835 static const ParsedAttrInfoPreserveMost Instance;
14836 };
14837 const ParsedAttrInfoPreserveMost ParsedAttrInfoPreserveMost::Instance;
14838 static constexpr ParsedAttrInfo::Spelling PreserveNoneSpellings[] = {
14839   {AttributeCommonInfo::AS_GNU, "preserve_none"},
14840   {AttributeCommonInfo::AS_CXX11, "clang::preserve_none"},
14841   {AttributeCommonInfo::AS_C23, "clang::preserve_none"},
14842 };
14843 struct ParsedAttrInfoPreserveNone final : public ParsedAttrInfo {
14844   constexpr ParsedAttrInfoPreserveNone() : ParsedAttrInfo(
14845     /*AttrKind=*/ParsedAttr::AT_PreserveNone,
14846     /*NumArgs=*/0,
14847     /*OptArgs=*/0,
14848     /*NumArgMembers=*/0,
14849     /*HasCustomParsing=*/0,
14850     /*AcceptsExprPack=*/0,
14851     /*IsTargetSpecific=*/1,
14852     /*IsType=*/1,
14853     /*IsStmt=*/0,
14854     /*IsKnownToGCC=*/0,
14855     /*IsSupportedByPragmaAttribute=*/1,
14856     /*Spellings=*/PreserveNoneSpellings,
14857     /*ArgNames=*/{}) {}
14858 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14859   if (!isFunctionLike(D)) {
14860     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14861       << Attr << Attr.isRegularKeywordAttribute() << "functions and function pointers";
14862     return false;
14863   }
14864   return true;
14865 }
14866 
14867 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14868   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14869     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14870   return false;
14871 }
14872 
14873 bool existsInTarget(const TargetInfo &Target) const override {
14874   const llvm::Triple &T = Target.getTriple(); (void)T;
14875   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32 || T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64);
14876 }
14877 
14878 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
14879   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
14880 }
14881 
14882 bool isParamExpr(size_t N) const override {
14883   return false;
14884 }
14885 
14886 static const ParsedAttrInfoPreserveNone Instance;
14887 };
14888 const ParsedAttrInfoPreserveNone ParsedAttrInfoPreserveNone::Instance;
14889 static constexpr ParsedAttrInfo::Spelling PtGuardedBySpellings[] = {
14890   {AttributeCommonInfo::AS_GNU, "pt_guarded_by"},
14891 };
14892 static constexpr const char *PtGuardedByArgNames[] = {
14893 "Arg",};
14894 struct ParsedAttrInfoPtGuardedBy final : public ParsedAttrInfo {
14895   constexpr ParsedAttrInfoPtGuardedBy() : ParsedAttrInfo(
14896     /*AttrKind=*/ParsedAttr::AT_PtGuardedBy,
14897     /*NumArgs=*/1,
14898     /*OptArgs=*/0,
14899     /*NumArgMembers=*/1,
14900     /*HasCustomParsing=*/0,
14901     /*AcceptsExprPack=*/0,
14902     /*IsTargetSpecific=*/0,
14903     /*IsType=*/0,
14904     /*IsStmt=*/0,
14905     /*IsKnownToGCC=*/0,
14906     /*IsSupportedByPragmaAttribute=*/0,
14907     /*Spellings=*/PtGuardedBySpellings,
14908     /*ArgNames=*/PtGuardedByArgNames) {}
14909 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14910   if (!isa<FieldDecl>(D) && !isSharedVar(D)) {
14911     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14912       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members and global variables";
14913     return false;
14914   }
14915   return true;
14916 }
14917 
14918 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14919   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14920     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14921   return false;
14922 }
14923 
14924 bool isParamExpr(size_t N) const override {
14925   return (N == 0) || false;
14926 }
14927 
14928 static const ParsedAttrInfoPtGuardedBy Instance;
14929 };
14930 const ParsedAttrInfoPtGuardedBy ParsedAttrInfoPtGuardedBy::Instance;
14931 static constexpr ParsedAttrInfo::Spelling PtGuardedVarSpellings[] = {
14932   {AttributeCommonInfo::AS_GNU, "pt_guarded_var"},
14933   {AttributeCommonInfo::AS_CXX11, "clang::pt_guarded_var"},
14934 };
14935 struct ParsedAttrInfoPtGuardedVar final : public ParsedAttrInfo {
14936   constexpr ParsedAttrInfoPtGuardedVar() : ParsedAttrInfo(
14937     /*AttrKind=*/ParsedAttr::AT_PtGuardedVar,
14938     /*NumArgs=*/0,
14939     /*OptArgs=*/0,
14940     /*NumArgMembers=*/0,
14941     /*HasCustomParsing=*/0,
14942     /*AcceptsExprPack=*/0,
14943     /*IsTargetSpecific=*/0,
14944     /*IsType=*/0,
14945     /*IsStmt=*/0,
14946     /*IsKnownToGCC=*/0,
14947     /*IsSupportedByPragmaAttribute=*/0,
14948     /*Spellings=*/PtGuardedVarSpellings,
14949     /*ArgNames=*/{}) {}
14950 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
14951   if (!isa<FieldDecl>(D) && !isSharedVar(D)) {
14952     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
14953       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members and global variables";
14954     return false;
14955   }
14956   return true;
14957 }
14958 
14959 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
14960   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
14961     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
14962   return false;
14963 }
14964 
14965 bool isParamExpr(size_t N) const override {
14966   return false;
14967 }
14968 
14969 static const ParsedAttrInfoPtGuardedVar Instance;
14970 };
14971 const ParsedAttrInfoPtGuardedVar ParsedAttrInfoPtGuardedVar::Instance;
14972 static constexpr ParsedAttrInfo::Spelling Ptr32Spellings[] = {
14973   {AttributeCommonInfo::AS_Keyword, "__ptr32"},
14974 };
14975 struct ParsedAttrInfoPtr32 final : public ParsedAttrInfo {
14976   constexpr ParsedAttrInfoPtr32() : ParsedAttrInfo(
14977     /*AttrKind=*/ParsedAttr::AT_Ptr32,
14978     /*NumArgs=*/0,
14979     /*OptArgs=*/0,
14980     /*NumArgMembers=*/0,
14981     /*HasCustomParsing=*/0,
14982     /*AcceptsExprPack=*/0,
14983     /*IsTargetSpecific=*/0,
14984     /*IsType=*/1,
14985     /*IsStmt=*/0,
14986     /*IsKnownToGCC=*/0,
14987     /*IsSupportedByPragmaAttribute=*/0,
14988     /*Spellings=*/Ptr32Spellings,
14989     /*ArgNames=*/{}) {}
14990 bool isParamExpr(size_t N) const override {
14991   return false;
14992 }
14993 
14994 static const ParsedAttrInfoPtr32 Instance;
14995 };
14996 const ParsedAttrInfoPtr32 ParsedAttrInfoPtr32::Instance;
14997 static constexpr ParsedAttrInfo::Spelling Ptr64Spellings[] = {
14998   {AttributeCommonInfo::AS_Keyword, "__ptr64"},
14999 };
15000 struct ParsedAttrInfoPtr64 final : public ParsedAttrInfo {
15001   constexpr ParsedAttrInfoPtr64() : ParsedAttrInfo(
15002     /*AttrKind=*/ParsedAttr::AT_Ptr64,
15003     /*NumArgs=*/0,
15004     /*OptArgs=*/0,
15005     /*NumArgMembers=*/0,
15006     /*HasCustomParsing=*/0,
15007     /*AcceptsExprPack=*/0,
15008     /*IsTargetSpecific=*/0,
15009     /*IsType=*/1,
15010     /*IsStmt=*/0,
15011     /*IsKnownToGCC=*/0,
15012     /*IsSupportedByPragmaAttribute=*/0,
15013     /*Spellings=*/Ptr64Spellings,
15014     /*ArgNames=*/{}) {}
15015 bool isParamExpr(size_t N) const override {
15016   return false;
15017 }
15018 
15019 static const ParsedAttrInfoPtr64 Instance;
15020 };
15021 const ParsedAttrInfoPtr64 ParsedAttrInfoPtr64::Instance;
15022 static constexpr ParsedAttrInfo::Spelling PureSpellings[] = {
15023   {AttributeCommonInfo::AS_GNU, "pure"},
15024   {AttributeCommonInfo::AS_CXX11, "gnu::pure"},
15025   {AttributeCommonInfo::AS_C23, "gnu::pure"},
15026 };
15027 struct ParsedAttrInfoPure final : public ParsedAttrInfo {
15028   constexpr ParsedAttrInfoPure() : ParsedAttrInfo(
15029     /*AttrKind=*/ParsedAttr::AT_Pure,
15030     /*NumArgs=*/0,
15031     /*OptArgs=*/0,
15032     /*NumArgMembers=*/0,
15033     /*HasCustomParsing=*/0,
15034     /*AcceptsExprPack=*/0,
15035     /*IsTargetSpecific=*/0,
15036     /*IsType=*/0,
15037     /*IsStmt=*/0,
15038     /*IsKnownToGCC=*/1,
15039     /*IsSupportedByPragmaAttribute=*/0,
15040     /*Spellings=*/PureSpellings,
15041     /*ArgNames=*/{}) {}
15042 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
15043   D->addAttr(::new (S.Context) PureAttr(S.Context, Attr));
15044   return AttributeApplied;
15045 }
15046 
15047 bool isParamExpr(size_t N) const override {
15048   return false;
15049 }
15050 
15051 static const ParsedAttrInfoPure Instance;
15052 };
15053 const ParsedAttrInfoPure ParsedAttrInfoPure::Instance;
15054 static constexpr ParsedAttrInfo::Spelling RISCVRVVVectorBitsSpellings[] = {
15055   {AttributeCommonInfo::AS_GNU, "riscv_rvv_vector_bits"},
15056 };
15057 static constexpr const char *RISCVRVVVectorBitsArgNames[] = {
15058 "NumBits",};
15059 struct ParsedAttrInfoRISCVRVVVectorBits final : public ParsedAttrInfo {
15060   constexpr ParsedAttrInfoRISCVRVVVectorBits() : ParsedAttrInfo(
15061     /*AttrKind=*/ParsedAttr::AT_RISCVRVVVectorBits,
15062     /*NumArgs=*/1,
15063     /*OptArgs=*/0,
15064     /*NumArgMembers=*/1,
15065     /*HasCustomParsing=*/0,
15066     /*AcceptsExprPack=*/0,
15067     /*IsTargetSpecific=*/0,
15068     /*IsType=*/1,
15069     /*IsStmt=*/0,
15070     /*IsKnownToGCC=*/0,
15071     /*IsSupportedByPragmaAttribute=*/0,
15072     /*Spellings=*/RISCVRVVVectorBitsSpellings,
15073     /*ArgNames=*/RISCVRVVVectorBitsArgNames) {}
15074 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15075   if (!isa<TypedefNameDecl>(D)) {
15076     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
15077       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
15078     return false;
15079   }
15080   return true;
15081 }
15082 
15083 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15084   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15085     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15086   return false;
15087 }
15088 
15089 bool isParamExpr(size_t N) const override {
15090   return false;
15091 }
15092 
15093 static const ParsedAttrInfoRISCVRVVVectorBits Instance;
15094 };
15095 const ParsedAttrInfoRISCVRVVVectorBits ParsedAttrInfoRISCVRVVVectorBits::Instance;
15096 static constexpr ParsedAttrInfo::Spelling RISCVVectorCCSpellings[] = {
15097   {AttributeCommonInfo::AS_CXX11, "riscv::vector_cc"},
15098   {AttributeCommonInfo::AS_C23, "riscv::vector_cc"},
15099   {AttributeCommonInfo::AS_GNU, "riscv_vector_cc"},
15100   {AttributeCommonInfo::AS_CXX11, "clang::riscv_vector_cc"},
15101   {AttributeCommonInfo::AS_C23, "clang::riscv_vector_cc"},
15102 };
15103 struct ParsedAttrInfoRISCVVectorCC final : public ParsedAttrInfo {
15104   constexpr ParsedAttrInfoRISCVVectorCC() : ParsedAttrInfo(
15105     /*AttrKind=*/ParsedAttr::AT_RISCVVectorCC,
15106     /*NumArgs=*/0,
15107     /*OptArgs=*/0,
15108     /*NumArgMembers=*/0,
15109     /*HasCustomParsing=*/0,
15110     /*AcceptsExprPack=*/0,
15111     /*IsTargetSpecific=*/1,
15112     /*IsType=*/1,
15113     /*IsStmt=*/0,
15114     /*IsKnownToGCC=*/0,
15115     /*IsSupportedByPragmaAttribute=*/0,
15116     /*Spellings=*/RISCVVectorCCSpellings,
15117     /*ArgNames=*/{}) {}
15118 bool existsInTarget(const TargetInfo &Target) const override {
15119   const llvm::Triple &T = Target.getTriple(); (void)T;
15120   return true && (T.getArch() == llvm::Triple::riscv32 || T.getArch() == llvm::Triple::riscv64);
15121 }
15122 
15123 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
15124   enum Spelling {
15125     CXX11_riscv_vector_cc = 0,
15126     C23_riscv_vector_cc = 1,
15127     GNU_riscv_vector_cc = 2,
15128     CXX11_clang_riscv_vector_cc = 3,
15129     C23_clang_riscv_vector_cc = 4,
15130   SpellingNotCalculated = 15
15131 
15132   };
15133 
15134   unsigned Idx = Attr.getAttributeSpellingListIndex();
15135   switch (Idx) {
15136     default: llvm_unreachable("Unknown spelling list index");
15137     case 0: return CXX11_riscv_vector_cc;
15138     case 1: return C23_riscv_vector_cc;
15139     case 2: return GNU_riscv_vector_cc;
15140     case 3: return CXX11_clang_riscv_vector_cc;
15141     case 4: return C23_clang_riscv_vector_cc;
15142   }
15143 }
15144 
15145 bool isParamExpr(size_t N) const override {
15146   return false;
15147 }
15148 
15149 static const ParsedAttrInfoRISCVVectorCC Instance;
15150 };
15151 const ParsedAttrInfoRISCVVectorCC ParsedAttrInfoRISCVVectorCC::Instance;
15152 static constexpr ParsedAttrInfo::Spelling RandomizeLayoutSpellings[] = {
15153   {AttributeCommonInfo::AS_GNU, "randomize_layout"},
15154   {AttributeCommonInfo::AS_CXX11, "gnu::randomize_layout"},
15155   {AttributeCommonInfo::AS_C23, "gnu::randomize_layout"},
15156 };
15157 struct ParsedAttrInfoRandomizeLayout final : public ParsedAttrInfo {
15158   constexpr ParsedAttrInfoRandomizeLayout() : ParsedAttrInfo(
15159     /*AttrKind=*/ParsedAttr::AT_RandomizeLayout,
15160     /*NumArgs=*/0,
15161     /*OptArgs=*/0,
15162     /*NumArgMembers=*/0,
15163     /*HasCustomParsing=*/0,
15164     /*AcceptsExprPack=*/0,
15165     /*IsTargetSpecific=*/0,
15166     /*IsType=*/0,
15167     /*IsStmt=*/0,
15168     /*IsKnownToGCC=*/1,
15169     /*IsSupportedByPragmaAttribute=*/1,
15170     /*Spellings=*/RandomizeLayoutSpellings,
15171     /*ArgNames=*/{}) {}
15172 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15173   if (!isa<RecordDecl>(D)) {
15174     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15175       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
15176     return false;
15177   }
15178   return true;
15179 }
15180 
15181 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15182   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15183     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15184   return false;
15185 }
15186 
15187   using ParsedAttrInfo::diagMutualExclusion;
15188 
15189   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
15190     if (const auto *A = D->getAttr<NoRandomizeLayoutAttr>()) {
15191       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
15192       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
15193 return false;
15194     }
15195     return true;
15196   }
15197 
15198 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
15199   return (!LangOpts.CPlusPlus);
15200 }
15201 
15202 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15203   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
15204 }
15205 
15206 bool isParamExpr(size_t N) const override {
15207   return false;
15208 }
15209 
15210 static const ParsedAttrInfoRandomizeLayout Instance;
15211 };
15212 const ParsedAttrInfoRandomizeLayout ParsedAttrInfoRandomizeLayout::Instance;
15213 static constexpr ParsedAttrInfo::Spelling ReadOnlyPlacementSpellings[] = {
15214   {AttributeCommonInfo::AS_GNU, "enforce_read_only_placement"},
15215   {AttributeCommonInfo::AS_CXX11, "clang::enforce_read_only_placement"},
15216   {AttributeCommonInfo::AS_C23, "clang::enforce_read_only_placement"},
15217 };
15218 struct ParsedAttrInfoReadOnlyPlacement final : public ParsedAttrInfo {
15219   constexpr ParsedAttrInfoReadOnlyPlacement() : ParsedAttrInfo(
15220     /*AttrKind=*/ParsedAttr::AT_ReadOnlyPlacement,
15221     /*NumArgs=*/0,
15222     /*OptArgs=*/0,
15223     /*NumArgMembers=*/0,
15224     /*HasCustomParsing=*/0,
15225     /*AcceptsExprPack=*/0,
15226     /*IsTargetSpecific=*/0,
15227     /*IsType=*/0,
15228     /*IsStmt=*/0,
15229     /*IsKnownToGCC=*/0,
15230     /*IsSupportedByPragmaAttribute=*/1,
15231     /*Spellings=*/ReadOnlyPlacementSpellings,
15232     /*ArgNames=*/{}) {}
15233 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15234   if (!isa<RecordDecl>(D)) {
15235     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15236       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
15237     return false;
15238   }
15239   return true;
15240 }
15241 
15242 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15243   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15244     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15245   return false;
15246 }
15247 
15248 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15249   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
15250 }
15251 
15252 bool isParamExpr(size_t N) const override {
15253   return false;
15254 }
15255 
15256 static const ParsedAttrInfoReadOnlyPlacement Instance;
15257 };
15258 const ParsedAttrInfoReadOnlyPlacement ParsedAttrInfoReadOnlyPlacement::Instance;
15259 static constexpr ParsedAttrInfo::Spelling RegCallSpellings[] = {
15260   {AttributeCommonInfo::AS_GNU, "regcall"},
15261   {AttributeCommonInfo::AS_CXX11, "gnu::regcall"},
15262   {AttributeCommonInfo::AS_C23, "gnu::regcall"},
15263   {AttributeCommonInfo::AS_Keyword, "__regcall"},
15264 };
15265 struct ParsedAttrInfoRegCall final : public ParsedAttrInfo {
15266   constexpr ParsedAttrInfoRegCall() : ParsedAttrInfo(
15267     /*AttrKind=*/ParsedAttr::AT_RegCall,
15268     /*NumArgs=*/0,
15269     /*OptArgs=*/0,
15270     /*NumArgMembers=*/0,
15271     /*HasCustomParsing=*/0,
15272     /*AcceptsExprPack=*/0,
15273     /*IsTargetSpecific=*/0,
15274     /*IsType=*/1,
15275     /*IsStmt=*/0,
15276     /*IsKnownToGCC=*/1,
15277     /*IsSupportedByPragmaAttribute=*/0,
15278     /*Spellings=*/RegCallSpellings,
15279     /*ArgNames=*/{}) {}
15280 bool isParamExpr(size_t N) const override {
15281   return false;
15282 }
15283 
15284 static const ParsedAttrInfoRegCall Instance;
15285 };
15286 const ParsedAttrInfoRegCall ParsedAttrInfoRegCall::Instance;
15287 static constexpr ParsedAttrInfo::Spelling RegparmSpellings[] = {
15288   {AttributeCommonInfo::AS_GNU, "regparm"},
15289   {AttributeCommonInfo::AS_CXX11, "gnu::regparm"},
15290   {AttributeCommonInfo::AS_C23, "gnu::regparm"},
15291 };
15292 static constexpr const char *RegparmArgNames[] = {
15293 "NumParams",};
15294 struct ParsedAttrInfoRegparm final : public ParsedAttrInfo {
15295   constexpr ParsedAttrInfoRegparm() : ParsedAttrInfo(
15296     /*AttrKind=*/ParsedAttr::AT_Regparm,
15297     /*NumArgs=*/1,
15298     /*OptArgs=*/0,
15299     /*NumArgMembers=*/1,
15300     /*HasCustomParsing=*/0,
15301     /*AcceptsExprPack=*/0,
15302     /*IsTargetSpecific=*/0,
15303     /*IsType=*/1,
15304     /*IsStmt=*/0,
15305     /*IsKnownToGCC=*/1,
15306     /*IsSupportedByPragmaAttribute=*/0,
15307     /*Spellings=*/RegparmSpellings,
15308     /*ArgNames=*/RegparmArgNames) {}
15309 bool isParamExpr(size_t N) const override {
15310   return false;
15311 }
15312 
15313 static const ParsedAttrInfoRegparm Instance;
15314 };
15315 const ParsedAttrInfoRegparm ParsedAttrInfoRegparm::Instance;
15316 static constexpr ParsedAttrInfo::Spelling ReinitializesSpellings[] = {
15317   {AttributeCommonInfo::AS_GNU, "reinitializes"},
15318   {AttributeCommonInfo::AS_CXX11, "clang::reinitializes"},
15319 };
15320 struct ParsedAttrInfoReinitializes final : public ParsedAttrInfo {
15321   constexpr ParsedAttrInfoReinitializes() : ParsedAttrInfo(
15322     /*AttrKind=*/ParsedAttr::AT_Reinitializes,
15323     /*NumArgs=*/0,
15324     /*OptArgs=*/0,
15325     /*NumArgMembers=*/0,
15326     /*HasCustomParsing=*/0,
15327     /*AcceptsExprPack=*/0,
15328     /*IsTargetSpecific=*/0,
15329     /*IsType=*/0,
15330     /*IsStmt=*/0,
15331     /*IsKnownToGCC=*/0,
15332     /*IsSupportedByPragmaAttribute=*/0,
15333     /*Spellings=*/ReinitializesSpellings,
15334     /*ArgNames=*/{}) {}
15335 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15336   if (!isNonStaticNonConstCXXMethod(D)) {
15337     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
15338       << Attr << Attr.isRegularKeywordAttribute() << "non-static non-const member functions";
15339     return false;
15340   }
15341   return true;
15342 }
15343 
15344 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15345   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15346     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15347   return false;
15348 }
15349 
15350 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
15351   D->addAttr(::new (S.Context) ReinitializesAttr(S.Context, Attr));
15352   return AttributeApplied;
15353 }
15354 
15355 bool isParamExpr(size_t N) const override {
15356   return false;
15357 }
15358 
15359 static const ParsedAttrInfoReinitializes Instance;
15360 };
15361 const ParsedAttrInfoReinitializes ParsedAttrInfoReinitializes::Instance;
15362 static constexpr ParsedAttrInfo::Spelling ReleaseCapabilitySpellings[] = {
15363   {AttributeCommonInfo::AS_GNU, "release_capability"},
15364   {AttributeCommonInfo::AS_CXX11, "clang::release_capability"},
15365   {AttributeCommonInfo::AS_GNU, "release_shared_capability"},
15366   {AttributeCommonInfo::AS_CXX11, "clang::release_shared_capability"},
15367   {AttributeCommonInfo::AS_GNU, "release_generic_capability"},
15368   {AttributeCommonInfo::AS_CXX11, "clang::release_generic_capability"},
15369   {AttributeCommonInfo::AS_GNU, "unlock_function"},
15370   {AttributeCommonInfo::AS_CXX11, "clang::unlock_function"},
15371 };
15372 static constexpr const char *ReleaseCapabilityArgNames[] = {
15373 "Args...",};
15374 struct ParsedAttrInfoReleaseCapability final : public ParsedAttrInfo {
15375   constexpr ParsedAttrInfoReleaseCapability() : ParsedAttrInfo(
15376     /*AttrKind=*/ParsedAttr::AT_ReleaseCapability,
15377     /*NumArgs=*/0,
15378     /*OptArgs=*/15,
15379     /*NumArgMembers=*/1,
15380     /*HasCustomParsing=*/0,
15381     /*AcceptsExprPack=*/0,
15382     /*IsTargetSpecific=*/0,
15383     /*IsType=*/0,
15384     /*IsStmt=*/0,
15385     /*IsKnownToGCC=*/0,
15386     /*IsSupportedByPragmaAttribute=*/0,
15387     /*Spellings=*/ReleaseCapabilitySpellings,
15388     /*ArgNames=*/ReleaseCapabilityArgNames) {}
15389 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15390   if (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D)) {
15391     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15392       << Attr << Attr.isRegularKeywordAttribute() << "functions and parameters";
15393     return false;
15394   }
15395   return true;
15396 }
15397 
15398 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15399   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15400     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15401   return false;
15402 }
15403 
15404 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
15405   enum Spelling {
15406     GNU_release_capability = 0,
15407     CXX11_clang_release_capability = 1,
15408     GNU_release_shared_capability = 2,
15409     CXX11_clang_release_shared_capability = 3,
15410     GNU_release_generic_capability = 4,
15411     CXX11_clang_release_generic_capability = 5,
15412     GNU_unlock_function = 6,
15413     CXX11_clang_unlock_function = 7,
15414   SpellingNotCalculated = 15
15415 
15416   };
15417 
15418   unsigned Idx = Attr.getAttributeSpellingListIndex();
15419   switch (Idx) {
15420     default: llvm_unreachable("Unknown spelling list index");
15421     case 0: return GNU_release_capability;
15422     case 1: return CXX11_clang_release_capability;
15423     case 2: return GNU_release_shared_capability;
15424     case 3: return CXX11_clang_release_shared_capability;
15425     case 4: return GNU_release_generic_capability;
15426     case 5: return CXX11_clang_release_generic_capability;
15427     case 6: return GNU_unlock_function;
15428     case 7: return CXX11_clang_unlock_function;
15429   }
15430 }
15431 
15432 bool isParamExpr(size_t N) const override {
15433   return (N == 0) || false;
15434 }
15435 
15436 static const ParsedAttrInfoReleaseCapability Instance;
15437 };
15438 const ParsedAttrInfoReleaseCapability ParsedAttrInfoReleaseCapability::Instance;
15439 static constexpr ParsedAttrInfo::Spelling ReleaseHandleSpellings[] = {
15440   {AttributeCommonInfo::AS_GNU, "release_handle"},
15441   {AttributeCommonInfo::AS_CXX11, "clang::release_handle"},
15442   {AttributeCommonInfo::AS_C23, "clang::release_handle"},
15443 };
15444 static constexpr const char *ReleaseHandleArgNames[] = {
15445 "HandleType",};
15446 struct ParsedAttrInfoReleaseHandle final : public ParsedAttrInfo {
15447   constexpr ParsedAttrInfoReleaseHandle() : ParsedAttrInfo(
15448     /*AttrKind=*/ParsedAttr::AT_ReleaseHandle,
15449     /*NumArgs=*/1,
15450     /*OptArgs=*/0,
15451     /*NumArgMembers=*/1,
15452     /*HasCustomParsing=*/0,
15453     /*AcceptsExprPack=*/0,
15454     /*IsTargetSpecific=*/0,
15455     /*IsType=*/0,
15456     /*IsStmt=*/0,
15457     /*IsKnownToGCC=*/0,
15458     /*IsSupportedByPragmaAttribute=*/1,
15459     /*Spellings=*/ReleaseHandleSpellings,
15460     /*ArgNames=*/ReleaseHandleArgNames) {}
15461 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15462   if (!isa<ParmVarDecl>(D)) {
15463     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15464       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
15465     return false;
15466   }
15467   return true;
15468 }
15469 
15470 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15471   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15472     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15473   return false;
15474 }
15475 
15476 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15477   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
15478 }
15479 
15480 bool isParamExpr(size_t N) const override {
15481   return false;
15482 }
15483 
15484 static const ParsedAttrInfoReleaseHandle Instance;
15485 };
15486 const ParsedAttrInfoReleaseHandle ParsedAttrInfoReleaseHandle::Instance;
15487 static constexpr ParsedAttrInfo::Spelling ReqdWorkGroupSizeSpellings[] = {
15488   {AttributeCommonInfo::AS_GNU, "reqd_work_group_size"},
15489 };
15490 static constexpr const char *ReqdWorkGroupSizeArgNames[] = {
15491 "XDim","YDim","ZDim",};
15492 struct ParsedAttrInfoReqdWorkGroupSize final : public ParsedAttrInfo {
15493   constexpr ParsedAttrInfoReqdWorkGroupSize() : ParsedAttrInfo(
15494     /*AttrKind=*/ParsedAttr::AT_ReqdWorkGroupSize,
15495     /*NumArgs=*/3,
15496     /*OptArgs=*/0,
15497     /*NumArgMembers=*/3,
15498     /*HasCustomParsing=*/0,
15499     /*AcceptsExprPack=*/0,
15500     /*IsTargetSpecific=*/0,
15501     /*IsType=*/0,
15502     /*IsStmt=*/0,
15503     /*IsKnownToGCC=*/0,
15504     /*IsSupportedByPragmaAttribute=*/1,
15505     /*Spellings=*/ReqdWorkGroupSizeSpellings,
15506     /*ArgNames=*/ReqdWorkGroupSizeArgNames) {}
15507 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15508   if (!isa<FunctionDecl>(D)) {
15509     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
15510       << Attr << Attr.isRegularKeywordAttribute() << "functions";
15511     return false;
15512   }
15513   return true;
15514 }
15515 
15516 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15517   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15518     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15519   return false;
15520 }
15521 
15522 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15523   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
15524 }
15525 
15526 bool isParamExpr(size_t N) const override {
15527   return false;
15528 }
15529 
15530 static const ParsedAttrInfoReqdWorkGroupSize Instance;
15531 };
15532 const ParsedAttrInfoReqdWorkGroupSize ParsedAttrInfoReqdWorkGroupSize::Instance;
15533 static constexpr ParsedAttrInfo::Spelling RequiresCapabilitySpellings[] = {
15534   {AttributeCommonInfo::AS_GNU, "requires_capability"},
15535   {AttributeCommonInfo::AS_CXX11, "clang::requires_capability"},
15536   {AttributeCommonInfo::AS_GNU, "exclusive_locks_required"},
15537   {AttributeCommonInfo::AS_CXX11, "clang::exclusive_locks_required"},
15538   {AttributeCommonInfo::AS_GNU, "requires_shared_capability"},
15539   {AttributeCommonInfo::AS_CXX11, "clang::requires_shared_capability"},
15540   {AttributeCommonInfo::AS_GNU, "shared_locks_required"},
15541   {AttributeCommonInfo::AS_CXX11, "clang::shared_locks_required"},
15542 };
15543 static constexpr const char *RequiresCapabilityArgNames[] = {
15544 "Args...",};
15545 struct ParsedAttrInfoRequiresCapability final : public ParsedAttrInfo {
15546   constexpr ParsedAttrInfoRequiresCapability() : ParsedAttrInfo(
15547     /*AttrKind=*/ParsedAttr::AT_RequiresCapability,
15548     /*NumArgs=*/0,
15549     /*OptArgs=*/15,
15550     /*NumArgMembers=*/1,
15551     /*HasCustomParsing=*/0,
15552     /*AcceptsExprPack=*/0,
15553     /*IsTargetSpecific=*/0,
15554     /*IsType=*/0,
15555     /*IsStmt=*/0,
15556     /*IsKnownToGCC=*/0,
15557     /*IsSupportedByPragmaAttribute=*/0,
15558     /*Spellings=*/RequiresCapabilitySpellings,
15559     /*ArgNames=*/RequiresCapabilityArgNames) {}
15560 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15561   if (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D)) {
15562     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15563       << Attr << Attr.isRegularKeywordAttribute() << "functions and parameters";
15564     return false;
15565   }
15566   return true;
15567 }
15568 
15569 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15570   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15571     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15572   return false;
15573 }
15574 
15575 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
15576   enum Spelling {
15577     GNU_requires_capability = 0,
15578     CXX11_clang_requires_capability = 1,
15579     GNU_exclusive_locks_required = 2,
15580     CXX11_clang_exclusive_locks_required = 3,
15581     GNU_requires_shared_capability = 4,
15582     CXX11_clang_requires_shared_capability = 5,
15583     GNU_shared_locks_required = 6,
15584     CXX11_clang_shared_locks_required = 7,
15585   SpellingNotCalculated = 15
15586 
15587   };
15588 
15589   unsigned Idx = Attr.getAttributeSpellingListIndex();
15590   switch (Idx) {
15591     default: llvm_unreachable("Unknown spelling list index");
15592     case 0: return GNU_requires_capability;
15593     case 1: return CXX11_clang_requires_capability;
15594     case 2: return GNU_exclusive_locks_required;
15595     case 3: return CXX11_clang_exclusive_locks_required;
15596     case 4: return GNU_requires_shared_capability;
15597     case 5: return CXX11_clang_requires_shared_capability;
15598     case 6: return GNU_shared_locks_required;
15599     case 7: return CXX11_clang_shared_locks_required;
15600   }
15601 }
15602 
15603 bool isParamExpr(size_t N) const override {
15604   return (N == 0) || false;
15605 }
15606 
15607 static const ParsedAttrInfoRequiresCapability Instance;
15608 };
15609 const ParsedAttrInfoRequiresCapability ParsedAttrInfoRequiresCapability::Instance;
15610 static constexpr ParsedAttrInfo::Spelling RestrictSpellings[] = {
15611   {AttributeCommonInfo::AS_Declspec, "restrict"},
15612   {AttributeCommonInfo::AS_GNU, "malloc"},
15613   {AttributeCommonInfo::AS_CXX11, "gnu::malloc"},
15614   {AttributeCommonInfo::AS_C23, "gnu::malloc"},
15615 };
15616 struct ParsedAttrInfoRestrict final : public ParsedAttrInfo {
15617   constexpr ParsedAttrInfoRestrict() : ParsedAttrInfo(
15618     /*AttrKind=*/ParsedAttr::AT_Restrict,
15619     /*NumArgs=*/0,
15620     /*OptArgs=*/0,
15621     /*NumArgMembers=*/0,
15622     /*HasCustomParsing=*/0,
15623     /*AcceptsExprPack=*/0,
15624     /*IsTargetSpecific=*/0,
15625     /*IsType=*/0,
15626     /*IsStmt=*/0,
15627     /*IsKnownToGCC=*/1,
15628     /*IsSupportedByPragmaAttribute=*/1,
15629     /*Spellings=*/RestrictSpellings,
15630     /*ArgNames=*/{}) {}
15631 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15632   if (!isa<FunctionDecl>(D)) {
15633     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15634       << Attr << Attr.isRegularKeywordAttribute() << "functions";
15635     return false;
15636   }
15637   return true;
15638 }
15639 
15640 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15641   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15642     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15643   return false;
15644 }
15645 
15646 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
15647   enum Spelling {
15648     Declspec_restrict = 0,
15649     GNU_malloc = 1,
15650     CXX11_gnu_malloc = 2,
15651     C23_gnu_malloc = 3,
15652   SpellingNotCalculated = 15
15653 
15654   };
15655 
15656   unsigned Idx = Attr.getAttributeSpellingListIndex();
15657   switch (Idx) {
15658     default: llvm_unreachable("Unknown spelling list index");
15659     case 0: return Declspec_restrict;
15660     case 1: return GNU_malloc;
15661     case 2: return CXX11_gnu_malloc;
15662     case 3: return C23_gnu_malloc;
15663   }
15664 }
15665 
15666 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15667   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
15668 }
15669 
15670 bool isParamExpr(size_t N) const override {
15671   return false;
15672 }
15673 
15674 static const ParsedAttrInfoRestrict Instance;
15675 };
15676 const ParsedAttrInfoRestrict ParsedAttrInfoRestrict::Instance;
15677 static constexpr ParsedAttrInfo::Spelling RetainSpellings[] = {
15678   {AttributeCommonInfo::AS_GNU, "retain"},
15679   {AttributeCommonInfo::AS_CXX11, "gnu::retain"},
15680   {AttributeCommonInfo::AS_C23, "gnu::retain"},
15681 };
15682 struct ParsedAttrInfoRetain final : public ParsedAttrInfo {
15683   constexpr ParsedAttrInfoRetain() : ParsedAttrInfo(
15684     /*AttrKind=*/ParsedAttr::AT_Retain,
15685     /*NumArgs=*/0,
15686     /*OptArgs=*/0,
15687     /*NumArgMembers=*/0,
15688     /*HasCustomParsing=*/0,
15689     /*AcceptsExprPack=*/0,
15690     /*IsTargetSpecific=*/0,
15691     /*IsType=*/0,
15692     /*IsStmt=*/0,
15693     /*IsKnownToGCC=*/1,
15694     /*IsSupportedByPragmaAttribute=*/0,
15695     /*Spellings=*/RetainSpellings,
15696     /*ArgNames=*/{}) {}
15697 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15698   if (!isNonLocalVar(D) && !isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
15699     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15700       << Attr << Attr.isRegularKeywordAttribute() << "variables with non-local storage, functions, and Objective-C methods";
15701     return false;
15702   }
15703   return true;
15704 }
15705 
15706 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15707   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15708     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15709   return false;
15710 }
15711 
15712 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
15713   D->addAttr(::new (S.Context) RetainAttr(S.Context, Attr));
15714   return AttributeApplied;
15715 }
15716 
15717 bool isParamExpr(size_t N) const override {
15718   return false;
15719 }
15720 
15721 static const ParsedAttrInfoRetain Instance;
15722 };
15723 const ParsedAttrInfoRetain ParsedAttrInfoRetain::Instance;
15724 static constexpr ParsedAttrInfo::Spelling ReturnTypestateSpellings[] = {
15725   {AttributeCommonInfo::AS_GNU, "return_typestate"},
15726   {AttributeCommonInfo::AS_CXX11, "clang::return_typestate"},
15727 };
15728 static constexpr const char *ReturnTypestateArgNames[] = {
15729 "State",};
15730 struct ParsedAttrInfoReturnTypestate final : public ParsedAttrInfo {
15731   constexpr ParsedAttrInfoReturnTypestate() : ParsedAttrInfo(
15732     /*AttrKind=*/ParsedAttr::AT_ReturnTypestate,
15733     /*NumArgs=*/1,
15734     /*OptArgs=*/0,
15735     /*NumArgMembers=*/1,
15736     /*HasCustomParsing=*/0,
15737     /*AcceptsExprPack=*/0,
15738     /*IsTargetSpecific=*/0,
15739     /*IsType=*/0,
15740     /*IsStmt=*/0,
15741     /*IsKnownToGCC=*/0,
15742     /*IsSupportedByPragmaAttribute=*/1,
15743     /*Spellings=*/ReturnTypestateSpellings,
15744     /*ArgNames=*/ReturnTypestateArgNames) {}
15745 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15746   if (!isa<FunctionDecl>(D) && !isa<ParmVarDecl>(D)) {
15747     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15748       << Attr << Attr.isRegularKeywordAttribute() << "functions and parameters";
15749     return false;
15750   }
15751   return true;
15752 }
15753 
15754 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15755   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15756     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15757   return false;
15758 }
15759 
15760 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15761   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
15762   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
15763 }
15764 
15765 bool isParamExpr(size_t N) const override {
15766   return false;
15767 }
15768 
15769 static const ParsedAttrInfoReturnTypestate Instance;
15770 };
15771 const ParsedAttrInfoReturnTypestate ParsedAttrInfoReturnTypestate::Instance;
15772 static constexpr ParsedAttrInfo::Spelling ReturnsNonNullSpellings[] = {
15773   {AttributeCommonInfo::AS_GNU, "returns_nonnull"},
15774   {AttributeCommonInfo::AS_CXX11, "gnu::returns_nonnull"},
15775   {AttributeCommonInfo::AS_C23, "gnu::returns_nonnull"},
15776 };
15777 struct ParsedAttrInfoReturnsNonNull final : public ParsedAttrInfo {
15778   constexpr ParsedAttrInfoReturnsNonNull() : ParsedAttrInfo(
15779     /*AttrKind=*/ParsedAttr::AT_ReturnsNonNull,
15780     /*NumArgs=*/0,
15781     /*OptArgs=*/0,
15782     /*NumArgMembers=*/0,
15783     /*HasCustomParsing=*/0,
15784     /*AcceptsExprPack=*/0,
15785     /*IsTargetSpecific=*/0,
15786     /*IsType=*/0,
15787     /*IsStmt=*/0,
15788     /*IsKnownToGCC=*/1,
15789     /*IsSupportedByPragmaAttribute=*/1,
15790     /*Spellings=*/ReturnsNonNullSpellings,
15791     /*ArgNames=*/{}) {}
15792 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15793   if (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) {
15794     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15795       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods and functions";
15796     return false;
15797   }
15798   return true;
15799 }
15800 
15801 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15802   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15803     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15804   return false;
15805 }
15806 
15807 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15808   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
15809   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
15810 }
15811 
15812 bool isParamExpr(size_t N) const override {
15813   return false;
15814 }
15815 
15816 static const ParsedAttrInfoReturnsNonNull Instance;
15817 };
15818 const ParsedAttrInfoReturnsNonNull ParsedAttrInfoReturnsNonNull::Instance;
15819 static constexpr ParsedAttrInfo::Spelling ReturnsTwiceSpellings[] = {
15820   {AttributeCommonInfo::AS_GNU, "returns_twice"},
15821   {AttributeCommonInfo::AS_CXX11, "gnu::returns_twice"},
15822   {AttributeCommonInfo::AS_C23, "gnu::returns_twice"},
15823 };
15824 struct ParsedAttrInfoReturnsTwice final : public ParsedAttrInfo {
15825   constexpr ParsedAttrInfoReturnsTwice() : ParsedAttrInfo(
15826     /*AttrKind=*/ParsedAttr::AT_ReturnsTwice,
15827     /*NumArgs=*/0,
15828     /*OptArgs=*/0,
15829     /*NumArgMembers=*/0,
15830     /*HasCustomParsing=*/0,
15831     /*AcceptsExprPack=*/0,
15832     /*IsTargetSpecific=*/0,
15833     /*IsType=*/0,
15834     /*IsStmt=*/0,
15835     /*IsKnownToGCC=*/1,
15836     /*IsSupportedByPragmaAttribute=*/1,
15837     /*Spellings=*/ReturnsTwiceSpellings,
15838     /*ArgNames=*/{}) {}
15839 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15840   if (!isa<FunctionDecl>(D)) {
15841     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15842       << Attr << Attr.isRegularKeywordAttribute() << "functions";
15843     return false;
15844   }
15845   return true;
15846 }
15847 
15848 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15849   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15850     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15851   return false;
15852 }
15853 
15854 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15855   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
15856 }
15857 
15858 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
15859   D->addAttr(::new (S.Context) ReturnsTwiceAttr(S.Context, Attr));
15860   return AttributeApplied;
15861 }
15862 
15863 bool isParamExpr(size_t N) const override {
15864   return false;
15865 }
15866 
15867 static const ParsedAttrInfoReturnsTwice Instance;
15868 };
15869 const ParsedAttrInfoReturnsTwice ParsedAttrInfoReturnsTwice::Instance;
15870 static constexpr ParsedAttrInfo::Spelling SPtrSpellings[] = {
15871   {AttributeCommonInfo::AS_Keyword, "__sptr"},
15872 };
15873 struct ParsedAttrInfoSPtr final : public ParsedAttrInfo {
15874   constexpr ParsedAttrInfoSPtr() : ParsedAttrInfo(
15875     /*AttrKind=*/ParsedAttr::AT_SPtr,
15876     /*NumArgs=*/0,
15877     /*OptArgs=*/0,
15878     /*NumArgMembers=*/0,
15879     /*HasCustomParsing=*/0,
15880     /*AcceptsExprPack=*/0,
15881     /*IsTargetSpecific=*/0,
15882     /*IsType=*/1,
15883     /*IsStmt=*/0,
15884     /*IsKnownToGCC=*/0,
15885     /*IsSupportedByPragmaAttribute=*/0,
15886     /*Spellings=*/SPtrSpellings,
15887     /*ArgNames=*/{}) {}
15888 bool isParamExpr(size_t N) const override {
15889   return false;
15890 }
15891 
15892 static const ParsedAttrInfoSPtr Instance;
15893 };
15894 const ParsedAttrInfoSPtr ParsedAttrInfoSPtr::Instance;
15895 static constexpr ParsedAttrInfo::Spelling SYCLKernelSpellings[] = {
15896   {AttributeCommonInfo::AS_GNU, "sycl_kernel"},
15897   {AttributeCommonInfo::AS_CXX11, "clang::sycl_kernel"},
15898   {AttributeCommonInfo::AS_C23, "clang::sycl_kernel"},
15899 };
15900 struct ParsedAttrInfoSYCLKernel final : public ParsedAttrInfo {
15901   constexpr ParsedAttrInfoSYCLKernel() : ParsedAttrInfo(
15902     /*AttrKind=*/ParsedAttr::AT_SYCLKernel,
15903     /*NumArgs=*/0,
15904     /*OptArgs=*/0,
15905     /*NumArgMembers=*/0,
15906     /*HasCustomParsing=*/0,
15907     /*AcceptsExprPack=*/0,
15908     /*IsTargetSpecific=*/0,
15909     /*IsType=*/0,
15910     /*IsStmt=*/0,
15911     /*IsKnownToGCC=*/0,
15912     /*IsSupportedByPragmaAttribute=*/0,
15913     /*Spellings=*/SYCLKernelSpellings,
15914     /*ArgNames=*/{}) {}
15915 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15916   if (!isFunctionTmpl(D)) {
15917     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
15918       << Attr << Attr.isRegularKeywordAttribute() << "function templates";
15919     return false;
15920   }
15921   return true;
15922 }
15923 
15924 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15925   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15926     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15927   return false;
15928 }
15929 
15930 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
15931   return LangOpts.SYCLIsDevice;
15932 }
15933 
15934 bool isParamExpr(size_t N) const override {
15935   return false;
15936 }
15937 
15938 static const ParsedAttrInfoSYCLKernel Instance;
15939 };
15940 const ParsedAttrInfoSYCLKernel ParsedAttrInfoSYCLKernel::Instance;
15941 static constexpr ParsedAttrInfo::Spelling SYCLKernelEntryPointSpellings[] = {
15942   {AttributeCommonInfo::AS_GNU, "sycl_kernel_entry_point"},
15943   {AttributeCommonInfo::AS_CXX11, "clang::sycl_kernel_entry_point"},
15944   {AttributeCommonInfo::AS_C23, "clang::sycl_kernel_entry_point"},
15945 };
15946 static constexpr const char *SYCLKernelEntryPointArgNames[] = {
15947 "KernelName",};
15948 struct ParsedAttrInfoSYCLKernelEntryPoint final : public ParsedAttrInfo {
15949   constexpr ParsedAttrInfoSYCLKernelEntryPoint() : ParsedAttrInfo(
15950     /*AttrKind=*/ParsedAttr::AT_SYCLKernelEntryPoint,
15951     /*NumArgs=*/1,
15952     /*OptArgs=*/0,
15953     /*NumArgMembers=*/1,
15954     /*HasCustomParsing=*/0,
15955     /*AcceptsExprPack=*/0,
15956     /*IsTargetSpecific=*/0,
15957     /*IsType=*/0,
15958     /*IsStmt=*/0,
15959     /*IsKnownToGCC=*/0,
15960     /*IsSupportedByPragmaAttribute=*/1,
15961     /*Spellings=*/SYCLKernelEntryPointSpellings,
15962     /*ArgNames=*/SYCLKernelEntryPointArgNames) {}
15963 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
15964   if (!isa<FunctionDecl>(D)) {
15965     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
15966       << Attr << Attr.isRegularKeywordAttribute() << "functions";
15967     return false;
15968   }
15969   return true;
15970 }
15971 
15972 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
15973   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
15974     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
15975   return false;
15976 }
15977 
15978 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
15979   return LangOpts.SYCLIsHost || LangOpts.SYCLIsDevice;
15980 }
15981 
15982 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
15983   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
15984 }
15985 
15986 bool isParamExpr(size_t N) const override {
15987   return false;
15988 }
15989 
15990 static const ParsedAttrInfoSYCLKernelEntryPoint Instance;
15991 };
15992 const ParsedAttrInfoSYCLKernelEntryPoint ParsedAttrInfoSYCLKernelEntryPoint::Instance;
15993 static constexpr ParsedAttrInfo::Spelling SYCLSpecialClassSpellings[] = {
15994   {AttributeCommonInfo::AS_GNU, "sycl_special_class"},
15995   {AttributeCommonInfo::AS_CXX11, "clang::sycl_special_class"},
15996   {AttributeCommonInfo::AS_C23, "clang::sycl_special_class"},
15997 };
15998 struct ParsedAttrInfoSYCLSpecialClass final : public ParsedAttrInfo {
15999   constexpr ParsedAttrInfoSYCLSpecialClass() : ParsedAttrInfo(
16000     /*AttrKind=*/ParsedAttr::AT_SYCLSpecialClass,
16001     /*NumArgs=*/0,
16002     /*OptArgs=*/0,
16003     /*NumArgMembers=*/0,
16004     /*HasCustomParsing=*/0,
16005     /*AcceptsExprPack=*/0,
16006     /*IsTargetSpecific=*/0,
16007     /*IsType=*/0,
16008     /*IsStmt=*/0,
16009     /*IsKnownToGCC=*/0,
16010     /*IsSupportedByPragmaAttribute=*/1,
16011     /*Spellings=*/SYCLSpecialClassSpellings,
16012     /*ArgNames=*/{}) {}
16013 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16014   if (!isa<CXXRecordDecl>(D)) {
16015     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16016       << Attr << Attr.isRegularKeywordAttribute() << "classes";
16017     return false;
16018   }
16019   return true;
16020 }
16021 
16022 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16023   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16024     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16025   return false;
16026 }
16027 
16028 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
16029   return LangOpts.SYCLIsDevice;
16030 }
16031 
16032 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16033   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
16034 }
16035 
16036 bool isParamExpr(size_t N) const override {
16037   return false;
16038 }
16039 
16040 static const ParsedAttrInfoSYCLSpecialClass Instance;
16041 };
16042 const ParsedAttrInfoSYCLSpecialClass ParsedAttrInfoSYCLSpecialClass::Instance;
16043 static constexpr ParsedAttrInfo::Spelling ScopedLockableSpellings[] = {
16044   {AttributeCommonInfo::AS_GNU, "scoped_lockable"},
16045   {AttributeCommonInfo::AS_CXX11, "clang::scoped_lockable"},
16046 };
16047 struct ParsedAttrInfoScopedLockable final : public ParsedAttrInfo {
16048   constexpr ParsedAttrInfoScopedLockable() : ParsedAttrInfo(
16049     /*AttrKind=*/ParsedAttr::AT_ScopedLockable,
16050     /*NumArgs=*/0,
16051     /*OptArgs=*/0,
16052     /*NumArgMembers=*/0,
16053     /*HasCustomParsing=*/0,
16054     /*AcceptsExprPack=*/0,
16055     /*IsTargetSpecific=*/0,
16056     /*IsType=*/0,
16057     /*IsStmt=*/0,
16058     /*IsKnownToGCC=*/0,
16059     /*IsSupportedByPragmaAttribute=*/1,
16060     /*Spellings=*/ScopedLockableSpellings,
16061     /*ArgNames=*/{}) {}
16062 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16063   if (!isa<RecordDecl>(D)) {
16064     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16065       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
16066     return false;
16067   }
16068   return true;
16069 }
16070 
16071 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16072   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16073     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16074   return false;
16075 }
16076 
16077 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16078   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
16079 }
16080 
16081 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
16082   D->addAttr(::new (S.Context) ScopedLockableAttr(S.Context, Attr));
16083   return AttributeApplied;
16084 }
16085 
16086 bool isParamExpr(size_t N) const override {
16087   return false;
16088 }
16089 
16090 static const ParsedAttrInfoScopedLockable Instance;
16091 };
16092 const ParsedAttrInfoScopedLockable ParsedAttrInfoScopedLockable::Instance;
16093 static constexpr ParsedAttrInfo::Spelling SectionSpellings[] = {
16094   {AttributeCommonInfo::AS_GNU, "section"},
16095   {AttributeCommonInfo::AS_CXX11, "gnu::section"},
16096   {AttributeCommonInfo::AS_C23, "gnu::section"},
16097   {AttributeCommonInfo::AS_Declspec, "allocate"},
16098 };
16099 static constexpr const char *SectionArgNames[] = {
16100 "Name",};
16101 struct ParsedAttrInfoSection final : public ParsedAttrInfo {
16102   constexpr ParsedAttrInfoSection() : ParsedAttrInfo(
16103     /*AttrKind=*/ParsedAttr::AT_Section,
16104     /*NumArgs=*/1,
16105     /*OptArgs=*/0,
16106     /*NumArgMembers=*/1,
16107     /*HasCustomParsing=*/0,
16108     /*AcceptsExprPack=*/0,
16109     /*IsTargetSpecific=*/0,
16110     /*IsType=*/0,
16111     /*IsStmt=*/0,
16112     /*IsKnownToGCC=*/1,
16113     /*IsSupportedByPragmaAttribute=*/1,
16114     /*Spellings=*/SectionSpellings,
16115     /*ArgNames=*/SectionArgNames) {}
16116 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16117   if (!isa<FunctionDecl>(D) && !isGlobalVar(D) && !isa<ObjCMethodDecl>(D) && !isa<ObjCPropertyDecl>(D)) {
16118     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16119       << Attr << Attr.isRegularKeywordAttribute() << "functions, global variables, Objective-C methods, and Objective-C properties";
16120     return false;
16121   }
16122   return true;
16123 }
16124 
16125 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16126   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16127     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16128   return false;
16129 }
16130 
16131 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
16132   enum Spelling {
16133     GNU_section = 0,
16134     CXX11_gnu_section = 1,
16135     C23_gnu_section = 2,
16136     Declspec_allocate = 3,
16137   SpellingNotCalculated = 15
16138 
16139   };
16140 
16141   unsigned Idx = Attr.getAttributeSpellingListIndex();
16142   switch (Idx) {
16143     default: llvm_unreachable("Unknown spelling list index");
16144     case 0: return GNU_section;
16145     case 1: return CXX11_gnu_section;
16146     case 2: return C23_gnu_section;
16147     case 3: return Declspec_allocate;
16148   }
16149 }
16150 
16151 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16152   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
16153   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_global, /*IsSupported=*/true));
16154   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
16155   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_property, /*IsSupported=*/LangOpts.ObjC));
16156 }
16157 
16158 bool isParamExpr(size_t N) const override {
16159   return false;
16160 }
16161 
16162 static const ParsedAttrInfoSection Instance;
16163 };
16164 const ParsedAttrInfoSection ParsedAttrInfoSection::Instance;
16165 static constexpr ParsedAttrInfo::Spelling SelectAnySpellings[] = {
16166   {AttributeCommonInfo::AS_Declspec, "selectany"},
16167   {AttributeCommonInfo::AS_GNU, "selectany"},
16168   {AttributeCommonInfo::AS_CXX11, "gnu::selectany"},
16169   {AttributeCommonInfo::AS_C23, "gnu::selectany"},
16170 };
16171 struct ParsedAttrInfoSelectAny final : public ParsedAttrInfo {
16172   constexpr ParsedAttrInfoSelectAny() : ParsedAttrInfo(
16173     /*AttrKind=*/ParsedAttr::AT_SelectAny,
16174     /*NumArgs=*/0,
16175     /*OptArgs=*/0,
16176     /*NumArgMembers=*/0,
16177     /*HasCustomParsing=*/0,
16178     /*AcceptsExprPack=*/0,
16179     /*IsTargetSpecific=*/0,
16180     /*IsType=*/0,
16181     /*IsStmt=*/0,
16182     /*IsKnownToGCC=*/1,
16183     /*IsSupportedByPragmaAttribute=*/0,
16184     /*Spellings=*/SelectAnySpellings,
16185     /*ArgNames=*/{}) {}
16186 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
16187   D->addAttr(::new (S.Context) SelectAnyAttr(S.Context, Attr));
16188   return AttributeApplied;
16189 }
16190 
16191 bool isParamExpr(size_t N) const override {
16192   return false;
16193 }
16194 
16195 static const ParsedAttrInfoSelectAny Instance;
16196 };
16197 const ParsedAttrInfoSelectAny ParsedAttrInfoSelectAny::Instance;
16198 static constexpr ParsedAttrInfo::Spelling SentinelSpellings[] = {
16199   {AttributeCommonInfo::AS_GNU, "sentinel"},
16200   {AttributeCommonInfo::AS_CXX11, "gnu::sentinel"},
16201   {AttributeCommonInfo::AS_C23, "gnu::sentinel"},
16202 };
16203 static constexpr const char *SentinelArgNames[] = {
16204 "Sentinel","NullPos",};
16205 struct ParsedAttrInfoSentinel final : public ParsedAttrInfo {
16206   constexpr ParsedAttrInfoSentinel() : ParsedAttrInfo(
16207     /*AttrKind=*/ParsedAttr::AT_Sentinel,
16208     /*NumArgs=*/0,
16209     /*OptArgs=*/2,
16210     /*NumArgMembers=*/2,
16211     /*HasCustomParsing=*/0,
16212     /*AcceptsExprPack=*/0,
16213     /*IsTargetSpecific=*/0,
16214     /*IsType=*/0,
16215     /*IsStmt=*/0,
16216     /*IsKnownToGCC=*/1,
16217     /*IsSupportedByPragmaAttribute=*/0,
16218     /*Spellings=*/SentinelSpellings,
16219     /*ArgNames=*/SentinelArgNames) {}
16220 bool isParamExpr(size_t N) const override {
16221   return false;
16222 }
16223 
16224 static const ParsedAttrInfoSentinel Instance;
16225 };
16226 const ParsedAttrInfoSentinel ParsedAttrInfoSentinel::Instance;
16227 static constexpr ParsedAttrInfo::Spelling SetTypestateSpellings[] = {
16228   {AttributeCommonInfo::AS_GNU, "set_typestate"},
16229   {AttributeCommonInfo::AS_CXX11, "clang::set_typestate"},
16230 };
16231 static constexpr const char *SetTypestateArgNames[] = {
16232 "NewState",};
16233 struct ParsedAttrInfoSetTypestate final : public ParsedAttrInfo {
16234   constexpr ParsedAttrInfoSetTypestate() : ParsedAttrInfo(
16235     /*AttrKind=*/ParsedAttr::AT_SetTypestate,
16236     /*NumArgs=*/1,
16237     /*OptArgs=*/0,
16238     /*NumArgMembers=*/1,
16239     /*HasCustomParsing=*/0,
16240     /*AcceptsExprPack=*/0,
16241     /*IsTargetSpecific=*/0,
16242     /*IsType=*/0,
16243     /*IsStmt=*/0,
16244     /*IsKnownToGCC=*/0,
16245     /*IsSupportedByPragmaAttribute=*/1,
16246     /*Spellings=*/SetTypestateSpellings,
16247     /*ArgNames=*/SetTypestateArgNames) {}
16248 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16249   if (!isa<CXXMethodDecl>(D)) {
16250     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16251       << Attr << Attr.isRegularKeywordAttribute() << "functions";
16252     return false;
16253   }
16254   return true;
16255 }
16256 
16257 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16258   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16259     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16260   return false;
16261 }
16262 
16263 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16264   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus));
16265 }
16266 
16267 bool isParamExpr(size_t N) const override {
16268   return false;
16269 }
16270 
16271 static const ParsedAttrInfoSetTypestate Instance;
16272 };
16273 const ParsedAttrInfoSetTypestate ParsedAttrInfoSetTypestate::Instance;
16274 static constexpr ParsedAttrInfo::Spelling SharedTrylockFunctionSpellings[] = {
16275   {AttributeCommonInfo::AS_GNU, "shared_trylock_function"},
16276 };
16277 static constexpr const char *SharedTrylockFunctionArgNames[] = {
16278 "SuccessValue","Args...",};
16279 struct ParsedAttrInfoSharedTrylockFunction final : public ParsedAttrInfo {
16280   constexpr ParsedAttrInfoSharedTrylockFunction() : ParsedAttrInfo(
16281     /*AttrKind=*/ParsedAttr::AT_SharedTrylockFunction,
16282     /*NumArgs=*/1,
16283     /*OptArgs=*/15,
16284     /*NumArgMembers=*/2,
16285     /*HasCustomParsing=*/0,
16286     /*AcceptsExprPack=*/0,
16287     /*IsTargetSpecific=*/0,
16288     /*IsType=*/0,
16289     /*IsStmt=*/0,
16290     /*IsKnownToGCC=*/0,
16291     /*IsSupportedByPragmaAttribute=*/0,
16292     /*Spellings=*/SharedTrylockFunctionSpellings,
16293     /*ArgNames=*/SharedTrylockFunctionArgNames) {}
16294 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16295   if (!isa<FunctionDecl>(D)) {
16296     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16297       << Attr << Attr.isRegularKeywordAttribute() << "functions";
16298     return false;
16299   }
16300   return true;
16301 }
16302 
16303 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16304   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16305     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16306   return false;
16307 }
16308 
16309 bool isParamExpr(size_t N) const override {
16310   return (N == 0) || (N == 1) || false;
16311 }
16312 
16313 static const ParsedAttrInfoSharedTrylockFunction Instance;
16314 };
16315 const ParsedAttrInfoSharedTrylockFunction ParsedAttrInfoSharedTrylockFunction::Instance;
16316 static constexpr ParsedAttrInfo::Spelling SizedBySpellings[] = {
16317   {AttributeCommonInfo::AS_GNU, "sized_by"},
16318   {AttributeCommonInfo::AS_CXX11, "clang::sized_by"},
16319   {AttributeCommonInfo::AS_C23, "clang::sized_by"},
16320 };
16321 static constexpr const char *SizedByArgNames[] = {
16322 "Size","NestedLevel",};
16323 struct ParsedAttrInfoSizedBy final : public ParsedAttrInfo {
16324   constexpr ParsedAttrInfoSizedBy() : ParsedAttrInfo(
16325     /*AttrKind=*/ParsedAttr::AT_SizedBy,
16326     /*NumArgs=*/1,
16327     /*OptArgs=*/1,
16328     /*NumArgMembers=*/2,
16329     /*HasCustomParsing=*/0,
16330     /*AcceptsExprPack=*/0,
16331     /*IsTargetSpecific=*/0,
16332     /*IsType=*/1,
16333     /*IsStmt=*/0,
16334     /*IsKnownToGCC=*/0,
16335     /*IsSupportedByPragmaAttribute=*/0,
16336     /*Spellings=*/SizedBySpellings,
16337     /*ArgNames=*/SizedByArgNames) {}
16338 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16339   if (!isa<FieldDecl>(D)) {
16340     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16341       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members";
16342     return false;
16343   }
16344   return true;
16345 }
16346 
16347 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16348   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16349     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16350   return false;
16351 }
16352 
16353 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
16354   return (!LangOpts.CPlusPlus);
16355 }
16356 
16357 bool isParamExpr(size_t N) const override {
16358   return (N == 0) || false;
16359 }
16360 
16361 static const ParsedAttrInfoSizedBy Instance;
16362 };
16363 const ParsedAttrInfoSizedBy ParsedAttrInfoSizedBy::Instance;
16364 static constexpr ParsedAttrInfo::Spelling SizedByOrNullSpellings[] = {
16365   {AttributeCommonInfo::AS_GNU, "sized_by_or_null"},
16366   {AttributeCommonInfo::AS_CXX11, "clang::sized_by_or_null"},
16367   {AttributeCommonInfo::AS_C23, "clang::sized_by_or_null"},
16368 };
16369 static constexpr const char *SizedByOrNullArgNames[] = {
16370 "Size","NestedLevel",};
16371 struct ParsedAttrInfoSizedByOrNull final : public ParsedAttrInfo {
16372   constexpr ParsedAttrInfoSizedByOrNull() : ParsedAttrInfo(
16373     /*AttrKind=*/ParsedAttr::AT_SizedByOrNull,
16374     /*NumArgs=*/1,
16375     /*OptArgs=*/1,
16376     /*NumArgMembers=*/2,
16377     /*HasCustomParsing=*/0,
16378     /*AcceptsExprPack=*/0,
16379     /*IsTargetSpecific=*/0,
16380     /*IsType=*/1,
16381     /*IsStmt=*/0,
16382     /*IsKnownToGCC=*/0,
16383     /*IsSupportedByPragmaAttribute=*/0,
16384     /*Spellings=*/SizedByOrNullSpellings,
16385     /*ArgNames=*/SizedByOrNullArgNames) {}
16386 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16387   if (!isa<FieldDecl>(D)) {
16388     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16389       << Attr << Attr.isRegularKeywordAttribute() << "non-static data members";
16390     return false;
16391   }
16392   return true;
16393 }
16394 
16395 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16396   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16397     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16398   return false;
16399 }
16400 
16401 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
16402   return (!LangOpts.CPlusPlus);
16403 }
16404 
16405 bool isParamExpr(size_t N) const override {
16406   return (N == 0) || false;
16407 }
16408 
16409 static const ParsedAttrInfoSizedByOrNull Instance;
16410 };
16411 const ParsedAttrInfoSizedByOrNull ParsedAttrInfoSizedByOrNull::Instance;
16412 static constexpr ParsedAttrInfo::Spelling SpeculativeLoadHardeningSpellings[] = {
16413   {AttributeCommonInfo::AS_GNU, "speculative_load_hardening"},
16414   {AttributeCommonInfo::AS_CXX11, "clang::speculative_load_hardening"},
16415   {AttributeCommonInfo::AS_C23, "clang::speculative_load_hardening"},
16416 };
16417 struct ParsedAttrInfoSpeculativeLoadHardening final : public ParsedAttrInfo {
16418   constexpr ParsedAttrInfoSpeculativeLoadHardening() : ParsedAttrInfo(
16419     /*AttrKind=*/ParsedAttr::AT_SpeculativeLoadHardening,
16420     /*NumArgs=*/0,
16421     /*OptArgs=*/0,
16422     /*NumArgMembers=*/0,
16423     /*HasCustomParsing=*/0,
16424     /*AcceptsExprPack=*/0,
16425     /*IsTargetSpecific=*/0,
16426     /*IsType=*/0,
16427     /*IsStmt=*/0,
16428     /*IsKnownToGCC=*/0,
16429     /*IsSupportedByPragmaAttribute=*/1,
16430     /*Spellings=*/SpeculativeLoadHardeningSpellings,
16431     /*ArgNames=*/{}) {}
16432 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16433   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
16434     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16435       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
16436     return false;
16437   }
16438   return true;
16439 }
16440 
16441 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16442   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16443     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16444   return false;
16445 }
16446 
16447   using ParsedAttrInfo::diagMutualExclusion;
16448 
16449   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
16450     if (const auto *A = D->getAttr<NoSpeculativeLoadHardeningAttr>()) {
16451       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
16452       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
16453 return false;
16454     }
16455     return true;
16456   }
16457 
16458 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16459   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
16460   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
16461 }
16462 
16463 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
16464   D->addAttr(::new (S.Context) SpeculativeLoadHardeningAttr(S.Context, Attr));
16465   return AttributeApplied;
16466 }
16467 
16468 bool isParamExpr(size_t N) const override {
16469   return false;
16470 }
16471 
16472 static const ParsedAttrInfoSpeculativeLoadHardening Instance;
16473 };
16474 const ParsedAttrInfoSpeculativeLoadHardening ParsedAttrInfoSpeculativeLoadHardening::Instance;
16475 static constexpr ParsedAttrInfo::Spelling StandaloneDebugSpellings[] = {
16476   {AttributeCommonInfo::AS_GNU, "standalone_debug"},
16477   {AttributeCommonInfo::AS_CXX11, "clang::standalone_debug"},
16478 };
16479 struct ParsedAttrInfoStandaloneDebug final : public ParsedAttrInfo {
16480   constexpr ParsedAttrInfoStandaloneDebug() : ParsedAttrInfo(
16481     /*AttrKind=*/ParsedAttr::AT_StandaloneDebug,
16482     /*NumArgs=*/0,
16483     /*OptArgs=*/0,
16484     /*NumArgMembers=*/0,
16485     /*HasCustomParsing=*/0,
16486     /*AcceptsExprPack=*/0,
16487     /*IsTargetSpecific=*/0,
16488     /*IsType=*/0,
16489     /*IsStmt=*/0,
16490     /*IsKnownToGCC=*/0,
16491     /*IsSupportedByPragmaAttribute=*/1,
16492     /*Spellings=*/StandaloneDebugSpellings,
16493     /*ArgNames=*/{}) {}
16494 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16495   if (!isa<CXXRecordDecl>(D)) {
16496     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16497       << Attr << Attr.isRegularKeywordAttribute() << "classes";
16498     return false;
16499   }
16500   return true;
16501 }
16502 
16503 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16504   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16505     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16506   return false;
16507 }
16508 
16509 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
16510   return LangOpts.CPlusPlus;
16511 }
16512 
16513 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16514   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
16515 }
16516 
16517 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
16518   D->addAttr(::new (S.Context) StandaloneDebugAttr(S.Context, Attr));
16519   return AttributeApplied;
16520 }
16521 
16522 bool isParamExpr(size_t N) const override {
16523   return false;
16524 }
16525 
16526 static const ParsedAttrInfoStandaloneDebug Instance;
16527 };
16528 const ParsedAttrInfoStandaloneDebug ParsedAttrInfoStandaloneDebug::Instance;
16529 static constexpr ParsedAttrInfo::Spelling StdCallSpellings[] = {
16530   {AttributeCommonInfo::AS_GNU, "stdcall"},
16531   {AttributeCommonInfo::AS_CXX11, "gnu::stdcall"},
16532   {AttributeCommonInfo::AS_C23, "gnu::stdcall"},
16533   {AttributeCommonInfo::AS_Keyword, "__stdcall"},
16534   {AttributeCommonInfo::AS_Keyword, "_stdcall"},
16535 };
16536 struct ParsedAttrInfoStdCall final : public ParsedAttrInfo {
16537   constexpr ParsedAttrInfoStdCall() : ParsedAttrInfo(
16538     /*AttrKind=*/ParsedAttr::AT_StdCall,
16539     /*NumArgs=*/0,
16540     /*OptArgs=*/0,
16541     /*NumArgMembers=*/0,
16542     /*HasCustomParsing=*/0,
16543     /*AcceptsExprPack=*/0,
16544     /*IsTargetSpecific=*/0,
16545     /*IsType=*/1,
16546     /*IsStmt=*/0,
16547     /*IsKnownToGCC=*/1,
16548     /*IsSupportedByPragmaAttribute=*/0,
16549     /*Spellings=*/StdCallSpellings,
16550     /*ArgNames=*/{}) {}
16551 bool isParamExpr(size_t N) const override {
16552   return false;
16553 }
16554 
16555 static const ParsedAttrInfoStdCall Instance;
16556 };
16557 const ParsedAttrInfoStdCall ParsedAttrInfoStdCall::Instance;
16558 struct ParsedAttrInfoStrictFP final : public ParsedAttrInfo {
16559   constexpr ParsedAttrInfoStrictFP() : ParsedAttrInfo(
16560     /*AttrKind=*/ParsedAttr::AT_StrictFP,
16561     /*NumArgs=*/0,
16562     /*OptArgs=*/0,
16563     /*NumArgMembers=*/0,
16564     /*HasCustomParsing=*/0,
16565     /*AcceptsExprPack=*/0,
16566     /*IsTargetSpecific=*/0,
16567     /*IsType=*/0,
16568     /*IsStmt=*/0,
16569     /*IsKnownToGCC=*/0,
16570     /*IsSupportedByPragmaAttribute=*/0,
16571     /*Spellings=*/{},
16572     /*ArgNames=*/{}) {}
16573 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16574   if (!isa<FunctionDecl>(D)) {
16575     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16576       << Attr << Attr.isRegularKeywordAttribute() << "functions";
16577     return false;
16578   }
16579   return true;
16580 }
16581 
16582 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16583   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16584     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16585   return false;
16586 }
16587 
16588 bool isParamExpr(size_t N) const override {
16589   return false;
16590 }
16591 
16592 static const ParsedAttrInfoStrictFP Instance;
16593 };
16594 const ParsedAttrInfoStrictFP ParsedAttrInfoStrictFP::Instance;
16595 static constexpr ParsedAttrInfo::Spelling StrictGuardStackCheckSpellings[] = {
16596   {AttributeCommonInfo::AS_Declspec, "strict_gs_check"},
16597 };
16598 struct ParsedAttrInfoStrictGuardStackCheck final : public ParsedAttrInfo {
16599   constexpr ParsedAttrInfoStrictGuardStackCheck() : ParsedAttrInfo(
16600     /*AttrKind=*/ParsedAttr::AT_StrictGuardStackCheck,
16601     /*NumArgs=*/0,
16602     /*OptArgs=*/0,
16603     /*NumArgMembers=*/0,
16604     /*HasCustomParsing=*/0,
16605     /*AcceptsExprPack=*/0,
16606     /*IsTargetSpecific=*/0,
16607     /*IsType=*/0,
16608     /*IsStmt=*/0,
16609     /*IsKnownToGCC=*/0,
16610     /*IsSupportedByPragmaAttribute=*/0,
16611     /*Spellings=*/StrictGuardStackCheckSpellings,
16612     /*ArgNames=*/{}) {}
16613 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16614   if (!isa<FunctionDecl>(D)) {
16615     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16616       << Attr << Attr.isRegularKeywordAttribute() << "functions";
16617     return false;
16618   }
16619   return true;
16620 }
16621 
16622 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16623   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16624     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16625   return false;
16626 }
16627 
16628 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
16629   D->addAttr(::new (S.Context) StrictGuardStackCheckAttr(S.Context, Attr));
16630   return AttributeApplied;
16631 }
16632 
16633 bool isParamExpr(size_t N) const override {
16634   return false;
16635 }
16636 
16637 static const ParsedAttrInfoStrictGuardStackCheck Instance;
16638 };
16639 const ParsedAttrInfoStrictGuardStackCheck ParsedAttrInfoStrictGuardStackCheck::Instance;
16640 static constexpr ParsedAttrInfo::Spelling SuppressSpellings[] = {
16641   {AttributeCommonInfo::AS_CXX11, "gsl::suppress"},
16642   {AttributeCommonInfo::AS_GNU, "suppress"},
16643   {AttributeCommonInfo::AS_CXX11, "clang::suppress"},
16644   {AttributeCommonInfo::AS_C23, "clang::suppress"},
16645 };
16646 static constexpr const char *SuppressArgNames[] = {
16647 "DiagnosticIdentifiers...",};
16648 struct ParsedAttrInfoSuppress final : public ParsedAttrInfo {
16649   constexpr ParsedAttrInfoSuppress() : ParsedAttrInfo(
16650     /*AttrKind=*/ParsedAttr::AT_Suppress,
16651     /*NumArgs=*/0,
16652     /*OptArgs=*/15,
16653     /*NumArgMembers=*/1,
16654     /*HasCustomParsing=*/0,
16655     /*AcceptsExprPack=*/0,
16656     /*IsTargetSpecific=*/0,
16657     /*IsType=*/0,
16658     /*IsStmt=*/1,
16659     /*IsKnownToGCC=*/0,
16660     /*IsSupportedByPragmaAttribute=*/0,
16661     /*Spellings=*/SuppressSpellings,
16662     /*ArgNames=*/SuppressArgNames) {}
16663 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16664   if (!isa<VarDecl>(D) && !isa<FieldDecl>(D) && !isa<ObjCPropertyDecl>(D) && !isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D) && !isa<RecordDecl>(D) && !isa<ObjCInterfaceDecl>(D) && !isa<ObjCImplementationDecl>(D) && !isa<NamespaceDecl>(D) && !isa<EmptyDecl>(D)) {
16665     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16666       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, structs, interfaces, and namespaces";
16667     return false;
16668   }
16669   return true;
16670 }
16671 
16672 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const override {
16673   if (!isa<Stmt>(St)) {
16674     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16675       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, structs, interfaces, and namespaces";
16676     return false;
16677   }
16678   return true;
16679 }
16680 
16681 bool isParamExpr(size_t N) const override {
16682   return false;
16683 }
16684 
16685 static const ParsedAttrInfoSuppress Instance;
16686 };
16687 const ParsedAttrInfoSuppress ParsedAttrInfoSuppress::Instance;
16688 static constexpr ParsedAttrInfo::Spelling SwiftAsyncSpellings[] = {
16689   {AttributeCommonInfo::AS_GNU, "swift_async"},
16690   {AttributeCommonInfo::AS_CXX11, "clang::swift_async"},
16691   {AttributeCommonInfo::AS_C23, "clang::swift_async"},
16692 };
16693 static constexpr const char *SwiftAsyncArgNames[] = {
16694 "Kind","CompletionHandlerIndex",};
16695 struct ParsedAttrInfoSwiftAsync final : public ParsedAttrInfo {
16696   constexpr ParsedAttrInfoSwiftAsync() : ParsedAttrInfo(
16697     /*AttrKind=*/ParsedAttr::AT_SwiftAsync,
16698     /*NumArgs=*/1,
16699     /*OptArgs=*/1,
16700     /*NumArgMembers=*/2,
16701     /*HasCustomParsing=*/0,
16702     /*AcceptsExprPack=*/0,
16703     /*IsTargetSpecific=*/0,
16704     /*IsType=*/0,
16705     /*IsStmt=*/0,
16706     /*IsKnownToGCC=*/0,
16707     /*IsSupportedByPragmaAttribute=*/1,
16708     /*Spellings=*/SwiftAsyncSpellings,
16709     /*ArgNames=*/SwiftAsyncArgNames) {}
16710 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16711   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
16712     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16713       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
16714     return false;
16715   }
16716   return true;
16717 }
16718 
16719 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16720   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16721     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16722   return false;
16723 }
16724 
16725 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16726   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
16727   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
16728 }
16729 
16730 bool isParamExpr(size_t N) const override {
16731   return false;
16732 }
16733 
16734 static const ParsedAttrInfoSwiftAsync Instance;
16735 };
16736 const ParsedAttrInfoSwiftAsync ParsedAttrInfoSwiftAsync::Instance;
16737 static constexpr ParsedAttrInfo::Spelling SwiftAsyncCallSpellings[] = {
16738   {AttributeCommonInfo::AS_GNU, "swiftasynccall"},
16739   {AttributeCommonInfo::AS_CXX11, "clang::swiftasynccall"},
16740   {AttributeCommonInfo::AS_C23, "clang::swiftasynccall"},
16741 };
16742 struct ParsedAttrInfoSwiftAsyncCall final : public ParsedAttrInfo {
16743   constexpr ParsedAttrInfoSwiftAsyncCall() : ParsedAttrInfo(
16744     /*AttrKind=*/ParsedAttr::AT_SwiftAsyncCall,
16745     /*NumArgs=*/0,
16746     /*OptArgs=*/0,
16747     /*NumArgMembers=*/0,
16748     /*HasCustomParsing=*/0,
16749     /*AcceptsExprPack=*/0,
16750     /*IsTargetSpecific=*/0,
16751     /*IsType=*/1,
16752     /*IsStmt=*/0,
16753     /*IsKnownToGCC=*/0,
16754     /*IsSupportedByPragmaAttribute=*/0,
16755     /*Spellings=*/SwiftAsyncCallSpellings,
16756     /*ArgNames=*/{}) {}
16757 bool isParamExpr(size_t N) const override {
16758   return false;
16759 }
16760 
16761 static const ParsedAttrInfoSwiftAsyncCall Instance;
16762 };
16763 const ParsedAttrInfoSwiftAsyncCall ParsedAttrInfoSwiftAsyncCall::Instance;
16764 static constexpr ParsedAttrInfo::Spelling SwiftAsyncContextSpellings[] = {
16765   {AttributeCommonInfo::AS_GNU, "swift_async_context"},
16766   {AttributeCommonInfo::AS_CXX11, "clang::swift_async_context"},
16767   {AttributeCommonInfo::AS_C23, "clang::swift_async_context"},
16768 };
16769 struct ParsedAttrInfoSwiftAsyncContext final : public ParsedAttrInfo {
16770   constexpr ParsedAttrInfoSwiftAsyncContext() : ParsedAttrInfo(
16771     /*AttrKind=*/ParsedAttr::AT_SwiftAsyncContext,
16772     /*NumArgs=*/0,
16773     /*OptArgs=*/0,
16774     /*NumArgMembers=*/0,
16775     /*HasCustomParsing=*/0,
16776     /*AcceptsExprPack=*/0,
16777     /*IsTargetSpecific=*/0,
16778     /*IsType=*/0,
16779     /*IsStmt=*/0,
16780     /*IsKnownToGCC=*/0,
16781     /*IsSupportedByPragmaAttribute=*/1,
16782     /*Spellings=*/SwiftAsyncContextSpellings,
16783     /*ArgNames=*/{}) {}
16784 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16785   if (!isa<ParmVarDecl>(D)) {
16786     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16787       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
16788     return false;
16789   }
16790   return true;
16791 }
16792 
16793 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16794   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16795     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16796   return false;
16797 }
16798 
16799 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16800   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
16801 }
16802 
16803 bool isParamExpr(size_t N) const override {
16804   return false;
16805 }
16806 
16807 static const ParsedAttrInfoSwiftAsyncContext Instance;
16808 };
16809 const ParsedAttrInfoSwiftAsyncContext ParsedAttrInfoSwiftAsyncContext::Instance;
16810 static constexpr ParsedAttrInfo::Spelling SwiftAsyncErrorSpellings[] = {
16811   {AttributeCommonInfo::AS_GNU, "swift_async_error"},
16812   {AttributeCommonInfo::AS_CXX11, "clang::swift_async_error"},
16813   {AttributeCommonInfo::AS_C23, "clang::swift_async_error"},
16814 };
16815 static constexpr const char *SwiftAsyncErrorArgNames[] = {
16816 "Convention","HandlerParamIdx",};
16817 struct ParsedAttrInfoSwiftAsyncError final : public ParsedAttrInfo {
16818   constexpr ParsedAttrInfoSwiftAsyncError() : ParsedAttrInfo(
16819     /*AttrKind=*/ParsedAttr::AT_SwiftAsyncError,
16820     /*NumArgs=*/1,
16821     /*OptArgs=*/1,
16822     /*NumArgMembers=*/2,
16823     /*HasCustomParsing=*/0,
16824     /*AcceptsExprPack=*/0,
16825     /*IsTargetSpecific=*/0,
16826     /*IsType=*/0,
16827     /*IsStmt=*/0,
16828     /*IsKnownToGCC=*/0,
16829     /*IsSupportedByPragmaAttribute=*/1,
16830     /*Spellings=*/SwiftAsyncErrorSpellings,
16831     /*ArgNames=*/SwiftAsyncErrorArgNames) {}
16832 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16833   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
16834     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
16835       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
16836     return false;
16837   }
16838   return true;
16839 }
16840 
16841 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16842   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16843     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16844   return false;
16845 }
16846 
16847 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16848   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
16849   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
16850 }
16851 
16852 bool isParamExpr(size_t N) const override {
16853   return false;
16854 }
16855 
16856 static const ParsedAttrInfoSwiftAsyncError Instance;
16857 };
16858 const ParsedAttrInfoSwiftAsyncError ParsedAttrInfoSwiftAsyncError::Instance;
16859 static constexpr ParsedAttrInfo::Spelling SwiftAsyncNameSpellings[] = {
16860   {AttributeCommonInfo::AS_GNU, "swift_async_name"},
16861 };
16862 static constexpr const char *SwiftAsyncNameArgNames[] = {
16863 "Name",};
16864 struct ParsedAttrInfoSwiftAsyncName final : public ParsedAttrInfo {
16865   constexpr ParsedAttrInfoSwiftAsyncName() : ParsedAttrInfo(
16866     /*AttrKind=*/ParsedAttr::AT_SwiftAsyncName,
16867     /*NumArgs=*/1,
16868     /*OptArgs=*/0,
16869     /*NumArgMembers=*/1,
16870     /*HasCustomParsing=*/0,
16871     /*AcceptsExprPack=*/0,
16872     /*IsTargetSpecific=*/0,
16873     /*IsType=*/0,
16874     /*IsStmt=*/0,
16875     /*IsKnownToGCC=*/0,
16876     /*IsSupportedByPragmaAttribute=*/1,
16877     /*Spellings=*/SwiftAsyncNameSpellings,
16878     /*ArgNames=*/SwiftAsyncNameArgNames) {}
16879 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16880   if (!isa<ObjCMethodDecl>(D) && !isa<FunctionDecl>(D)) {
16881     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16882       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods and functions";
16883     return false;
16884   }
16885   return true;
16886 }
16887 
16888 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16889   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16890     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16891   return false;
16892 }
16893 
16894 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
16895   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
16896   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
16897 }
16898 
16899 bool isParamExpr(size_t N) const override {
16900   return false;
16901 }
16902 
16903 static const ParsedAttrInfoSwiftAsyncName Instance;
16904 };
16905 const ParsedAttrInfoSwiftAsyncName ParsedAttrInfoSwiftAsyncName::Instance;
16906 static constexpr ParsedAttrInfo::Spelling SwiftAttrSpellings[] = {
16907   {AttributeCommonInfo::AS_GNU, "swift_attr"},
16908 };
16909 static constexpr const char *SwiftAttrArgNames[] = {
16910 "Attribute",};
16911 struct ParsedAttrInfoSwiftAttr final : public ParsedAttrInfo {
16912   constexpr ParsedAttrInfoSwiftAttr() : ParsedAttrInfo(
16913     /*AttrKind=*/ParsedAttr::AT_SwiftAttr,
16914     /*NumArgs=*/1,
16915     /*OptArgs=*/0,
16916     /*NumArgMembers=*/1,
16917     /*HasCustomParsing=*/0,
16918     /*AcceptsExprPack=*/0,
16919     /*IsTargetSpecific=*/0,
16920     /*IsType=*/1,
16921     /*IsStmt=*/0,
16922     /*IsKnownToGCC=*/0,
16923     /*IsSupportedByPragmaAttribute=*/1,
16924     /*Spellings=*/SwiftAttrSpellings,
16925     /*ArgNames=*/SwiftAttrArgNames) {}
16926 bool isParamExpr(size_t N) const override {
16927   return false;
16928 }
16929 
16930 static const ParsedAttrInfoSwiftAttr Instance;
16931 };
16932 const ParsedAttrInfoSwiftAttr ParsedAttrInfoSwiftAttr::Instance;
16933 static constexpr ParsedAttrInfo::Spelling SwiftBridgeSpellings[] = {
16934   {AttributeCommonInfo::AS_GNU, "swift_bridge"},
16935 };
16936 static constexpr const char *SwiftBridgeArgNames[] = {
16937 "SwiftType",};
16938 struct ParsedAttrInfoSwiftBridge final : public ParsedAttrInfo {
16939   constexpr ParsedAttrInfoSwiftBridge() : ParsedAttrInfo(
16940     /*AttrKind=*/ParsedAttr::AT_SwiftBridge,
16941     /*NumArgs=*/1,
16942     /*OptArgs=*/0,
16943     /*NumArgMembers=*/1,
16944     /*HasCustomParsing=*/0,
16945     /*AcceptsExprPack=*/0,
16946     /*IsTargetSpecific=*/0,
16947     /*IsType=*/0,
16948     /*IsStmt=*/0,
16949     /*IsKnownToGCC=*/0,
16950     /*IsSupportedByPragmaAttribute=*/0,
16951     /*Spellings=*/SwiftBridgeSpellings,
16952     /*ArgNames=*/SwiftBridgeArgNames) {}
16953 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16954   if (!isa<TagDecl>(D) && !isa<TypedefNameDecl>(D) && !isa<ObjCInterfaceDecl>(D) && !isa<ObjCProtocolDecl>(D)) {
16955     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16956       << Attr << Attr.isRegularKeywordAttribute() << "tag types, typedefs, Objective-C interfaces, and Objective-C protocols";
16957     return false;
16958   }
16959   return true;
16960 }
16961 
16962 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
16963   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
16964     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
16965   return false;
16966 }
16967 
16968 bool isParamExpr(size_t N) const override {
16969   return false;
16970 }
16971 
16972 static const ParsedAttrInfoSwiftBridge Instance;
16973 };
16974 const ParsedAttrInfoSwiftBridge ParsedAttrInfoSwiftBridge::Instance;
16975 static constexpr ParsedAttrInfo::Spelling SwiftBridgedTypedefSpellings[] = {
16976   {AttributeCommonInfo::AS_GNU, "swift_bridged_typedef"},
16977 };
16978 struct ParsedAttrInfoSwiftBridgedTypedef final : public ParsedAttrInfo {
16979   constexpr ParsedAttrInfoSwiftBridgedTypedef() : ParsedAttrInfo(
16980     /*AttrKind=*/ParsedAttr::AT_SwiftBridgedTypedef,
16981     /*NumArgs=*/0,
16982     /*OptArgs=*/0,
16983     /*NumArgMembers=*/0,
16984     /*HasCustomParsing=*/0,
16985     /*AcceptsExprPack=*/0,
16986     /*IsTargetSpecific=*/0,
16987     /*IsType=*/0,
16988     /*IsStmt=*/0,
16989     /*IsKnownToGCC=*/0,
16990     /*IsSupportedByPragmaAttribute=*/1,
16991     /*Spellings=*/SwiftBridgedTypedefSpellings,
16992     /*ArgNames=*/{}) {}
16993 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
16994   if (!isa<TypedefNameDecl>(D)) {
16995     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
16996       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
16997     return false;
16998   }
16999   return true;
17000 }
17001 
17002 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17003   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17004     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17005   return false;
17006 }
17007 
17008 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17009   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
17010 }
17011 
17012 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
17013   D->addAttr(::new (S.Context) SwiftBridgedTypedefAttr(S.Context, Attr));
17014   return AttributeApplied;
17015 }
17016 
17017 bool isParamExpr(size_t N) const override {
17018   return false;
17019 }
17020 
17021 static const ParsedAttrInfoSwiftBridgedTypedef Instance;
17022 };
17023 const ParsedAttrInfoSwiftBridgedTypedef ParsedAttrInfoSwiftBridgedTypedef::Instance;
17024 static constexpr ParsedAttrInfo::Spelling SwiftCallSpellings[] = {
17025   {AttributeCommonInfo::AS_GNU, "swiftcall"},
17026   {AttributeCommonInfo::AS_CXX11, "clang::swiftcall"},
17027   {AttributeCommonInfo::AS_C23, "clang::swiftcall"},
17028 };
17029 struct ParsedAttrInfoSwiftCall final : public ParsedAttrInfo {
17030   constexpr ParsedAttrInfoSwiftCall() : ParsedAttrInfo(
17031     /*AttrKind=*/ParsedAttr::AT_SwiftCall,
17032     /*NumArgs=*/0,
17033     /*OptArgs=*/0,
17034     /*NumArgMembers=*/0,
17035     /*HasCustomParsing=*/0,
17036     /*AcceptsExprPack=*/0,
17037     /*IsTargetSpecific=*/0,
17038     /*IsType=*/1,
17039     /*IsStmt=*/0,
17040     /*IsKnownToGCC=*/0,
17041     /*IsSupportedByPragmaAttribute=*/0,
17042     /*Spellings=*/SwiftCallSpellings,
17043     /*ArgNames=*/{}) {}
17044 bool isParamExpr(size_t N) const override {
17045   return false;
17046 }
17047 
17048 static const ParsedAttrInfoSwiftCall Instance;
17049 };
17050 const ParsedAttrInfoSwiftCall ParsedAttrInfoSwiftCall::Instance;
17051 static constexpr ParsedAttrInfo::Spelling SwiftContextSpellings[] = {
17052   {AttributeCommonInfo::AS_GNU, "swift_context"},
17053   {AttributeCommonInfo::AS_CXX11, "clang::swift_context"},
17054   {AttributeCommonInfo::AS_C23, "clang::swift_context"},
17055 };
17056 struct ParsedAttrInfoSwiftContext final : public ParsedAttrInfo {
17057   constexpr ParsedAttrInfoSwiftContext() : ParsedAttrInfo(
17058     /*AttrKind=*/ParsedAttr::AT_SwiftContext,
17059     /*NumArgs=*/0,
17060     /*OptArgs=*/0,
17061     /*NumArgMembers=*/0,
17062     /*HasCustomParsing=*/0,
17063     /*AcceptsExprPack=*/0,
17064     /*IsTargetSpecific=*/0,
17065     /*IsType=*/0,
17066     /*IsStmt=*/0,
17067     /*IsKnownToGCC=*/0,
17068     /*IsSupportedByPragmaAttribute=*/1,
17069     /*Spellings=*/SwiftContextSpellings,
17070     /*ArgNames=*/{}) {}
17071 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17072   if (!isa<ParmVarDecl>(D)) {
17073     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
17074       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
17075     return false;
17076   }
17077   return true;
17078 }
17079 
17080 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17081   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17082     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17083   return false;
17084 }
17085 
17086 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17087   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
17088 }
17089 
17090 bool isParamExpr(size_t N) const override {
17091   return false;
17092 }
17093 
17094 static const ParsedAttrInfoSwiftContext Instance;
17095 };
17096 const ParsedAttrInfoSwiftContext ParsedAttrInfoSwiftContext::Instance;
17097 static constexpr ParsedAttrInfo::Spelling SwiftErrorSpellings[] = {
17098   {AttributeCommonInfo::AS_GNU, "swift_error"},
17099 };
17100 static constexpr const char *SwiftErrorArgNames[] = {
17101 "Convention",};
17102 struct ParsedAttrInfoSwiftError final : public ParsedAttrInfo {
17103   constexpr ParsedAttrInfoSwiftError() : ParsedAttrInfo(
17104     /*AttrKind=*/ParsedAttr::AT_SwiftError,
17105     /*NumArgs=*/1,
17106     /*OptArgs=*/0,
17107     /*NumArgMembers=*/1,
17108     /*HasCustomParsing=*/0,
17109     /*AcceptsExprPack=*/0,
17110     /*IsTargetSpecific=*/0,
17111     /*IsType=*/0,
17112     /*IsStmt=*/0,
17113     /*IsKnownToGCC=*/0,
17114     /*IsSupportedByPragmaAttribute=*/1,
17115     /*Spellings=*/SwiftErrorSpellings,
17116     /*ArgNames=*/SwiftErrorArgNames) {}
17117 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17118   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
17119     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17120       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
17121     return false;
17122   }
17123   return true;
17124 }
17125 
17126 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17127   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17128     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17129   return false;
17130 }
17131 
17132 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17133   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
17134   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
17135 }
17136 
17137 bool isParamExpr(size_t N) const override {
17138   return false;
17139 }
17140 
17141 static const ParsedAttrInfoSwiftError Instance;
17142 };
17143 const ParsedAttrInfoSwiftError ParsedAttrInfoSwiftError::Instance;
17144 static constexpr ParsedAttrInfo::Spelling SwiftErrorResultSpellings[] = {
17145   {AttributeCommonInfo::AS_GNU, "swift_error_result"},
17146   {AttributeCommonInfo::AS_CXX11, "clang::swift_error_result"},
17147   {AttributeCommonInfo::AS_C23, "clang::swift_error_result"},
17148 };
17149 struct ParsedAttrInfoSwiftErrorResult final : public ParsedAttrInfo {
17150   constexpr ParsedAttrInfoSwiftErrorResult() : ParsedAttrInfo(
17151     /*AttrKind=*/ParsedAttr::AT_SwiftErrorResult,
17152     /*NumArgs=*/0,
17153     /*OptArgs=*/0,
17154     /*NumArgMembers=*/0,
17155     /*HasCustomParsing=*/0,
17156     /*AcceptsExprPack=*/0,
17157     /*IsTargetSpecific=*/0,
17158     /*IsType=*/0,
17159     /*IsStmt=*/0,
17160     /*IsKnownToGCC=*/0,
17161     /*IsSupportedByPragmaAttribute=*/1,
17162     /*Spellings=*/SwiftErrorResultSpellings,
17163     /*ArgNames=*/{}) {}
17164 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17165   if (!isa<ParmVarDecl>(D)) {
17166     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
17167       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
17168     return false;
17169   }
17170   return true;
17171 }
17172 
17173 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17174   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17175     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17176   return false;
17177 }
17178 
17179 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17180   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
17181 }
17182 
17183 bool isParamExpr(size_t N) const override {
17184   return false;
17185 }
17186 
17187 static const ParsedAttrInfoSwiftErrorResult Instance;
17188 };
17189 const ParsedAttrInfoSwiftErrorResult ParsedAttrInfoSwiftErrorResult::Instance;
17190 static constexpr ParsedAttrInfo::Spelling SwiftIndirectResultSpellings[] = {
17191   {AttributeCommonInfo::AS_GNU, "swift_indirect_result"},
17192   {AttributeCommonInfo::AS_CXX11, "clang::swift_indirect_result"},
17193   {AttributeCommonInfo::AS_C23, "clang::swift_indirect_result"},
17194 };
17195 struct ParsedAttrInfoSwiftIndirectResult final : public ParsedAttrInfo {
17196   constexpr ParsedAttrInfoSwiftIndirectResult() : ParsedAttrInfo(
17197     /*AttrKind=*/ParsedAttr::AT_SwiftIndirectResult,
17198     /*NumArgs=*/0,
17199     /*OptArgs=*/0,
17200     /*NumArgMembers=*/0,
17201     /*HasCustomParsing=*/0,
17202     /*AcceptsExprPack=*/0,
17203     /*IsTargetSpecific=*/0,
17204     /*IsType=*/0,
17205     /*IsStmt=*/0,
17206     /*IsKnownToGCC=*/0,
17207     /*IsSupportedByPragmaAttribute=*/1,
17208     /*Spellings=*/SwiftIndirectResultSpellings,
17209     /*ArgNames=*/{}) {}
17210 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17211   if (!isa<ParmVarDecl>(D)) {
17212     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
17213       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
17214     return false;
17215   }
17216   return true;
17217 }
17218 
17219 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17220   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17221     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17222   return false;
17223 }
17224 
17225 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17226   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
17227 }
17228 
17229 bool isParamExpr(size_t N) const override {
17230   return false;
17231 }
17232 
17233 static const ParsedAttrInfoSwiftIndirectResult Instance;
17234 };
17235 const ParsedAttrInfoSwiftIndirectResult ParsedAttrInfoSwiftIndirectResult::Instance;
17236 static constexpr ParsedAttrInfo::Spelling SwiftNameSpellings[] = {
17237   {AttributeCommonInfo::AS_GNU, "swift_name"},
17238 };
17239 static constexpr const char *SwiftNameArgNames[] = {
17240 "Name",};
17241 struct ParsedAttrInfoSwiftName final : public ParsedAttrInfo {
17242   constexpr ParsedAttrInfoSwiftName() : ParsedAttrInfo(
17243     /*AttrKind=*/ParsedAttr::AT_SwiftName,
17244     /*NumArgs=*/1,
17245     /*OptArgs=*/0,
17246     /*NumArgMembers=*/1,
17247     /*HasCustomParsing=*/0,
17248     /*AcceptsExprPack=*/0,
17249     /*IsTargetSpecific=*/0,
17250     /*IsType=*/0,
17251     /*IsStmt=*/0,
17252     /*IsKnownToGCC=*/0,
17253     /*IsSupportedByPragmaAttribute=*/0,
17254     /*Spellings=*/SwiftNameSpellings,
17255     /*ArgNames=*/SwiftNameArgNames) {}
17256 bool isParamExpr(size_t N) const override {
17257   return false;
17258 }
17259 
17260 static const ParsedAttrInfoSwiftName Instance;
17261 };
17262 const ParsedAttrInfoSwiftName ParsedAttrInfoSwiftName::Instance;
17263 static constexpr ParsedAttrInfo::Spelling SwiftNewTypeSpellings[] = {
17264   {AttributeCommonInfo::AS_GNU, "swift_newtype"},
17265   {AttributeCommonInfo::AS_GNU, "swift_wrapper"},
17266 };
17267 static constexpr const char *SwiftNewTypeArgNames[] = {
17268 "NewtypeKind",};
17269 struct ParsedAttrInfoSwiftNewType final : public ParsedAttrInfo {
17270   constexpr ParsedAttrInfoSwiftNewType() : ParsedAttrInfo(
17271     /*AttrKind=*/ParsedAttr::AT_SwiftNewType,
17272     /*NumArgs=*/1,
17273     /*OptArgs=*/0,
17274     /*NumArgMembers=*/1,
17275     /*HasCustomParsing=*/1,
17276     /*AcceptsExprPack=*/0,
17277     /*IsTargetSpecific=*/0,
17278     /*IsType=*/0,
17279     /*IsStmt=*/0,
17280     /*IsKnownToGCC=*/0,
17281     /*IsSupportedByPragmaAttribute=*/1,
17282     /*Spellings=*/SwiftNewTypeSpellings,
17283     /*ArgNames=*/SwiftNewTypeArgNames) {}
17284 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17285   if (!isa<TypedefNameDecl>(D)) {
17286     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17287       << Attr << Attr.isRegularKeywordAttribute() << "typedefs";
17288     return false;
17289   }
17290   return true;
17291 }
17292 
17293 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17294   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17295     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17296   return false;
17297 }
17298 
17299 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
17300   enum Spelling {
17301     GNU_swift_newtype = 0,
17302     GNU_swift_wrapper = 1,
17303   SpellingNotCalculated = 15
17304 
17305   };
17306 
17307   unsigned Idx = Attr.getAttributeSpellingListIndex();
17308   switch (Idx) {
17309     default: llvm_unreachable("Unknown spelling list index");
17310     case 0: return GNU_swift_newtype;
17311     case 1: return GNU_swift_wrapper;
17312   }
17313 }
17314 
17315 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17316   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
17317 }
17318 
17319 bool isParamExpr(size_t N) const override {
17320   return false;
17321 }
17322 
17323 static const ParsedAttrInfoSwiftNewType Instance;
17324 };
17325 const ParsedAttrInfoSwiftNewType ParsedAttrInfoSwiftNewType::Instance;
17326 static constexpr ParsedAttrInfo::Spelling SwiftObjCMembersSpellings[] = {
17327   {AttributeCommonInfo::AS_GNU, "swift_objc_members"},
17328 };
17329 struct ParsedAttrInfoSwiftObjCMembers final : public ParsedAttrInfo {
17330   constexpr ParsedAttrInfoSwiftObjCMembers() : ParsedAttrInfo(
17331     /*AttrKind=*/ParsedAttr::AT_SwiftObjCMembers,
17332     /*NumArgs=*/0,
17333     /*OptArgs=*/0,
17334     /*NumArgMembers=*/0,
17335     /*HasCustomParsing=*/0,
17336     /*AcceptsExprPack=*/0,
17337     /*IsTargetSpecific=*/0,
17338     /*IsType=*/0,
17339     /*IsStmt=*/0,
17340     /*IsKnownToGCC=*/0,
17341     /*IsSupportedByPragmaAttribute=*/1,
17342     /*Spellings=*/SwiftObjCMembersSpellings,
17343     /*ArgNames=*/{}) {}
17344 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17345   if (!isa<ObjCInterfaceDecl>(D)) {
17346     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17347       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C interfaces";
17348     return false;
17349   }
17350   return true;
17351 }
17352 
17353 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17354   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17355     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17356   return false;
17357 }
17358 
17359 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17360   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_interface, /*IsSupported=*/LangOpts.ObjC));
17361 }
17362 
17363 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
17364   D->addAttr(::new (S.Context) SwiftObjCMembersAttr(S.Context, Attr));
17365   return AttributeApplied;
17366 }
17367 
17368 bool isParamExpr(size_t N) const override {
17369   return false;
17370 }
17371 
17372 static const ParsedAttrInfoSwiftObjCMembers Instance;
17373 };
17374 const ParsedAttrInfoSwiftObjCMembers ParsedAttrInfoSwiftObjCMembers::Instance;
17375 static constexpr ParsedAttrInfo::Spelling SwiftPrivateSpellings[] = {
17376   {AttributeCommonInfo::AS_GNU, "swift_private"},
17377 };
17378 struct ParsedAttrInfoSwiftPrivate final : public ParsedAttrInfo {
17379   constexpr ParsedAttrInfoSwiftPrivate() : ParsedAttrInfo(
17380     /*AttrKind=*/ParsedAttr::AT_SwiftPrivate,
17381     /*NumArgs=*/0,
17382     /*OptArgs=*/0,
17383     /*NumArgMembers=*/0,
17384     /*HasCustomParsing=*/0,
17385     /*AcceptsExprPack=*/0,
17386     /*IsTargetSpecific=*/0,
17387     /*IsType=*/0,
17388     /*IsStmt=*/0,
17389     /*IsKnownToGCC=*/0,
17390     /*IsSupportedByPragmaAttribute=*/0,
17391     /*Spellings=*/SwiftPrivateSpellings,
17392     /*ArgNames=*/{}) {}
17393 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
17394   D->addAttr(::new (S.Context) SwiftPrivateAttr(S.Context, Attr));
17395   return AttributeApplied;
17396 }
17397 
17398 bool isParamExpr(size_t N) const override {
17399   return false;
17400 }
17401 
17402 static const ParsedAttrInfoSwiftPrivate Instance;
17403 };
17404 const ParsedAttrInfoSwiftPrivate ParsedAttrInfoSwiftPrivate::Instance;
17405 static constexpr ParsedAttrInfo::Spelling SysVABISpellings[] = {
17406   {AttributeCommonInfo::AS_GNU, "sysv_abi"},
17407   {AttributeCommonInfo::AS_CXX11, "gnu::sysv_abi"},
17408   {AttributeCommonInfo::AS_C23, "gnu::sysv_abi"},
17409 };
17410 struct ParsedAttrInfoSysVABI final : public ParsedAttrInfo {
17411   constexpr ParsedAttrInfoSysVABI() : ParsedAttrInfo(
17412     /*AttrKind=*/ParsedAttr::AT_SysVABI,
17413     /*NumArgs=*/0,
17414     /*OptArgs=*/0,
17415     /*NumArgMembers=*/0,
17416     /*HasCustomParsing=*/0,
17417     /*AcceptsExprPack=*/0,
17418     /*IsTargetSpecific=*/0,
17419     /*IsType=*/1,
17420     /*IsStmt=*/0,
17421     /*IsKnownToGCC=*/1,
17422     /*IsSupportedByPragmaAttribute=*/0,
17423     /*Spellings=*/SysVABISpellings,
17424     /*ArgNames=*/{}) {}
17425 bool isParamExpr(size_t N) const override {
17426   return false;
17427 }
17428 
17429 static const ParsedAttrInfoSysVABI Instance;
17430 };
17431 const ParsedAttrInfoSysVABI ParsedAttrInfoSysVABI::Instance;
17432 static constexpr ParsedAttrInfo::Spelling TLSModelSpellings[] = {
17433   {AttributeCommonInfo::AS_GNU, "tls_model"},
17434   {AttributeCommonInfo::AS_CXX11, "gnu::tls_model"},
17435   {AttributeCommonInfo::AS_C23, "gnu::tls_model"},
17436 };
17437 static constexpr const char *TLSModelArgNames[] = {
17438 "Model",};
17439 struct ParsedAttrInfoTLSModel final : public ParsedAttrInfo {
17440   constexpr ParsedAttrInfoTLSModel() : ParsedAttrInfo(
17441     /*AttrKind=*/ParsedAttr::AT_TLSModel,
17442     /*NumArgs=*/1,
17443     /*OptArgs=*/0,
17444     /*NumArgMembers=*/1,
17445     /*HasCustomParsing=*/0,
17446     /*AcceptsExprPack=*/0,
17447     /*IsTargetSpecific=*/0,
17448     /*IsType=*/0,
17449     /*IsStmt=*/0,
17450     /*IsKnownToGCC=*/1,
17451     /*IsSupportedByPragmaAttribute=*/1,
17452     /*Spellings=*/TLSModelSpellings,
17453     /*ArgNames=*/TLSModelArgNames) {}
17454 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17455   if (!isTLSVar(D)) {
17456     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17457       << Attr << Attr.isRegularKeywordAttribute() << "thread-local variables";
17458     return false;
17459   }
17460   return true;
17461 }
17462 
17463 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17464   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17465     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17466   return false;
17467 }
17468 
17469 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17470   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_thread_local, /*IsSupported=*/true));
17471 }
17472 
17473 bool isParamExpr(size_t N) const override {
17474   return false;
17475 }
17476 
17477 static const ParsedAttrInfoTLSModel Instance;
17478 };
17479 const ParsedAttrInfoTLSModel ParsedAttrInfoTLSModel::Instance;
17480 static constexpr ParsedAttrInfo::Spelling TargetSpellings[] = {
17481   {AttributeCommonInfo::AS_GNU, "target"},
17482   {AttributeCommonInfo::AS_CXX11, "gnu::target"},
17483   {AttributeCommonInfo::AS_C23, "gnu::target"},
17484 };
17485 static constexpr const char *TargetArgNames[] = {
17486 "featuresStr",};
17487 struct ParsedAttrInfoTarget final : public ParsedAttrInfo {
17488   constexpr ParsedAttrInfoTarget() : ParsedAttrInfo(
17489     /*AttrKind=*/ParsedAttr::AT_Target,
17490     /*NumArgs=*/1,
17491     /*OptArgs=*/0,
17492     /*NumArgMembers=*/1,
17493     /*HasCustomParsing=*/0,
17494     /*AcceptsExprPack=*/0,
17495     /*IsTargetSpecific=*/0,
17496     /*IsType=*/0,
17497     /*IsStmt=*/0,
17498     /*IsKnownToGCC=*/1,
17499     /*IsSupportedByPragmaAttribute=*/1,
17500     /*Spellings=*/TargetSpellings,
17501     /*ArgNames=*/TargetArgNames) {}
17502 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17503   if (!isa<FunctionDecl>(D)) {
17504     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17505       << Attr << Attr.isRegularKeywordAttribute() << "functions";
17506     return false;
17507   }
17508   return true;
17509 }
17510 
17511 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17512   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17513     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17514   return false;
17515 }
17516 
17517   using ParsedAttrInfo::diagMutualExclusion;
17518 
17519   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
17520     if (const auto *A = D->getAttr<TargetClonesAttr>()) {
17521       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17522       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17523 return false;
17524     }
17525     if (const auto *A = D->getAttr<TargetVersionAttr>()) {
17526       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17527       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17528 return false;
17529     }
17530     if (const auto *A = D->getAttr<CPUDispatchAttr>()) {
17531       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17532       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17533 return false;
17534     }
17535     if (const auto *A = D->getAttr<CPUSpecificAttr>()) {
17536       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17537       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17538 return false;
17539     }
17540     return true;
17541   }
17542 
17543 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17544   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
17545 }
17546 
17547 bool isParamExpr(size_t N) const override {
17548   return false;
17549 }
17550 
17551 static const ParsedAttrInfoTarget Instance;
17552 };
17553 const ParsedAttrInfoTarget ParsedAttrInfoTarget::Instance;
17554 static constexpr ParsedAttrInfo::Spelling TargetClonesSpellings[] = {
17555   {AttributeCommonInfo::AS_GNU, "target_clones"},
17556   {AttributeCommonInfo::AS_CXX11, "gnu::target_clones"},
17557   {AttributeCommonInfo::AS_C23, "gnu::target_clones"},
17558 };
17559 static constexpr const char *TargetClonesArgNames[] = {
17560 "featuresStrs...",};
17561 struct ParsedAttrInfoTargetClones final : public ParsedAttrInfo {
17562   constexpr ParsedAttrInfoTargetClones() : ParsedAttrInfo(
17563     /*AttrKind=*/ParsedAttr::AT_TargetClones,
17564     /*NumArgs=*/0,
17565     /*OptArgs=*/15,
17566     /*NumArgMembers=*/1,
17567     /*HasCustomParsing=*/0,
17568     /*AcceptsExprPack=*/0,
17569     /*IsTargetSpecific=*/0,
17570     /*IsType=*/0,
17571     /*IsStmt=*/0,
17572     /*IsKnownToGCC=*/1,
17573     /*IsSupportedByPragmaAttribute=*/1,
17574     /*Spellings=*/TargetClonesSpellings,
17575     /*ArgNames=*/TargetClonesArgNames) {}
17576 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17577   if (!isa<FunctionDecl>(D)) {
17578     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17579       << Attr << Attr.isRegularKeywordAttribute() << "functions";
17580     return false;
17581   }
17582   return true;
17583 }
17584 
17585 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17586   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17587     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17588   return false;
17589 }
17590 
17591   using ParsedAttrInfo::diagMutualExclusion;
17592 
17593   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
17594     if (const auto *A = D->getAttr<TargetVersionAttr>()) {
17595       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17596       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17597 return false;
17598     }
17599     if (const auto *A = D->getAttr<TargetAttr>()) {
17600       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17601       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17602 return false;
17603     }
17604     if (const auto *A = D->getAttr<CPUDispatchAttr>()) {
17605       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17606       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17607 return false;
17608     }
17609     if (const auto *A = D->getAttr<CPUSpecificAttr>()) {
17610       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17611       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17612 return false;
17613     }
17614     return true;
17615   }
17616 
17617 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17618   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
17619 }
17620 
17621 bool isParamExpr(size_t N) const override {
17622   return false;
17623 }
17624 
17625 static const ParsedAttrInfoTargetClones Instance;
17626 };
17627 const ParsedAttrInfoTargetClones ParsedAttrInfoTargetClones::Instance;
17628 static constexpr ParsedAttrInfo::Spelling TargetVersionSpellings[] = {
17629   {AttributeCommonInfo::AS_GNU, "target_version"},
17630   {AttributeCommonInfo::AS_CXX11, "gnu::target_version"},
17631   {AttributeCommonInfo::AS_C23, "gnu::target_version"},
17632 };
17633 static constexpr const char *TargetVersionArgNames[] = {
17634 "NamesStr",};
17635 struct ParsedAttrInfoTargetVersion final : public ParsedAttrInfo {
17636   constexpr ParsedAttrInfoTargetVersion() : ParsedAttrInfo(
17637     /*AttrKind=*/ParsedAttr::AT_TargetVersion,
17638     /*NumArgs=*/1,
17639     /*OptArgs=*/0,
17640     /*NumArgMembers=*/1,
17641     /*HasCustomParsing=*/0,
17642     /*AcceptsExprPack=*/0,
17643     /*IsTargetSpecific=*/1,
17644     /*IsType=*/0,
17645     /*IsStmt=*/0,
17646     /*IsKnownToGCC=*/1,
17647     /*IsSupportedByPragmaAttribute=*/1,
17648     /*Spellings=*/TargetVersionSpellings,
17649     /*ArgNames=*/TargetVersionArgNames) {}
17650 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17651   if (!isa<FunctionDecl>(D)) {
17652     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17653       << Attr << Attr.isRegularKeywordAttribute() << "functions";
17654     return false;
17655   }
17656   return true;
17657 }
17658 
17659 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17660   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17661     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17662   return false;
17663 }
17664 
17665   using ParsedAttrInfo::diagMutualExclusion;
17666 
17667   bool diagMutualExclusion(Sema &S, const ParsedAttr &AL, const Decl *D) const override {
17668     if (const auto *A = D->getAttr<TargetClonesAttr>()) {
17669       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17670       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17671 return false;
17672     }
17673     if (const auto *A = D->getAttr<TargetAttr>()) {
17674       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17675       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17676 return false;
17677     }
17678     if (const auto *A = D->getAttr<CPUDispatchAttr>()) {
17679       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17680       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17681 return false;
17682     }
17683     if (const auto *A = D->getAttr<CPUSpecificAttr>()) {
17684       S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible) << AL << A << (AL.isRegularKeywordAttribute() || A->isRegularKeywordAttribute());
17685       S.Diag(A->getLocation(), diag::note_conflicting_attribute);      
17686 return false;
17687     }
17688     return true;
17689   }
17690 
17691 bool existsInTarget(const TargetInfo &Target) const override {
17692   const llvm::Triple &T = Target.getTriple(); (void)T;
17693   return true && (T.getArch() == llvm::Triple::aarch64 || T.getArch() == llvm::Triple::aarch64_be || T.getArch() == llvm::Triple::aarch64_32 || T.getArch() == llvm::Triple::riscv32 || T.getArch() == llvm::Triple::riscv64);
17694 }
17695 
17696 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17697   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
17698 }
17699 
17700 bool isParamExpr(size_t N) const override {
17701   return false;
17702 }
17703 
17704 static const ParsedAttrInfoTargetVersion Instance;
17705 };
17706 const ParsedAttrInfoTargetVersion ParsedAttrInfoTargetVersion::Instance;
17707 static constexpr ParsedAttrInfo::Spelling TestTypestateSpellings[] = {
17708   {AttributeCommonInfo::AS_GNU, "test_typestate"},
17709   {AttributeCommonInfo::AS_CXX11, "clang::test_typestate"},
17710 };
17711 static constexpr const char *TestTypestateArgNames[] = {
17712 "TestState",};
17713 struct ParsedAttrInfoTestTypestate final : public ParsedAttrInfo {
17714   constexpr ParsedAttrInfoTestTypestate() : ParsedAttrInfo(
17715     /*AttrKind=*/ParsedAttr::AT_TestTypestate,
17716     /*NumArgs=*/1,
17717     /*OptArgs=*/0,
17718     /*NumArgMembers=*/1,
17719     /*HasCustomParsing=*/0,
17720     /*AcceptsExprPack=*/0,
17721     /*IsTargetSpecific=*/0,
17722     /*IsType=*/0,
17723     /*IsStmt=*/0,
17724     /*IsKnownToGCC=*/0,
17725     /*IsSupportedByPragmaAttribute=*/1,
17726     /*Spellings=*/TestTypestateSpellings,
17727     /*ArgNames=*/TestTypestateArgNames) {}
17728 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17729   if (!isa<CXXMethodDecl>(D)) {
17730     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
17731       << Attr << Attr.isRegularKeywordAttribute() << "functions";
17732     return false;
17733   }
17734   return true;
17735 }
17736 
17737 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17738   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17739     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17740   return false;
17741 }
17742 
17743 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17744   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function_is_member, /*IsSupported=*/LangOpts.CPlusPlus));
17745 }
17746 
17747 bool isParamExpr(size_t N) const override {
17748   return false;
17749 }
17750 
17751 static const ParsedAttrInfoTestTypestate Instance;
17752 };
17753 const ParsedAttrInfoTestTypestate ParsedAttrInfoTestTypestate::Instance;
17754 static constexpr ParsedAttrInfo::Spelling ThisCallSpellings[] = {
17755   {AttributeCommonInfo::AS_GNU, "thiscall"},
17756   {AttributeCommonInfo::AS_CXX11, "gnu::thiscall"},
17757   {AttributeCommonInfo::AS_C23, "gnu::thiscall"},
17758   {AttributeCommonInfo::AS_Keyword, "__thiscall"},
17759   {AttributeCommonInfo::AS_Keyword, "_thiscall"},
17760 };
17761 struct ParsedAttrInfoThisCall final : public ParsedAttrInfo {
17762   constexpr ParsedAttrInfoThisCall() : ParsedAttrInfo(
17763     /*AttrKind=*/ParsedAttr::AT_ThisCall,
17764     /*NumArgs=*/0,
17765     /*OptArgs=*/0,
17766     /*NumArgMembers=*/0,
17767     /*HasCustomParsing=*/0,
17768     /*AcceptsExprPack=*/0,
17769     /*IsTargetSpecific=*/0,
17770     /*IsType=*/1,
17771     /*IsStmt=*/0,
17772     /*IsKnownToGCC=*/1,
17773     /*IsSupportedByPragmaAttribute=*/0,
17774     /*Spellings=*/ThisCallSpellings,
17775     /*ArgNames=*/{}) {}
17776 bool isParamExpr(size_t N) const override {
17777   return false;
17778 }
17779 
17780 static const ParsedAttrInfoThisCall Instance;
17781 };
17782 const ParsedAttrInfoThisCall ParsedAttrInfoThisCall::Instance;
17783 static constexpr ParsedAttrInfo::Spelling ThreadSpellings[] = {
17784   {AttributeCommonInfo::AS_Declspec, "thread"},
17785 };
17786 struct ParsedAttrInfoThread final : public ParsedAttrInfo {
17787   constexpr ParsedAttrInfoThread() : ParsedAttrInfo(
17788     /*AttrKind=*/ParsedAttr::AT_Thread,
17789     /*NumArgs=*/0,
17790     /*OptArgs=*/0,
17791     /*NumArgMembers=*/0,
17792     /*HasCustomParsing=*/0,
17793     /*AcceptsExprPack=*/0,
17794     /*IsTargetSpecific=*/0,
17795     /*IsType=*/0,
17796     /*IsStmt=*/0,
17797     /*IsKnownToGCC=*/0,
17798     /*IsSupportedByPragmaAttribute=*/0,
17799     /*Spellings=*/ThreadSpellings,
17800     /*ArgNames=*/{}) {}
17801 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17802   if (!isa<VarDecl>(D)) {
17803     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
17804       << Attr << Attr.isRegularKeywordAttribute() << "variables";
17805     return false;
17806   }
17807   return true;
17808 }
17809 
17810 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17811   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17812     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17813   return false;
17814 }
17815 
17816 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
17817   return LangOpts.MicrosoftExt;
17818 }
17819 
17820 bool isParamExpr(size_t N) const override {
17821   return false;
17822 }
17823 
17824 static const ParsedAttrInfoThread Instance;
17825 };
17826 const ParsedAttrInfoThread ParsedAttrInfoThread::Instance;
17827 static constexpr ParsedAttrInfo::Spelling TransparentUnionSpellings[] = {
17828   {AttributeCommonInfo::AS_GNU, "transparent_union"},
17829   {AttributeCommonInfo::AS_CXX11, "gnu::transparent_union"},
17830   {AttributeCommonInfo::AS_C23, "gnu::transparent_union"},
17831 };
17832 struct ParsedAttrInfoTransparentUnion final : public ParsedAttrInfo {
17833   constexpr ParsedAttrInfoTransparentUnion() : ParsedAttrInfo(
17834     /*AttrKind=*/ParsedAttr::AT_TransparentUnion,
17835     /*NumArgs=*/0,
17836     /*OptArgs=*/0,
17837     /*NumArgMembers=*/0,
17838     /*HasCustomParsing=*/0,
17839     /*AcceptsExprPack=*/0,
17840     /*IsTargetSpecific=*/0,
17841     /*IsType=*/0,
17842     /*IsStmt=*/0,
17843     /*IsKnownToGCC=*/1,
17844     /*IsSupportedByPragmaAttribute=*/0,
17845     /*Spellings=*/TransparentUnionSpellings,
17846     /*ArgNames=*/{}) {}
17847 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
17848   return (!LangOpts.CPlusPlus);
17849 }
17850 
17851 bool isParamExpr(size_t N) const override {
17852   return false;
17853 }
17854 
17855 static const ParsedAttrInfoTransparentUnion Instance;
17856 };
17857 const ParsedAttrInfoTransparentUnion ParsedAttrInfoTransparentUnion::Instance;
17858 static constexpr ParsedAttrInfo::Spelling TrivialABISpellings[] = {
17859   {AttributeCommonInfo::AS_GNU, "trivial_abi"},
17860   {AttributeCommonInfo::AS_CXX11, "clang::trivial_abi"},
17861 };
17862 struct ParsedAttrInfoTrivialABI final : public ParsedAttrInfo {
17863   constexpr ParsedAttrInfoTrivialABI() : ParsedAttrInfo(
17864     /*AttrKind=*/ParsedAttr::AT_TrivialABI,
17865     /*NumArgs=*/0,
17866     /*OptArgs=*/0,
17867     /*NumArgMembers=*/0,
17868     /*HasCustomParsing=*/0,
17869     /*AcceptsExprPack=*/0,
17870     /*IsTargetSpecific=*/0,
17871     /*IsType=*/0,
17872     /*IsStmt=*/0,
17873     /*IsKnownToGCC=*/0,
17874     /*IsSupportedByPragmaAttribute=*/1,
17875     /*Spellings=*/TrivialABISpellings,
17876     /*ArgNames=*/{}) {}
17877 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17878   if (!isa<CXXRecordDecl>(D)) {
17879     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
17880       << Attr << Attr.isRegularKeywordAttribute() << "classes";
17881     return false;
17882   }
17883   return true;
17884 }
17885 
17886 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17887   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17888     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17889   return false;
17890 }
17891 
17892 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
17893   return LangOpts.CPlusPlus;
17894 }
17895 
17896 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
17897   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
17898 }
17899 
17900 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
17901   D->addAttr(::new (S.Context) TrivialABIAttr(S.Context, Attr));
17902   return AttributeApplied;
17903 }
17904 
17905 bool isParamExpr(size_t N) const override {
17906   return false;
17907 }
17908 
17909 static const ParsedAttrInfoTrivialABI Instance;
17910 };
17911 const ParsedAttrInfoTrivialABI ParsedAttrInfoTrivialABI::Instance;
17912 static constexpr ParsedAttrInfo::Spelling TryAcquireCapabilitySpellings[] = {
17913   {AttributeCommonInfo::AS_GNU, "try_acquire_capability"},
17914   {AttributeCommonInfo::AS_CXX11, "clang::try_acquire_capability"},
17915   {AttributeCommonInfo::AS_GNU, "try_acquire_shared_capability"},
17916   {AttributeCommonInfo::AS_CXX11, "clang::try_acquire_shared_capability"},
17917 };
17918 static constexpr const char *TryAcquireCapabilityArgNames[] = {
17919 "SuccessValue","Args...",};
17920 struct ParsedAttrInfoTryAcquireCapability final : public ParsedAttrInfo {
17921   constexpr ParsedAttrInfoTryAcquireCapability() : ParsedAttrInfo(
17922     /*AttrKind=*/ParsedAttr::AT_TryAcquireCapability,
17923     /*NumArgs=*/1,
17924     /*OptArgs=*/15,
17925     /*NumArgMembers=*/2,
17926     /*HasCustomParsing=*/0,
17927     /*AcceptsExprPack=*/0,
17928     /*IsTargetSpecific=*/0,
17929     /*IsType=*/0,
17930     /*IsStmt=*/0,
17931     /*IsKnownToGCC=*/0,
17932     /*IsSupportedByPragmaAttribute=*/0,
17933     /*Spellings=*/TryAcquireCapabilitySpellings,
17934     /*ArgNames=*/TryAcquireCapabilityArgNames) {}
17935 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
17936   if (!isa<FunctionDecl>(D)) {
17937     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
17938       << Attr << Attr.isRegularKeywordAttribute() << "functions";
17939     return false;
17940   }
17941   return true;
17942 }
17943 
17944 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
17945   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
17946     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
17947   return false;
17948 }
17949 
17950 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
17951   enum Spelling {
17952     GNU_try_acquire_capability = 0,
17953     CXX11_clang_try_acquire_capability = 1,
17954     GNU_try_acquire_shared_capability = 2,
17955     CXX11_clang_try_acquire_shared_capability = 3,
17956   SpellingNotCalculated = 15
17957 
17958   };
17959 
17960   unsigned Idx = Attr.getAttributeSpellingListIndex();
17961   switch (Idx) {
17962     default: llvm_unreachable("Unknown spelling list index");
17963     case 0: return GNU_try_acquire_capability;
17964     case 1: return CXX11_clang_try_acquire_capability;
17965     case 2: return GNU_try_acquire_shared_capability;
17966     case 3: return CXX11_clang_try_acquire_shared_capability;
17967   }
17968 }
17969 
17970 bool isParamExpr(size_t N) const override {
17971   return (N == 0) || (N == 1) || false;
17972 }
17973 
17974 static const ParsedAttrInfoTryAcquireCapability Instance;
17975 };
17976 const ParsedAttrInfoTryAcquireCapability ParsedAttrInfoTryAcquireCapability::Instance;
17977 static constexpr ParsedAttrInfo::Spelling TypeNonNullSpellings[] = {
17978   {AttributeCommonInfo::AS_Keyword, "_Nonnull"},
17979 };
17980 struct ParsedAttrInfoTypeNonNull final : public ParsedAttrInfo {
17981   constexpr ParsedAttrInfoTypeNonNull() : ParsedAttrInfo(
17982     /*AttrKind=*/ParsedAttr::AT_TypeNonNull,
17983     /*NumArgs=*/0,
17984     /*OptArgs=*/0,
17985     /*NumArgMembers=*/0,
17986     /*HasCustomParsing=*/0,
17987     /*AcceptsExprPack=*/0,
17988     /*IsTargetSpecific=*/0,
17989     /*IsType=*/1,
17990     /*IsStmt=*/0,
17991     /*IsKnownToGCC=*/0,
17992     /*IsSupportedByPragmaAttribute=*/0,
17993     /*Spellings=*/TypeNonNullSpellings,
17994     /*ArgNames=*/{}) {}
17995 bool isParamExpr(size_t N) const override {
17996   return false;
17997 }
17998 
17999 static const ParsedAttrInfoTypeNonNull Instance;
18000 };
18001 const ParsedAttrInfoTypeNonNull ParsedAttrInfoTypeNonNull::Instance;
18002 static constexpr ParsedAttrInfo::Spelling TypeNullUnspecifiedSpellings[] = {
18003   {AttributeCommonInfo::AS_Keyword, "_Null_unspecified"},
18004 };
18005 struct ParsedAttrInfoTypeNullUnspecified final : public ParsedAttrInfo {
18006   constexpr ParsedAttrInfoTypeNullUnspecified() : ParsedAttrInfo(
18007     /*AttrKind=*/ParsedAttr::AT_TypeNullUnspecified,
18008     /*NumArgs=*/0,
18009     /*OptArgs=*/0,
18010     /*NumArgMembers=*/0,
18011     /*HasCustomParsing=*/0,
18012     /*AcceptsExprPack=*/0,
18013     /*IsTargetSpecific=*/0,
18014     /*IsType=*/1,
18015     /*IsStmt=*/0,
18016     /*IsKnownToGCC=*/0,
18017     /*IsSupportedByPragmaAttribute=*/0,
18018     /*Spellings=*/TypeNullUnspecifiedSpellings,
18019     /*ArgNames=*/{}) {}
18020 bool isParamExpr(size_t N) const override {
18021   return false;
18022 }
18023 
18024 static const ParsedAttrInfoTypeNullUnspecified Instance;
18025 };
18026 const ParsedAttrInfoTypeNullUnspecified ParsedAttrInfoTypeNullUnspecified::Instance;
18027 static constexpr ParsedAttrInfo::Spelling TypeNullableSpellings[] = {
18028   {AttributeCommonInfo::AS_Keyword, "_Nullable"},
18029 };
18030 struct ParsedAttrInfoTypeNullable final : public ParsedAttrInfo {
18031   constexpr ParsedAttrInfoTypeNullable() : ParsedAttrInfo(
18032     /*AttrKind=*/ParsedAttr::AT_TypeNullable,
18033     /*NumArgs=*/0,
18034     /*OptArgs=*/0,
18035     /*NumArgMembers=*/0,
18036     /*HasCustomParsing=*/0,
18037     /*AcceptsExprPack=*/0,
18038     /*IsTargetSpecific=*/0,
18039     /*IsType=*/1,
18040     /*IsStmt=*/0,
18041     /*IsKnownToGCC=*/0,
18042     /*IsSupportedByPragmaAttribute=*/0,
18043     /*Spellings=*/TypeNullableSpellings,
18044     /*ArgNames=*/{}) {}
18045 bool isParamExpr(size_t N) const override {
18046   return false;
18047 }
18048 
18049 static const ParsedAttrInfoTypeNullable Instance;
18050 };
18051 const ParsedAttrInfoTypeNullable ParsedAttrInfoTypeNullable::Instance;
18052 static constexpr ParsedAttrInfo::Spelling TypeNullableResultSpellings[] = {
18053   {AttributeCommonInfo::AS_Keyword, "_Nullable_result"},
18054 };
18055 struct ParsedAttrInfoTypeNullableResult final : public ParsedAttrInfo {
18056   constexpr ParsedAttrInfoTypeNullableResult() : ParsedAttrInfo(
18057     /*AttrKind=*/ParsedAttr::AT_TypeNullableResult,
18058     /*NumArgs=*/0,
18059     /*OptArgs=*/0,
18060     /*NumArgMembers=*/0,
18061     /*HasCustomParsing=*/0,
18062     /*AcceptsExprPack=*/0,
18063     /*IsTargetSpecific=*/0,
18064     /*IsType=*/1,
18065     /*IsStmt=*/0,
18066     /*IsKnownToGCC=*/0,
18067     /*IsSupportedByPragmaAttribute=*/0,
18068     /*Spellings=*/TypeNullableResultSpellings,
18069     /*ArgNames=*/{}) {}
18070 bool isParamExpr(size_t N) const override {
18071   return false;
18072 }
18073 
18074 static const ParsedAttrInfoTypeNullableResult Instance;
18075 };
18076 const ParsedAttrInfoTypeNullableResult ParsedAttrInfoTypeNullableResult::Instance;
18077 static constexpr ParsedAttrInfo::Spelling TypeTagForDatatypeSpellings[] = {
18078   {AttributeCommonInfo::AS_GNU, "type_tag_for_datatype"},
18079   {AttributeCommonInfo::AS_CXX11, "clang::type_tag_for_datatype"},
18080   {AttributeCommonInfo::AS_C23, "clang::type_tag_for_datatype"},
18081 };
18082 static constexpr const char *TypeTagForDatatypeArgNames[] = {
18083 "ArgumentKind","MatchingCType","LayoutCompatible","MustBeNull",};
18084 struct ParsedAttrInfoTypeTagForDatatype final : public ParsedAttrInfo {
18085   constexpr ParsedAttrInfoTypeTagForDatatype() : ParsedAttrInfo(
18086     /*AttrKind=*/ParsedAttr::AT_TypeTagForDatatype,
18087     /*NumArgs=*/4,
18088     /*OptArgs=*/0,
18089     /*NumArgMembers=*/4,
18090     /*HasCustomParsing=*/1,
18091     /*AcceptsExprPack=*/0,
18092     /*IsTargetSpecific=*/0,
18093     /*IsType=*/0,
18094     /*IsStmt=*/0,
18095     /*IsKnownToGCC=*/0,
18096     /*IsSupportedByPragmaAttribute=*/0,
18097     /*Spellings=*/TypeTagForDatatypeSpellings,
18098     /*ArgNames=*/TypeTagForDatatypeArgNames) {}
18099 bool isParamExpr(size_t N) const override {
18100   return false;
18101 }
18102 
18103 static const ParsedAttrInfoTypeTagForDatatype Instance;
18104 };
18105 const ParsedAttrInfoTypeTagForDatatype ParsedAttrInfoTypeTagForDatatype::Instance;
18106 static constexpr ParsedAttrInfo::Spelling TypeVisibilitySpellings[] = {
18107   {AttributeCommonInfo::AS_GNU, "type_visibility"},
18108   {AttributeCommonInfo::AS_CXX11, "clang::type_visibility"},
18109   {AttributeCommonInfo::AS_C23, "clang::type_visibility"},
18110 };
18111 static constexpr const char *TypeVisibilityArgNames[] = {
18112 "Visibility",};
18113 struct ParsedAttrInfoTypeVisibility final : public ParsedAttrInfo {
18114   constexpr ParsedAttrInfoTypeVisibility() : ParsedAttrInfo(
18115     /*AttrKind=*/ParsedAttr::AT_TypeVisibility,
18116     /*NumArgs=*/1,
18117     /*OptArgs=*/0,
18118     /*NumArgMembers=*/1,
18119     /*HasCustomParsing=*/0,
18120     /*AcceptsExprPack=*/0,
18121     /*IsTargetSpecific=*/0,
18122     /*IsType=*/0,
18123     /*IsStmt=*/0,
18124     /*IsKnownToGCC=*/0,
18125     /*IsSupportedByPragmaAttribute=*/0,
18126     /*Spellings=*/TypeVisibilitySpellings,
18127     /*ArgNames=*/TypeVisibilityArgNames) {}
18128 bool isParamExpr(size_t N) const override {
18129   return false;
18130 }
18131 
18132 static const ParsedAttrInfoTypeVisibility Instance;
18133 };
18134 const ParsedAttrInfoTypeVisibility ParsedAttrInfoTypeVisibility::Instance;
18135 static constexpr ParsedAttrInfo::Spelling UPtrSpellings[] = {
18136   {AttributeCommonInfo::AS_Keyword, "__uptr"},
18137 };
18138 struct ParsedAttrInfoUPtr final : public ParsedAttrInfo {
18139   constexpr ParsedAttrInfoUPtr() : ParsedAttrInfo(
18140     /*AttrKind=*/ParsedAttr::AT_UPtr,
18141     /*NumArgs=*/0,
18142     /*OptArgs=*/0,
18143     /*NumArgMembers=*/0,
18144     /*HasCustomParsing=*/0,
18145     /*AcceptsExprPack=*/0,
18146     /*IsTargetSpecific=*/0,
18147     /*IsType=*/1,
18148     /*IsStmt=*/0,
18149     /*IsKnownToGCC=*/0,
18150     /*IsSupportedByPragmaAttribute=*/0,
18151     /*Spellings=*/UPtrSpellings,
18152     /*ArgNames=*/{}) {}
18153 bool isParamExpr(size_t N) const override {
18154   return false;
18155 }
18156 
18157 static const ParsedAttrInfoUPtr Instance;
18158 };
18159 const ParsedAttrInfoUPtr ParsedAttrInfoUPtr::Instance;
18160 static constexpr ParsedAttrInfo::Spelling UnavailableSpellings[] = {
18161   {AttributeCommonInfo::AS_GNU, "unavailable"},
18162   {AttributeCommonInfo::AS_CXX11, "clang::unavailable"},
18163   {AttributeCommonInfo::AS_C23, "clang::unavailable"},
18164 };
18165 static constexpr const char *UnavailableArgNames[] = {
18166 "Message",};
18167 struct ParsedAttrInfoUnavailable final : public ParsedAttrInfo {
18168   constexpr ParsedAttrInfoUnavailable() : ParsedAttrInfo(
18169     /*AttrKind=*/ParsedAttr::AT_Unavailable,
18170     /*NumArgs=*/0,
18171     /*OptArgs=*/1,
18172     /*NumArgMembers=*/1,
18173     /*HasCustomParsing=*/0,
18174     /*AcceptsExprPack=*/0,
18175     /*IsTargetSpecific=*/0,
18176     /*IsType=*/0,
18177     /*IsStmt=*/0,
18178     /*IsKnownToGCC=*/0,
18179     /*IsSupportedByPragmaAttribute=*/0,
18180     /*Spellings=*/UnavailableSpellings,
18181     /*ArgNames=*/UnavailableArgNames) {}
18182 bool isParamExpr(size_t N) const override {
18183   return false;
18184 }
18185 
18186 static const ParsedAttrInfoUnavailable Instance;
18187 };
18188 const ParsedAttrInfoUnavailable ParsedAttrInfoUnavailable::Instance;
18189 static constexpr ParsedAttrInfo::Spelling UninitializedSpellings[] = {
18190   {AttributeCommonInfo::AS_GNU, "uninitialized"},
18191   {AttributeCommonInfo::AS_CXX11, "clang::uninitialized"},
18192 };
18193 struct ParsedAttrInfoUninitialized final : public ParsedAttrInfo {
18194   constexpr ParsedAttrInfoUninitialized() : ParsedAttrInfo(
18195     /*AttrKind=*/ParsedAttr::AT_Uninitialized,
18196     /*NumArgs=*/0,
18197     /*OptArgs=*/0,
18198     /*NumArgMembers=*/0,
18199     /*HasCustomParsing=*/0,
18200     /*AcceptsExprPack=*/0,
18201     /*IsTargetSpecific=*/0,
18202     /*IsType=*/0,
18203     /*IsStmt=*/0,
18204     /*IsKnownToGCC=*/0,
18205     /*IsSupportedByPragmaAttribute=*/1,
18206     /*Spellings=*/UninitializedSpellings,
18207     /*ArgNames=*/{}) {}
18208 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18209   if (!isLocalVar(D)) {
18210     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18211       << Attr << Attr.isRegularKeywordAttribute() << "local variables";
18212     return false;
18213   }
18214   return true;
18215 }
18216 
18217 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18218   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18219     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18220   return false;
18221 }
18222 
18223 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18224   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_local, /*IsSupported=*/true));
18225 }
18226 
18227 bool isParamExpr(size_t N) const override {
18228   return false;
18229 }
18230 
18231 static const ParsedAttrInfoUninitialized Instance;
18232 };
18233 const ParsedAttrInfoUninitialized ParsedAttrInfoUninitialized::Instance;
18234 static constexpr ParsedAttrInfo::Spelling UnlikelySpellings[] = {
18235   {AttributeCommonInfo::AS_CXX11, "unlikely"},
18236   {AttributeCommonInfo::AS_C23, "clang::unlikely"},
18237 };
18238 struct ParsedAttrInfoUnlikely final : public ParsedAttrInfo {
18239   constexpr ParsedAttrInfoUnlikely() : ParsedAttrInfo(
18240     /*AttrKind=*/ParsedAttr::AT_Unlikely,
18241     /*NumArgs=*/0,
18242     /*OptArgs=*/0,
18243     /*NumArgMembers=*/0,
18244     /*HasCustomParsing=*/0,
18245     /*AcceptsExprPack=*/0,
18246     /*IsTargetSpecific=*/0,
18247     /*IsType=*/0,
18248     /*IsStmt=*/1,
18249     /*IsKnownToGCC=*/0,
18250     /*IsSupportedByPragmaAttribute=*/0,
18251     /*Spellings=*/UnlikelySpellings,
18252     /*ArgNames=*/{}) {}
18253   using ParsedAttrInfo::diagMutualExclusion;
18254 
18255 bool isParamExpr(size_t N) const override {
18256   return false;
18257 }
18258 
18259 static const ParsedAttrInfoUnlikely Instance;
18260 };
18261 const ParsedAttrInfoUnlikely ParsedAttrInfoUnlikely::Instance;
18262 static constexpr ParsedAttrInfo::Spelling UnsafeBufferUsageSpellings[] = {
18263   {AttributeCommonInfo::AS_GNU, "unsafe_buffer_usage"},
18264   {AttributeCommonInfo::AS_CXX11, "clang::unsafe_buffer_usage"},
18265   {AttributeCommonInfo::AS_C23, "clang::unsafe_buffer_usage"},
18266 };
18267 struct ParsedAttrInfoUnsafeBufferUsage final : public ParsedAttrInfo {
18268   constexpr ParsedAttrInfoUnsafeBufferUsage() : ParsedAttrInfo(
18269     /*AttrKind=*/ParsedAttr::AT_UnsafeBufferUsage,
18270     /*NumArgs=*/0,
18271     /*OptArgs=*/0,
18272     /*NumArgMembers=*/0,
18273     /*HasCustomParsing=*/0,
18274     /*AcceptsExprPack=*/0,
18275     /*IsTargetSpecific=*/0,
18276     /*IsType=*/0,
18277     /*IsStmt=*/0,
18278     /*IsKnownToGCC=*/0,
18279     /*IsSupportedByPragmaAttribute=*/1,
18280     /*Spellings=*/UnsafeBufferUsageSpellings,
18281     /*ArgNames=*/{}) {}
18282 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18283   if (!isa<FunctionDecl>(D) && !isa<FieldDecl>(D)) {
18284     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18285       << Attr << Attr.isRegularKeywordAttribute() << "functions and non-static data members";
18286     return false;
18287   }
18288   return true;
18289 }
18290 
18291 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18292   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18293     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18294   return false;
18295 }
18296 
18297 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18298   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
18299   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_field, /*IsSupported=*/true));
18300 }
18301 
18302 bool isParamExpr(size_t N) const override {
18303   return false;
18304 }
18305 
18306 static const ParsedAttrInfoUnsafeBufferUsage Instance;
18307 };
18308 const ParsedAttrInfoUnsafeBufferUsage ParsedAttrInfoUnsafeBufferUsage::Instance;
18309 static constexpr ParsedAttrInfo::Spelling UnusedSpellings[] = {
18310   {AttributeCommonInfo::AS_CXX11, "maybe_unused"},
18311   {AttributeCommonInfo::AS_GNU, "unused"},
18312   {AttributeCommonInfo::AS_CXX11, "gnu::unused"},
18313   {AttributeCommonInfo::AS_C23, "gnu::unused"},
18314   {AttributeCommonInfo::AS_C23, "maybe_unused"},
18315 };
18316 struct ParsedAttrInfoUnused final : public ParsedAttrInfo {
18317   constexpr ParsedAttrInfoUnused() : ParsedAttrInfo(
18318     /*AttrKind=*/ParsedAttr::AT_Unused,
18319     /*NumArgs=*/0,
18320     /*OptArgs=*/0,
18321     /*NumArgMembers=*/0,
18322     /*HasCustomParsing=*/0,
18323     /*AcceptsExprPack=*/0,
18324     /*IsTargetSpecific=*/0,
18325     /*IsType=*/0,
18326     /*IsStmt=*/0,
18327     /*IsKnownToGCC=*/1,
18328     /*IsSupportedByPragmaAttribute=*/0,
18329     /*Spellings=*/UnusedSpellings,
18330     /*ArgNames=*/{}) {}
18331 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18332   if (!isa<VarDecl>(D) && !isa<BindingDecl>(D) && !isa<ObjCIvarDecl>(D) && !isa<TypeDecl>(D) && !isa<EnumDecl>(D) && !isa<EnumConstantDecl>(D) && !isa<LabelDecl>(D) && !isa<FieldDecl>(D) && !isa<ObjCMethodDecl>(D) && !isFunctionLike(D)) {
18333     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18334       << Attr << Attr.isRegularKeywordAttribute() << "variables, value declarations, non-static data members, types, enums, enumerators, labels, non-static data members, Objective-C methods, functions, and function pointers";
18335     return false;
18336   }
18337   return true;
18338 }
18339 
18340 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18341   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18342     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18343   return false;
18344 }
18345 
18346 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
18347   enum Spelling {
18348     CXX11_maybe_unused = 0,
18349     GNU_unused = 1,
18350     CXX11_gnu_unused = 2,
18351     C23_gnu_unused = 3,
18352     C23_maybe_unused = 4,
18353   SpellingNotCalculated = 15
18354 
18355   };
18356 
18357   unsigned Idx = Attr.getAttributeSpellingListIndex();
18358   switch (Idx) {
18359     default: llvm_unreachable("Unknown spelling list index");
18360     case 0: return CXX11_maybe_unused;
18361     case 1: return GNU_unused;
18362     case 2: return CXX11_gnu_unused;
18363     case 3: return C23_gnu_unused;
18364     case 4: return C23_maybe_unused;
18365   }
18366 }
18367 
18368 bool isParamExpr(size_t N) const override {
18369   return false;
18370 }
18371 
18372 static const ParsedAttrInfoUnused Instance;
18373 };
18374 const ParsedAttrInfoUnused ParsedAttrInfoUnused::Instance;
18375 static constexpr ParsedAttrInfo::Spelling UseHandleSpellings[] = {
18376   {AttributeCommonInfo::AS_GNU, "use_handle"},
18377   {AttributeCommonInfo::AS_CXX11, "clang::use_handle"},
18378   {AttributeCommonInfo::AS_C23, "clang::use_handle"},
18379 };
18380 static constexpr const char *UseHandleArgNames[] = {
18381 "HandleType",};
18382 struct ParsedAttrInfoUseHandle final : public ParsedAttrInfo {
18383   constexpr ParsedAttrInfoUseHandle() : ParsedAttrInfo(
18384     /*AttrKind=*/ParsedAttr::AT_UseHandle,
18385     /*NumArgs=*/1,
18386     /*OptArgs=*/0,
18387     /*NumArgMembers=*/1,
18388     /*HasCustomParsing=*/0,
18389     /*AcceptsExprPack=*/0,
18390     /*IsTargetSpecific=*/0,
18391     /*IsType=*/0,
18392     /*IsStmt=*/0,
18393     /*IsKnownToGCC=*/0,
18394     /*IsSupportedByPragmaAttribute=*/1,
18395     /*Spellings=*/UseHandleSpellings,
18396     /*ArgNames=*/UseHandleArgNames) {}
18397 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18398   if (!isa<ParmVarDecl>(D)) {
18399     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18400       << Attr << Attr.isRegularKeywordAttribute() << "parameters";
18401     return false;
18402   }
18403   return true;
18404 }
18405 
18406 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18407   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18408     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18409   return false;
18410 }
18411 
18412 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18413   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable_is_parameter, /*IsSupported=*/true));
18414 }
18415 
18416 bool isParamExpr(size_t N) const override {
18417   return false;
18418 }
18419 
18420 static const ParsedAttrInfoUseHandle Instance;
18421 };
18422 const ParsedAttrInfoUseHandle ParsedAttrInfoUseHandle::Instance;
18423 static constexpr ParsedAttrInfo::Spelling UsedSpellings[] = {
18424   {AttributeCommonInfo::AS_GNU, "used"},
18425   {AttributeCommonInfo::AS_CXX11, "gnu::used"},
18426   {AttributeCommonInfo::AS_C23, "gnu::used"},
18427 };
18428 struct ParsedAttrInfoUsed final : public ParsedAttrInfo {
18429   constexpr ParsedAttrInfoUsed() : ParsedAttrInfo(
18430     /*AttrKind=*/ParsedAttr::AT_Used,
18431     /*NumArgs=*/0,
18432     /*OptArgs=*/0,
18433     /*NumArgMembers=*/0,
18434     /*HasCustomParsing=*/0,
18435     /*AcceptsExprPack=*/0,
18436     /*IsTargetSpecific=*/0,
18437     /*IsType=*/0,
18438     /*IsStmt=*/0,
18439     /*IsKnownToGCC=*/1,
18440     /*IsSupportedByPragmaAttribute=*/0,
18441     /*Spellings=*/UsedSpellings,
18442     /*ArgNames=*/{}) {}
18443 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18444   if (!isNonLocalVar(D) && !isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
18445     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18446       << Attr << Attr.isRegularKeywordAttribute() << "variables with non-local storage, functions, and Objective-C methods";
18447     return false;
18448   }
18449   return true;
18450 }
18451 
18452 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18453   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18454     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18455   return false;
18456 }
18457 
18458 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
18459   D->addAttr(::new (S.Context) UsedAttr(S.Context, Attr));
18460   return AttributeApplied;
18461 }
18462 
18463 bool isParamExpr(size_t N) const override {
18464   return false;
18465 }
18466 
18467 static const ParsedAttrInfoUsed Instance;
18468 };
18469 const ParsedAttrInfoUsed ParsedAttrInfoUsed::Instance;
18470 static constexpr ParsedAttrInfo::Spelling UsingIfExistsSpellings[] = {
18471   {AttributeCommonInfo::AS_GNU, "using_if_exists"},
18472   {AttributeCommonInfo::AS_CXX11, "clang::using_if_exists"},
18473 };
18474 struct ParsedAttrInfoUsingIfExists final : public ParsedAttrInfo {
18475   constexpr ParsedAttrInfoUsingIfExists() : ParsedAttrInfo(
18476     /*AttrKind=*/ParsedAttr::AT_UsingIfExists,
18477     /*NumArgs=*/0,
18478     /*OptArgs=*/0,
18479     /*NumArgMembers=*/0,
18480     /*HasCustomParsing=*/0,
18481     /*AcceptsExprPack=*/0,
18482     /*IsTargetSpecific=*/0,
18483     /*IsType=*/0,
18484     /*IsStmt=*/0,
18485     /*IsKnownToGCC=*/0,
18486     /*IsSupportedByPragmaAttribute=*/0,
18487     /*Spellings=*/UsingIfExistsSpellings,
18488     /*ArgNames=*/{}) {}
18489 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18490   if (!isa<UsingDecl>(D) && !isa<UnresolvedUsingTypenameDecl>(D) && !isa<UnresolvedUsingValueDecl>(D)) {
18491     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
18492       << Attr << Attr.isRegularKeywordAttribute() << "named declarations, types, and value declarations";
18493     return false;
18494   }
18495   return true;
18496 }
18497 
18498 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18499   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18500     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18501   return false;
18502 }
18503 
18504 bool isParamExpr(size_t N) const override {
18505   return false;
18506 }
18507 
18508 static const ParsedAttrInfoUsingIfExists Instance;
18509 };
18510 const ParsedAttrInfoUsingIfExists ParsedAttrInfoUsingIfExists::Instance;
18511 static constexpr ParsedAttrInfo::Spelling UuidSpellings[] = {
18512   {AttributeCommonInfo::AS_Declspec, "uuid"},
18513   {AttributeCommonInfo::AS_Microsoft, "uuid"},
18514 };
18515 static constexpr const char *UuidArgNames[] = {
18516 "Guid",};
18517 struct ParsedAttrInfoUuid final : public ParsedAttrInfo {
18518   constexpr ParsedAttrInfoUuid() : ParsedAttrInfo(
18519     /*AttrKind=*/ParsedAttr::AT_Uuid,
18520     /*NumArgs=*/1,
18521     /*OptArgs=*/0,
18522     /*NumArgMembers=*/1,
18523     /*HasCustomParsing=*/0,
18524     /*AcceptsExprPack=*/0,
18525     /*IsTargetSpecific=*/0,
18526     /*IsType=*/0,
18527     /*IsStmt=*/0,
18528     /*IsKnownToGCC=*/0,
18529     /*IsSupportedByPragmaAttribute=*/0,
18530     /*Spellings=*/UuidSpellings,
18531     /*ArgNames=*/UuidArgNames) {}
18532 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18533   if (!isa<RecordDecl>(D) && !isa<EnumDecl>(D)) {
18534     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18535       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, classes, and enums";
18536     return false;
18537   }
18538   return true;
18539 }
18540 
18541 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18542   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18543     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18544   return false;
18545 }
18546 
18547 bool acceptsLangOpts(const LangOptions &LangOpts) const override {
18548   return LangOpts.MicrosoftExt || LangOpts.Borland;
18549 }
18550 
18551 bool isParamExpr(size_t N) const override {
18552   return false;
18553 }
18554 
18555 static const ParsedAttrInfoUuid Instance;
18556 };
18557 const ParsedAttrInfoUuid ParsedAttrInfoUuid::Instance;
18558 static constexpr ParsedAttrInfo::Spelling VTablePointerAuthenticationSpellings[] = {
18559   {AttributeCommonInfo::AS_GNU, "ptrauth_vtable_pointer"},
18560   {AttributeCommonInfo::AS_CXX11, "clang::ptrauth_vtable_pointer"},
18561   {AttributeCommonInfo::AS_C23, "clang::ptrauth_vtable_pointer"},
18562 };
18563 static constexpr const char *VTablePointerAuthenticationArgNames[] = {
18564 "Key","AddressDiscrimination","ExtraDiscrimination","CustomDiscriminationValue",};
18565 struct ParsedAttrInfoVTablePointerAuthentication final : public ParsedAttrInfo {
18566   constexpr ParsedAttrInfoVTablePointerAuthentication() : ParsedAttrInfo(
18567     /*AttrKind=*/ParsedAttr::AT_VTablePointerAuthentication,
18568     /*NumArgs=*/3,
18569     /*OptArgs=*/1,
18570     /*NumArgMembers=*/4,
18571     /*HasCustomParsing=*/0,
18572     /*AcceptsExprPack=*/0,
18573     /*IsTargetSpecific=*/0,
18574     /*IsType=*/0,
18575     /*IsStmt=*/0,
18576     /*IsKnownToGCC=*/0,
18577     /*IsSupportedByPragmaAttribute=*/1,
18578     /*Spellings=*/VTablePointerAuthenticationSpellings,
18579     /*ArgNames=*/VTablePointerAuthenticationArgNames) {}
18580 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18581   if (!isa<CXXRecordDecl>(D)) {
18582     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18583       << Attr << Attr.isRegularKeywordAttribute() << "classes";
18584     return false;
18585   }
18586   return true;
18587 }
18588 
18589 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18590   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18591     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18592   return false;
18593 }
18594 
18595 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18596   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
18597 }
18598 
18599 bool isParamExpr(size_t N) const override {
18600   return false;
18601 }
18602 
18603 static const ParsedAttrInfoVTablePointerAuthentication Instance;
18604 };
18605 const ParsedAttrInfoVTablePointerAuthentication ParsedAttrInfoVTablePointerAuthentication::Instance;
18606 static constexpr ParsedAttrInfo::Spelling VecReturnSpellings[] = {
18607   {AttributeCommonInfo::AS_GNU, "vecreturn"},
18608   {AttributeCommonInfo::AS_CXX11, "clang::vecreturn"},
18609 };
18610 struct ParsedAttrInfoVecReturn final : public ParsedAttrInfo {
18611   constexpr ParsedAttrInfoVecReturn() : ParsedAttrInfo(
18612     /*AttrKind=*/ParsedAttr::AT_VecReturn,
18613     /*NumArgs=*/0,
18614     /*OptArgs=*/0,
18615     /*NumArgMembers=*/0,
18616     /*HasCustomParsing=*/0,
18617     /*AcceptsExprPack=*/0,
18618     /*IsTargetSpecific=*/0,
18619     /*IsType=*/0,
18620     /*IsStmt=*/0,
18621     /*IsKnownToGCC=*/0,
18622     /*IsSupportedByPragmaAttribute=*/1,
18623     /*Spellings=*/VecReturnSpellings,
18624     /*ArgNames=*/{}) {}
18625 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18626   if (!isa<CXXRecordDecl>(D)) {
18627     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
18628       << Attr << Attr.isRegularKeywordAttribute() << "classes";
18629     return false;
18630   }
18631   return true;
18632 }
18633 
18634 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18635   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18636     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18637   return false;
18638 }
18639 
18640 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18641   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
18642 }
18643 
18644 bool isParamExpr(size_t N) const override {
18645   return false;
18646 }
18647 
18648 static const ParsedAttrInfoVecReturn Instance;
18649 };
18650 const ParsedAttrInfoVecReturn ParsedAttrInfoVecReturn::Instance;
18651 static constexpr ParsedAttrInfo::Spelling VecTypeHintSpellings[] = {
18652   {AttributeCommonInfo::AS_GNU, "vec_type_hint"},
18653 };
18654 static constexpr const char *VecTypeHintArgNames[] = {
18655 "TypeHint",};
18656 struct ParsedAttrInfoVecTypeHint final : public ParsedAttrInfo {
18657   constexpr ParsedAttrInfoVecTypeHint() : ParsedAttrInfo(
18658     /*AttrKind=*/ParsedAttr::AT_VecTypeHint,
18659     /*NumArgs=*/1,
18660     /*OptArgs=*/0,
18661     /*NumArgMembers=*/1,
18662     /*HasCustomParsing=*/0,
18663     /*AcceptsExprPack=*/0,
18664     /*IsTargetSpecific=*/0,
18665     /*IsType=*/0,
18666     /*IsStmt=*/0,
18667     /*IsKnownToGCC=*/0,
18668     /*IsSupportedByPragmaAttribute=*/1,
18669     /*Spellings=*/VecTypeHintSpellings,
18670     /*ArgNames=*/VecTypeHintArgNames) {}
18671 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18672   if (!isa<FunctionDecl>(D)) {
18673     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
18674       << Attr << Attr.isRegularKeywordAttribute() << "functions";
18675     return false;
18676   }
18677   return true;
18678 }
18679 
18680 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18681   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18682     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18683   return false;
18684 }
18685 
18686 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18687   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
18688 }
18689 
18690 bool isParamExpr(size_t N) const override {
18691   return false;
18692 }
18693 
18694 static const ParsedAttrInfoVecTypeHint Instance;
18695 };
18696 const ParsedAttrInfoVecTypeHint ParsedAttrInfoVecTypeHint::Instance;
18697 static constexpr ParsedAttrInfo::Spelling VectorCallSpellings[] = {
18698   {AttributeCommonInfo::AS_GNU, "vectorcall"},
18699   {AttributeCommonInfo::AS_CXX11, "clang::vectorcall"},
18700   {AttributeCommonInfo::AS_C23, "clang::vectorcall"},
18701   {AttributeCommonInfo::AS_Keyword, "__vectorcall"},
18702   {AttributeCommonInfo::AS_Keyword, "_vectorcall"},
18703 };
18704 struct ParsedAttrInfoVectorCall final : public ParsedAttrInfo {
18705   constexpr ParsedAttrInfoVectorCall() : ParsedAttrInfo(
18706     /*AttrKind=*/ParsedAttr::AT_VectorCall,
18707     /*NumArgs=*/0,
18708     /*OptArgs=*/0,
18709     /*NumArgMembers=*/0,
18710     /*HasCustomParsing=*/0,
18711     /*AcceptsExprPack=*/0,
18712     /*IsTargetSpecific=*/0,
18713     /*IsType=*/1,
18714     /*IsStmt=*/0,
18715     /*IsKnownToGCC=*/0,
18716     /*IsSupportedByPragmaAttribute=*/0,
18717     /*Spellings=*/VectorCallSpellings,
18718     /*ArgNames=*/{}) {}
18719 bool isParamExpr(size_t N) const override {
18720   return false;
18721 }
18722 
18723 static const ParsedAttrInfoVectorCall Instance;
18724 };
18725 const ParsedAttrInfoVectorCall ParsedAttrInfoVectorCall::Instance;
18726 static constexpr ParsedAttrInfo::Spelling VectorSizeSpellings[] = {
18727   {AttributeCommonInfo::AS_GNU, "vector_size"},
18728   {AttributeCommonInfo::AS_CXX11, "gnu::vector_size"},
18729   {AttributeCommonInfo::AS_C23, "gnu::vector_size"},
18730 };
18731 static constexpr const char *VectorSizeArgNames[] = {
18732 "NumBytes",};
18733 struct ParsedAttrInfoVectorSize final : public ParsedAttrInfo {
18734   constexpr ParsedAttrInfoVectorSize() : ParsedAttrInfo(
18735     /*AttrKind=*/ParsedAttr::AT_VectorSize,
18736     /*NumArgs=*/1,
18737     /*OptArgs=*/0,
18738     /*NumArgMembers=*/1,
18739     /*HasCustomParsing=*/0,
18740     /*AcceptsExprPack=*/0,
18741     /*IsTargetSpecific=*/0,
18742     /*IsType=*/1,
18743     /*IsStmt=*/0,
18744     /*IsKnownToGCC=*/1,
18745     /*IsSupportedByPragmaAttribute=*/0,
18746     /*Spellings=*/VectorSizeSpellings,
18747     /*ArgNames=*/VectorSizeArgNames) {}
18748 bool isParamExpr(size_t N) const override {
18749   return (N == 0) || false;
18750 }
18751 
18752 static const ParsedAttrInfoVectorSize Instance;
18753 };
18754 const ParsedAttrInfoVectorSize ParsedAttrInfoVectorSize::Instance;
18755 static constexpr ParsedAttrInfo::Spelling VisibilitySpellings[] = {
18756   {AttributeCommonInfo::AS_GNU, "visibility"},
18757   {AttributeCommonInfo::AS_CXX11, "gnu::visibility"},
18758   {AttributeCommonInfo::AS_C23, "gnu::visibility"},
18759 };
18760 static constexpr const char *VisibilityArgNames[] = {
18761 "Visibility",};
18762 struct ParsedAttrInfoVisibility final : public ParsedAttrInfo {
18763   constexpr ParsedAttrInfoVisibility() : ParsedAttrInfo(
18764     /*AttrKind=*/ParsedAttr::AT_Visibility,
18765     /*NumArgs=*/1,
18766     /*OptArgs=*/0,
18767     /*NumArgMembers=*/1,
18768     /*HasCustomParsing=*/0,
18769     /*AcceptsExprPack=*/0,
18770     /*IsTargetSpecific=*/0,
18771     /*IsType=*/0,
18772     /*IsStmt=*/0,
18773     /*IsKnownToGCC=*/1,
18774     /*IsSupportedByPragmaAttribute=*/0,
18775     /*Spellings=*/VisibilitySpellings,
18776     /*ArgNames=*/VisibilityArgNames) {}
18777 bool isParamExpr(size_t N) const override {
18778   return false;
18779 }
18780 
18781 static const ParsedAttrInfoVisibility Instance;
18782 };
18783 const ParsedAttrInfoVisibility ParsedAttrInfoVisibility::Instance;
18784 static constexpr ParsedAttrInfo::Spelling WarnUnusedSpellings[] = {
18785   {AttributeCommonInfo::AS_GNU, "warn_unused"},
18786   {AttributeCommonInfo::AS_CXX11, "gnu::warn_unused"},
18787   {AttributeCommonInfo::AS_C23, "gnu::warn_unused"},
18788 };
18789 struct ParsedAttrInfoWarnUnused final : public ParsedAttrInfo {
18790   constexpr ParsedAttrInfoWarnUnused() : ParsedAttrInfo(
18791     /*AttrKind=*/ParsedAttr::AT_WarnUnused,
18792     /*NumArgs=*/0,
18793     /*OptArgs=*/0,
18794     /*NumArgMembers=*/0,
18795     /*HasCustomParsing=*/0,
18796     /*AcceptsExprPack=*/0,
18797     /*IsTargetSpecific=*/0,
18798     /*IsType=*/0,
18799     /*IsStmt=*/0,
18800     /*IsKnownToGCC=*/1,
18801     /*IsSupportedByPragmaAttribute=*/1,
18802     /*Spellings=*/WarnUnusedSpellings,
18803     /*ArgNames=*/{}) {}
18804 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18805   if (!isa<RecordDecl>(D)) {
18806     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18807       << Attr << Attr.isRegularKeywordAttribute() << "structs, unions, and classes";
18808     return false;
18809   }
18810   return true;
18811 }
18812 
18813 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18814   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18815     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18816   return false;
18817 }
18818 
18819 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18820   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
18821 }
18822 
18823 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
18824   D->addAttr(::new (S.Context) WarnUnusedAttr(S.Context, Attr));
18825   return AttributeApplied;
18826 }
18827 
18828 bool isParamExpr(size_t N) const override {
18829   return false;
18830 }
18831 
18832 static const ParsedAttrInfoWarnUnused Instance;
18833 };
18834 const ParsedAttrInfoWarnUnused ParsedAttrInfoWarnUnused::Instance;
18835 static constexpr ParsedAttrInfo::Spelling WarnUnusedResultSpellings[] = {
18836   {AttributeCommonInfo::AS_CXX11, "nodiscard"},
18837   {AttributeCommonInfo::AS_C23, "nodiscard"},
18838   {AttributeCommonInfo::AS_CXX11, "clang::warn_unused_result"},
18839   {AttributeCommonInfo::AS_GNU, "warn_unused_result"},
18840   {AttributeCommonInfo::AS_CXX11, "gnu::warn_unused_result"},
18841   {AttributeCommonInfo::AS_C23, "gnu::warn_unused_result"},
18842 };
18843 static constexpr const char *WarnUnusedResultArgNames[] = {
18844 "Message",};
18845 struct ParsedAttrInfoWarnUnusedResult final : public ParsedAttrInfo {
18846   constexpr ParsedAttrInfoWarnUnusedResult() : ParsedAttrInfo(
18847     /*AttrKind=*/ParsedAttr::AT_WarnUnusedResult,
18848     /*NumArgs=*/0,
18849     /*OptArgs=*/1,
18850     /*NumArgMembers=*/1,
18851     /*HasCustomParsing=*/0,
18852     /*AcceptsExprPack=*/0,
18853     /*IsTargetSpecific=*/0,
18854     /*IsType=*/0,
18855     /*IsStmt=*/0,
18856     /*IsKnownToGCC=*/1,
18857     /*IsSupportedByPragmaAttribute=*/1,
18858     /*Spellings=*/WarnUnusedResultSpellings,
18859     /*ArgNames=*/WarnUnusedResultArgNames) {}
18860 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18861   if (!isa<ObjCMethodDecl>(D) && !isa<EnumDecl>(D) && !isa<RecordDecl>(D) && !isFunctionLike(D) && !isa<TypedefNameDecl>(D)) {
18862     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18863       << Attr << Attr.isRegularKeywordAttribute() << "Objective-C methods, enums, structs, unions, classes, functions, function pointers, and typedefs";
18864     return false;
18865   }
18866   return true;
18867 }
18868 
18869 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18870   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18871     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18872   return false;
18873 }
18874 
18875 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
18876   enum Spelling {
18877     CXX11_nodiscard = 0,
18878     C23_nodiscard = 1,
18879     CXX11_clang_warn_unused_result = 2,
18880     GNU_warn_unused_result = 3,
18881     CXX11_gnu_warn_unused_result = 4,
18882     C23_gnu_warn_unused_result = 5,
18883   SpellingNotCalculated = 15
18884 
18885   };
18886 
18887   unsigned Idx = Attr.getAttributeSpellingListIndex();
18888   switch (Idx) {
18889     default: llvm_unreachable("Unknown spelling list index");
18890     case 0: return CXX11_nodiscard;
18891     case 1: return C23_nodiscard;
18892     case 2: return CXX11_clang_warn_unused_result;
18893     case 3: return GNU_warn_unused_result;
18894     case 4: return CXX11_gnu_warn_unused_result;
18895     case 5: return C23_gnu_warn_unused_result;
18896   }
18897 }
18898 
18899 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18900   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
18901   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_enum, /*IsSupported=*/true));
18902   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
18903   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_hasType_functionType, /*IsSupported=*/true));
18904   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_type_alias, /*IsSupported=*/true));
18905 }
18906 
18907 bool isParamExpr(size_t N) const override {
18908   return false;
18909 }
18910 
18911 static const ParsedAttrInfoWarnUnusedResult Instance;
18912 };
18913 const ParsedAttrInfoWarnUnusedResult ParsedAttrInfoWarnUnusedResult::Instance;
18914 static constexpr ParsedAttrInfo::Spelling WeakSpellings[] = {
18915   {AttributeCommonInfo::AS_GNU, "weak"},
18916   {AttributeCommonInfo::AS_CXX11, "gnu::weak"},
18917   {AttributeCommonInfo::AS_C23, "gnu::weak"},
18918 };
18919 struct ParsedAttrInfoWeak final : public ParsedAttrInfo {
18920   constexpr ParsedAttrInfoWeak() : ParsedAttrInfo(
18921     /*AttrKind=*/ParsedAttr::AT_Weak,
18922     /*NumArgs=*/0,
18923     /*OptArgs=*/0,
18924     /*NumArgMembers=*/0,
18925     /*HasCustomParsing=*/0,
18926     /*AcceptsExprPack=*/0,
18927     /*IsTargetSpecific=*/0,
18928     /*IsType=*/0,
18929     /*IsStmt=*/0,
18930     /*IsKnownToGCC=*/1,
18931     /*IsSupportedByPragmaAttribute=*/1,
18932     /*Spellings=*/WeakSpellings,
18933     /*ArgNames=*/{}) {}
18934 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
18935   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D) && !isa<CXXRecordDecl>(D)) {
18936     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
18937       << Attr << Attr.isRegularKeywordAttribute() << "variables, functions, and classes";
18938     return false;
18939   }
18940   return true;
18941 }
18942 
18943 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
18944   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
18945     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
18946   return false;
18947 }
18948 
18949 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
18950   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
18951   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
18952   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_record, /*IsSupported=*/true));
18953 }
18954 
18955 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
18956   D->addAttr(::new (S.Context) WeakAttr(S.Context, Attr));
18957   return AttributeApplied;
18958 }
18959 
18960 bool isParamExpr(size_t N) const override {
18961   return false;
18962 }
18963 
18964 static const ParsedAttrInfoWeak Instance;
18965 };
18966 const ParsedAttrInfoWeak ParsedAttrInfoWeak::Instance;
18967 static constexpr ParsedAttrInfo::Spelling WeakImportSpellings[] = {
18968   {AttributeCommonInfo::AS_GNU, "weak_import"},
18969   {AttributeCommonInfo::AS_CXX11, "clang::weak_import"},
18970   {AttributeCommonInfo::AS_C23, "clang::weak_import"},
18971 };
18972 struct ParsedAttrInfoWeakImport final : public ParsedAttrInfo {
18973   constexpr ParsedAttrInfoWeakImport() : ParsedAttrInfo(
18974     /*AttrKind=*/ParsedAttr::AT_WeakImport,
18975     /*NumArgs=*/0,
18976     /*OptArgs=*/0,
18977     /*NumArgMembers=*/0,
18978     /*HasCustomParsing=*/0,
18979     /*AcceptsExprPack=*/0,
18980     /*IsTargetSpecific=*/0,
18981     /*IsType=*/0,
18982     /*IsStmt=*/0,
18983     /*IsKnownToGCC=*/0,
18984     /*IsSupportedByPragmaAttribute=*/0,
18985     /*Spellings=*/WeakImportSpellings,
18986     /*ArgNames=*/{}) {}
18987 bool isParamExpr(size_t N) const override {
18988   return false;
18989 }
18990 
18991 static const ParsedAttrInfoWeakImport Instance;
18992 };
18993 const ParsedAttrInfoWeakImport ParsedAttrInfoWeakImport::Instance;
18994 static constexpr ParsedAttrInfo::Spelling WeakRefSpellings[] = {
18995   {AttributeCommonInfo::AS_GNU, "weakref"},
18996   {AttributeCommonInfo::AS_CXX11, "gnu::weakref"},
18997   {AttributeCommonInfo::AS_C23, "gnu::weakref"},
18998 };
18999 static constexpr const char *WeakRefArgNames[] = {
19000 "Aliasee",};
19001 struct ParsedAttrInfoWeakRef final : public ParsedAttrInfo {
19002   constexpr ParsedAttrInfoWeakRef() : ParsedAttrInfo(
19003     /*AttrKind=*/ParsedAttr::AT_WeakRef,
19004     /*NumArgs=*/0,
19005     /*OptArgs=*/1,
19006     /*NumArgMembers=*/1,
19007     /*HasCustomParsing=*/0,
19008     /*AcceptsExprPack=*/0,
19009     /*IsTargetSpecific=*/0,
19010     /*IsType=*/0,
19011     /*IsStmt=*/0,
19012     /*IsKnownToGCC=*/1,
19013     /*IsSupportedByPragmaAttribute=*/1,
19014     /*Spellings=*/WeakRefSpellings,
19015     /*ArgNames=*/WeakRefArgNames) {}
19016 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19017   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
19018     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19019       << Attr << Attr.isRegularKeywordAttribute() << "variables and functions";
19020     return false;
19021   }
19022   return true;
19023 }
19024 
19025 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19026   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19027     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19028   return false;
19029 }
19030 
19031 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19032   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_variable, /*IsSupported=*/true));
19033   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19034 }
19035 
19036 bool isParamExpr(size_t N) const override {
19037   return false;
19038 }
19039 
19040 static const ParsedAttrInfoWeakRef Instance;
19041 };
19042 const ParsedAttrInfoWeakRef ParsedAttrInfoWeakRef::Instance;
19043 static constexpr ParsedAttrInfo::Spelling WebAssemblyExportNameSpellings[] = {
19044   {AttributeCommonInfo::AS_GNU, "export_name"},
19045   {AttributeCommonInfo::AS_CXX11, "clang::export_name"},
19046   {AttributeCommonInfo::AS_C23, "clang::export_name"},
19047 };
19048 static constexpr const char *WebAssemblyExportNameArgNames[] = {
19049 "ExportName",};
19050 struct ParsedAttrInfoWebAssemblyExportName final : public ParsedAttrInfo {
19051   constexpr ParsedAttrInfoWebAssemblyExportName() : ParsedAttrInfo(
19052     /*AttrKind=*/ParsedAttr::AT_WebAssemblyExportName,
19053     /*NumArgs=*/1,
19054     /*OptArgs=*/0,
19055     /*NumArgMembers=*/1,
19056     /*HasCustomParsing=*/0,
19057     /*AcceptsExprPack=*/0,
19058     /*IsTargetSpecific=*/1,
19059     /*IsType=*/0,
19060     /*IsStmt=*/0,
19061     /*IsKnownToGCC=*/0,
19062     /*IsSupportedByPragmaAttribute=*/1,
19063     /*Spellings=*/WebAssemblyExportNameSpellings,
19064     /*ArgNames=*/WebAssemblyExportNameArgNames) {}
19065 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19066   if (!isa<FunctionDecl>(D)) {
19067     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19068       << Attr << Attr.isRegularKeywordAttribute() << "functions";
19069     return false;
19070   }
19071   return true;
19072 }
19073 
19074 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19075   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19076     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19077   return false;
19078 }
19079 
19080 bool existsInTarget(const TargetInfo &Target) const override {
19081   const llvm::Triple &T = Target.getTriple(); (void)T;
19082   return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64);
19083 }
19084 
19085 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19086   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19087 }
19088 
19089 bool isParamExpr(size_t N) const override {
19090   return false;
19091 }
19092 
19093 static const ParsedAttrInfoWebAssemblyExportName Instance;
19094 };
19095 const ParsedAttrInfoWebAssemblyExportName ParsedAttrInfoWebAssemblyExportName::Instance;
19096 static constexpr ParsedAttrInfo::Spelling WebAssemblyFuncrefSpellings[] = {
19097   {AttributeCommonInfo::AS_Keyword, "__funcref"},
19098 };
19099 struct ParsedAttrInfoWebAssemblyFuncref final : public ParsedAttrInfo {
19100   constexpr ParsedAttrInfoWebAssemblyFuncref() : ParsedAttrInfo(
19101     /*AttrKind=*/ParsedAttr::AT_WebAssemblyFuncref,
19102     /*NumArgs=*/0,
19103     /*OptArgs=*/0,
19104     /*NumArgMembers=*/0,
19105     /*HasCustomParsing=*/0,
19106     /*AcceptsExprPack=*/0,
19107     /*IsTargetSpecific=*/1,
19108     /*IsType=*/1,
19109     /*IsStmt=*/0,
19110     /*IsKnownToGCC=*/0,
19111     /*IsSupportedByPragmaAttribute=*/0,
19112     /*Spellings=*/WebAssemblyFuncrefSpellings,
19113     /*ArgNames=*/{}) {}
19114 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19115   if (!isFunctionPointer(D)) {
19116     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19117       << Attr << Attr.isRegularKeywordAttribute() << "functions pointers";
19118     return false;
19119   }
19120   return true;
19121 }
19122 
19123 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19124   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19125     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19126   return false;
19127 }
19128 
19129 bool existsInTarget(const TargetInfo &Target) const override {
19130   const llvm::Triple &T = Target.getTriple(); (void)T;
19131   return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64);
19132 }
19133 
19134 bool isParamExpr(size_t N) const override {
19135   return false;
19136 }
19137 
19138 static const ParsedAttrInfoWebAssemblyFuncref Instance;
19139 };
19140 const ParsedAttrInfoWebAssemblyFuncref ParsedAttrInfoWebAssemblyFuncref::Instance;
19141 static constexpr ParsedAttrInfo::Spelling WebAssemblyImportModuleSpellings[] = {
19142   {AttributeCommonInfo::AS_GNU, "import_module"},
19143   {AttributeCommonInfo::AS_CXX11, "clang::import_module"},
19144   {AttributeCommonInfo::AS_C23, "clang::import_module"},
19145 };
19146 static constexpr const char *WebAssemblyImportModuleArgNames[] = {
19147 "ImportModule",};
19148 struct ParsedAttrInfoWebAssemblyImportModule final : public ParsedAttrInfo {
19149   constexpr ParsedAttrInfoWebAssemblyImportModule() : ParsedAttrInfo(
19150     /*AttrKind=*/ParsedAttr::AT_WebAssemblyImportModule,
19151     /*NumArgs=*/1,
19152     /*OptArgs=*/0,
19153     /*NumArgMembers=*/1,
19154     /*HasCustomParsing=*/0,
19155     /*AcceptsExprPack=*/0,
19156     /*IsTargetSpecific=*/1,
19157     /*IsType=*/0,
19158     /*IsStmt=*/0,
19159     /*IsKnownToGCC=*/0,
19160     /*IsSupportedByPragmaAttribute=*/1,
19161     /*Spellings=*/WebAssemblyImportModuleSpellings,
19162     /*ArgNames=*/WebAssemblyImportModuleArgNames) {}
19163 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19164   if (!isa<FunctionDecl>(D)) {
19165     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19166       << Attr << Attr.isRegularKeywordAttribute() << "functions";
19167     return false;
19168   }
19169   return true;
19170 }
19171 
19172 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19173   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19174     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19175   return false;
19176 }
19177 
19178 bool existsInTarget(const TargetInfo &Target) const override {
19179   const llvm::Triple &T = Target.getTriple(); (void)T;
19180   return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64);
19181 }
19182 
19183 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19184   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19185 }
19186 
19187 bool isParamExpr(size_t N) const override {
19188   return false;
19189 }
19190 
19191 static const ParsedAttrInfoWebAssemblyImportModule Instance;
19192 };
19193 const ParsedAttrInfoWebAssemblyImportModule ParsedAttrInfoWebAssemblyImportModule::Instance;
19194 static constexpr ParsedAttrInfo::Spelling WebAssemblyImportNameSpellings[] = {
19195   {AttributeCommonInfo::AS_GNU, "import_name"},
19196   {AttributeCommonInfo::AS_CXX11, "clang::import_name"},
19197   {AttributeCommonInfo::AS_C23, "clang::import_name"},
19198 };
19199 static constexpr const char *WebAssemblyImportNameArgNames[] = {
19200 "ImportName",};
19201 struct ParsedAttrInfoWebAssemblyImportName final : public ParsedAttrInfo {
19202   constexpr ParsedAttrInfoWebAssemblyImportName() : ParsedAttrInfo(
19203     /*AttrKind=*/ParsedAttr::AT_WebAssemblyImportName,
19204     /*NumArgs=*/1,
19205     /*OptArgs=*/0,
19206     /*NumArgMembers=*/1,
19207     /*HasCustomParsing=*/0,
19208     /*AcceptsExprPack=*/0,
19209     /*IsTargetSpecific=*/1,
19210     /*IsType=*/0,
19211     /*IsStmt=*/0,
19212     /*IsKnownToGCC=*/0,
19213     /*IsSupportedByPragmaAttribute=*/1,
19214     /*Spellings=*/WebAssemblyImportNameSpellings,
19215     /*ArgNames=*/WebAssemblyImportNameArgNames) {}
19216 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19217   if (!isa<FunctionDecl>(D)) {
19218     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19219       << Attr << Attr.isRegularKeywordAttribute() << "functions";
19220     return false;
19221   }
19222   return true;
19223 }
19224 
19225 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19226   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19227     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19228   return false;
19229 }
19230 
19231 bool existsInTarget(const TargetInfo &Target) const override {
19232   const llvm::Triple &T = Target.getTriple(); (void)T;
19233   return true && (T.getArch() == llvm::Triple::wasm32 || T.getArch() == llvm::Triple::wasm64);
19234 }
19235 
19236 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19237   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19238 }
19239 
19240 bool isParamExpr(size_t N) const override {
19241   return false;
19242 }
19243 
19244 static const ParsedAttrInfoWebAssemblyImportName Instance;
19245 };
19246 const ParsedAttrInfoWebAssemblyImportName ParsedAttrInfoWebAssemblyImportName::Instance;
19247 static constexpr ParsedAttrInfo::Spelling WorkGroupSizeHintSpellings[] = {
19248   {AttributeCommonInfo::AS_GNU, "work_group_size_hint"},
19249 };
19250 static constexpr const char *WorkGroupSizeHintArgNames[] = {
19251 "XDim","YDim","ZDim",};
19252 struct ParsedAttrInfoWorkGroupSizeHint final : public ParsedAttrInfo {
19253   constexpr ParsedAttrInfoWorkGroupSizeHint() : ParsedAttrInfo(
19254     /*AttrKind=*/ParsedAttr::AT_WorkGroupSizeHint,
19255     /*NumArgs=*/3,
19256     /*OptArgs=*/0,
19257     /*NumArgMembers=*/3,
19258     /*HasCustomParsing=*/0,
19259     /*AcceptsExprPack=*/0,
19260     /*IsTargetSpecific=*/0,
19261     /*IsType=*/0,
19262     /*IsStmt=*/0,
19263     /*IsKnownToGCC=*/0,
19264     /*IsSupportedByPragmaAttribute=*/1,
19265     /*Spellings=*/WorkGroupSizeHintSpellings,
19266     /*ArgNames=*/WorkGroupSizeHintArgNames) {}
19267 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19268   if (!isa<FunctionDecl>(D)) {
19269     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19270       << Attr << Attr.isRegularKeywordAttribute() << "functions";
19271     return false;
19272   }
19273   return true;
19274 }
19275 
19276 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19277   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19278     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19279   return false;
19280 }
19281 
19282 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19283   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19284 }
19285 
19286 bool isParamExpr(size_t N) const override {
19287   return false;
19288 }
19289 
19290 static const ParsedAttrInfoWorkGroupSizeHint Instance;
19291 };
19292 const ParsedAttrInfoWorkGroupSizeHint ParsedAttrInfoWorkGroupSizeHint::Instance;
19293 static constexpr ParsedAttrInfo::Spelling X86ForceAlignArgPointerSpellings[] = {
19294   {AttributeCommonInfo::AS_GNU, "force_align_arg_pointer"},
19295   {AttributeCommonInfo::AS_CXX11, "gnu::force_align_arg_pointer"},
19296   {AttributeCommonInfo::AS_C23, "gnu::force_align_arg_pointer"},
19297 };
19298 struct ParsedAttrInfoX86ForceAlignArgPointer final : public ParsedAttrInfo {
19299   constexpr ParsedAttrInfoX86ForceAlignArgPointer() : ParsedAttrInfo(
19300     /*AttrKind=*/ParsedAttr::AT_X86ForceAlignArgPointer,
19301     /*NumArgs=*/0,
19302     /*OptArgs=*/0,
19303     /*NumArgMembers=*/0,
19304     /*HasCustomParsing=*/0,
19305     /*AcceptsExprPack=*/0,
19306     /*IsTargetSpecific=*/1,
19307     /*IsType=*/0,
19308     /*IsStmt=*/0,
19309     /*IsKnownToGCC=*/1,
19310     /*IsSupportedByPragmaAttribute=*/0,
19311     /*Spellings=*/X86ForceAlignArgPointerSpellings,
19312     /*ArgNames=*/{}) {}
19313 bool existsInTarget(const TargetInfo &Target) const override {
19314   const llvm::Triple &T = Target.getTriple(); (void)T;
19315   return true && (T.getArch() == llvm::Triple::x86 || T.getArch() == llvm::Triple::x86_64);
19316 }
19317 
19318 bool isParamExpr(size_t N) const override {
19319   return false;
19320 }
19321 
19322 static const ParsedAttrInfoX86ForceAlignArgPointer Instance;
19323 };
19324 const ParsedAttrInfoX86ForceAlignArgPointer ParsedAttrInfoX86ForceAlignArgPointer::Instance;
19325 static constexpr ParsedAttrInfo::Spelling XRayInstrumentSpellings[] = {
19326   {AttributeCommonInfo::AS_GNU, "xray_always_instrument"},
19327   {AttributeCommonInfo::AS_CXX11, "clang::xray_always_instrument"},
19328   {AttributeCommonInfo::AS_C23, "clang::xray_always_instrument"},
19329   {AttributeCommonInfo::AS_GNU, "xray_never_instrument"},
19330   {AttributeCommonInfo::AS_CXX11, "clang::xray_never_instrument"},
19331   {AttributeCommonInfo::AS_C23, "clang::xray_never_instrument"},
19332 };
19333 struct ParsedAttrInfoXRayInstrument final : public ParsedAttrInfo {
19334   constexpr ParsedAttrInfoXRayInstrument() : ParsedAttrInfo(
19335     /*AttrKind=*/ParsedAttr::AT_XRayInstrument,
19336     /*NumArgs=*/0,
19337     /*OptArgs=*/0,
19338     /*NumArgMembers=*/0,
19339     /*HasCustomParsing=*/0,
19340     /*AcceptsExprPack=*/0,
19341     /*IsTargetSpecific=*/0,
19342     /*IsType=*/0,
19343     /*IsStmt=*/0,
19344     /*IsKnownToGCC=*/0,
19345     /*IsSupportedByPragmaAttribute=*/1,
19346     /*Spellings=*/XRayInstrumentSpellings,
19347     /*ArgNames=*/{}) {}
19348 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19349   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
19350     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
19351       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
19352     return false;
19353   }
19354   return true;
19355 }
19356 
19357 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19358   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19359     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19360   return false;
19361 }
19362 
19363 unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const override {
19364   enum Spelling {
19365     GNU_xray_always_instrument = 0,
19366     CXX11_clang_xray_always_instrument = 1,
19367     C23_clang_xray_always_instrument = 2,
19368     GNU_xray_never_instrument = 3,
19369     CXX11_clang_xray_never_instrument = 4,
19370     C23_clang_xray_never_instrument = 5,
19371   SpellingNotCalculated = 15
19372 
19373   };
19374 
19375   unsigned Idx = Attr.getAttributeSpellingListIndex();
19376   switch (Idx) {
19377     default: llvm_unreachable("Unknown spelling list index");
19378     case 0: return GNU_xray_always_instrument;
19379     case 1: return CXX11_clang_xray_always_instrument;
19380     case 2: return C23_clang_xray_always_instrument;
19381     case 3: return GNU_xray_never_instrument;
19382     case 4: return CXX11_clang_xray_never_instrument;
19383     case 5: return C23_clang_xray_never_instrument;
19384   }
19385 }
19386 
19387 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19388   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19389   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
19390 }
19391 
19392 AttrHandling handleDeclAttribute(Sema &S, Decl *D,const ParsedAttr &Attr) const override {
19393   D->addAttr(::new (S.Context) XRayInstrumentAttr(S.Context, Attr));
19394   return AttributeApplied;
19395 }
19396 
19397 bool isParamExpr(size_t N) const override {
19398   return false;
19399 }
19400 
19401 static const ParsedAttrInfoXRayInstrument Instance;
19402 };
19403 const ParsedAttrInfoXRayInstrument ParsedAttrInfoXRayInstrument::Instance;
19404 static constexpr ParsedAttrInfo::Spelling XRayLogArgsSpellings[] = {
19405   {AttributeCommonInfo::AS_GNU, "xray_log_args"},
19406   {AttributeCommonInfo::AS_CXX11, "clang::xray_log_args"},
19407   {AttributeCommonInfo::AS_C23, "clang::xray_log_args"},
19408 };
19409 static constexpr const char *XRayLogArgsArgNames[] = {
19410 "ArgumentCount",};
19411 struct ParsedAttrInfoXRayLogArgs final : public ParsedAttrInfo {
19412   constexpr ParsedAttrInfoXRayLogArgs() : ParsedAttrInfo(
19413     /*AttrKind=*/ParsedAttr::AT_XRayLogArgs,
19414     /*NumArgs=*/1,
19415     /*OptArgs=*/0,
19416     /*NumArgMembers=*/1,
19417     /*HasCustomParsing=*/0,
19418     /*AcceptsExprPack=*/0,
19419     /*IsTargetSpecific=*/0,
19420     /*IsType=*/0,
19421     /*IsStmt=*/0,
19422     /*IsKnownToGCC=*/0,
19423     /*IsSupportedByPragmaAttribute=*/1,
19424     /*Spellings=*/XRayLogArgsSpellings,
19425     /*ArgNames=*/XRayLogArgsArgNames) {}
19426 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19427   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
19428     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type_str)
19429       << Attr << Attr.isRegularKeywordAttribute() << "functions and Objective-C methods";
19430     return false;
19431   }
19432   return true;
19433 }
19434 
19435 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19436   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19437     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19438   return false;
19439 }
19440 
19441 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19442   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19443   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_objc_method, /*IsSupported=*/LangOpts.ObjC));
19444 }
19445 
19446 bool isParamExpr(size_t N) const override {
19447   return false;
19448 }
19449 
19450 static const ParsedAttrInfoXRayLogArgs Instance;
19451 };
19452 const ParsedAttrInfoXRayLogArgs ParsedAttrInfoXRayLogArgs::Instance;
19453 static constexpr ParsedAttrInfo::Spelling ZeroCallUsedRegsSpellings[] = {
19454   {AttributeCommonInfo::AS_GNU, "zero_call_used_regs"},
19455   {AttributeCommonInfo::AS_CXX11, "gnu::zero_call_used_regs"},
19456   {AttributeCommonInfo::AS_C23, "gnu::zero_call_used_regs"},
19457 };
19458 static constexpr const char *ZeroCallUsedRegsArgNames[] = {
19459 "ZeroCallUsedRegs",};
19460 struct ParsedAttrInfoZeroCallUsedRegs final : public ParsedAttrInfo {
19461   constexpr ParsedAttrInfoZeroCallUsedRegs() : ParsedAttrInfo(
19462     /*AttrKind=*/ParsedAttr::AT_ZeroCallUsedRegs,
19463     /*NumArgs=*/1,
19464     /*OptArgs=*/0,
19465     /*NumArgMembers=*/1,
19466     /*HasCustomParsing=*/0,
19467     /*AcceptsExprPack=*/0,
19468     /*IsTargetSpecific=*/0,
19469     /*IsType=*/0,
19470     /*IsStmt=*/0,
19471     /*IsKnownToGCC=*/1,
19472     /*IsSupportedByPragmaAttribute=*/1,
19473     /*Spellings=*/ZeroCallUsedRegsSpellings,
19474     /*ArgNames=*/ZeroCallUsedRegsArgNames) {}
19475 bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const override {
19476   if (!isa<FunctionDecl>(D)) {
19477     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type_str)
19478       << Attr << Attr.isRegularKeywordAttribute() << "functions";
19479     return false;
19480   }
19481   return true;
19482 }
19483 
19484 bool diagAppertainsToStmt(Sema &S, const ParsedAttr &AL, const Stmt *St) const override {
19485   S.Diag(AL.getLoc(), diag::err_decl_attribute_invalid_on_stmt)
19486     << AL << AL.isRegularKeywordAttribute() << St->getBeginLoc();
19487   return false;
19488 }
19489 
19490 void getPragmaAttributeMatchRules(llvm::SmallVectorImpl<std::pair<attr::SubjectMatchRule, bool>> &MatchRules, const LangOptions &LangOpts) const override {
19491   MatchRules.push_back(std::make_pair(attr::SubjectMatchRule_function, /*IsSupported=*/true));
19492 }
19493 
19494 bool isParamExpr(size_t N) const override {
19495   return false;
19496 }
19497 
19498 static const ParsedAttrInfoZeroCallUsedRegs Instance;
19499 };
19500 const ParsedAttrInfoZeroCallUsedRegs ParsedAttrInfoZeroCallUsedRegs::Instance;
19501 static const ParsedAttrInfo *AttrInfoMap[] = {
19502 &ParsedAttrInfoAArch64SVEPcs::Instance,
19503 &ParsedAttrInfoAArch64VectorPcs::Instance,
19504 &ParsedAttrInfoAMDGPUFlatWorkGroupSize::Instance,
19505 &ParsedAttrInfoAMDGPUKernelCall::Instance,
19506 &ParsedAttrInfoAMDGPUMaxNumWorkGroups::Instance,
19507 &ParsedAttrInfoAMDGPUNumSGPR::Instance,
19508 &ParsedAttrInfoAMDGPUNumVGPR::Instance,
19509 &ParsedAttrInfoAMDGPUWavesPerEU::Instance,
19510 &ParsedAttrInfoInterrupt::Instance,
19511 &ParsedAttrInfoAVRSignal::Instance,
19512 &ParsedAttrInfoAbiTag::Instance,
19513 &ParsedAttrInfoAcquireCapability::Instance,
19514 &ParsedAttrInfoAcquireHandle::Instance,
19515 &ParsedAttrInfoAcquiredAfter::Instance,
19516 &ParsedAttrInfoAcquiredBefore::Instance,
19517 &ParsedAttrInfoAddressSpace::Instance,
19518 &ParsedAttrInfoAlias::Instance,
19519 &ParsedAttrInfoAlignValue::Instance,
19520 &ParsedAttrInfoAligned::Instance,
19521 &ParsedAttrInfoAllocAlign::Instance,
19522 &ParsedAttrInfoAllocSize::Instance,
19523 &ParsedAttrInfoAllocating::Instance,
19524 &ParsedAttrInfoAlwaysDestroy::Instance,
19525 &ParsedAttrInfoAlwaysInline::Instance,
19526 &ParsedAttrInfoAnalyzerNoReturn::Instance,
19527 &ParsedAttrInfoAnnotate::Instance,
19528 &ParsedAttrInfoAnnotateType::Instance,
19529 &ParsedAttrInfoAnyX86NoCallerSavedRegisters::Instance,
19530 &ParsedAttrInfoAnyX86NoCfCheck::Instance,
19531 &ParsedAttrInfoArcWeakrefUnavailable::Instance,
19532 &ParsedAttrInfoArgumentWithTypeTag::Instance,
19533 &ParsedAttrInfoArmAgnostic::Instance,
19534 &ParsedAttrInfoArmBuiltinAlias::Instance,
19535 &ParsedAttrInfoArmIn::Instance,
19536 &ParsedAttrInfoArmInOut::Instance,
19537 &ParsedAttrInfoArmLocallyStreaming::Instance,
19538 &ParsedAttrInfoArmMveStrictPolymorphism::Instance,
19539 &ParsedAttrInfoArmNew::Instance,
19540 &ParsedAttrInfoArmOut::Instance,
19541 &ParsedAttrInfoArmPreserves::Instance,
19542 &ParsedAttrInfoArmStreaming::Instance,
19543 &ParsedAttrInfoArmStreamingCompatible::Instance,
19544 &ParsedAttrInfoArmSveVectorBits::Instance,
19545 &ParsedAttrInfoArtificial::Instance,
19546 &ParsedAttrInfoAssertCapability::Instance,
19547 &ParsedAttrInfoAssertExclusiveLock::Instance,
19548 &ParsedAttrInfoAssertSharedLock::Instance,
19549 &ParsedAttrInfoAssumeAligned::Instance,
19550 &ParsedAttrInfoAvailability::Instance,
19551 &ParsedAttrInfoAvailableOnlyInDefaultEvalMethod::Instance,
19552 &ParsedAttrInfoBPFFastCall::Instance,
19553 &ParsedAttrInfoBPFPreserveAccessIndex::Instance,
19554 &ParsedAttrInfoBPFPreserveStaticOffset::Instance,
19555 &ParsedAttrInfoBTFDeclTag::Instance,
19556 &ParsedAttrInfoBTFTypeTag::Instance,
19557 &ParsedAttrInfoBlocking::Instance,
19558 &ParsedAttrInfoBlocks::Instance,
19559 &ParsedAttrInfoBuiltinAlias::Instance,
19560 &ParsedAttrInfoCDecl::Instance,
19561 &ParsedAttrInfoCFAuditedTransfer::Instance,
19562 &ParsedAttrInfoCFConsumed::Instance,
19563 &ParsedAttrInfoCFGuard::Instance,
19564 &ParsedAttrInfoCFICanonicalJumpTable::Instance,
19565 &ParsedAttrInfoCFReturnsNotRetained::Instance,
19566 &ParsedAttrInfoCFReturnsRetained::Instance,
19567 &ParsedAttrInfoCFUnknownTransfer::Instance,
19568 &ParsedAttrInfoCPUDispatch::Instance,
19569 &ParsedAttrInfoCPUSpecific::Instance,
19570 &ParsedAttrInfoCUDAConstant::Instance,
19571 &ParsedAttrInfoCUDADevice::Instance,
19572 &ParsedAttrInfoCUDADeviceBuiltinSurfaceType::Instance,
19573 &ParsedAttrInfoCUDADeviceBuiltinTextureType::Instance,
19574 &ParsedAttrInfoCUDAGlobal::Instance,
19575 &ParsedAttrInfoCUDAGridConstant::Instance,
19576 &ParsedAttrInfoCUDAHost::Instance,
19577 &ParsedAttrInfoCUDAInvalidTarget::Instance,
19578 &ParsedAttrInfoCUDALaunchBounds::Instance,
19579 &ParsedAttrInfoCUDAShared::Instance,
19580 &ParsedAttrInfoCXX11NoReturn::Instance,
19581 &ParsedAttrInfoCXXAssume::Instance,
19582 &ParsedAttrInfoCallableWhen::Instance,
19583 &ParsedAttrInfoCallback::Instance,
19584 &ParsedAttrInfoCalledOnce::Instance,
19585 &ParsedAttrInfoCapability::Instance,
19586 &ParsedAttrInfoCarriesDependency::Instance,
19587 &ParsedAttrInfoCleanup::Instance,
19588 &ParsedAttrInfoClspvLibclcBuiltin::Instance,
19589 &ParsedAttrInfoCmseNSCall::Instance,
19590 &ParsedAttrInfoCmseNSEntry::Instance,
19591 &ParsedAttrInfoCodeAlign::Instance,
19592 &ParsedAttrInfoCodeModel::Instance,
19593 &ParsedAttrInfoCodeSeg::Instance,
19594 &ParsedAttrInfoCold::Instance,
19595 &ParsedAttrInfoCommon::Instance,
19596 &ParsedAttrInfoConst::Instance,
19597 &ParsedAttrInfoConstInit::Instance,
19598 &ParsedAttrInfoConstructor::Instance,
19599 &ParsedAttrInfoConsumable::Instance,
19600 &ParsedAttrInfoConsumableAutoCast::Instance,
19601 &ParsedAttrInfoConsumableSetOnRead::Instance,
19602 &ParsedAttrInfoConvergent::Instance,
19603 &ParsedAttrInfoCoroAwaitElidable::Instance,
19604 &ParsedAttrInfoCoroAwaitElidableArgument::Instance,
19605 &ParsedAttrInfoCoroDisableLifetimeBound::Instance,
19606 &ParsedAttrInfoCoroLifetimeBound::Instance,
19607 &ParsedAttrInfoCoroOnlyDestroyWhenComplete::Instance,
19608 &ParsedAttrInfoCoroReturnType::Instance,
19609 &ParsedAttrInfoCoroWrapper::Instance,
19610 &ParsedAttrInfoCountedBy::Instance,
19611 &ParsedAttrInfoCountedByOrNull::Instance,
19612 &ParsedAttrInfoDLLExport::Instance,
19613 &ParsedAttrInfoDLLExportStaticLocal::Instance,
19614 &ParsedAttrInfoDLLImport::Instance,
19615 &ParsedAttrInfoDLLImportStaticLocal::Instance,
19616 &ParsedAttrInfoDeprecated::Instance,
19617 &ParsedAttrInfoDestructor::Instance,
19618 &ParsedAttrInfoDiagnoseAsBuiltin::Instance,
19619 &ParsedAttrInfoDiagnoseIf::Instance,
19620 &ParsedAttrInfoDisableSanitizerInstrumentation::Instance,
19621 &ParsedAttrInfoDisableTailCalls::Instance,
19622 &ParsedAttrInfoEmptyBases::Instance,
19623 &ParsedAttrInfoEnableIf::Instance,
19624 &ParsedAttrInfoEnforceTCB::Instance,
19625 &ParsedAttrInfoEnforceTCBLeaf::Instance,
19626 &ParsedAttrInfoEnumExtensibility::Instance,
19627 &ParsedAttrInfoError::Instance,
19628 &ParsedAttrInfoExcludeFromExplicitInstantiation::Instance,
19629 &ParsedAttrInfoExclusiveTrylockFunction::Instance,
19630 &ParsedAttrInfoExplicitInit::Instance,
19631 &ParsedAttrInfoExtVectorType::Instance,
19632 &ParsedAttrInfoExternalSourceSymbol::Instance,
19633 &ParsedAttrInfoFallThrough::Instance,
19634 &ParsedAttrInfoFastCall::Instance,
19635 &ParsedAttrInfoFlagEnum::Instance,
19636 &ParsedAttrInfoFlatten::Instance,
19637 &ParsedAttrInfoFormat::Instance,
19638 &ParsedAttrInfoFormatArg::Instance,
19639 &ParsedAttrInfoFunctionReturnThunks::Instance,
19640 &ParsedAttrInfoGNUInline::Instance,
19641 &ParsedAttrInfoGuardedBy::Instance,
19642 &ParsedAttrInfoGuardedVar::Instance,
19643 &ParsedAttrInfoHIPManaged::Instance,
19644 &ParsedAttrInfoHLSLContainedType::Instance,
19645 &ParsedAttrInfoHLSLControlFlowHint::Instance,
19646 &ParsedAttrInfoHLSLGroupSharedAddressSpace::Instance,
19647 &ParsedAttrInfoHLSLLoopHint::Instance,
19648 &ParsedAttrInfoHLSLNumThreads::Instance,
19649 &ParsedAttrInfoHLSLPackOffset::Instance,
19650 &ParsedAttrInfoHLSLParamModifier::Instance,
19651 &ParsedAttrInfoHLSLROV::Instance,
19652 &ParsedAttrInfoHLSLRawBuffer::Instance,
19653 &ParsedAttrInfoHLSLResource::Instance,
19654 &ParsedAttrInfoHLSLResourceBinding::Instance,
19655 &ParsedAttrInfoHLSLResourceClass::Instance,
19656 &ParsedAttrInfoHLSLSV_DispatchThreadID::Instance,
19657 &ParsedAttrInfoHLSLSV_GroupID::Instance,
19658 &ParsedAttrInfoHLSLSV_GroupIndex::Instance,
19659 &ParsedAttrInfoHLSLSV_GroupThreadID::Instance,
19660 &ParsedAttrInfoHLSLShader::Instance,
19661 &ParsedAttrInfoHLSLWaveSize::Instance,
19662 &ParsedAttrInfoHot::Instance,
19663 &ParsedAttrInfoHybridPatchable::Instance,
19664 &ParsedAttrInfoIBAction::Instance,
19665 &ParsedAttrInfoIBOutlet::Instance,
19666 &ParsedAttrInfoIBOutletCollection::Instance,
19667 &ParsedAttrInfoIFunc::Instance,
19668 &ParsedAttrInfoInitPriority::Instance,
19669 &ParsedAttrInfoIntelOclBicc::Instance,
19670 &ParsedAttrInfoInternalLinkage::Instance,
19671 &ParsedAttrInfoLTOVisibilityPublic::Instance,
19672 &ParsedAttrInfoLayoutVersion::Instance,
19673 &ParsedAttrInfoLeaf::Instance,
19674 &ParsedAttrInfoLifetimeBound::Instance,
19675 &ParsedAttrInfoLifetimeCaptureBy::Instance,
19676 &ParsedAttrInfoLikely::Instance,
19677 &ParsedAttrInfoLoaderUninitialized::Instance,
19678 &ParsedAttrInfoLockReturned::Instance,
19679 &ParsedAttrInfoLockable::Instance,
19680 &ParsedAttrInfoLocksExcluded::Instance,
19681 &ParsedAttrInfoLoopHint::Instance,
19682 &ParsedAttrInfoM68kRTD::Instance,
19683 &ParsedAttrInfoMIGServerRoutine::Instance,
19684 &ParsedAttrInfoMSABI::Instance,
19685 &ParsedAttrInfoMSAllocator::Instance,
19686 &ParsedAttrInfoMSConstexpr::Instance,
19687 &ParsedAttrInfoMSInheritance::Instance,
19688 &ParsedAttrInfoMSNoVTable::Instance,
19689 &ParsedAttrInfoMSStruct::Instance,
19690 &ParsedAttrInfoMatrixType::Instance,
19691 &ParsedAttrInfoMayAlias::Instance,
19692 &ParsedAttrInfoMaybeUndef::Instance,
19693 &ParsedAttrInfoMicroMips::Instance,
19694 &ParsedAttrInfoMinSize::Instance,
19695 &ParsedAttrInfoMinVectorWidth::Instance,
19696 &ParsedAttrInfoMips16::Instance,
19697 &ParsedAttrInfoMipsLongCall::Instance,
19698 &ParsedAttrInfoMipsShortCall::Instance,
19699 &ParsedAttrInfoMode::Instance,
19700 &ParsedAttrInfoMustTail::Instance,
19701 &ParsedAttrInfoNSConsumed::Instance,
19702 &ParsedAttrInfoNSConsumesSelf::Instance,
19703 &ParsedAttrInfoNSErrorDomain::Instance,
19704 &ParsedAttrInfoNSReturnsAutoreleased::Instance,
19705 &ParsedAttrInfoNSReturnsNotRetained::Instance,
19706 &ParsedAttrInfoNSReturnsRetained::Instance,
19707 &ParsedAttrInfoNVPTXKernel::Instance,
19708 &ParsedAttrInfoNaked::Instance,
19709 &ParsedAttrInfoNeonPolyVectorType::Instance,
19710 &ParsedAttrInfoNeonVectorType::Instance,
19711 &ParsedAttrInfoNoAlias::Instance,
19712 &ParsedAttrInfoNoBuiltin::Instance,
19713 &ParsedAttrInfoNoCommon::Instance,
19714 &ParsedAttrInfoNoConvergent::Instance,
19715 &ParsedAttrInfoNoDebug::Instance,
19716 &ParsedAttrInfoNoDeref::Instance,
19717 &ParsedAttrInfoNoDestroy::Instance,
19718 &ParsedAttrInfoNoDuplicate::Instance,
19719 &ParsedAttrInfoNoEscape::Instance,
19720 &ParsedAttrInfoNoInline::Instance,
19721 &ParsedAttrInfoNoInstrumentFunction::Instance,
19722 &ParsedAttrInfoNoMerge::Instance,
19723 &ParsedAttrInfoNoMicroMips::Instance,
19724 &ParsedAttrInfoNoMips16::Instance,
19725 &ParsedAttrInfoNoProfileFunction::Instance,
19726 &ParsedAttrInfoNoRandomizeLayout::Instance,
19727 &ParsedAttrInfoNoReturn::Instance,
19728 &ParsedAttrInfoNoSanitize::Instance,
19729 &ParsedAttrInfoNoSanitizeSpecific::Instance,
19730 &ParsedAttrInfoNoSpecializations::Instance,
19731 &ParsedAttrInfoNoSpeculativeLoadHardening::Instance,
19732 &ParsedAttrInfoNoSplitStack::Instance,
19733 &ParsedAttrInfoNoStackProtector::Instance,
19734 &ParsedAttrInfoNoThreadSafetyAnalysis::Instance,
19735 &ParsedAttrInfoNoThrow::Instance,
19736 &ParsedAttrInfoNoTrivialAutoVarInit::Instance,
19737 &ParsedAttrInfoNoUniqueAddress::Instance,
19738 &ParsedAttrInfoNoUwtable::Instance,
19739 &ParsedAttrInfoNonAllocating::Instance,
19740 &ParsedAttrInfoNonBlocking::Instance,
19741 &ParsedAttrInfoNonNull::Instance,
19742 &ParsedAttrInfoNotTailCalled::Instance,
19743 &ParsedAttrInfoOMPAssume::Instance,
19744 &ParsedAttrInfoOSConsumed::Instance,
19745 &ParsedAttrInfoOSConsumesThis::Instance,
19746 &ParsedAttrInfoOSReturnsNotRetained::Instance,
19747 &ParsedAttrInfoOSReturnsRetained::Instance,
19748 &ParsedAttrInfoOSReturnsRetainedOnNonZero::Instance,
19749 &ParsedAttrInfoOSReturnsRetainedOnZero::Instance,
19750 &ParsedAttrInfoObjCBoxable::Instance,
19751 &ParsedAttrInfoObjCBridge::Instance,
19752 &ParsedAttrInfoObjCBridgeMutable::Instance,
19753 &ParsedAttrInfoObjCBridgeRelated::Instance,
19754 &ParsedAttrInfoObjCClassStub::Instance,
19755 &ParsedAttrInfoObjCDesignatedInitializer::Instance,
19756 &ParsedAttrInfoObjCDirect::Instance,
19757 &ParsedAttrInfoObjCDirectMembers::Instance,
19758 &ParsedAttrInfoObjCException::Instance,
19759 &ParsedAttrInfoObjCExplicitProtocolImpl::Instance,
19760 &ParsedAttrInfoObjCExternallyRetained::Instance,
19761 &ParsedAttrInfoObjCGC::Instance,
19762 &ParsedAttrInfoObjCIndependentClass::Instance,
19763 &ParsedAttrInfoObjCInertUnsafeUnretained::Instance,
19764 &ParsedAttrInfoObjCKindOf::Instance,
19765 &ParsedAttrInfoObjCMethodFamily::Instance,
19766 &ParsedAttrInfoObjCNSObject::Instance,
19767 &ParsedAttrInfoObjCNonLazyClass::Instance,
19768 &ParsedAttrInfoObjCNonRuntimeProtocol::Instance,
19769 &ParsedAttrInfoObjCOwnership::Instance,
19770 &ParsedAttrInfoObjCPreciseLifetime::Instance,
19771 &ParsedAttrInfoObjCRequiresPropertyDefs::Instance,
19772 &ParsedAttrInfoObjCRequiresSuper::Instance,
19773 &ParsedAttrInfoObjCReturnsInnerPointer::Instance,
19774 &ParsedAttrInfoObjCRootClass::Instance,
19775 &ParsedAttrInfoObjCRuntimeName::Instance,
19776 &ParsedAttrInfoObjCRuntimeVisible::Instance,
19777 &ParsedAttrInfoObjCSubclassingRestricted::Instance,
19778 &ParsedAttrInfoOpenCLAccess::Instance,
19779 &ParsedAttrInfoOpenCLConstantAddressSpace::Instance,
19780 &ParsedAttrInfoOpenCLGenericAddressSpace::Instance,
19781 &ParsedAttrInfoOpenCLGlobalAddressSpace::Instance,
19782 &ParsedAttrInfoOpenCLGlobalDeviceAddressSpace::Instance,
19783 &ParsedAttrInfoOpenCLGlobalHostAddressSpace::Instance,
19784 &ParsedAttrInfoOpenCLIntelReqdSubGroupSize::Instance,
19785 &ParsedAttrInfoOpenCLKernel::Instance,
19786 &ParsedAttrInfoOpenCLLocalAddressSpace::Instance,
19787 &ParsedAttrInfoOpenCLNoSVM::Instance,
19788 &ParsedAttrInfoOpenCLPrivateAddressSpace::Instance,
19789 &ParsedAttrInfoOpenCLUnrollHint::Instance,
19790 &ParsedAttrInfoOptimizeNone::Instance,
19791 &ParsedAttrInfoOverloadable::Instance,
19792 &ParsedAttrInfoOwner::Instance,
19793 &ParsedAttrInfoOwnership::Instance,
19794 &ParsedAttrInfoPacked::Instance,
19795 &ParsedAttrInfoParamTypestate::Instance,
19796 &ParsedAttrInfoPascal::Instance,
19797 &ParsedAttrInfoPassObjectSize::Instance,
19798 &ParsedAttrInfoPatchableFunctionEntry::Instance,
19799 &ParsedAttrInfoPcs::Instance,
19800 &ParsedAttrInfoPointer::Instance,
19801 &ParsedAttrInfoPragmaClangBSSSection::Instance,
19802 &ParsedAttrInfoPragmaClangDataSection::Instance,
19803 &ParsedAttrInfoPragmaClangRelroSection::Instance,
19804 &ParsedAttrInfoPragmaClangRodataSection::Instance,
19805 &ParsedAttrInfoPragmaClangTextSection::Instance,
19806 &ParsedAttrInfoPreferredName::Instance,
19807 &ParsedAttrInfoPreferredType::Instance,
19808 &ParsedAttrInfoPreserveAll::Instance,
19809 &ParsedAttrInfoPreserveMost::Instance,
19810 &ParsedAttrInfoPreserveNone::Instance,
19811 &ParsedAttrInfoPtGuardedBy::Instance,
19812 &ParsedAttrInfoPtGuardedVar::Instance,
19813 &ParsedAttrInfoPtr32::Instance,
19814 &ParsedAttrInfoPtr64::Instance,
19815 &ParsedAttrInfoPure::Instance,
19816 &ParsedAttrInfoRISCVRVVVectorBits::Instance,
19817 &ParsedAttrInfoRISCVVectorCC::Instance,
19818 &ParsedAttrInfoRandomizeLayout::Instance,
19819 &ParsedAttrInfoReadOnlyPlacement::Instance,
19820 &ParsedAttrInfoRegCall::Instance,
19821 &ParsedAttrInfoRegparm::Instance,
19822 &ParsedAttrInfoReinitializes::Instance,
19823 &ParsedAttrInfoReleaseCapability::Instance,
19824 &ParsedAttrInfoReleaseHandle::Instance,
19825 &ParsedAttrInfoReqdWorkGroupSize::Instance,
19826 &ParsedAttrInfoRequiresCapability::Instance,
19827 &ParsedAttrInfoRestrict::Instance,
19828 &ParsedAttrInfoRetain::Instance,
19829 &ParsedAttrInfoReturnTypestate::Instance,
19830 &ParsedAttrInfoReturnsNonNull::Instance,
19831 &ParsedAttrInfoReturnsTwice::Instance,
19832 &ParsedAttrInfoSPtr::Instance,
19833 &ParsedAttrInfoSYCLKernel::Instance,
19834 &ParsedAttrInfoSYCLKernelEntryPoint::Instance,
19835 &ParsedAttrInfoSYCLSpecialClass::Instance,
19836 &ParsedAttrInfoScopedLockable::Instance,
19837 &ParsedAttrInfoSection::Instance,
19838 &ParsedAttrInfoSelectAny::Instance,
19839 &ParsedAttrInfoSentinel::Instance,
19840 &ParsedAttrInfoSetTypestate::Instance,
19841 &ParsedAttrInfoSharedTrylockFunction::Instance,
19842 &ParsedAttrInfoSizedBy::Instance,
19843 &ParsedAttrInfoSizedByOrNull::Instance,
19844 &ParsedAttrInfoSpeculativeLoadHardening::Instance,
19845 &ParsedAttrInfoStandaloneDebug::Instance,
19846 &ParsedAttrInfoStdCall::Instance,
19847 &ParsedAttrInfoStrictFP::Instance,
19848 &ParsedAttrInfoStrictGuardStackCheck::Instance,
19849 &ParsedAttrInfoSuppress::Instance,
19850 &ParsedAttrInfoSwiftAsync::Instance,
19851 &ParsedAttrInfoSwiftAsyncCall::Instance,
19852 &ParsedAttrInfoSwiftAsyncContext::Instance,
19853 &ParsedAttrInfoSwiftAsyncError::Instance,
19854 &ParsedAttrInfoSwiftAsyncName::Instance,
19855 &ParsedAttrInfoSwiftAttr::Instance,
19856 &ParsedAttrInfoSwiftBridge::Instance,
19857 &ParsedAttrInfoSwiftBridgedTypedef::Instance,
19858 &ParsedAttrInfoSwiftCall::Instance,
19859 &ParsedAttrInfoSwiftContext::Instance,
19860 &ParsedAttrInfoSwiftError::Instance,
19861 &ParsedAttrInfoSwiftErrorResult::Instance,
19862 &ParsedAttrInfoSwiftIndirectResult::Instance,
19863 &ParsedAttrInfoSwiftName::Instance,
19864 &ParsedAttrInfoSwiftNewType::Instance,
19865 &ParsedAttrInfoSwiftObjCMembers::Instance,
19866 &ParsedAttrInfoSwiftPrivate::Instance,
19867 &ParsedAttrInfoSysVABI::Instance,
19868 &ParsedAttrInfoTLSModel::Instance,
19869 &ParsedAttrInfoTarget::Instance,
19870 &ParsedAttrInfoTargetClones::Instance,
19871 &ParsedAttrInfoTargetVersion::Instance,
19872 &ParsedAttrInfoTestTypestate::Instance,
19873 &ParsedAttrInfoThisCall::Instance,
19874 &ParsedAttrInfoThread::Instance,
19875 &ParsedAttrInfoTransparentUnion::Instance,
19876 &ParsedAttrInfoTrivialABI::Instance,
19877 &ParsedAttrInfoTryAcquireCapability::Instance,
19878 &ParsedAttrInfoTypeNonNull::Instance,
19879 &ParsedAttrInfoTypeNullUnspecified::Instance,
19880 &ParsedAttrInfoTypeNullable::Instance,
19881 &ParsedAttrInfoTypeNullableResult::Instance,
19882 &ParsedAttrInfoTypeTagForDatatype::Instance,
19883 &ParsedAttrInfoTypeVisibility::Instance,
19884 &ParsedAttrInfoUPtr::Instance,
19885 &ParsedAttrInfoUnavailable::Instance,
19886 &ParsedAttrInfoUninitialized::Instance,
19887 &ParsedAttrInfoUnlikely::Instance,
19888 &ParsedAttrInfoUnsafeBufferUsage::Instance,
19889 &ParsedAttrInfoUnused::Instance,
19890 &ParsedAttrInfoUseHandle::Instance,
19891 &ParsedAttrInfoUsed::Instance,
19892 &ParsedAttrInfoUsingIfExists::Instance,
19893 &ParsedAttrInfoUuid::Instance,
19894 &ParsedAttrInfoVTablePointerAuthentication::Instance,
19895 &ParsedAttrInfoVecReturn::Instance,
19896 &ParsedAttrInfoVecTypeHint::Instance,
19897 &ParsedAttrInfoVectorCall::Instance,
19898 &ParsedAttrInfoVectorSize::Instance,
19899 &ParsedAttrInfoVisibility::Instance,
19900 &ParsedAttrInfoWarnUnused::Instance,
19901 &ParsedAttrInfoWarnUnusedResult::Instance,
19902 &ParsedAttrInfoWeak::Instance,
19903 &ParsedAttrInfoWeakImport::Instance,
19904 &ParsedAttrInfoWeakRef::Instance,
19905 &ParsedAttrInfoWebAssemblyExportName::Instance,
19906 &ParsedAttrInfoWebAssemblyFuncref::Instance,
19907 &ParsedAttrInfoWebAssemblyImportModule::Instance,
19908 &ParsedAttrInfoWebAssemblyImportName::Instance,
19909 &ParsedAttrInfoWorkGroupSizeHint::Instance,
19910 &ParsedAttrInfoX86ForceAlignArgPointer::Instance,
19911 &ParsedAttrInfoXRayInstrument::Instance,
19912 &ParsedAttrInfoXRayLogArgs::Instance,
19913 &ParsedAttrInfoZeroCallUsedRegs::Instance,
19914 };
19915 
19916 static void handleAttrWithDelayedArgs(Sema &S, Decl *D, const ParsedAttr &Attr) {
19917   SmallVector<Expr *, 4> ArgExprs;
19918   ArgExprs.reserve(Attr.getNumArgs());
19919   for (unsigned I = 0; I < Attr.getNumArgs(); ++I) {
19920     assert(!Attr.isArgIdent(I));
19921     ArgExprs.push_back(Attr.getArgAsExpr(I));
19922   }
19923   clang::Attr *CreatedAttr = nullptr;
19924   switch (Attr.getKind()) {
19925   default:
19926     llvm_unreachable("Attribute cannot hold delayed arguments.");
19927   case ParsedAttr::AT_Annotate: {
19928     CreatedAttr = AnnotateAttr::CreateWithDelayedArgs(S.Context, ArgExprs.data(), ArgExprs.size(), Attr);
19929     break;
19930   }
19931   case ParsedAttr::AT_AnnotateType: {
19932     CreatedAttr = AnnotateTypeAttr::CreateWithDelayedArgs(S.Context, ArgExprs.data(), ArgExprs.size(), Attr);
19933     break;
19934   }
19935   }
19936   D->addAttr(CreatedAttr);
19937 }
19938 
19939 static bool checkAttributeMatchRuleAppliesTo(const Decl *D, attr::SubjectMatchRule rule) {
19940   switch (rule) {
19941   case attr::SubjectMatchRule_block:
19942     return isa<BlockDecl>(D);
19943   case attr::SubjectMatchRule_enum:
19944     return isa<EnumDecl>(D);
19945   case attr::SubjectMatchRule_enum_constant:
19946     return isa<EnumConstantDecl>(D);
19947   case attr::SubjectMatchRule_field:
19948     return isa<FieldDecl>(D);
19949   case attr::SubjectMatchRule_function:
19950     return isa<FunctionDecl>(D);
19951   case attr::SubjectMatchRule_function_is_member:
19952     return isa<CXXMethodDecl>(D);
19953   case attr::SubjectMatchRule_namespace:
19954     return isa<NamespaceDecl>(D);
19955   case attr::SubjectMatchRule_objc_category:
19956     return isa<ObjCCategoryDecl>(D);
19957   case attr::SubjectMatchRule_objc_implementation:
19958     return isa<ObjCImplDecl>(D);
19959   case attr::SubjectMatchRule_objc_interface:
19960     return isa<ObjCInterfaceDecl>(D);
19961   case attr::SubjectMatchRule_objc_method:
19962     return isa<ObjCMethodDecl>(D);
19963   case attr::SubjectMatchRule_objc_method_is_instance:
19964     return isObjCInstanceMethod(D);
19965   case attr::SubjectMatchRule_objc_property:
19966     return isa<ObjCPropertyDecl>(D);
19967   case attr::SubjectMatchRule_objc_protocol:
19968     return isa<ObjCProtocolDecl>(D);
19969   case attr::SubjectMatchRule_record:
19970     return isa<RecordDecl>(D) || isa<CXXRecordDecl>(D);
19971   case attr::SubjectMatchRule_record_not_is_union:
19972     return isStruct(D);
19973   case attr::SubjectMatchRule_hasType_abstract:
19974     assert(false && "Abstract matcher rule isn't allowed");
19975     return false;
19976   case attr::SubjectMatchRule_hasType_functionType:
19977     return isFunctionLike(D);
19978   case attr::SubjectMatchRule_type_alias:
19979     return isa<TypedefNameDecl>(D);
19980   case attr::SubjectMatchRule_variable:
19981     return isa<VarDecl>(D);
19982   case attr::SubjectMatchRule_variable_is_thread_local:
19983     return isTLSVar(D);
19984   case attr::SubjectMatchRule_variable_is_global:
19985     return isGlobalVar(D);
19986   case attr::SubjectMatchRule_variable_is_local:
19987     return isLocalVar(D);
19988   case attr::SubjectMatchRule_variable_is_parameter:
19989     return isa<ParmVarDecl>(D);
19990   case attr::SubjectMatchRule_variable_not_is_parameter:
19991     return isNonParmVar(D);
19992   }
19993   llvm_unreachable("Invalid match rule");
19994 return false;
19995 }
19996 
19997 #elif defined(WANT_DECL_MERGE_LOGIC)
19998 
19999 static bool DiagnoseMutualExclusions(Sema &S, const NamedDecl *D, const Attr *A) {
20000   if (const auto *Second = dyn_cast<AlwaysDestroyAttr>(A)) {
20001     if (const auto *First = D->getAttr<NoDestroyAttr>()) {
20002       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20003       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20004       return false;
20005     }
20006     return true;
20007   }
20008   if (const auto *Second = dyn_cast<AlwaysInlineAttr>(A)) {
20009     if (const auto *First = D->getAttr<NotTailCalledAttr>()) {
20010       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20011       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20012       return false;
20013     }
20014     return true;
20015   }
20016   if (const auto *Second = dyn_cast<CFAuditedTransferAttr>(A)) {
20017     if (const auto *First = D->getAttr<CFUnknownTransferAttr>()) {
20018       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20019       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20020       return false;
20021     }
20022     return true;
20023   }
20024   if (const auto *Second = dyn_cast<CFUnknownTransferAttr>(A)) {
20025     if (const auto *First = D->getAttr<CFAuditedTransferAttr>()) {
20026       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20027       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20028       return false;
20029     }
20030     return true;
20031   }
20032   if (const auto *Second = dyn_cast<CPUDispatchAttr>(A)) {
20033     if (const auto *First = D->getAttr<TargetClonesAttr>()) {
20034       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20035       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20036       return false;
20037     }
20038     if (const auto *First = D->getAttr<TargetVersionAttr>()) {
20039       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20040       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20041       return false;
20042     }
20043     if (const auto *First = D->getAttr<TargetAttr>()) {
20044       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20045       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20046       return false;
20047     }
20048     if (const auto *First = D->getAttr<CPUSpecificAttr>()) {
20049       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20050       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20051       return false;
20052     }
20053     return true;
20054   }
20055   if (const auto *Second = dyn_cast<CPUSpecificAttr>(A)) {
20056     if (const auto *First = D->getAttr<TargetClonesAttr>()) {
20057       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20058       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20059       return false;
20060     }
20061     if (const auto *First = D->getAttr<TargetVersionAttr>()) {
20062       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20063       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20064       return false;
20065     }
20066     if (const auto *First = D->getAttr<TargetAttr>()) {
20067       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20068       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20069       return false;
20070     }
20071     if (const auto *First = D->getAttr<CPUDispatchAttr>()) {
20072       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20073       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20074       return false;
20075     }
20076     return true;
20077   }
20078   if (const auto *Second = dyn_cast<CUDAConstantAttr>(A)) {
20079     if (const auto *First = D->getAttr<CUDASharedAttr>()) {
20080       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20081       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20082       return false;
20083     }
20084     if (const auto *First = D->getAttr<HIPManagedAttr>()) {
20085       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20086       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20087       return false;
20088     }
20089     return true;
20090   }
20091   if (const auto *Second = dyn_cast<CUDADeviceAttr>(A)) {
20092     if (const auto *First = D->getAttr<CUDAGlobalAttr>()) {
20093       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20094       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20095       return false;
20096     }
20097     return true;
20098   }
20099   if (const auto *Second = dyn_cast<CUDADeviceBuiltinSurfaceTypeAttr>(A)) {
20100     if (const auto *First = D->getAttr<CUDADeviceBuiltinTextureTypeAttr>()) {
20101       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20102       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20103       return false;
20104     }
20105     return true;
20106   }
20107   if (const auto *Second = dyn_cast<CUDADeviceBuiltinTextureTypeAttr>(A)) {
20108     if (const auto *First = D->getAttr<CUDADeviceBuiltinSurfaceTypeAttr>()) {
20109       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20110       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20111       return false;
20112     }
20113     return true;
20114   }
20115   if (const auto *Second = dyn_cast<CUDAGlobalAttr>(A)) {
20116     if (const auto *First = D->getAttr<CUDADeviceAttr>()) {
20117       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20118       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20119       return false;
20120     }
20121     if (const auto *First = D->getAttr<CUDAHostAttr>()) {
20122       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20123       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20124       return false;
20125     }
20126     return true;
20127   }
20128   if (const auto *Second = dyn_cast<CUDAHostAttr>(A)) {
20129     if (const auto *First = D->getAttr<CUDAGlobalAttr>()) {
20130       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20131       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20132       return false;
20133     }
20134     return true;
20135   }
20136   if (const auto *Second = dyn_cast<CUDASharedAttr>(A)) {
20137     if (const auto *First = D->getAttr<CUDAConstantAttr>()) {
20138       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20139       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20140       return false;
20141     }
20142     if (const auto *First = D->getAttr<HIPManagedAttr>()) {
20143       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20144       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20145       return false;
20146     }
20147     return true;
20148   }
20149   if (const auto *Second = dyn_cast<ColdAttr>(A)) {
20150     if (const auto *First = D->getAttr<HotAttr>()) {
20151       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20152       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20153       return false;
20154     }
20155     return true;
20156   }
20157   if (const auto *Second = dyn_cast<CommonAttr>(A)) {
20158     if (const auto *First = D->getAttr<InternalLinkageAttr>()) {
20159       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20160       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20161       return false;
20162     }
20163     return true;
20164   }
20165   if (const auto *Second = dyn_cast<ConvergentAttr>(A)) {
20166     if (const auto *First = D->getAttr<NoConvergentAttr>()) {
20167       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20168       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20169       return false;
20170     }
20171     return true;
20172   }
20173   if (const auto *Second = dyn_cast<DisableTailCallsAttr>(A)) {
20174     if (const auto *First = D->getAttr<NakedAttr>()) {
20175       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20176       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20177       return false;
20178     }
20179     return true;
20180   }
20181   if (const auto *Second = dyn_cast<HIPManagedAttr>(A)) {
20182     if (const auto *First = D->getAttr<CUDAConstantAttr>()) {
20183       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20184       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20185       return false;
20186     }
20187     if (const auto *First = D->getAttr<CUDASharedAttr>()) {
20188       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20189       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20190       return false;
20191     }
20192     return true;
20193   }
20194   if (const auto *Second = dyn_cast<HotAttr>(A)) {
20195     if (const auto *First = D->getAttr<ColdAttr>()) {
20196       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20197       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20198       return false;
20199     }
20200     return true;
20201   }
20202   if (const auto *Second = dyn_cast<InternalLinkageAttr>(A)) {
20203     if (const auto *First = D->getAttr<CommonAttr>()) {
20204       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20205       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20206       return false;
20207     }
20208     return true;
20209   }
20210   if (const auto *Second = dyn_cast<MicroMipsAttr>(A)) {
20211     if (const auto *First = D->getAttr<Mips16Attr>()) {
20212       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20213       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20214       return false;
20215     }
20216     return true;
20217   }
20218   if (const auto *Second = dyn_cast<Mips16Attr>(A)) {
20219     if (const auto *First = D->getAttr<MipsInterruptAttr>()) {
20220       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20221       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20222       return false;
20223     }
20224     if (const auto *First = D->getAttr<MicroMipsAttr>()) {
20225       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20226       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20227       return false;
20228     }
20229     return true;
20230   }
20231   if (const auto *Second = dyn_cast<MipsLongCallAttr>(A)) {
20232     if (const auto *First = D->getAttr<MipsShortCallAttr>()) {
20233       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20234       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20235       return false;
20236     }
20237     return true;
20238   }
20239   if (const auto *Second = dyn_cast<MipsShortCallAttr>(A)) {
20240     if (const auto *First = D->getAttr<MipsLongCallAttr>()) {
20241       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20242       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20243       return false;
20244     }
20245     return true;
20246   }
20247   if (const auto *Second = dyn_cast<NakedAttr>(A)) {
20248     if (const auto *First = D->getAttr<DisableTailCallsAttr>()) {
20249       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20250       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20251       return false;
20252     }
20253     return true;
20254   }
20255   if (const auto *Second = dyn_cast<NoConvergentAttr>(A)) {
20256     if (const auto *First = D->getAttr<ConvergentAttr>()) {
20257       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20258       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20259       return false;
20260     }
20261     return true;
20262   }
20263   if (const auto *Second = dyn_cast<NoDestroyAttr>(A)) {
20264     if (const auto *First = D->getAttr<AlwaysDestroyAttr>()) {
20265       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20266       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20267       return false;
20268     }
20269     return true;
20270   }
20271   if (const auto *Second = dyn_cast<NoRandomizeLayoutAttr>(A)) {
20272     if (const auto *First = D->getAttr<RandomizeLayoutAttr>()) {
20273       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20274       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20275       return false;
20276     }
20277     return true;
20278   }
20279   if (const auto *Second = dyn_cast<NoSpeculativeLoadHardeningAttr>(A)) {
20280     if (const auto *First = D->getAttr<SpeculativeLoadHardeningAttr>()) {
20281       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20282       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20283       return false;
20284     }
20285     return true;
20286   }
20287   if (const auto *Second = dyn_cast<NotTailCalledAttr>(A)) {
20288     if (const auto *First = D->getAttr<AlwaysInlineAttr>()) {
20289       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20290       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20291       return false;
20292     }
20293     return true;
20294   }
20295   if (const auto *Second = dyn_cast<OwnerAttr>(A)) {
20296     if (const auto *First = D->getAttr<PointerAttr>()) {
20297       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20298       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20299       return false;
20300     }
20301     return true;
20302   }
20303   if (const auto *Second = dyn_cast<PointerAttr>(A)) {
20304     if (const auto *First = D->getAttr<OwnerAttr>()) {
20305       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20306       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20307       return false;
20308     }
20309     return true;
20310   }
20311   if (const auto *Second = dyn_cast<RandomizeLayoutAttr>(A)) {
20312     if (const auto *First = D->getAttr<NoRandomizeLayoutAttr>()) {
20313       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20314       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20315       return false;
20316     }
20317     return true;
20318   }
20319   if (const auto *Second = dyn_cast<SpeculativeLoadHardeningAttr>(A)) {
20320     if (const auto *First = D->getAttr<NoSpeculativeLoadHardeningAttr>()) {
20321       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20322       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20323       return false;
20324     }
20325     return true;
20326   }
20327   if (const auto *Second = dyn_cast<TargetAttr>(A)) {
20328     if (const auto *First = D->getAttr<TargetClonesAttr>()) {
20329       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20330       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20331       return false;
20332     }
20333     if (const auto *First = D->getAttr<TargetVersionAttr>()) {
20334       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20335       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20336       return false;
20337     }
20338     if (const auto *First = D->getAttr<CPUDispatchAttr>()) {
20339       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20340       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20341       return false;
20342     }
20343     if (const auto *First = D->getAttr<CPUSpecificAttr>()) {
20344       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20345       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20346       return false;
20347     }
20348     return true;
20349   }
20350   if (const auto *Second = dyn_cast<TargetClonesAttr>(A)) {
20351     if (const auto *First = D->getAttr<TargetVersionAttr>()) {
20352       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20353       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20354       return false;
20355     }
20356     if (const auto *First = D->getAttr<TargetAttr>()) {
20357       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20358       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20359       return false;
20360     }
20361     if (const auto *First = D->getAttr<CPUDispatchAttr>()) {
20362       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20363       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20364       return false;
20365     }
20366     if (const auto *First = D->getAttr<CPUSpecificAttr>()) {
20367       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20368       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20369       return false;
20370     }
20371     return true;
20372   }
20373   if (const auto *Second = dyn_cast<TargetVersionAttr>(A)) {
20374     if (const auto *First = D->getAttr<TargetClonesAttr>()) {
20375       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20376       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20377       return false;
20378     }
20379     if (const auto *First = D->getAttr<TargetAttr>()) {
20380       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20381       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20382       return false;
20383     }
20384     if (const auto *First = D->getAttr<CPUDispatchAttr>()) {
20385       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20386       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20387       return false;
20388     }
20389     if (const auto *First = D->getAttr<CPUSpecificAttr>()) {
20390       S.Diag(First->getLocation(), diag::err_attributes_are_not_compatible) << First << Second << (First->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20391       S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20392       return false;
20393     }
20394     return true;
20395   }
20396   return true;
20397 }
20398 
20399 #elif defined(WANT_STMT_MERGE_LOGIC)
20400 
20401 static bool DiagnoseMutualExclusions(Sema &S, const SmallVectorImpl<const Attr *> &C) {
20402   for (const Attr *A : C) {
20403     if (const auto *Second = dyn_cast<AlwaysInlineAttr>(A)) {
20404       auto Iter = llvm::find_if(C, [](const Attr *Check) { return isa<NotTailCalledAttr>(Check); });
20405       if (Iter != C.end()) {
20406         S.Diag((*Iter)->getLocation(), diag::err_attributes_are_not_compatible) << *Iter << Second << ((*Iter)->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20407         S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20408         return false;
20409       }
20410     }
20411     if (const auto *Second = dyn_cast<LikelyAttr>(A)) {
20412       auto Iter = llvm::find_if(C, [](const Attr *Check) { return isa<UnlikelyAttr>(Check); });
20413       if (Iter != C.end()) {
20414         S.Diag((*Iter)->getLocation(), diag::err_attributes_are_not_compatible) << *Iter << Second << ((*Iter)->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20415         S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20416         return false;
20417       }
20418     }
20419     if (const auto *Second = dyn_cast<UnlikelyAttr>(A)) {
20420       auto Iter = llvm::find_if(C, [](const Attr *Check) { return isa<LikelyAttr>(Check); });
20421       if (Iter != C.end()) {
20422         S.Diag((*Iter)->getLocation(), diag::err_attributes_are_not_compatible) << *Iter << Second << ((*Iter)->isRegularKeywordAttribute() || Second->isRegularKeywordAttribute());
20423         S.Diag(Second->getLocation(), diag::note_conflicting_attribute);
20424         return false;
20425       }
20426     }
20427   }
20428   return true;
20429 }
20430 
20431 #endif