60#include "llvm/ADT/STLExtras.h"
61#include "llvm/ADT/STLForwardCompat.h"
62#include "llvm/ADT/StringExtras.h"
63#include "llvm/Demangle/Demangle.h"
64#include "llvm/IR/DerivedTypes.h"
65#include "llvm/MC/MCSectionMachO.h"
66#include "llvm/Support/Error.h"
67#include "llvm/Support/MathExtras.h"
68#include "llvm/Support/raw_ostream.h"
69#include "llvm/TargetParser/Triple.h"
93template <
typename AttrInfo>
100 if (UVal > (uint32_t)std::numeric_limits<int>::max()) {
104 <<
toString(I, 10,
false) << 32 << 0;
113 const Expr *
E, StringRef &Str,
119 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
125 Str = Literal->getString();
135 Diag(
Loc->Loc, diag::err_attribute_argument_type)
139 Str =
Loc->Ident->getName();
141 *ArgLocation =
Loc->Loc;
151 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
156 Str = Literal->getString();
178 bool foundStarOperator = IsOverloadedOperatorPresent(
Record, OO_Star);
179 bool foundArrowOperator = IsOverloadedOperatorPresent(
Record, OO_Arrow);
180 if (foundStarOperator && foundArrowOperator)
187 for (
const auto &BaseSpecifier : CXXRecord->bases()) {
188 if (!foundStarOperator)
189 foundStarOperator = IsOverloadedOperatorPresent(
190 BaseSpecifier.getType()->getAsRecordDecl(), OO_Star);
191 if (!foundArrowOperator)
192 foundArrowOperator = IsOverloadedOperatorPresent(
193 BaseSpecifier.getType()->getAsRecordDecl(), OO_Arrow);
196 if (foundStarOperator && foundArrowOperator)
207 const auto *VD = cast<ValueDecl>(
D);
216 if (RT->isIncompleteType())
223 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_pointer) << AL << QT;
240template <
typename AttrType>
247 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(RD)) {
249 return !Base->hasAttr<AttrType>();
271 return checkRecordDeclForAttr<CapabilityAttr>(RT->
getDecl());
284 return checkRecordDeclForAttr<ScopedLockableAttr>(RT->
getDecl());
296 return TN->
hasAttr<CapabilityAttr>();
315 if (
const auto *
E = dyn_cast<CastExpr>(Ex))
317 else if (
const auto *
E = dyn_cast<ParenExpr>(Ex))
319 else if (
const auto *
E = dyn_cast<UnaryOperator>(Ex)) {
320 if (
E->getOpcode() == UO_LNot ||
E->getOpcode() == UO_AddrOf ||
321 E->getOpcode() == UO_Deref)
324 }
else if (
const auto *
E = dyn_cast<BinaryOperator>(Ex)) {
325 if (
E->getOpcode() == BO_LAnd ||
E->getOpcode() == BO_LOr)
343 bool ParamIdxOk =
false) {
348 const auto *MD = dyn_cast<const CXXMethodDecl>(
D);
349 if (MD && !MD->isStatic()) {
352 if (!checkRecordDeclForAttr<CapabilityAttr>(RD) &&
353 !checkRecordDeclForAttr<ScopedLockableAttr>(RD))
355 diag::warn_thread_attribute_not_on_capability_member)
356 << AL << MD->getParent();
358 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_non_static_member)
363 for (
unsigned Idx = Sidx; Idx < AL.
getNumArgs(); ++Idx) {
368 Args.push_back(ArgExp);
372 if (
const auto *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
373 if (StrLit->getLength() == 0 ||
374 (StrLit->isOrdinary() && StrLit->getString() ==
"*")) {
377 Args.push_back(ArgExp);
383 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_ignored) << AL;
384 Args.push_back(ArgExp);
392 if (
const auto *UOp = dyn_cast<UnaryOperator>(ArgExp))
393 if (UOp->getOpcode() == UO_AddrOf)
394 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
395 if (DRE->getDecl()->isCXXInstanceMember())
396 ArgTy = DRE->getDecl()->getType();
402 if(!RT && ParamIdxOk) {
403 const auto *FD = dyn_cast<FunctionDecl>(
D);
404 const auto *IL = dyn_cast<IntegerLiteral>(ArgExp);
406 unsigned int NumParams = FD->getNumParams();
407 llvm::APInt ArgValue = IL->getValue();
408 uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
409 uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
410 if (!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
412 diag::err_attribute_argument_out_of_bounds_extra_info)
413 << AL << Idx + 1 << NumParams;
416 ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
425 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_argument_not_lockable)
428 Args.push_back(ArgExp);
440 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
461 unsigned Size = Args.size();
495 QualType QT = cast<ValueDecl>(
D)->getType();
497 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
514 Expr **StartArg = &Args[0];
516 AcquiredAfterAttr(S.
Context, AL, StartArg, Args.size()));
524 Expr **StartArg = &Args[0];
526 AcquiredBeforeAttr(S.
Context, AL, StartArg, Args.size()));
543 unsigned Size = Args.size();
544 Expr **StartArg = Size == 0 ? nullptr : &Args[0];
546 AssertSharedLockAttr(S.
Context, AL, StartArg, Size));
555 unsigned Size = Args.size();
556 Expr **StartArg = Size == 0 ? nullptr : &Args[0];
558 AssertExclusiveLockAttr(S.
Context, AL, StartArg, Size));
566template <
typename AttrInfo>
568 unsigned AttrArgNo) {
569 assert(AI.isArgExpr(AttrArgNo) &&
"Expected expression argument");
570 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
579 S.
Diag(SrcLoc, diag::err_attribute_integers_only)
594 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only) << AL;
620 AllocSizeAttr(S.
Context, AL, SizeArgNo, NumberArgNo));
629 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
664 unsigned Size = Args.size();
672 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(
D);
682 unsigned Size = Args.size();
685 Expr **StartArg = &Args[0];
688 LocksExcludedAttr(S.
Context, AL, StartArg, Size));
692 Expr *&Cond, StringRef &Msg) {
698 Cond = Converted.
get();
705 Msg =
"<no message provided>";
711 S.
Diag(AL.
getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
713 S.
Diag(PDiag.first, PDiag.second);
720 S.
Diag(AL.
getLoc(), diag::ext_clang_enable_if);
729 StringRef NewUserDiagnostic;
738 const auto *PD = isa<CXXRecordDecl>(
D)
739 ? cast<DeclContext>(
D)
741 if (
const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
743 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
744 << AL << !isa<CXXRecordDecl>(
D);
748 ExcludeFromExplicitInstantiationAttr(S.
Context, AL));
764 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
772 bool referencesArgs(
Expr *
E) {
780 "`this` doesn't refer to the enclosing class?");
786 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DRE->
getDecl()))
787 if (Parms.count(PVD)) {
798 const auto *DeclFD = cast<FunctionDecl>(
D);
800 if (
const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
801 if (!MethodDecl->isStatic()) {
802 S.
Diag(AL.
getLoc(), diag::err_attribute_no_member_function) << AL;
809 if (
auto *
E = dyn_cast<Expr *>(
Union))
811 return cast<IdentifierLoc *>(
Union)->Loc;
814 S.
Diag(
Loc, diag::err_attribute_argument_n_type) << AL << Index <<
T;
820 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.
getArgAsExpr(0));
823 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
832 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments_for)
839 for (
unsigned I = 1; I < AL.
getNumArgs(); ++I) {
851 if (Index > DeclFD->getNumParams()) {
852 S.
Diag(AL.
getLoc(), diag::err_attribute_bounds_for_function)
853 << AL << Index << DeclFD << DeclFD->getNumParams();
858 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
863 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
867 Indices.push_back(Index - 1);
871 S.
Context, AL, AttrFD, Indices.data(), Indices.size()));
875 S.
Diag(AL.
getLoc(), diag::ext_clang_diagnose_if);
882 StringRef DiagTypeStr;
886 DiagnoseIfAttr::DiagnosticType DiagType;
887 if (!DiagnoseIfAttr::ConvertStrToDiagnosticType(DiagTypeStr, DiagType)) {
889 diag::err_diagnose_if_invalid_diagnostic_type);
893 bool ArgDependent =
false;
894 if (
const auto *FD = dyn_cast<FunctionDecl>(
D))
895 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(Cond);
897 S.
Context, AL, Cond, Msg, DiagType, ArgDependent, cast<NamedDecl>(
D)));
901 static constexpr const StringRef kWildcard =
"*";
904 bool HasWildcard =
false;
906 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
907 if (Name == kWildcard)
909 Names.push_back(Name);
913 if (
const auto *NBA =
D->
getAttr<NoBuiltinAttr>())
914 for (StringRef BuiltinName : NBA->builtinNames())
915 AddBuiltinName(BuiltinName);
919 AddBuiltinName(kWildcard);
921 for (
unsigned I = 0,
E = AL.
getNumArgs(); I !=
E; ++I) {
922 StringRef BuiltinName;
928 AddBuiltinName(BuiltinName);
930 S.
Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
931 << BuiltinName << AL;
936 Names.erase(std::unique(Names.begin(), Names.end()), Names.end());
939 if (HasWildcard && Names.size() > 1)
941 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
947 NoBuiltinAttr(S.
Context, AL, Names.data(), Names.size()));
951 if (
D->
hasAttr<PassObjectSizeAttr>()) {
952 S.
Diag(
D->
getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
974 if (!cast<ParmVarDecl>(
D)->getType()->isPointerType()) {
983 ConsumableAttr::ConsumedState DefaultState;
987 if (!ConsumableAttr::ConvertStrToConsumedState(IL->
Ident->
getName(),
989 S.
Diag(IL->
Loc, diag::warn_attribute_type_not_supported) << AL
994 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1007 if (!RD->hasAttr<ConsumableAttr>()) {
1008 S.
Diag(AL.
getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1025 for (
unsigned ArgIndex = 0; ArgIndex < AL.
getNumArgs(); ++ArgIndex) {
1026 CallableWhenAttr::ConsumedState CallableState;
1028 StringRef StateString;
1039 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1041 S.
Diag(
Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1045 States.push_back(CallableState);
1049 CallableWhenAttr(S.
Context, AL, States.data(), States.size()));
1053 ParamTypestateAttr::ConsumedState ParamState;
1059 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1061 S.
Diag(Ident->
Loc, diag::warn_attribute_type_not_supported)
1062 << AL << StateString;
1066 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1087 ReturnTypestateAttr::ConsumedState ReturnState;
1091 if (!ReturnTypestateAttr::ConvertStrToConsumedState(IL->
Ident->
getName(),
1093 S.
Diag(IL->
Loc, diag::warn_attribute_type_not_supported) << AL
1098 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1135 SetTypestateAttr::ConsumedState NewState;
1139 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1140 S.
Diag(Ident->
Loc, diag::warn_attribute_type_not_supported) << AL
1145 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1157 TestTypestateAttr::ConsumedState TestState;
1161 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1162 S.
Diag(Ident->
Loc, diag::warn_attribute_type_not_supported) << AL
1167 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1181 if (
auto *TD = dyn_cast<TagDecl>(
D))
1183 else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
1190 if (BitfieldByteAligned)
1192 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1198 if (BitfieldByteAligned)
1199 S.
Diag(AL.
getLoc(), diag::warn_attribute_packed_for_bitfield);
1205 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
1209 auto *RD = cast<CXXRecordDecl>(
D);
1211 assert(CTD &&
"attribute does not appertain to this declaration");
1222 if (
const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1224 Template = CTSD->getSpecializedTemplate();
1226 while (TST && TST->isTypeAlias())
1229 Template = TST->getTemplateName().getAsTemplateDecl();
1238 S.
Diag(AL.
getLoc(), diag::err_attribute_preferred_name_arg_invalid)
1241 S.
Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1250 NoSpecializationsAttr::Create(S.
Context, Message, AL));
1260 T =
T.getNonReferenceType();
1266 if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) {
1268 for (
const auto *I : UD->
fields()) {
1282 bool isReturnValue =
false) {
1285 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1286 << AL << AttrParmRange << TypeRange;
1288 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1289 << AL << AttrParmRange << TypeRange << 0;
1297 for (
unsigned I = 0; I < AL.
getNumArgs(); ++I) {
1311 NonNullArgs.push_back(Idx);
1322 I !=
E && !AnyPointers; ++I) {
1329 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_no_pointers);
1332 ParamIdx *Start = NonNullArgs.data();
1333 unsigned Size = NonNullArgs.size();
1334 llvm::array_pod_sort(Start, Start + Size);
1344 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1373 QualType T = cast<ParmVarDecl>(
D)->getType();
1375 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1398 AssumeAlignedAttr TmpAttr(
Context, CI,
E, OE);
1402 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1403 << &TmpAttr << TmpAttr.getRange() << SR;
1408 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1411 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1415 Diag(AttrLoc, diag::err_attribute_argument_type)
1421 if (!I->isPowerOf2()) {
1422 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1428 Diag(CI.
getLoc(), diag::warn_assume_aligned_too_great)
1433 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1450 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1456 const auto *FuncDecl = cast<FunctionDecl>(
D);
1466 << FuncDecl->getParamDecl(Idx.
getASTIndex())->getSourceRange();
1476 if (AttrName.size() > 4 && AttrName.starts_with(
"__") &&
1477 AttrName.ends_with(
"__")) {
1478 AttrName = AttrName.drop_front(2).drop_back(2);
1494 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1500 OwnershipAttr::OwnershipKind K =
1501 OwnershipAttr(S.
Context, AL,
nullptr,
nullptr, 0).getOwnKind();
1505 case OwnershipAttr::Takes:
1506 case OwnershipAttr::Holds:
1508 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1512 case OwnershipAttr::Returns:
1514 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 1;
1522 if (K == OwnershipAttr::Returns &&
1524 S.
Diag(AL.
getLoc(), diag::err_ownership_takes_return_type) << AL;
1530 StringRef ModuleName =
Module->getName();
1536 for (
unsigned i = 1; i < AL.
getNumArgs(); ++i) {
1546 case OwnershipAttr::Takes:
1547 case OwnershipAttr::Holds:
1551 case OwnershipAttr::Returns:
1557 S.
Diag(AL.
getLoc(), diag::err_ownership_type) << AL << Err
1566 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1567 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1570 I->isRegularKeywordAttribute());
1572 }
else if (K == OwnershipAttr::Returns &&
1573 I->getOwnKind() == OwnershipAttr::Returns) {
1576 if (!llvm::is_contained(I->args(), Idx)) {
1577 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1578 << I->args_begin()->getSourceIndex();
1580 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1584 }
else if (K == OwnershipAttr::Takes &&
1585 I->getOwnKind() == OwnershipAttr::Takes) {
1586 if (I->getModule()->getName() != ModuleName) {
1587 S.
Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1588 << I->getModule()->getName();
1589 S.
Diag(AL.
getLoc(), diag::note_ownership_takes_class_mismatch)
1596 OwnershipArgs.push_back(Idx);
1599 ParamIdx *Start = OwnershipArgs.data();
1600 unsigned Size = OwnershipArgs.size();
1601 llvm::array_pod_sort(Start, Start + Size);
1609 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1625 S.
Diag(AL.
getLoc(), diag::err_attribute_weakref_not_global_context)
1626 << cast<NamedDecl>(
D);
1670 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1672 Demangled.reset(llvm::itaniumDemangle(Str,
false));
1681 if (!isa<FunctionDecl>(ND) && !isa<VarDecl>(ND))
1683 if (MC->shouldMangleDeclName(ND)) {
1684 llvm::raw_svector_ostream Out(Name);
1688 Name = ND->getIdentifier()->getName();
1702 const auto *FD = cast<FunctionDecl>(
D);
1704 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 1;
1718 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_darwin);
1726 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_nvptx);
1730 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
1732 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 0;
1736 const auto *VD = cast<VarDecl>(
D);
1737 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1738 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << VD << 0;
1755 if (Model !=
"global-dynamic" && Model !=
"local-dynamic"
1756 && Model !=
"initial-exec" && Model !=
"local-exec") {
1757 S.
Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1771 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1779 if (checkAttrMutualExclusion<CPUSpecificAttr>(S,
D, AL))
1783 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1784 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1787 }
else if (AL.
getParsedKind() == ParsedAttr::AT_CPUSpecific) {
1788 if (checkAttrMutualExclusion<CPUDispatchAttr>(S,
D, AL))
1792 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1793 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1800 if (
const auto *MD = dyn_cast<CXXMethodDecl>(
D)) {
1801 if (MD->getParent()->isLambda()) {
1802 S.
Diag(AL.
getLoc(), diag::err_attribute_dll_lambda) << AL;
1813 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1822 S.
Diag(CPUArg->
Loc, diag::err_invalid_cpu_specific_dispatch_value)
1823 << CPUName << (AL.
getKind() == ParsedAttr::AT_CPUDispatch);
1829 return Target.CPUSpecificManglingCharacter(CPUName) ==
1832 S.
Diag(AL.
getLoc(), diag::warn_multiversion_duplicate_entries);
1835 CPUs.push_back(CPUArg->
Ident);
1839 if (AL.
getKind() == ParsedAttr::AT_CPUSpecific)
1841 CPUSpecificAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1844 CPUDispatchAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1849 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
1860 const auto &Arch = Triple.getArch();
1861 if (Arch != llvm::Triple::x86 &&
1862 (Arch != llvm::Triple::arm && Arch != llvm::Triple::thumb)) {
1863 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_on_arch)
1864 << AL << Triple.getArchName();
1870 if (S.
getLangOpts().MSVCCompat && isa<CXXMethodDecl>(
D)) {
1871 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type_str)
1883 if (!isa<ObjCMethodDecl>(
D)) {
1884 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
1910 S.
Diag(Attrs.
getLoc(), diag::warn_nocf_check_attribute_ignored);
1912 handleSimpleAttribute<AnyX86NoCfCheckAttr>(S,
D, Attrs);
1928 ? diag::err_keyword_not_supported_on_target
1929 : diag::warn_unknown_attribute_ignored)
1947 ? diag::err_attribute_wrong_decl_type
1948 : diag::warn_attribute_wrong_decl_type)
1984 if (VecReturnAttr *A =
D->
getAttr<VecReturnAttr>()) {
1985 S.
Diag(AL.
getLoc(), diag::err_repeat_attribute) << A;
1989 const auto *R = cast<RecordDecl>(
D);
1992 if (!isa<CXXRecordDecl>(R)) {
1993 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
1997 if (!cast<CXXRecordDecl>(R)->isPOD()) {
1998 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2002 for (
const auto *I : R->fields()) {
2003 if ((count == 1) || !I->getType()->isVectorType()) {
2004 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2015 if (isa<ParmVarDecl>(
D)) {
2020 diag::err_carries_dependency_param_not_function_decl);
2034 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2040 uint32_t priority = ConstructorAttr::DefaultPriority;
2042 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
2053 uint32_t priority = DestructorAttr::DefaultPriority;
2061template <
typename AttrTy>
2073 VersionTuple Introduced,
2074 VersionTuple Deprecated,
2075 VersionTuple Obsoleted) {
2076 StringRef PlatformName
2077 = AvailabilityAttr::getPrettyPlatformName(Platform->
getName());
2078 if (PlatformName.empty())
2079 PlatformName = Platform->
getName();
2083 if (!Introduced.empty() && !Deprecated.empty() &&
2084 !(Introduced <= Deprecated)) {
2086 << 1 << PlatformName << Deprecated.getAsString()
2087 << 0 << Introduced.getAsString();
2091 if (!Introduced.empty() && !Obsoleted.empty() &&
2092 !(Introduced <= Obsoleted)) {
2094 << 2 << PlatformName << Obsoleted.getAsString()
2095 << 0 << Introduced.getAsString();
2099 if (!Deprecated.empty() && !Obsoleted.empty() &&
2100 !(Deprecated <= Obsoleted)) {
2102 << 2 << PlatformName << Obsoleted.getAsString()
2103 << 1 << Deprecated.getAsString();
2115 bool BeforeIsOkay) {
2116 if (
X.empty() || Y.empty())
2122 if (BeforeIsOkay &&
X < Y)
2130 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2131 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2134 VersionTuple MergedIntroduced = Introduced;
2135 VersionTuple MergedDeprecated = Deprecated;
2136 VersionTuple MergedObsoleted = Obsoleted;
2137 bool FoundAny =
false;
2138 bool OverrideOrImpl =
false;
2142 OverrideOrImpl =
false;
2148 OverrideOrImpl =
true;
2154 for (
unsigned i = 0, e = Attrs.size(); i != e;) {
2155 const auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2162 if (OldPlatform != Platform) {
2168 if (OldEnvironment != Environment) {
2176 if (OldAA->getPriority() <
Priority)
2182 if (OldAA->getPriority() >
Priority) {
2183 Attrs.erase(Attrs.begin() + i);
2189 VersionTuple OldIntroduced = OldAA->getIntroduced();
2190 VersionTuple OldDeprecated = OldAA->getDeprecated();
2191 VersionTuple OldObsoleted = OldAA->getObsoleted();
2192 bool OldIsUnavailable = OldAA->getUnavailable();
2194 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2195 !
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2197 !(OldIsUnavailable == IsUnavailable ||
2198 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2199 if (OverrideOrImpl) {
2201 VersionTuple FirstVersion;
2202 VersionTuple SecondVersion;
2203 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2205 FirstVersion = OldIntroduced;
2206 SecondVersion = Introduced;
2207 }
else if (!
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2209 FirstVersion = Deprecated;
2210 SecondVersion = OldDeprecated;
2211 }
else if (!
versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2213 FirstVersion = Obsoleted;
2214 SecondVersion = OldObsoleted;
2218 Diag(OldAA->getLocation(),
2219 diag::warn_mismatched_availability_override_unavail)
2220 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2231 Diag(OldAA->getLocation(),
2232 diag::warn_mismatched_availability_override)
2234 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2235 << FirstVersion.getAsString() << SecondVersion.getAsString()
2239 Diag(CI.
getLoc(), diag::note_overridden_method);
2241 Diag(CI.
getLoc(), diag::note_protocol_method);
2243 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2244 Diag(CI.
getLoc(), diag::note_previous_attribute);
2247 Attrs.erase(Attrs.begin() + i);
2252 VersionTuple MergedIntroduced2 = MergedIntroduced;
2253 VersionTuple MergedDeprecated2 = MergedDeprecated;
2254 VersionTuple MergedObsoleted2 = MergedObsoleted;
2256 if (MergedIntroduced2.empty())
2257 MergedIntroduced2 = OldIntroduced;
2258 if (MergedDeprecated2.empty())
2259 MergedDeprecated2 = OldDeprecated;
2260 if (MergedObsoleted2.empty())
2261 MergedObsoleted2 = OldObsoleted;
2264 MergedIntroduced2, MergedDeprecated2,
2265 MergedObsoleted2)) {
2266 Attrs.erase(Attrs.begin() + i);
2271 MergedIntroduced = MergedIntroduced2;
2272 MergedDeprecated = MergedDeprecated2;
2273 MergedObsoleted = MergedObsoleted2;
2279 MergedIntroduced == Introduced &&
2280 MergedDeprecated == Deprecated &&
2281 MergedObsoleted == Obsoleted)
2287 MergedDeprecated, MergedObsoleted) &&
2289 auto *Avail = ::new (
Context) AvailabilityAttr(
2290 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2291 Message, IsStrict, Replacement,
Priority, Environment);
2299 if (isa<UsingDecl, UnresolvedUsingTypenameDecl, UnresolvedUsingValueDecl>(
2311 if (AvailabilityAttr::getPrettyPlatformName(II->
getName()).empty())
2312 S.
Diag(Platform->
Loc, diag::warn_availability_unknown_platform)
2315 auto *ND = dyn_cast<NamedDecl>(
D);
2325 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getMessageExpr()))
2326 Str = SE->getString();
2327 StringRef Replacement;
2328 if (
const auto *SE =
2330 Replacement = SE->getString();
2332 if (II->
isStr(
"swift")) {
2334 (!IsUnavailable && !Deprecated.
isValid())) {
2336 diag::warn_availability_swift_unavailable_deprecated_only);
2341 if (II->
isStr(
"fuchsia")) {
2342 std::optional<unsigned>
Min, Sub;
2344 (Sub = Introduced.
Version.getSubminor())) {
2345 S.
Diag(AL.
getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2360 if (EnvironmentLoc) {
2362 IIEnvironment = EnvironmentLoc->
Ident;
2363 if (AvailabilityAttr::getEnvironmentType(
2365 llvm::Triple::EnvironmentType::UnknownEnvironment)
2366 S.
Diag(EnvironmentLoc->
Loc, diag::warn_availability_unknown_environment)
2367 << EnvironmentLoc->
Ident;
2369 S.
Diag(EnvironmentLoc->
Loc, diag::err_availability_unexpected_parameter)
2370 <<
"environment" << 1;
2376 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2387 else if (II->
getName() ==
"ios_app_extension")
2392 const auto *IOSToWatchOSMapping =
2397 auto adjustWatchOSVersion =
2398 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2399 if (Version.empty())
2401 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2403 if (IOSToWatchOSMapping) {
2404 if (
auto MappedVersion = IOSToWatchOSMapping->map(
2405 Version, MinimumWatchOSVersion, std::nullopt)) {
2406 return *MappedVersion;
2410 auto Major = Version.getMajor();
2411 auto NewMajor = Major >= 9 ? Major - 7 : 0;
2412 if (NewMajor >= 2) {
2413 if (Version.getMinor()) {
2414 if (Version.getSubminor())
2415 return VersionTuple(NewMajor, *Version.getMinor(),
2416 *Version.getSubminor());
2418 return VersionTuple(NewMajor, *Version.getMinor());
2420 return VersionTuple(NewMajor);
2423 return MinimumWatchOSVersion;
2426 auto NewIntroduced = adjustWatchOSVersion(Introduced.
Version);
2427 auto NewDeprecated = adjustWatchOSVersion(Deprecated.
Version);
2428 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.
Version);
2431 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2432 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2444 else if (II->
getName() ==
"ios_app_extension")
2449 const auto *IOSToTvOSMapping =
2454 auto AdjustTvOSVersion =
2455 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2456 if (Version.empty())
2459 if (IOSToTvOSMapping) {
2460 if (
auto MappedVersion = IOSToTvOSMapping->map(
2461 Version, VersionTuple(0, 0), std::nullopt)) {
2462 return *MappedVersion;
2468 auto NewIntroduced = AdjustTvOSVersion(Introduced.
Version);
2469 auto NewDeprecated = AdjustTvOSVersion(Deprecated.
Version);
2470 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.
Version);
2473 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2474 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2481 llvm::Triple::IOS &&
2483 auto GetSDKInfo = [&]() {
2492 else if (II->
getName() ==
"ios_app_extension")
2495 auto MinMacCatalystVersion = [](
const VersionTuple &
V) {
2498 if (
V.getMajor() < 13 ||
2499 (
V.getMajor() == 13 &&
V.getMinor() && *
V.getMinor() < 1))
2500 return VersionTuple(13, 1);
2504 ND, AL, NewII,
true ,
2505 MinMacCatalystVersion(Introduced.
Version),
2506 MinMacCatalystVersion(Deprecated.
Version),
2507 MinMacCatalystVersion(Obsoleted.
Version), IsUnavailable, Str,
2512 }
else if (II->
getName() ==
"macos" && GetSDKInfo() &&
2514 !Obsoleted.
Version.empty())) {
2515 if (
const auto *MacOStoMacCatalystMapping =
2516 GetSDKInfo()->getVersionMapping(
2523 auto RemapMacOSVersion =
2524 [&](
const VersionTuple &
V) -> std::optional<VersionTuple> {
2526 return std::nullopt;
2528 if (
V.getMajor() == 100000)
2529 return VersionTuple(100000);
2531 return MacOStoMacCatalystMapping->map(
V, VersionTuple(13, 1),
2534 std::optional<VersionTuple> NewIntroduced =
2535 RemapMacOSVersion(Introduced.
Version),
2537 RemapMacOSVersion(Deprecated.
Version),
2539 RemapMacOSVersion(Obsoleted.
Version);
2540 if (NewIntroduced || NewDeprecated || NewObsoleted) {
2541 auto VersionOrEmptyVersion =
2542 [](
const std::optional<VersionTuple> &
V) -> VersionTuple {
2543 return V ? *
V : VersionTuple();
2546 ND, AL, NewII,
true ,
2547 VersionOrEmptyVersion(NewIntroduced),
2548 VersionOrEmptyVersion(NewDeprecated),
2549 VersionOrEmptyVersion(NewObsoleted),
false, Str,
2568 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(0)))
2570 StringRef DefinedIn;
2571 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(1)))
2572 DefinedIn = SE->getString();
2573 bool IsGeneratedDeclaration = AL.
getArgAsIdent(2) !=
nullptr;
2575 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(3)))
2576 USR = SE->getString();
2584 typename T::VisibilityType value) {
2587 typename T::VisibilityType existingValue = existingAttr->
getVisibility();
2588 if (existingValue == value)
2590 S.
Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
2591 S.
Diag(CI.
getLoc(), diag::note_previous_attribute);
2599 VisibilityAttr::VisibilityType Vis) {
2600 return ::mergeVisibilityAttr<VisibilityAttr>(*
this,
D, CI, Vis);
2605 TypeVisibilityAttr::VisibilityType Vis) {
2606 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*
this,
D, CI, Vis);
2610 bool isTypeVisibility) {
2612 if (isa<TypedefNameDecl>(
D)) {
2618 if (isTypeVisibility && !(isa<TagDecl>(
D) || isa<ObjCInterfaceDecl>(
D) ||
2619 isa<NamespaceDecl>(
D))) {
2631 VisibilityAttr::VisibilityType
type;
2632 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr,
type)) {
2633 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
2640 if (
type == VisibilityAttr::Protected &&
2642 S.
Diag(AL.
getLoc(), diag::warn_attribute_protected_visibility);
2643 type = VisibilityAttr::Default;
2647 if (isTypeVisibility) {
2649 D, AL, (TypeVisibilityAttr::VisibilityType)
type);
2658 unsigned sentinel = (
unsigned)SentinelAttr::DefaultSentinel;
2661 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
2663 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
2668 if (Idx->isSigned() && Idx->isNegative()) {
2669 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_less_than_zero)
2674 sentinel = Idx->getZExtValue();
2677 unsigned nullPos = (
unsigned)SentinelAttr::DefaultNullPos;
2680 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
2682 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
2686 nullPos = Idx->getZExtValue();
2688 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
2691 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
2697 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
2699 if (isa<FunctionNoProtoType>(FT)) {
2700 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
2704 if (!cast<FunctionProtoType>(FT)->isVariadic()) {
2705 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
2708 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(
D)) {
2709 if (!MD->isVariadic()) {
2710 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
2713 }
else if (
const auto *BD = dyn_cast<BlockDecl>(
D)) {
2714 if (!BD->isVariadic()) {
2715 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
2718 }
else if (
const auto *
V = dyn_cast<VarDecl>(
D)) {
2726 if (!cast<FunctionProtoType>(FT)->isVariadic()) {
2728 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
2732 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
2738 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
2749 !isa<CXXConstructorDecl>(
D)) {
2750 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
2753 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(
D))
2754 if (MD->getReturnType()->isVoidType()) {
2755 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
2763 if (isa<VarDecl>(
D))
2764 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type_str)
2766 <<
"functions, classes, or enumerations";
2775 if (LO.CPlusPlus && !LO.CPlusPlus20)
2776 S.
Diag(AL.
getLoc(), diag::ext_cxx20_attr) << AL;
2784 }
else if (LO.CPlusPlus && !LO.CPlusPlus17)
2785 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2790 isa<TypedefNameDecl>(
D)) {
2791 S.
Diag(AL.
getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
2804 S.
Diag(AL.
getLoc(), diag::warn_attribute_invalid_on_definition)
2806 else if (isa<ObjCPropertyDecl>(
D) || isa<ObjCMethodDecl>(
D) ||
2808 (isa<ObjCInterfaceDecl>(
D) || isa<EnumDecl>(
D)))) {
2811 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
2821template <
typename WorkGroupAttr>
2824 for (
unsigned i = 0; i < 3; ++i) {
2829 if (WGSize[i] == 0) {
2830 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_is_zero)
2836 WorkGroupAttr *Existing =
D->
getAttr<WorkGroupAttr>();
2837 if (Existing && !(Existing->getXDim() == WGSize[0] &&
2838 Existing->getYDim() == WGSize[1] &&
2839 Existing->getZDim() == WGSize[2]))
2840 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
2843 WorkGroupAttr(S.
Context, AL, WGSize[0], WGSize[1], WGSize[2]));
2848 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
2854 assert(ParmTSI &&
"no type source info for attribute argument");
2859 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
2863 if (VecTypeHintAttr *A =
D->
getAttr<VecTypeHintAttr>()) {
2865 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
2877 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
2882 if (SectionAttr *ExistingAttr =
D->
getAttr<SectionAttr>()) {
2883 if (ExistingAttr->getName() == Name)
2885 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
2887 Diag(CI.
getLoc(), diag::note_previous_attribute);
2895 return llvm::Error::success();
2898 StringRef Segment, Section;
2899 unsigned TAA, StubSize;
2901 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
2902 TAA, HasTAA, StubSize);
2907 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
2932 cast<NamedDecl>(
D));
2943 llvm::CodeModel::Model CM;
2944 if (!CodeModelAttr::ConvertStrToModel(Str, CM)) {
2945 S.
Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
2955 StringRef CodeSegName) {
2957 S.
Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
2969 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
2973 if (
const auto *ExistingAttr =
D->
getAttr<CodeSegAttr>()) {
2974 if (ExistingAttr->getName() == Name)
2976 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
2978 Diag(CI.
getLoc(), diag::note_previous_attribute);
2991 if (
const auto *ExistingAttr =
D->
getAttr<CodeSegAttr>()) {
2992 if (!ExistingAttr->isImplicit()) {
2994 ExistingAttr->getName() == Str
2995 ? diag::warn_duplicate_codeseg_attribute
2996 : diag::err_conflicting_codeseg_attribute);
3006 enum FirstParam { Unsupported, Duplicate,
Unknown };
3007 enum SecondParam {
None, CPU, Tune };
3009 if (AttrStr.contains(
"fpmath="))
3010 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3011 << Unsupported <<
None <<
"fpmath=" <<
Target;
3015 AttrStr.contains(
"tune="))
3016 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3022 if (!ParsedAttrs.
CPU.empty() &&
3024 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3027 if (!ParsedAttrs.
Tune.empty() &&
3029 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3034 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3036 for (
const auto &Feature : ParsedAttrs.
Features) {
3037 StringRef CurFeature = Feature;
3038 if (!CurFeature.starts_with(
'+') && !CurFeature.starts_with(
'-'))
3039 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3045 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3048 for (
const auto &Feature : ParsedAttrs.
Features) {
3049 auto CurFeature = StringRef(Feature).drop_front();
3051 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3052 << Unsupported <<
None << CurFeature <<
Target;
3061 if (DiagMsg.empty())
3062 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3063 << Unsupported <<
None <<
"branch-protection" <<
Target;
3064 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3067 if (!DiagMsg.empty())
3068 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3074 StringRef AttrStr) {
3075 enum FirstParam { Unsupported };
3076 enum SecondParam {
None };
3081 AttrStr.split(AttrStrs,
';');
3083 bool HasArch =
false;
3084 bool HasPriority =
false;
3085 bool HasDefault =
false;
3086 bool DuplicateAttr =
false;
3087 for (
auto &AttrStr : AttrStrs) {
3089 if (AttrStr.starts_with(
"arch=+")) {
3091 DuplicateAttr =
true;
3097 llvm::any_of(TargetAttr.
Features, [&](
const StringRef Ext) {
3098 return !RISCV().isValidFMVExtension(Ext);
3100 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3102 }
else if (AttrStr.starts_with(
"default")) {
3104 DuplicateAttr =
true;
3106 }
else if (AttrStr.consume_front(
"priority=")) {
3108 DuplicateAttr =
true;
3111 if (AttrStr.getAsInteger(0, Digit))
3112 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3115 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3120 if (((HasPriority || HasArch) && HasDefault) || DuplicateAttr ||
3121 (HasPriority && !HasArch))
3122 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3127 AttrStr.split(Features,
"+");
3128 for (
auto &CurFeature : Features) {
3129 CurFeature = CurFeature.trim();
3130 if (CurFeature ==
"default")
3133 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3145 TargetVersionAttr *NewAttr =
3157 TargetAttr *NewAttr = ::new (S.
Context) TargetAttr(S.
Context, AL, Str);
3163 Decl *
D,
bool &HasDefault,
bool &HasCommas,
bool &HasNotDefault,
3165 enum FirstParam { Unsupported, Duplicate,
Unknown };
3166 enum SecondParam {
None, CPU, Tune };
3168 HasCommas = HasCommas || Str.contains(
',');
3171 if (Str.size() == 0)
3172 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3175 std::pair<StringRef, StringRef> Parts = {{}, Str};
3176 while (!Parts.second.empty()) {
3177 Parts = Parts.second.split(
',');
3178 StringRef Cur = Parts.first.trim();
3180 Literal->getLocationOfByte(Cur.data() - Literal->getString().data(),
3183 bool DefaultIsDupe =
false;
3184 bool HasCodeGenImpact =
false;
3186 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3191 if (Cur ==
"default") {
3192 DefaultIsDupe = HasDefault;
3194 if (llvm::is_contained(StringsBuffer, Cur) || DefaultIsDupe)
3195 Diag(CurLoc, diag::warn_target_clone_duplicate_options);
3197 StringsBuffer.push_back(Cur);
3199 std::pair<StringRef, StringRef> CurParts = {{}, Cur};
3201 while (!CurParts.second.empty()) {
3202 CurParts = CurParts.second.split(
'+');
3203 StringRef CurFeature = CurParts.first.trim();
3205 Diag(CurLoc, diag::warn_unsupported_target_attribute)
3210 HasCodeGenImpact =
true;
3211 CurFeatures.push_back(CurFeature);
3214 llvm::sort(CurFeatures);
3216 for (
auto &CurFeat : CurFeatures) {
3219 Res.append(CurFeat);
3221 if (llvm::is_contained(StringsBuffer, Res) || DefaultIsDupe)
3222 Diag(CurLoc, diag::warn_target_clone_duplicate_options);
3223 else if (!HasCodeGenImpact)
3226 Diag(CurLoc, diag::warn_target_clone_no_impact_options);
3227 else if (!Res.empty()) {
3228 StringsBuffer.push_back(Res);
3229 HasNotDefault =
true;
3232 }
else if (TInfo.
getTriple().isRISCV()) {
3238 if (!Str.starts_with(Cur))
3242 Str.split(AttrStrs,
";");
3244 bool IsPriority =
false;
3245 bool IsDefault =
false;
3246 for (
auto &AttrStr : AttrStrs) {
3248 if (AttrStr.starts_with(
"arch=+")) {
3253 llvm::any_of(TargetAttr.
Features, [&](
const StringRef Ext) {
3254 return !RISCV().isValidFMVExtension(Ext);
3256 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3258 }
else if (AttrStr.starts_with(
"default")) {
3260 DefaultIsDupe = HasDefault;
3262 }
else if (AttrStr.consume_front(
"priority=")) {
3265 if (AttrStr.getAsInteger(0, Digit))
3266 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3269 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3274 if (IsPriority && IsDefault)
3275 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3278 if (llvm::is_contained(StringsBuffer, Str) || DefaultIsDupe)
3279 Diag(CurLoc, diag::warn_target_clone_duplicate_options);
3280 StringsBuffer.push_back(Str);
3283 if (Cur.starts_with(
"arch=")) {
3285 Cur.drop_front(
sizeof(
"arch=") - 1)))
3286 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3287 << Unsupported << CPU << Cur.drop_front(
sizeof(
"arch=") - 1)
3289 }
else if (Cur ==
"default") {
3290 DefaultIsDupe = HasDefault;
3293 return Diag(CurLoc, diag::warn_unsupported_target_attribute)
3295 if (llvm::is_contained(StringsBuffer, Cur) || DefaultIsDupe)
3296 Diag(CurLoc, diag::warn_target_clone_duplicate_options);
3298 StringsBuffer.push_back(Cur);
3301 if (Str.rtrim().ends_with(
","))
3302 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3315 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3316 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
3319 if (checkAttrMutualExclusion<TargetClonesAttr>(S,
D, AL))
3324 bool HasCommas =
false, HasDefault =
false, HasNotDefault =
false;
3326 for (
unsigned I = 0,
E = AL.
getNumArgs(); I !=
E; ++I) {
3333 HasDefault, HasCommas, HasNotDefault, StringsBuffer))
3336 for (
auto &SmallStr : StringsBuffer)
3337 Strings.push_back(SmallStr.str());
3340 S.
Diag(AL.
getLoc(), diag::warn_target_clone_mixed_values);
3345 Strings.push_back(
"default");
3349 S.
Diag(AL.
getLoc(), diag::err_target_clone_must_have_default);
3355 if (
const auto *MD = dyn_cast<CXXMethodDecl>(
D)) {
3356 if (MD->getParent()->isLambda()) {
3368 cast<FunctionDecl>(
D)->setIsMultiVersion();
3369 TargetClonesAttr *NewAttr = ::new (S.
Context)
3370 TargetClonesAttr(S.
Context, AL, Strings.data(), Strings.size());
3382 MinVectorWidthAttr *Existing =
D->
getAttr<MinVectorWidthAttr>();
3383 if (Existing && Existing->getVectorWidth() != VecWidth) {
3384 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3399 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
3401 S.
Diag(
Loc, diag::warn_cleanup_ext);
3402 FD = dyn_cast<FunctionDecl>(DRE->
getDecl());
3405 S.
Diag(
Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3409 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(
E)) {
3410 if (ULE->hasExplicitTemplateArgs())
3411 S.
Diag(
Loc, diag::warn_cleanup_ext);
3413 NI = ULE->getNameInfo();
3415 S.
Diag(
Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3422 S.
Diag(
Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3427 S.
Diag(
Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3438 S.
Diag(
Loc, diag::err_attribute_cleanup_func_arg_incompatible_type)
3439 << NI.
getName() << ParamTy << Ty;
3453 S.
Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3473 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3478 EnumExtensibilityAttr::Kind ExtensibilityKind;
3480 if (!EnumExtensibilityAttr::ConvertStrToKind(II->
getName(),
3481 ExtensibilityKind)) {
3482 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3487 EnumExtensibilityAttr(S.
Context, AL, ExtensibilityKind));
3505 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3513 if (
auto *OMD = dyn_cast<ObjCMethodDecl>(
D))
3514 if (
auto *
Interface = OMD->getClassInterface())
3521 S.
Diag(AL.
getLoc(), diag::err_format_attribute_result_not)
3522 << (NotNSStringTy ?
"string type" :
"NSString")
3542 return llvm::StringSwitch<FormatAttrKind>(Format)
3556 .Cases(
"gcc_diag",
"gcc_cdiag",
"gcc_cxxdiag",
"gcc_tdiag",
IgnoredFormat)
3564 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
3569 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
3574 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
3582 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
3588 uint32_t prioritynum;
3597 if ((prioritynum < 101 || prioritynum > 65535) &&
3599 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_range)
3608 StringRef NewUserDiagnostic) {
3609 if (
const auto *EA =
D->
getAttr<ErrorAttr>()) {
3611 assert((NewAttr ==
"error" || NewAttr ==
"warning") &&
3612 "unexpected normalized full name");
3613 bool Match = (EA->isError() && NewAttr ==
"error") ||
3614 (EA->isWarning() && NewAttr ==
"warning");
3616 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
3619 EA->isRegularKeywordAttribute());
3620 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
3623 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
3624 Diag(CI.
getLoc(), diag::warn_duplicate_attribute) << EA;
3625 Diag(EA->getLoc(), diag::note_previous_attribute);
3629 return ::new (
Context) ErrorAttr(
Context, CI, NewUserDiagnostic);
3637 if (F->getType() == Format &&
3638 F->getFormatIdx() == FormatIdx &&
3639 F->getFirstArg() == FirstArg) {
3642 if (F->getLocation().isInvalid())
3648 return ::new (
Context) FormatAttr(
Context, CI, Format, FormatIdx, FirstArg);
3655 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3666 StringRef Format = II->
getName();
3680 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
3691 if (Idx < 1 || Idx > NumArgs) {
3692 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
3698 unsigned ArgIdx = Idx - 1;
3700 if (HasImplicitThisParam) {
3703 diag::err_format_attribute_implicit_this_format_string)
3716 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3728 if (FirstArg != 0) {
3732 S.
Diag(AL.
getLoc(), diag::err_format_strftime_third_parameter)
3740 if (FirstArg != NumArgs + 1) {
3741 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
3744 std::to_string(NumArgs + 1));
3750 if (FirstArg <= Idx) {
3754 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
3770 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_no_callee)
3779 assert(FD &&
"Expected a function declaration!");
3781 llvm::StringMap<int> NameIdxMapping;
3782 NameIdxMapping[
"__"] = -1;
3784 NameIdxMapping[
"this"] = 0;
3788 NameIdxMapping[PVD->getName()] = Idx++;
3790 auto UnknownName = NameIdxMapping.end();
3793 for (
unsigned I = 0,
E = AL.
getNumArgs(); I <
E; ++I) {
3799 auto It = NameIdxMapping.find(IdLoc->
Ident->
getName());
3800 if (It == UnknownName) {
3801 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_argument_unknown)
3807 ArgIdx = It->second;
3814 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
3820 if (ArgIdx < -1 || ArgIdx > NumArgs) {
3821 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
3828 llvm_unreachable(
"Unexpected ParsedAttr argument type!");
3831 if (ArgIdx == 0 && !HasImplicitThisParam) {
3832 S.
Diag(AL.
getLoc(), diag::err_callback_implicit_this_not_available)
3839 if (!HasImplicitThisParam && ArgIdx > 0)
3842 EncodingIndices.push_back(ArgIdx);
3845 int CalleeIdx = EncodingIndices.front();
3849 if (CalleeIdx < (
int)HasImplicitThisParam) {
3850 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_invalid_callee)
3857 const Type *CalleeType =
3861 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
3866 const Type *CalleeFnType =
3871 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
3872 if (!CalleeFnProtoType) {
3873 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
3878 if (CalleeFnProtoType->getNumParams() > EncodingIndices.size() - 1) {
3879 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments)
3880 << AL << (
unsigned)(EncodingIndices.size() - 1);
3884 if (CalleeFnProtoType->getNumParams() < EncodingIndices.size() - 1) {
3885 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments)
3886 << AL << (
unsigned)(EncodingIndices.size() - 1);
3890 if (CalleeFnProtoType->isVariadic()) {
3902 S.
Context, AL, EncodingIndices.data(), EncodingIndices.size()));
3906 StringRef ParamName) {
3909 Diag(AL.
getLoc(), diag::err_capture_by_attribute_no_entity)
3918 bool IsValid =
true;
3919 for (
unsigned I = 0; I < N; ++I) {
3922 Diag(
E->
getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
3930 Diag(IdLoc->
Loc, diag::err_capture_by_references_itself) << IdLoc->
Loc;
3934 ParamIdents[I] = IdLoc->
Ident;
3935 ParamLocs[I] = IdLoc->
Loc;
3941 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices.data(), N, AL);
3942 CapturedBy->setArgs(ParamIdents, ParamLocs);
3949 if (
D->
hasAttr<LifetimeCaptureByAttr>()) {
3950 S.
Diag(AL.
getLoc(), diag::err_capture_by_attribute_multiple)
3954 auto *PVD = dyn_cast<ParmVarDecl>(
D);
3965 if (
auto *A = PVD->getAttr<LifetimeCaptureByAttr>())
3967 if (HasImplicitThisParam) {
3975 if (
auto *A = ATL.
getAttrAs<LifetimeCaptureByAttr>())
3976 Attrs.push_back(
const_cast<LifetimeCaptureByAttr *
>(A));
3981 llvm::StringMap<int> NameIdxMapping = {
3982 {
"global", LifetimeCaptureByAttr::GLOBAL},
3983 {
"unknown", LifetimeCaptureByAttr::UNKNOWN}};
3985 if (HasImplicitThisParam) {
3986 NameIdxMapping[
"this"] = 0;
3990 NameIdxMapping[PVD->getName()] = Idx++;
3991 auto DisallowReservedParams = [&](StringRef Reserved) {
3993 if (PVD->getName() == Reserved)
3994 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
3995 << (PVD->getName() ==
"unknown");
3997 for (
auto *CapturedBy : Attrs) {
3998 const auto &Entities = CapturedBy->getArgIdents();
3999 for (
size_t I = 0; I < Entities.size(); ++I) {
4000 StringRef Name = Entities[I]->getName();
4001 auto It = NameIdxMapping.find(Name);
4002 if (It == NameIdxMapping.end()) {
4003 auto Loc = CapturedBy->getArgLocs()[I];
4004 if (!HasImplicitThisParam && Name ==
"this")
4005 Diag(
Loc, diag::err_capture_by_implicit_this_not_available) <<
Loc;
4007 Diag(
Loc, diag::err_capture_by_attribute_argument_unknown)
4008 << Entities[I] <<
Loc;
4011 if (Name ==
"unknown" || Name ==
"global")
4012 DisallowReservedParams(Name);
4013 CapturedBy->setParamIdx(I, It->second);
4028 QualType T = cast<ParmVarDecl>(
D)->getType();
4031 S.
Diag(AL.
getLoc(), diag::err_called_once_attribute_wrong_type);
4041 const auto *TD = dyn_cast<TypedefNameDecl>(
D);
4042 if (TD && TD->getUnderlyingType()->isUnionType())
4043 RD = TD->getUnderlyingType()->getAsUnionType()->getDecl();
4045 RD = dyn_cast<RecordDecl>(
D);
4048 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4056 diag::warn_transparent_union_attribute_not_definition);
4062 if (Field == FieldEnd) {
4063 S.
Diag(AL.
getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4071 diag::warn_transparent_union_attribute_floating)
4080 for (; Field != FieldEnd; ++Field) {
4081 QualType FieldType = Field->getType();
4095 S.
Diag(Field->getLocation(),
4096 diag::warn_transparent_union_attribute_field_size_align)
4097 << isSize << *Field << FieldBits;
4098 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4100 diag::note_transparent_union_first_field_size_align)
4101 << isSize << FirstBits;
4121 AlignValueAttr TmpAttr(
Context, CI,
E);
4125 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
D))
4126 T = TD->getUnderlyingType();
4127 else if (
const auto *VD = dyn_cast<ValueDecl>(
D))
4130 llvm_unreachable(
"Unknown decl type for align_value");
4134 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4140 llvm::APSInt Alignment;
4142 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4146 if (!Alignment.isPowerOf2()) {
4147 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4169 diag::err_pack_expansion_without_parameter_packs);
4184 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4196 diag::err_pack_expansion_without_parameter_packs);
4223 const AlignedAttr &
Attr,
4226 if (isa<ParmVarDecl>(
D)) {
4228 }
else if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
4231 if (VD->isExceptionVariable())
4233 }
else if (
const auto *FD = dyn_cast<FieldDecl>(
D)) {
4234 if (FD->isBitField())
4236 }
else if (
const auto *ED = dyn_cast<EnumDecl>(
D)) {
4237 if (ED->getLangOpts().CPlusPlus)
4239 }
else if (!isa<TagDecl>(
D)) {
4240 return S.
Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4245 if (DiagKind != -1) {
4246 return S.
Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4247 << &
Attr << DiagKind;
4253 bool IsPackExpansion) {
4254 AlignedAttr TmpAttr(
Context, CI,
true,
E);
4258 if (TmpAttr.isAlignas() &&
4266 if (
const auto *TND = dyn_cast<TypedefNameDecl>(
D)) {
4267 if (!TND->getUnderlyingType()->isDependentType()) {
4268 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4276 AA->setPackExpansion(IsPackExpansion);
4282 llvm::APSInt Alignment;
4284 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4292 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4297 uint64_t AlignVal = Alignment.getZExtValue();
4303 if (!(TmpAttr.isAlignas() && !Alignment)) {
4304 if (!llvm::isPowerOf2_64(AlignVal)) {
4305 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4311 const auto *VD = dyn_cast<VarDecl>(
D);
4313 unsigned MaxTLSAlign =
4316 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4318 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4319 << (
unsigned)AlignVal << VD << MaxTLSAlign;
4327 const Type *Ty = VD->getType().getTypePtr();
4329 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4330 << VD->getType() << 16;
4336 AA->setPackExpansion(IsPackExpansion);
4337 AA->setCachedAlignmentValue(
4344 AlignedAttr TmpAttr(
Context, CI,
false, TS);
4348 if (TmpAttr.isAlignas() &&
4356 if (
const auto *TND = dyn_cast<TypedefNameDecl>(
D)) {
4357 if (!TND->getUnderlyingType()->isDependentType()) {
4358 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4364 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4365 AA->setPackExpansion(IsPackExpansion);
4370 const auto *VD = dyn_cast<VarDecl>(
D);
4371 unsigned AlignVal = TmpAttr.getAlignment(
Context);
4375 const Type *Ty = VD->getType().getTypePtr();
4378 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4379 << VD->getType() << 16;
4384 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4385 AA->setPackExpansion(IsPackExpansion);
4386 AA->setCachedAlignmentValue(AlignVal);
4391 assert(
D->
hasAttrs() &&
"no attributes on decl");
4394 if (
const auto *VD = dyn_cast<ValueDecl>(
D)) {
4395 UnderlyingTy = DiagTy = VD->getType();
4398 if (
const auto *ED = dyn_cast<EnumDecl>(
D))
4399 UnderlyingTy = ED->getIntegerType();
4408 AlignedAttr *AlignasAttr =
nullptr;
4409 AlignedAttr *LastAlignedAttr =
nullptr;
4412 if (I->isAlignmentDependent())
4416 Align = std::max(Align, I->getAlignment(
Context));
4417 LastAlignedAttr = I;
4421 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4422 << LastAlignedAttr << DiagTy;
4423 }
else if (AlignasAttr && Align) {
4426 if (NaturalAlign > RequestedAlign)
4427 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
4463 bool &IntegerMode,
bool &ComplexMode,
4466 ComplexMode =
false;
4468 switch (Str.size()) {
4488 DestWidth = Str[1] ==
'I' ? 0 : 128;
4496 DestWidth = Str[1] ==
'I' ? 0 : 128;
4499 if (Str[1] ==
'F') {
4500 IntegerMode =
false;
4501 }
else if (Str[1] ==
'C') {
4502 IntegerMode =
false;
4504 }
else if (Str[1] !=
'I') {
4513 else if (Str ==
"byte")
4517 if (Str ==
"pointer")
4521 if (Str ==
"unwind_word")
4537 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
4549 StringRef Str = Name->getName();
4553 unsigned DestWidth = 0;
4554 bool IntegerMode =
true;
4555 bool ComplexMode =
false;
4557 llvm::APInt VectorSize(64, 0);
4558 if (Str.size() >= 4 && Str[0] ==
'V') {
4560 size_t StrSize = Str.size();
4561 size_t VectorStringLength = 0;
4562 while ((VectorStringLength + 1) < StrSize &&
4563 isdigit(Str[VectorStringLength + 1]))
4564 ++VectorStringLength;
4565 if (VectorStringLength &&
4566 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
4567 VectorSize.isPowerOf2()) {
4569 IntegerMode, ComplexMode, ExplicitType);
4571 if (!InInstantiation)
4572 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
4587 Diag(AttrLoc, diag::err_machine_mode) << 0 << Name;
4592 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
D))
4593 OldTy = TD->getUnderlyingType();
4594 else if (
const auto *ED = dyn_cast<EnumDecl>(
D)) {
4597 OldTy = ED->getIntegerType();
4601 OldTy = cast<ValueDecl>(
D)->getType();
4612 OldElemTy = VT->getElementType();
4618 VectorSize.getBoolValue()) {
4619 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.
getRange();
4627 !IntegralOrAnyEnumType)
4628 Diag(AttrLoc, diag::err_mode_not_primitive);
4629 else if (IntegerMode) {
4630 if (!IntegralOrAnyEnumType)
4631 Diag(AttrLoc, diag::err_mode_wrong_type);
4632 }
else if (ComplexMode) {
4634 Diag(AttrLoc, diag::err_mode_wrong_type);
4637 Diag(AttrLoc, diag::err_mode_wrong_type);
4648 if (NewElemTy.
isNull()) {
4650 if (!(DestWidth == 128 &&
getLangOpts().CUDAIsDevice))
4651 Diag(AttrLoc, diag::err_machine_mode) << 1 << Name;
4660 if (VectorSize.getBoolValue()) {
4666 Diag(AttrLoc, diag::err_complex_mode_vector_type);
4670 OldVT->getNumElements() /
4677 Diag(AttrLoc, diag::err_mode_wrong_type);
4682 if (
auto *TD = dyn_cast<TypedefNameDecl>(
D))
4683 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
4684 else if (
auto *ED = dyn_cast<EnumDecl>(
D))
4685 ED->setIntegerType(NewTy);
4687 cast<ValueDecl>(
D)->setType(NewTy);
4699 if (OptimizeNoneAttr *Optnone =
D->
getAttr<OptimizeNoneAttr>()) {
4700 Diag(CI.
getLoc(), diag::warn_attribute_ignored) << Ident;
4701 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
4705 if (
D->
hasAttr<AlwaysInlineAttr>())
4713 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
4716 if (VD->getKind() != Decl::Var) {
4717 Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4724 if (VD->hasLocalStorage()) {
4725 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
4732InternalLinkageAttr *
4734 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
4737 if (VD->getKind() != Decl::Var) {
4738 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
4739 << &AL << AL.isRegularKeywordAttribute()
4745 if (VD->hasLocalStorage()) {
4746 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
4755 if (OptimizeNoneAttr *Optnone =
D->
getAttr<OptimizeNoneAttr>()) {
4756 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'minsize'";
4757 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
4769 if (AlwaysInlineAttr *Inline =
D->
getAttr<AlwaysInlineAttr>()) {
4770 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
4771 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
4774 if (MinSizeAttr *MinSize =
D->
getAttr<MinSizeAttr>()) {
4775 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
4776 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
4780 if (
D->
hasAttr<OptimizeNoneAttr>())
4787 if (AlwaysInlineAttr *Inline =
4803 const auto *VD = cast<VarDecl>(
D);
4804 if (VD->hasLocalStorage()) {
4805 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
4810 if (
auto *A =
D->
getAttr<CUDAConstantAttr>()) {
4811 if (!A->isImplicit())
4819 const auto *VD = cast<VarDecl>(
D);
4822 if (!S.
getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
4823 !isa<IncompleteArrayType>(VD->getType())) {
4824 S.
Diag(AL.
getLoc(), diag::err_cuda_extern_shared) << VD;
4827 if (S.
getLangOpts().CUDA && VD->hasLocalStorage() &&
4835 const auto *FD = cast<FunctionDecl>(
D);
4846 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
4847 if (Method->isInstance()) {
4848 S.
Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
4852 S.
Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
4858 if (AL.
getKind() == ParsedAttr::AT_NVPTXKernel)
4871 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
4872 if (VD->hasLocalStorage()) {
4873 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
4878 if (
auto *A =
D->
getAttr<CUDADeviceAttr>()) {
4879 if (!A->isImplicit())
4887 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
4888 if (VD->hasLocalStorage()) {
4889 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
4909 const auto *Fn = cast<FunctionDecl>(
D);
4910 if (!Fn->isInlineSpecified()) {
4911 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
4916 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
4932 if (!isa<ObjCMethodDecl>(
D)) {
4933 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4939 case ParsedAttr::AT_FastCall:
4942 case ParsedAttr::AT_StdCall:
4945 case ParsedAttr::AT_ThisCall:
4948 case ParsedAttr::AT_CDecl:
4951 case ParsedAttr::AT_Pascal:
4954 case ParsedAttr::AT_SwiftCall:
4957 case ParsedAttr::AT_SwiftAsyncCall:
4960 case ParsedAttr::AT_VectorCall:
4963 case ParsedAttr::AT_MSABI:
4966 case ParsedAttr::AT_SysVABI:
4969 case ParsedAttr::AT_RegCall:
4972 case ParsedAttr::AT_Pcs: {
4973 PcsAttr::PCSType PCS;
4976 PCS = PcsAttr::AAPCS;
4979 PCS = PcsAttr::AAPCS_VFP;
4982 llvm_unreachable(
"unexpected calling convention in pcs attribute");
4988 case ParsedAttr::AT_AArch64VectorPcs:
4991 case ParsedAttr::AT_AArch64SVEPcs:
4994 case ParsedAttr::AT_AMDGPUKernelCall:
4997 case ParsedAttr::AT_IntelOclBicc:
5000 case ParsedAttr::AT_PreserveMost:
5003 case ParsedAttr::AT_PreserveAll:
5006 case ParsedAttr::AT_M68kRTD:
5009 case ParsedAttr::AT_PreserveNone:
5012 case ParsedAttr::AT_RISCVVectorCC:
5016 llvm_unreachable(
"unexpected attribute kind");
5027 std::vector<StringRef> DiagnosticIdentifiers;
5028 for (
unsigned I = 0,
E = AL.
getNumArgs(); I !=
E; ++I) {
5034 DiagnosticIdentifiers.push_back(RuleName);
5037 SuppressAttr(S.
Context, AL, DiagnosticIdentifiers.data(),
5038 DiagnosticIdentifiers.size()));
5047 unsigned SelectIdx = ~0
U;
5053 if (SelectIdx != ~0
U) {
5054 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument)
5066 if (AL.
getKind() == ParsedAttr::AT_Owner) {
5067 if (checkAttrMutualExclusion<PointerAttr>(S,
D, AL))
5069 if (
const auto *OAttr =
D->
getAttr<OwnerAttr>()) {
5070 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5071 ? OAttr->getDerefType().getTypePtr()
5074 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5077 OAttr->isRegularKeywordAttribute());
5078 S.
Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5083 Redecl->addAttr(::new (S.
Context) OwnerAttr(S.
Context, AL, DerefTypeLoc));
5086 if (checkAttrMutualExclusion<OwnerAttr>(S,
D, AL))
5088 if (
const auto *PAttr =
D->
getAttr<PointerAttr>()) {
5089 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5090 ? PAttr->getDerefType().getTypePtr()
5093 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5096 PAttr->isRegularKeywordAttribute());
5097 S.
Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5102 Redecl->addAttr(::new (S.
Context)
5103 PointerAttr(S.
Context, AL, DerefTypeLoc));
5109 if (checkAttrMutualExclusion<NoRandomizeLayoutAttr>(S,
D, AL))
5111 if (!
D->
hasAttr<RandomizeLayoutAttr>())
5117 if (checkAttrMutualExclusion<RandomizeLayoutAttr>(S,
D, AL))
5119 if (!
D->
hasAttr<NoRandomizeLayoutAttr>())
5134 unsigned ReqArgs = Attrs.
getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5142 case ParsedAttr::AT_CDecl:
5145 case ParsedAttr::AT_FastCall:
5148 case ParsedAttr::AT_StdCall:
5151 case ParsedAttr::AT_ThisCall:
5154 case ParsedAttr::AT_Pascal:
5157 case ParsedAttr::AT_SwiftCall:
5160 case ParsedAttr::AT_SwiftAsyncCall:
5163 case ParsedAttr::AT_VectorCall:
5166 case ParsedAttr::AT_AArch64VectorPcs:
5169 case ParsedAttr::AT_AArch64SVEPcs:
5172 case ParsedAttr::AT_AMDGPUKernelCall:
5175 case ParsedAttr::AT_RegCall:
5178 case ParsedAttr::AT_MSABI:
5182 case ParsedAttr::AT_SysVABI:
5186 case ParsedAttr::AT_Pcs: {
5192 if (StrRef ==
"aapcs") {
5195 }
else if (StrRef ==
"aapcs-vfp") {
5204 case ParsedAttr::AT_IntelOclBicc:
5207 case ParsedAttr::AT_PreserveMost:
5210 case ParsedAttr::AT_PreserveAll:
5213 case ParsedAttr::AT_M68kRTD:
5216 case ParsedAttr::AT_PreserveNone:
5219 case ParsedAttr::AT_RISCVVectorCC:
5222 default: llvm_unreachable(
"unexpected attribute kind");
5235 bool CheckHost =
false, CheckDevice =
false;
5236 switch (CudaTarget) {
5249 llvm_unreachable(
"unexpected cuda target");
5251 auto *HostTI =
LangOpts.CUDAIsDevice ? Aux : &TI;
5252 auto *DeviceTI =
LangOpts.CUDAIsDevice ? &TI : Aux;
5253 if (CheckHost && HostTI)
5256 A = DeviceTI->checkCallingConvention(CC);
5274 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
5279 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
5284 bool IsCXXMethod =
false, IsVariadic =
false;
5315 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
5323 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
5335 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
5345 const CUDALaunchBoundsAttr &AL,
5346 const unsigned Idx) {
5355 std::optional<llvm::APSInt> I = llvm::APSInt(64);
5362 if (!I->isIntN(32)) {
5364 <<
toString(*I, 10,
false) << 32 << 1;
5376 "Unexpected PerformCopyInitialization() failure.");
5381CUDALaunchBoundsAttr *
5383 Expr *MinBlocks,
Expr *MaxBlocks) {
5384 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5402 MaxBlocks =
nullptr;
5411 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5433 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
5451 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
5454 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
5465 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
5473 if (!isa<VarDecl>(
D)) {
5474 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
5482 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
5505 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
5508 uint32_t Count = 0, Offset = 0;
5515 if (Count < Offset) {
5516 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
5522 PatchableFunctionEntryAttr(S.
Context, AL, Count, Offset));
5527 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
5534 StringRef AliasName = cast<FunctionDecl>(
D)->getIdentifier()->getName();
5544 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL)) {
5545 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
5556 if (
auto *CRD = dyn_cast<CXXRecordDecl>(
D);
5557 !CRD || !(CRD->isClass() || CRD->isStruct())) {
5563 handleSimpleAttribute<TypeNullableAttr>(S,
D, AL);
5568 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
5574 assert(ParmTSI &&
"no type source info for attribute argument");
5576 diag::err_incomplete_type);
5586 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
5587 if (
const auto *UA =
D->
getAttr<UuidAttr>()) {
5590 if (!UA->getGuid().empty()) {
5591 Diag(UA->getLocation(), diag::err_mismatched_uuid);
5597 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
5602 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
5607 StringRef OrigStrRef;
5614 StringRef StrRef = OrigStrRef;
5615 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
5616 StrRef = StrRef.drop_front().drop_back();
5619 if (StrRef.size() != 36) {
5620 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
5624 for (
unsigned i = 0; i < 36; ++i) {
5625 if (i == 8 || i == 13 || i == 18 || i == 23) {
5626 if (StrRef[i] !=
'-') {
5627 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
5631 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
5638 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
5639 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
5640 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
5641 for (
unsigned i = 0; i != 8; ++i)
5642 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
5653 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
5662 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
5675 const auto *VD = cast<VarDecl>(
D);
5677 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
5681 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
5684 if (VD->hasLocalStorage()) {
5685 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
5693 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
5697 auto *FD = cast<FunctionDecl>(
D);
5699 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
5703 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
5704 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
5705 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
5715 for (
unsigned I = 0,
E = AL.
getNumArgs(); I !=
E; ++I) {
5719 Tags.push_back(Tag);
5722 if (
const auto *NS = dyn_cast<NamespaceDecl>(
D)) {
5723 if (!NS->isInline()) {
5724 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
5727 if (NS->isAnonymousNamespace()) {
5728 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
5732 Tags.push_back(NS->getName());
5738 Tags.erase(std::unique(Tags.begin(), Tags.end()), Tags.end());
5741 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
5746 if (I->getBTFDeclTag() == Tag)
5765 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
5771 case llvm::Triple::msp430:
5774 case llvm::Triple::mipsel:
5775 case llvm::Triple::mips:
5778 case llvm::Triple::m68k:
5781 case llvm::Triple::x86:
5782 case llvm::Triple::x86_64:
5785 case llvm::Triple::avr:
5788 case llvm::Triple::riscv32:
5789 case llvm::Triple::riscv64:
5806 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
5822 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
5834 if (DLLImportAttr *Import =
D->
getAttr<DLLImportAttr>()) {
5835 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
5846 if (isa<ClassTemplatePartialSpecializationDecl>(
D) &&
5852 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
5862 if (
const auto *MD = dyn_cast<CXXMethodDecl>(
D)) {
5864 MD->getParent()->isLambda()) {
5870 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
5881 if (MSInheritanceAttr *IA =
D->
getAttr<MSInheritanceAttr>()) {
5882 if (IA->getInheritanceModel() == Model)
5884 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
5886 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
5890 auto *RD = cast<CXXRecordDecl>(
D);
5891 if (RD->hasDefinition()) {
5897 if (isa<ClassTemplatePartialSpecializationDecl>(RD)) {
5898 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
5902 if (RD->getDescribedClassTemplate()) {
5903 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
5921 StringRef N(
"mutex");
5923 if (AL.
getKind() == ParsedAttr::AT_Capability &&
5936 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
5941 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(
D);
5965 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(
D);
5978 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(
D);
5991 RequiresCapabilityAttr *RCA = ::new (S.
Context)
5992 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
5998 if (
const auto *NSD = dyn_cast<NamespaceDecl>(
D)) {
5999 if (NSD->isAnonymousNamespace()) {
6000 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6014 StringRef Str, Replacement;
6027 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6033 if (
const auto *S = dyn_cast<VarDecl>(
D))
6034 return S->hasGlobalStorage();
6039 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6040 Sanitizer ==
"memtag";
6047 std::vector<StringRef> Sanitizers;
6049 for (
unsigned I = 0,
E = AL.
getNumArgs(); I !=
E; ++I) {
6050 StringRef SanitizerName;
6058 SanitizerName !=
"coverage")
6059 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6062 << AL << SanitizerName;
6063 Sanitizers.push_back(SanitizerName);
6067 Sanitizers.size()));
6074 StringRef SanitizerName = llvm::StringSwitch<StringRef>(AttrName)
6075 .Case(
"no_address_safety_analysis",
"address")
6076 .Case(
"no_sanitize_address",
"address")
6077 .Case(
"no_sanitize_thread",
"thread")
6078 .Case(
"no_sanitize_memory",
"memory");
6091 unsigned TranslatedSpellingIndex = 0;
6093 TranslatedSpellingIndex = 1;
6098 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6113 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6114 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6115 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6125 auto *FD = dyn_cast<FieldDecl>(
D);
6135 case ParsedAttr::AT_CountedBy:
6136 CountInBytes =
false;
6139 case ParsedAttr::AT_CountedByOrNull:
6140 CountInBytes =
false;
6143 case ParsedAttr::AT_SizedBy:
6144 CountInBytes =
true;
6147 case ParsedAttr::AT_SizedByOrNull:
6148 CountInBytes =
true;
6152 llvm_unreachable(
"unexpected counted_by family attribute");
6159 FD->
getType(), CountExpr, CountInBytes, OrNull);
6170 FunctionReturnThunksAttr::Kind Kind;
6171 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
6172 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6179 D->
dropAttr<FunctionReturnThunksAttr>();
6185 assert(isa<TypedefNameDecl>(
D) &&
"This attribute only applies to a typedef");
6186 handleSimpleAttribute<AvailableOnlyInDefaultEvalMethodAttr>(S,
D, AL);
6190 auto *VDecl = dyn_cast<VarDecl>(
D);
6191 if (VDecl && !VDecl->isFunctionPointerType()) {
6192 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
6204 if (!cast<VarDecl>(
D)->hasGlobalStorage()) {
6206 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
6210 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
6211 handleSimpleAttribute<AlwaysDestroyAttr>(S,
D, A);
6213 handleSimpleAttribute<NoDestroyAttr>(S,
D, A);
6217 assert(cast<VarDecl>(
D)->getStorageDuration() ==
SD_Automatic &&
6218 "uninitialized is only valid on automatic duration variables");
6227 if (!isa<BlockDecl>(
D)) {
6229 bool IsKernReturnT =
false;
6231 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
6236 diag::warn_mig_server_routine_does_not_return_kern_return_t);
6241 handleSimpleAttribute<MIGServerRoutineAttr>(S,
D, AL);
6246 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
6249 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
6255 handleSimpleAttribute<MSAllocatorAttr>(S,
D, AL);
6262 if (
const auto *PVD = dyn_cast<ParmVarDecl>(
D)) {
6263 if (PVD->getType()->isIntegerType()) {
6264 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
6275template<
typename Attr>
6283template<
typename Attr>
6292 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
6297 CFGuardAttr::GuardArg Arg;
6299 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
6300 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
6308template <
typename AttrTy>
6311 auto I = llvm::find_if(Attrs,
6312 [Name](
const AttrTy *A) {
6313 return A->getTCBName() == Name;
6315 return I == Attrs.end() ? nullptr : *I;
6318template <
typename AttrTy,
typename ConflictingAttrTy>
6325 if (
const ConflictingAttrTy *ConflictingAttr =
6326 findEnforceTCBAttrByName<ConflictingAttrTy>(
D, Argument)) {
6329 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
6343template <
typename AttrTy,
typename ConflictingAttrTy>
6346 StringRef TCBName = AL.getTCBName();
6347 if (
const ConflictingAttrTy *ConflictingAttr =
6348 findEnforceTCBAttrByName<ConflictingAttrTy>(
D, TCBName)) {
6349 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
6350 << ConflictingAttr->getAttrName()->getName()
6351 << AL.getAttrName()->getName() << TCBName;
6354 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
6362 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
6366 return mergeEnforceTCBAttrImpl<EnforceTCBAttr, EnforceTCBLeafAttr>(
6371 Decl *
D,
const EnforceTCBLeafAttr &AL) {
6372 return mergeEnforceTCBAttrImpl<EnforceTCBLeafAttr, EnforceTCBAttr>(
6381 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
6386 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
6391 if (
D->
getAttr<VTablePointerAuthenticationAttr>()) {
6392 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
6396 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
6399 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
6401 S.
Diag(IL->
Loc, diag::err_invalid_authentication_key) << IL->
Ident;
6404 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
6406 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
6410 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
6415 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
6416 AddressDiscriminationMode::DefaultAddressDiscrimination;
6420 if (!VTablePointerAuthenticationAttr::
6421 ConvertStrToAddressDiscriminationMode(IL->
Ident->
getName(),
6422 AddressDiversityMode)) {
6423 S.
Diag(IL->
Loc, diag::err_invalid_address_discrimination) << IL->
Ident;
6426 if (AddressDiversityMode ==
6427 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
6429 S.
Diag(IL->
Loc, diag::err_no_default_vtable_pointer_auth) << 1;
6433 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
6438 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
6439 DefaultExtraDiscrimination;
6443 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
6445 S.
Diag(IL->
Loc, diag::err_invalid_extra_discrimination) << IL->
Ident;
6448 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
6450 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
6454 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
6459 uint32_t CustomDiscriminationValue = 0;
6460 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
6462 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
6467 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
6472 CustomDiscriminationValue)) {
6473 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
6476 }
else if (NumArgs > 3) {
6477 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
6482 S.
Context, AL, KeyType, AddressDiversityMode, ED,
6483 CustomDiscriminationValue));
6499 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
6500 bool IsLastAttrArg = I == (AttrNumArgs - 1);
6503 if (IsLastAttrArg && AttrHasVariadicArg)
6510 if (isa<PackExpansionExpr>(
E))
6511 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
6538 !Options.IncludeCXX11Attributes)
6548 ? (
unsigned)diag::err_keyword_not_supported_on_target
6550 ? (
unsigned)diag::warn_unhandled_ms_attribute_ignored
6551 : (
unsigned)diag::warn_unknown_attribute_ignored)
6563 if (MustDelayArgs) {
6573 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
6576 if (Options.IgnoreTypeAttributes)
6594 isa<DeclaratorDecl, TypeAliasDecl>(
D)) {
6599 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
6608 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
6621 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
6631 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
6642 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
6645 case ParsedAttr::AT_Interrupt:
6648 case ParsedAttr::AT_X86ForceAlignArgPointer:
6651 case ParsedAttr::AT_ReadOnlyPlacement:
6652 handleSimpleAttribute<ReadOnlyPlacementAttr>(S,
D, AL);
6654 case ParsedAttr::AT_DLLExport:
6655 case ParsedAttr::AT_DLLImport:
6658 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
6661 case ParsedAttr::AT_AMDGPUWavesPerEU:
6664 case ParsedAttr::AT_AMDGPUNumSGPR:
6667 case ParsedAttr::AT_AMDGPUNumVGPR:
6670 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
6673 case ParsedAttr::AT_AVRSignal:
6676 case ParsedAttr::AT_BPFPreserveAccessIndex:
6679 case ParsedAttr::AT_BPFPreserveStaticOffset:
6680 handleSimpleAttribute<BPFPreserveStaticOffsetAttr>(S,
D, AL);
6682 case ParsedAttr::AT_BTFDeclTag:
6685 case ParsedAttr::AT_WebAssemblyExportName:
6688 case ParsedAttr::AT_WebAssemblyImportModule:
6691 case ParsedAttr::AT_WebAssemblyImportName:
6694 case ParsedAttr::AT_IBOutlet:
6697 case ParsedAttr::AT_IBOutletCollection:
6700 case ParsedAttr::AT_IFunc:
6703 case ParsedAttr::AT_Alias:
6706 case ParsedAttr::AT_Aligned:
6709 case ParsedAttr::AT_AlignValue:
6712 case ParsedAttr::AT_AllocSize:
6715 case ParsedAttr::AT_AlwaysInline:
6718 case ParsedAttr::AT_AnalyzerNoReturn:
6721 case ParsedAttr::AT_TLSModel:
6724 case ParsedAttr::AT_Annotate:
6727 case ParsedAttr::AT_Availability:
6730 case ParsedAttr::AT_CarriesDependency:
6733 case ParsedAttr::AT_CPUDispatch:
6734 case ParsedAttr::AT_CPUSpecific:
6737 case ParsedAttr::AT_Common:
6740 case ParsedAttr::AT_CUDAConstant:
6743 case ParsedAttr::AT_PassObjectSize:
6746 case ParsedAttr::AT_Constructor:
6749 case ParsedAttr::AT_Deprecated:
6752 case ParsedAttr::AT_Destructor:
6755 case ParsedAttr::AT_EnableIf:
6758 case ParsedAttr::AT_Error:
6761 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
6764 case ParsedAttr::AT_DiagnoseIf:
6767 case ParsedAttr::AT_DiagnoseAsBuiltin:
6770 case ParsedAttr::AT_NoBuiltin:
6773 case ParsedAttr::AT_ExtVectorType:
6776 case ParsedAttr::AT_ExternalSourceSymbol:
6779 case ParsedAttr::AT_MinSize:
6782 case ParsedAttr::AT_OptimizeNone:
6785 case ParsedAttr::AT_EnumExtensibility:
6788 case ParsedAttr::AT_SYCLKernel:
6791 case ParsedAttr::AT_SYCLKernelEntryPoint:
6794 case ParsedAttr::AT_SYCLSpecialClass:
6795 handleSimpleAttribute<SYCLSpecialClassAttr>(S,
D, AL);
6797 case ParsedAttr::AT_Format:
6800 case ParsedAttr::AT_FormatArg:
6803 case ParsedAttr::AT_Callback:
6806 case ParsedAttr::AT_LifetimeCaptureBy:
6809 case ParsedAttr::AT_CalledOnce:
6812 case ParsedAttr::AT_NVPTXKernel:
6813 case ParsedAttr::AT_CUDAGlobal:
6816 case ParsedAttr::AT_CUDADevice:
6819 case ParsedAttr::AT_CUDAGridConstant:
6822 case ParsedAttr::AT_HIPManaged:
6825 case ParsedAttr::AT_GNUInline:
6828 case ParsedAttr::AT_CUDALaunchBounds:
6831 case ParsedAttr::AT_Restrict:
6834 case ParsedAttr::AT_Mode:
6837 case ParsedAttr::AT_NonNull:
6838 if (
auto *PVD = dyn_cast<ParmVarDecl>(
D))
6843 case ParsedAttr::AT_ReturnsNonNull:
6846 case ParsedAttr::AT_NoEscape:
6849 case ParsedAttr::AT_MaybeUndef:
6850 handleSimpleAttribute<MaybeUndefAttr>(S,
D, AL);
6852 case ParsedAttr::AT_AssumeAligned:
6855 case ParsedAttr::AT_AllocAlign:
6858 case ParsedAttr::AT_Ownership:
6861 case ParsedAttr::AT_Naked:
6864 case ParsedAttr::AT_NoReturn:
6867 case ParsedAttr::AT_CXX11NoReturn:
6870 case ParsedAttr::AT_AnyX86NoCfCheck:
6873 case ParsedAttr::AT_NoThrow:
6875 handleSimpleAttribute<NoThrowAttr>(S,
D, AL);
6877 case ParsedAttr::AT_CUDAShared:
6880 case ParsedAttr::AT_VecReturn:
6883 case ParsedAttr::AT_ObjCOwnership:
6886 case ParsedAttr::AT_ObjCPreciseLifetime:
6889 case ParsedAttr::AT_ObjCReturnsInnerPointer:
6892 case ParsedAttr::AT_ObjCRequiresSuper:
6895 case ParsedAttr::AT_ObjCBridge:
6898 case ParsedAttr::AT_ObjCBridgeMutable:
6901 case ParsedAttr::AT_ObjCBridgeRelated:
6904 case ParsedAttr::AT_ObjCDesignatedInitializer:
6907 case ParsedAttr::AT_ObjCRuntimeName:
6910 case ParsedAttr::AT_ObjCBoxable:
6913 case ParsedAttr::AT_NSErrorDomain:
6916 case ParsedAttr::AT_CFConsumed:
6917 case ParsedAttr::AT_NSConsumed:
6918 case ParsedAttr::AT_OSConsumed:
6923 case ParsedAttr::AT_OSReturnsRetainedOnZero:
6924 handleSimpleAttributeOrDiagnose<OSReturnsRetainedOnZeroAttr>(
6926 diag::warn_ns_attribute_wrong_parameter_type,
6929 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
6930 handleSimpleAttributeOrDiagnose<OSReturnsRetainedOnNonZeroAttr>(
6932 diag::warn_ns_attribute_wrong_parameter_type,
6935 case ParsedAttr::AT_NSReturnsAutoreleased:
6936 case ParsedAttr::AT_NSReturnsNotRetained:
6937 case ParsedAttr::AT_NSReturnsRetained:
6938 case ParsedAttr::AT_CFReturnsNotRetained:
6939 case ParsedAttr::AT_CFReturnsRetained:
6940 case ParsedAttr::AT_OSReturnsNotRetained:
6941 case ParsedAttr::AT_OSReturnsRetained:
6944 case ParsedAttr::AT_WorkGroupSizeHint:
6945 handleWorkGroupSize<WorkGroupSizeHintAttr>(S,
D, AL);
6947 case ParsedAttr::AT_ReqdWorkGroupSize:
6948 handleWorkGroupSize<ReqdWorkGroupSizeAttr>(S,
D, AL);
6950 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
6953 case ParsedAttr::AT_VecTypeHint:
6956 case ParsedAttr::AT_InitPriority:
6959 case ParsedAttr::AT_Packed:
6962 case ParsedAttr::AT_PreferredName:
6965 case ParsedAttr::AT_NoSpecializations:
6968 case ParsedAttr::AT_Section:
6971 case ParsedAttr::AT_CodeModel:
6974 case ParsedAttr::AT_RandomizeLayout:
6977 case ParsedAttr::AT_NoRandomizeLayout:
6980 case ParsedAttr::AT_CodeSeg:
6983 case ParsedAttr::AT_Target:
6986 case ParsedAttr::AT_TargetVersion:
6989 case ParsedAttr::AT_TargetClones:
6992 case ParsedAttr::AT_MinVectorWidth:
6995 case ParsedAttr::AT_Unavailable:
6996 handleAttrWithMessage<UnavailableAttr>(S,
D, AL);
6998 case ParsedAttr::AT_OMPAssume:
7001 case ParsedAttr::AT_ObjCDirect:
7004 case ParsedAttr::AT_ObjCDirectMembers:
7006 handleSimpleAttribute<ObjCDirectMembersAttr>(S,
D, AL);
7008 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
7011 case ParsedAttr::AT_Unused:
7014 case ParsedAttr::AT_Visibility:
7017 case ParsedAttr::AT_TypeVisibility:
7020 case ParsedAttr::AT_WarnUnusedResult:
7023 case ParsedAttr::AT_WeakRef:
7026 case ParsedAttr::AT_WeakImport:
7029 case ParsedAttr::AT_TransparentUnion:
7032 case ParsedAttr::AT_ObjCMethodFamily:
7035 case ParsedAttr::AT_ObjCNSObject:
7038 case ParsedAttr::AT_ObjCIndependentClass:
7041 case ParsedAttr::AT_Blocks:
7044 case ParsedAttr::AT_Sentinel:
7047 case ParsedAttr::AT_Cleanup:
7050 case ParsedAttr::AT_NoDebug:
7053 case ParsedAttr::AT_CmseNSEntry:
7056 case ParsedAttr::AT_StdCall:
7057 case ParsedAttr::AT_CDecl:
7058 case ParsedAttr::AT_FastCall:
7059 case ParsedAttr::AT_ThisCall:
7060 case ParsedAttr::AT_Pascal:
7061 case ParsedAttr::AT_RegCall:
7062 case ParsedAttr::AT_SwiftCall:
7063 case ParsedAttr::AT_SwiftAsyncCall:
7064 case ParsedAttr::AT_VectorCall:
7065 case ParsedAttr::AT_MSABI:
7066 case ParsedAttr::AT_SysVABI:
7067 case ParsedAttr::AT_Pcs:
7068 case ParsedAttr::AT_IntelOclBicc:
7069 case ParsedAttr::AT_PreserveMost:
7070 case ParsedAttr::AT_PreserveAll:
7071 case ParsedAttr::AT_AArch64VectorPcs:
7072 case ParsedAttr::AT_AArch64SVEPcs:
7073 case ParsedAttr::AT_AMDGPUKernelCall:
7074 case ParsedAttr::AT_M68kRTD:
7075 case ParsedAttr::AT_PreserveNone:
7076 case ParsedAttr::AT_RISCVVectorCC:
7079 case ParsedAttr::AT_Suppress:
7082 case ParsedAttr::AT_Owner:
7083 case ParsedAttr::AT_Pointer:
7086 case ParsedAttr::AT_OpenCLAccess:
7089 case ParsedAttr::AT_OpenCLNoSVM:
7092 case ParsedAttr::AT_SwiftContext:
7095 case ParsedAttr::AT_SwiftAsyncContext:
7098 case ParsedAttr::AT_SwiftErrorResult:
7101 case ParsedAttr::AT_SwiftIndirectResult:
7104 case ParsedAttr::AT_InternalLinkage:
7107 case ParsedAttr::AT_ZeroCallUsedRegs:
7110 case ParsedAttr::AT_FunctionReturnThunks:
7113 case ParsedAttr::AT_NoMerge:
7116 case ParsedAttr::AT_NoUniqueAddress:
7120 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
7124 case ParsedAttr::AT_CountedBy:
7125 case ParsedAttr::AT_CountedByOrNull:
7126 case ParsedAttr::AT_SizedBy:
7127 case ParsedAttr::AT_SizedByOrNull:
7132 case ParsedAttr::AT_LayoutVersion:
7135 case ParsedAttr::AT_Uuid:
7138 case ParsedAttr::AT_MSInheritance:
7141 case ParsedAttr::AT_Thread:
7144 case ParsedAttr::AT_MSConstexpr:
7147 case ParsedAttr::AT_HybridPatchable:
7148 handleSimpleAttribute<HybridPatchableAttr>(S,
D, AL);
7152 case ParsedAttr::AT_HLSLNumThreads:
7155 case ParsedAttr::AT_HLSLWaveSize:
7158 case ParsedAttr::AT_HLSLSV_GroupThreadID:
7161 case ParsedAttr::AT_HLSLSV_GroupID:
7164 case ParsedAttr::AT_HLSLSV_GroupIndex:
7165 handleSimpleAttribute<HLSLSV_GroupIndexAttr>(S,
D, AL);
7167 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
7168 handleSimpleAttribute<HLSLGroupSharedAddressSpaceAttr>(S,
D, AL);
7170 case ParsedAttr::AT_HLSLSV_DispatchThreadID:
7173 case ParsedAttr::AT_HLSLPackOffset:
7176 case ParsedAttr::AT_HLSLShader:
7179 case ParsedAttr::AT_HLSLResourceBinding:
7182 case ParsedAttr::AT_HLSLParamModifier:
7186 case ParsedAttr::AT_AbiTag:
7189 case ParsedAttr::AT_CFGuard:
7194 case ParsedAttr::AT_AssertExclusiveLock:
7197 case ParsedAttr::AT_AssertSharedLock:
7200 case ParsedAttr::AT_PtGuardedVar:
7203 case ParsedAttr::AT_NoSanitize:
7206 case ParsedAttr::AT_NoSanitizeSpecific:
7209 case ParsedAttr::AT_GuardedBy:
7212 case ParsedAttr::AT_PtGuardedBy:
7215 case ParsedAttr::AT_ExclusiveTrylockFunction:
7218 case ParsedAttr::AT_LockReturned:
7221 case ParsedAttr::AT_LocksExcluded:
7224 case ParsedAttr::AT_SharedTrylockFunction:
7227 case ParsedAttr::AT_AcquiredBefore:
7230 case ParsedAttr::AT_AcquiredAfter:
7235 case ParsedAttr::AT_Capability:
7236 case ParsedAttr::AT_Lockable:
7239 case ParsedAttr::AT_RequiresCapability:
7243 case ParsedAttr::AT_AssertCapability:
7246 case ParsedAttr::AT_AcquireCapability:
7249 case ParsedAttr::AT_ReleaseCapability:
7252 case ParsedAttr::AT_TryAcquireCapability:
7257 case ParsedAttr::AT_Consumable:
7260 case ParsedAttr::AT_CallableWhen:
7263 case ParsedAttr::AT_ParamTypestate:
7266 case ParsedAttr::AT_ReturnTypestate:
7269 case ParsedAttr::AT_SetTypestate:
7272 case ParsedAttr::AT_TestTypestate:
7277 case ParsedAttr::AT_ArgumentWithTypeTag:
7280 case ParsedAttr::AT_TypeTagForDatatype:
7285 case ParsedAttr::AT_SwiftAsyncName:
7288 case ParsedAttr::AT_SwiftAttr:
7291 case ParsedAttr::AT_SwiftBridge:
7294 case ParsedAttr::AT_SwiftError:
7297 case ParsedAttr::AT_SwiftName:
7300 case ParsedAttr::AT_SwiftNewType:
7303 case ParsedAttr::AT_SwiftAsync:
7306 case ParsedAttr::AT_SwiftAsyncError:
7311 case ParsedAttr::AT_XRayLogArgs:
7315 case ParsedAttr::AT_PatchableFunctionEntry:
7319 case ParsedAttr::AT_AlwaysDestroy:
7320 case ParsedAttr::AT_NoDestroy:
7324 case ParsedAttr::AT_Uninitialized:
7328 case ParsedAttr::AT_ObjCExternallyRetained:
7332 case ParsedAttr::AT_MIGServerRoutine:
7336 case ParsedAttr::AT_MSAllocator:
7340 case ParsedAttr::AT_ArmBuiltinAlias:
7344 case ParsedAttr::AT_ArmLocallyStreaming:
7345 handleSimpleAttribute<ArmLocallyStreamingAttr>(S,
D, AL);
7348 case ParsedAttr::AT_ArmNew:
7352 case ParsedAttr::AT_AcquireHandle:
7356 case ParsedAttr::AT_ReleaseHandle:
7357 handleHandleAttr<ReleaseHandleAttr>(S,
D, AL);
7360 case ParsedAttr::AT_UnsafeBufferUsage:
7361 handleUnsafeBufferUsage<UnsafeBufferUsageAttr>(S,
D, AL);
7364 case ParsedAttr::AT_UseHandle:
7365 handleHandleAttr<UseHandleAttr>(S,
D, AL);
7368 case ParsedAttr::AT_EnforceTCB:
7369 handleEnforceTCBAttr<EnforceTCBAttr, EnforceTCBLeafAttr>(S,
D, AL);
7372 case ParsedAttr::AT_EnforceTCBLeaf:
7373 handleEnforceTCBAttr<EnforceTCBLeafAttr, EnforceTCBAttr>(S,
D, AL);
7376 case ParsedAttr::AT_BuiltinAlias:
7380 case ParsedAttr::AT_PreferredType:
7384 case ParsedAttr::AT_UsingIfExists:
7385 handleSimpleAttribute<UsingIfExistsAttr>(S,
D, AL);
7388 case ParsedAttr::AT_TypeNullable:
7392 case ParsedAttr::AT_VTablePointerAuthentication:
7400 return D->
hasAttr<OpenCLKernelAttr>() ||
7408 if (AttrList.
empty())
7419 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
7420 << cast<NamedDecl>(
D);
7429 if (!(
D->
hasAttr<OpenCLKernelAttr>() ||
7433 if (
const auto *A =
D->
getAttr<ReqdWorkGroupSizeAttr>()) {
7438 }
else if (
const auto *A =
D->
getAttr<WorkGroupSizeHintAttr>()) {
7441 }
else if (
const auto *A =
D->
getAttr<VecTypeHintAttr>()) {
7444 }
else if (
const auto *A =
D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
7450 if (
const auto *A =
D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
7454 }
else if (
const auto *A =
D->
getAttr<AMDGPUWavesPerEUAttr>()) {
7458 }
else if (
const auto *A =
D->
getAttr<AMDGPUNumSGPRAttr>()) {
7462 }
else if (
const auto *A =
D->
getAttr<AMDGPUNumVGPRAttr>()) {
7474 if (
D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
7475 cast<ObjCMethodDecl>(
D)->getMethodFamily() !=
OMF_init) {
7477 D->
dropAttr<ObjCDesignatedInitializerAttr>();
7484 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
7491 if (
D &&
D->
hasAttr<BPFPreserveAccessIndexAttr>())
7498 if (AL.getKind() == ParsedAttr::AT_Annotate) {
7502 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
7514 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
7520 S.
Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored)
7521 << AL << AL.getRange();
7523 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
7533 for (
unsigned i = 0, e =
D.getNumTypeObjects(); i != e; ++i)
7539 assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
7541 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
7563 for (
const auto &AI : FT->param_types()) {
7566 Params.push_back(Param);
7568 NewFD->setParams(Params);
7570 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
7572 VD->getInnerLocStart(), VD->getLocation(), II,
7573 VD->getType(), VD->getTypeSourceInfo(),
7574 VD->getStorageClass());
7575 if (VD->getQualifier())
7576 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
7609 if (
auto *VD = dyn_cast<VarDecl>(
D))
7610 if (VD->isExternC())
7612 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
7620 auto &WeakInfos = I->second;
7621 for (
const auto &W : WeakInfos)
7623 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
7624 WeakInfos.swap(EmptyWeakInfos);
7636 auto ProcessAttributesWithSliding =
7644 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
7645 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
7650 AL.diagnoseAppertainsTo(*
this,
D);
7665 .WithIncludeCXX11Attributes(
false)
7666 .WithIgnoreTypeAttributes(
true));
7675 .WithIncludeCXX11Attributes(
false)
7676 .WithIgnoreTypeAttributes(
true));
7694 UnavailableAttr::ImplicitReason &reason) {
7698 if (!isa<FieldDecl>(
D) && !isa<ObjCPropertyDecl>(
D) &&
7699 !isa<FunctionDecl>(
D))
7707 if ((isa<ObjCIvarDecl>(
D) || isa<ObjCPropertyDecl>(
D))) {
7710 reason = UnavailableAttr::IR_ForbiddenWeak;
7719 reason = UnavailableAttr::IR_ARCForbiddenType;
7729 auto Reason = UnavailableAttr::IR_None;
7731 assert(Reason &&
"didn't set reason?");
7736 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
7739 if (FD->
hasAttr<UnavailableAttr>() &&
7741 diag::err_arc_array_param_no_ownership) {
7772 bool AnyAccessFailures =
false;
7780 switch (diag.
Kind) {
7784 if (!
decl->isInvalidDecl())
7792 if (AnyAccessFailures && isa<DecompositionDecl>(
decl))
7796 AnyAccessFailures =
true;
7809 assert(curPool &&
"re-emitting in undelayed context not supported");
7810 curPool->
steal(pool);
Defines the clang::ASTContext interface.
static SmallString< 64 > normalizeName(const IdentifierInfo *Name, const IdentifierInfo *Scope, AttributeCommonInfo::Syntax SyntaxUsed)
static OffloadArch getOffloadArch(CodeGenModule &CGM)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y)
Check whether the two versions match.
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis functions specific to AVR.
This file declares semantic analysis functions specific to BPF.
This file declares semantic analysis for CUDA constructs.
static void handleCleanupAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWeakImportAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkGuardedByAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, Expr *&Arg)
static void handleCodeSegAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePatchableFunctionEntryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCountedByAttrField(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFormatAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((format(type,idx,firstarg))) attributes based on http://gcc.gnu.org/onlinedocs/gcc/F...
static void handleUninitializedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRequiresCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleBTFDeclTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleOptimizeNoneAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnableIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSectionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleStandardNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleMIGServerRoutineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleZeroCallUsedRegsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDiagnoseAsBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnumExtensibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static T * mergeVisibilityAttr(Sema &S, Decl *D, const AttributeCommonInfo &CI, typename T::VisibilityType value)
static void handleLayoutVersion(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkForConsumableClass(Sema &S, const CXXMethodDecl *MD, const ParsedAttr &AL)
static void handleDLLAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlignValueAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLifetimeCaptureByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoCfCheckAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleNoSpecializations(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReturnsNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void checkUnusedDeclAttributes(Sema &S, const ParsedAttributesView &A)
checkUnusedDeclAttributes - Check a list of attributes to see if it contains any decl attributes that...
static void handleGNUInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWorkGroupSize(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleBuiltinAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTransparentUnionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVTablePointerAuthentication(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnforceTCBAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void checkAttrArgsAreCapabilityObjs(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args, unsigned Sidx=0, bool ParamIdxOk=false)
Checks that all attribute arguments, starting from Sidx, resolve to a capability object.
static void handleErrorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkCodeSegName(Sema &S, SourceLocation LiteralLoc, StringRef CodeSegName)
static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTryAcquireCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGridConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSetTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFormatArgAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((format_arg((idx)))) attribute based on http://gcc.gnu.org/onlinedocs/gcc/Function-A...
static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL, const Sema::ProcessDeclAttributeOptions &Options)
ProcessDeclAttribute - Apply the specific attribute to the specified decl if the attribute applies to...
static void handleTargetAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleXRayLogArgsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePassObjectSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoMergeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleManagedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleParamTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUnsafeBufferUsage(Sema &S, Decl *D, const ParsedAttr &AL)
static bool attrNonNullArgCheck(Sema &S, QualType T, const ParsedAttr &AL, SourceRange AttrParmRange, SourceRange TypeRange, bool isReturnValue=false)
static void handleAcquireCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCPUSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePackedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleIFuncAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAbiTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAttrWithMessage(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWeakRefAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExtVectorTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCalledOnceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle 'called_once' attribute.
static void handleLockReturnedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkFunctionConditionAttr(Sema &S, Decl *D, const ParsedAttr &AL, Expr *&Cond, StringRef &Msg)
static void handleAcquiredAfterAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExternalSourceSymbolAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D, const ParsedAttr &AL)
static bool checkParamIsIntegerType(Sema &S, const Decl *D, const AttrInfo &AI, unsigned AttrArgNo)
Checks to be sure that the given parameter number is in bounds, and is an integral type.
static bool checkFunParamsAreScopedLockable(Sema &S, const ParmVarDecl *ParamDecl, const ParsedAttr &AL)
static bool checkRecordTypeForCapability(Sema &S, QualType Ty)
static void handleArgumentWithTypeTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkAcquireOrderAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleLocksExcludedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSAllocatorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static AttrTy * mergeEnforceTCBAttrImpl(Sema &S, Decl *D, const AttrTy &AL)
static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAllocSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleConsumableAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static const RecordType * getRecordType(QualType QT)
Checks that the passed in QualType either is of RecordType or points to RecordType.
static void handleNoSanitizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReturnTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isKernelDecl(Decl *D)
static void handleAllocAlignAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePreferredTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeviceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePtGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlwaysInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAssertCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVisibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL, bool isTypeVisibility)
static void handleAnnotateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static FormatAttrKind getFormatAttrKind(StringRef Format)
getFormatAttrKind - Map from format attribute names to supported format types.
static void handleNullableTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUuidAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAcquireHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSConstexprAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCommonAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTestTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkTryLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void parseModeAttrArg(Sema &S, StringRef Str, unsigned &DestWidth, bool &IntegerMode, bool &ComplexMode, FloatModeKind &ExplicitType)
parseModeAttrArg - Parses attribute mode string and returns parsed type attribute.
static void handleExcludeFromExplicitInstantiationAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSharedTrylockFunctionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLaunchBoundsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkAvailabilityAttr(Sema &S, SourceRange Range, IdentifierInfo *Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted)
static void handleDependencyAttr(Sema &S, Scope *Scope, Decl *D, const ParsedAttr &AL)
static void handleNoBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoUniqueAddressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool validateAlignasAppliedType(Sema &S, Decl *D, const AlignedAttr &Attr, SourceLocation AttrLoc)
Perform checking of type validity.
static void handleNakedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFunctionReturnThunksAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
static void handleGlobalAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSentinelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCodeModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCallableWhenAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool hasBTFDeclTagAttr(Decl *D, StringRef Tag)
static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &DD, Decl *D)
Handle a delayed forbidden-type diagnostic.
static void handleAssertSharedLockAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleAssumeAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSharedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSInheritanceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVecTypeHint(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRestrictAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinVectorWidthAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static Expr * makeLaunchBoundsArgExpr(Sema &S, Expr *E, const CUDALaunchBoundsAttr &AL, const unsigned Idx)
static void handleDeclspecThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleInterruptAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExclusiveTrylockFunctionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCallbackAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((callback(CalleeIdx, PayloadIdx0, ...))) attributes.
static void handleInitPriorityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((init_priority(priority))) attributes based on http://gcc.gnu.org/onlinedocs/gcc/C_0...
static void handlePtGuardedVarAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkRecordDeclForAttr(const RecordDecl *RD)
static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleTypeTagForDatatypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void markUsedForAliasOrIfunc(Sema &S, Decl *D, const ParsedAttr &AL, StringRef Str)
static bool isCapabilityExpr(Sema &S, const Expr *Ex)
static void handleNoDebugAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSuppressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static const AttrTy * findEnforceTCBAttrByName(Decl *D, StringRef Name)
static void handleNoEscapeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAvailableOnlyInDefaultEvalMethod(Sema &S, Decl *D, const ParsedAttr &AL)
static bool MustDelayAttributeArguments(const ParsedAttr &AL)
static void handleNoRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTargetVersionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWarnUnusedResult(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkRecordTypeForScopedCapability(Sema &S, QualType Ty)
static void handleAssertExclusiveLockAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isIntOrBool(Expr *Exp)
Check if the passed-in expression is of type int or bool.
static bool isSanitizerAttributeAllowedOnGlobals(StringRef Sanitizer)
static void handleCallConvAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleOwnershipAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkTypedefTypeForCapability(QualType Ty)
static void handleAcquiredBeforeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReleaseCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool typeHasCapability(Sema &S, QualType Ty)
static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsSmartPointer(Sema &S, const RecordType *RT)
static bool isFunctionLike(const Type &T)
static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCFGuardAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsPointer(Sema &S, const Decl *D, const ParsedAttr &AL)
Check if passed in Decl is a pointer type.
static bool isForbiddenTypeAllowed(Sema &S, Decl *D, const DelayedDiagnostic &diag, UnavailableAttr::ImplicitReason &reason)
Is the given declaration allowed to use a forbidden type? If so, it'll still be annotated with an att...
static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleModeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
handleModeAttr - This attribute modifies the width of a decl with primitive type.
static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkPositiveIntArgument(Sema &S, const AttrInfo &AI, const Expr *Expr, int &Val, unsigned Idx=UINT_MAX)
Wrapper around checkUInt32Argument, with an extra check to be sure that the result will fit into a re...
static void handleNoSanitizeSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVecReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isGlobalVar(const Decl *D)
static void handleTLSModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis functions specific to M68k.
This file declares semantic analysis functions specific to MIPS.
This file declares semantic analysis functions specific to MSP430.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis routines for OpenCL.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
This file declares semantic analysis functions specific to X86.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
DeclarationNameTable DeclarationNames
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const
Retrieves the default calling convention for the current target.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
const TargetInfo * getAuxTargetInfo() const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
Represents an access specifier followed by colon ':'.
Attr - This represents one attribute.
bool isMicrosoftAttribute() const
bool isClangScope() const
void setAttributeSpellingListIndex(unsigned V)
std::string getNormalizedFullName() const
Gets the normalized full name, which consists of both scope and name and with surrounding underscores...
bool isCXX11Attribute() const
bool isDeclspecAttribute() const
SourceRange getRange() const
bool isC23Attribute() const
unsigned getAttributeSpellingListIndex() const
const IdentifierInfo * getScopeName() const
bool isGNUAttribute() const
bool isRegularKeywordAttribute() const
SourceLocation getLoc() const
const IdentifierInfo * getAttrName() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
Kind getParsedKind() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
This class is used for builtin types like 'int'.
static bool isBuiltinFunc(llvm::StringRef Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
Represents a static or instance method of a struct/union/class.
QualType getFunctionObjectParameterType() const
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
bool hasDefinition() const
MSInheritanceModel calculateInheritanceModel() const
Calculate what the inheritance model would be for this class.
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
const RelatedTargetVersionMapping * getVersionMapping(OSEnvPair Kind) const
The results of name lookup within a DeclContext.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
A reference to a declared variable, function, enum, etc.
DeclarationNameInfo getNameInfo() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
ParsedAttributes & getAttributes()
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
ASTContext & getASTContext() const LLVM_READONLY
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool canBeWeakImported(bool &IsDefinition) const
Determines whether this symbol can be weak-imported, e.g., whether it would be well-formed to add the...
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
The name of a declaration.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
const ParsedAttributes & getAttributes() const
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
const ParsedAttributesView & getDeclarationAttributes() const
Recursive AST visitor that supports extension via dynamic dispatch.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
This represents one expression.
static bool isPotentialConstantExprUnevaluated(Expr *E, const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExprUnevaluated - Return true if this expression might be usable in a constant exp...
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
bool isConstexprSpecified() const
bool isExternC() const
Determines whether this function is a function with external, C linkage.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, Expr *TrailingRequiresClause=nullptr)
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
void push_back(const T &LocalValue)
Represents the results of name lookup.
Describes a module or submodule.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
A C++ nested-name-specifier augmented with source location information.
ObjCMethodDecl - Represents an instance or class method declaration.
Represents one property declaration in an Objective-C interface.
void * getAsOpaquePtr() const
static OpaquePtr getFromOpaquePtr(void *P)
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
unsigned getSourceIndex() const
Get the parameter index as it would normally be encoded for attributes at the source level of represe...
unsigned getASTIndex() const
Get the parameter index as it would normally be encoded at the AST level of representation: zero-orig...
Represents a parameter to a function.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
ParsedAttr - Represents a syntactic attribute.
bool isPackExpansion() const
const AvailabilityChange & getAvailabilityDeprecated() const
unsigned getSemanticSpelling() const
If the parsed attribute has a semantic equivalent, and it would have a semantic Spelling enumeration ...
bool existsInTarget(const TargetInfo &Target) const
bool checkExactlyNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has exactly as many args as Num.
IdentifierLoc * getArgAsIdent(unsigned Arg) const
bool hasParsedType() const
const AvailabilityChange & getAvailabilityIntroduced() const
void setInvalid(bool b=true) const
bool hasVariadicArg() const
const ParsedAttrInfo & getInfo() const
void handleAttrWithDelayedArgs(Sema &S, Decl *D) const
const Expr * getReplacementExpr() const
bool hasProcessingCache() const
SourceLocation getUnavailableLoc() const
unsigned getProcessingCache() const
const IdentifierLoc * getEnvironment() const
bool acceptsExprPack() const
const Expr * getMessageExpr() const
const ParsedType & getMatchingCType() const
const ParsedType & getTypeArg() const
SourceLocation getStrictLoc() const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool isArgIdent(unsigned Arg) const
Expr * getArgAsExpr(unsigned Arg) const
bool getMustBeNull() const
bool checkAtLeastNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at least as many args as Num.
bool isUsedAsTypeAttr() const
unsigned getNumArgMembers() const
bool isPragmaClangAttribute() const
True if the attribute is specified using '#pragma clang attribute'.
bool slidesFromDeclToDeclSpecLegacyBehavior() const
Returns whether a [[]] attribute, if specified ahead of a declaration, should be applied to the decl-...
AttributeCommonInfo::Kind getKind() const
void setProcessingCache(unsigned value) const
bool isParamExpr(size_t N) const
bool isArgExpr(unsigned Arg) const
bool getLayoutCompatible() const
ArgsUnion getArg(unsigned Arg) const
getArg - Return the specified argument.
SourceLocation getEllipsisLoc() const
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
const AvailabilityChange & getAvailabilityObsoleted() const
void addAtEnd(ParsedAttr *newAttr)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
IdentifierTable & getIdentifierTable()
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
const Type * getTypePtrOrNull() const
Represents a struct/union/class.
field_iterator field_end() const
field_range fields() const
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
unsigned getFlags() const
getFlags - Return the flags for this scope.
@ FunctionDeclarationScope
This is a scope that corresponds to the parameters within a function prototype for a function declara...
void handleAMDGPUMaxNumWorkGroupsAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUFlatWorkGroupSizeAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumSGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumVGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUWavesPerEUAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleBuiltinAliasAttr(Decl *D, const ParsedAttr &AL)
void handleNewAttr(Decl *D, const ParsedAttr &AL)
bool SveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool MveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL)
bool CdeAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleSignalAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handlePreserveAIRecord(RecordDecl *RD)
void handlePreserveAccessIndexAttr(Decl *D, const ParsedAttr &AL)
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
SemaDiagnosticBuilder DiagIfHostCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as host cod...
void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL)
void handleSV_GroupThreadIDAttr(Decl *D, const ParsedAttr &AL)
void handleShaderAttr(Decl *D, const ParsedAttr &AL)
void handleSV_DispatchThreadIDAttr(Decl *D, const ParsedAttr &AL)
void handlePackOffsetAttr(Decl *D, const ParsedAttr &AL)
void handleParamModifierAttr(Decl *D, const ParsedAttr &AL)
void handleResourceBindingAttr(Decl *D, const ParsedAttr &AL)
void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL)
void handleSV_GroupIDAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleRuntimeName(Decl *D, const ParsedAttr &AL)
void handleNSObject(Decl *D, const ParsedAttr &AL)
bool isValidOSObjectOutParameter(const Decl *D)
void handleNSErrorDomain(Decl *D, const ParsedAttr &Attr)
void handleXReturnsXRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleExternallyRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleMethodFamilyAttr(Decl *D, const ParsedAttr &AL)
void handleIndependentClass(Decl *D, const ParsedAttr &AL)
void handleIBOutlet(Decl *D, const ParsedAttr &AL)
void handleReturnsInnerPointerAttr(Decl *D, const ParsedAttr &Attrs)
void handleSuppresProtocolAttr(Decl *D, const ParsedAttr &AL)
void handleOwnershipAttr(Decl *D, const ParsedAttr &AL)
void handleBlocksAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeMutableAttr(Decl *D, const ParsedAttr &AL)
Sema::RetainOwnershipKind parsedAttrToRetainOwnershipKind(const ParsedAttr &AL)
void handleRequiresSuperAttr(Decl *D, const ParsedAttr &Attrs)
void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI, Sema::RetainOwnershipKind K, bool IsTemplateInstantiation)
void handleDesignatedInitializer(Decl *D, const ParsedAttr &AL)
void handleBridgeRelatedAttr(Decl *D, const ParsedAttr &AL)
void handleIBOutletCollection(Decl *D, const ParsedAttr &AL)
bool isCFStringType(QualType T)
void handleDirectAttr(Decl *D, const ParsedAttr &AL)
bool isNSStringType(QualType T, bool AllowNSAttributedString=false)
void handleBoxable(Decl *D, const ParsedAttr &AL)
void handleDirectMembersAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeAttr(Decl *D, const ParsedAttr &AL)
void handlePreciseLifetimeAttr(Decl *D, const ParsedAttr &AL)
void handleSubGroupSize(Decl *D, const ParsedAttr &AL)
void handleNoSVMAttr(Decl *D, const ParsedAttr &AL)
void handleAccessAttr(Decl *D, const ParsedAttr &AL)
void handleOMPAssumeAttr(Decl *D, const ParsedAttr &AL)
bool isAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleKernelEntryPointAttr(Decl *D, const ParsedAttr &AL)
void handleKernelAttr(Decl *D, const ParsedAttr &AL)
void handleBridge(Decl *D, const ParsedAttr &AL)
void handleAsyncAttr(Decl *D, const ParsedAttr &AL)
void handleAsyncName(Decl *D, const ParsedAttr &AL)
void handleNewType(Decl *D, const ParsedAttr &AL)
void handleError(Decl *D, const ParsedAttr &AL)
void AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi)
void handleAsyncError(Decl *D, const ParsedAttr &AL)
void handleName(Decl *D, const ParsedAttr &AL)
void handleAttrAttr(Decl *D, const ParsedAttr &AL)
void handleWebAssemblyImportNameAttr(Decl *D, const ParsedAttr &AL)
void handleWebAssemblyImportModuleAttr(Decl *D, const ParsedAttr &AL)
void handleWebAssemblyExportNameAttr(Decl *D, const ParsedAttr &AL)
void handleForceAlignArgPointerAttr(Decl *D, const ParsedAttr &AL)
void handleAnyInterruptAttr(Decl *D, const ParsedAttr &AL)
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
void popWithoutEmitting(DelayedDiagnosticsState state)
Leave a delayed-diagnostic state that was previously pushed.
Sema - This implements semantic analysis and AST building for C.
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
bool isValidPointerAttrType(QualType T, bool RefOkay=false)
Determine if type T is a valid subject for a nonnull and similar attributes.
static std::enable_if_t< std::is_base_of_v< Attr, AttrInfo >, SourceLocation > getAttrLoc(const AttrInfo &AL)
A helper function to provide Attribute Location for the Attr types AND the ParsedAttr.
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
bool checkSectionName(SourceLocation LiteralLoc, StringRef Str)
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A, bool SkipArgCountCheck=false)
Handles semantic checking for features that are common to all attributes, such as checking whether a ...
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
DLLImportAttr * mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI)
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=NoFold)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
void PopParsingDeclaration(ParsingDeclState state, Decl *decl)
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
void redelayDiagnostics(sema::DelayedDiagnosticPool &pool)
Given a set of delayed diagnostics, re-emit them as if they had been delayed in the current context i...
bool checkTargetVersionAttr(SourceLocation Loc, Decl *D, StringRef Str)
Check Target Version attrs.
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ASTContext & getASTContext() const
@ None
This is not a defaultable comparison operator.
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
void ProcessPragmaWeak(Scope *S, Decl *D)
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
FPOptions & getCurFPFeatures()
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Expression
An arbitrary expression.
const LangOptions & getLangOpts() const
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
const LangOptions & LangOpts
static const uint64_t MaximumAlignment
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes, bool OrNull)
Check if applying the specified attribute variant from the "counted by" family of attributes to Field...
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val, unsigned Idx=UINT_MAX, bool StrictlyUnsigned=false)
If Expr is a valid integer constant, get the value of the integer expression and return success or fa...
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
@ Compatible
Compatible - the types are compatible according to the standard.
NamedDecl * DeclClonePragmaWeak(NamedDecl *ND, const IdentifierInfo *II, SourceLocation Loc)
DeclClonePragmaWeak - clone existing decl (maybe definition), #pragma weak needs a non-definition dec...
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
@ AP_PragmaClangAttribute
The availability attribute was applied using '#pragma clang attribute'.
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ AMK_None
Don't merge availability attributes at all.
@ AMK_Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ AMK_ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ AMK_OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ AMK_Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
bool checkTargetClonesAttrString(SourceLocation LiteralLoc, StringRef Str, const StringLiteral *Literal, Decl *D, bool &HasDefault, bool &HasCommas, bool &HasNotDefault, SmallVectorImpl< SmallString< 64 > > &StringsBuffer)
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI, unsigned AttrArgNum, const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis=false)
Check if IdxExpr is a valid parameter index for a function or instance method D.
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc, StringRef Platform)
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
Create an CUDALaunchBoundsAttr attribute.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
LifetimeCaptureByAttr * ParseLifetimeCaptureByAttr(const ParsedAttr &AL, StringRef ParamName)
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
bool isBeingDefined() const
Return true if this decl is currently being defined.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
bool isTLSSupported() const
Whether the target supports thread-local storage.
unsigned getMaxTLSAlign() const
Return the maximum alignment (in bits) of a TLS variable.
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this target.
virtual bool validateCpuSupports(StringRef Name) const
virtual bool doesFeatureAffectCodeGen(StringRef Feature) const
Returns true if feature has an impact on target code generation.
virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const
virtual bool hasProtectedVisibility() const
Does this target support "protected" visibility?
unsigned getRegParmMax() const
virtual unsigned getUnwindWordWidth() const
virtual bool isValidFeatureName(StringRef Feature) const
Determine whether this TargetInfo supports the given feature.
unsigned getCharWidth() const
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
virtual bool supportsTargetAttributeTune() const
Determine whether this TargetInfo supports tune in target attribute.
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
virtual bool isValidCPUName(StringRef Name) const
Determine whether this TargetInfo supports the given CPU name.
const llvm::VersionTuple & getSDKVersion() const
virtual bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, StringRef &Err) const
Determine if this TargetInfo supports the given branch protection specification.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a type template specialization; the template must be a class template, a type alias templa...
const Type * getTypeForDecl() const
Base wrapper for a particular "section" of type source info.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBlockPointerType() const
bool isBooleanType() const
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isFunctionPointerType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isExtVectorType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isMemberPointerType() const
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Visibility getVisibility() const
Determine the visibility of this type.
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isVectorType() const
bool isFloatingType() const
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isTypedefNameType() const
Determines whether this type is written as a typedef-name.
Base class for declarations which introduce a typedef-name.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
@ TLS_None
Not a TLS variable.
Represents a GCC generic vector type.
Captures information about a #pragma weak directive.
const IdentifierInfo * getAlias() const
SourceLocation getLocation() const
A collection of diagnostics which were delayed.
const DelayedDiagnosticPool * getParent() const
void steal(DelayedDiagnosticPool &pool)
Steal the diagnostics from the given pool.
pool_iterator pool_end() const
SmallVectorImpl< DelayedDiagnostic >::const_iterator pool_iterator
pool_iterator pool_begin() const
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
QualType getForbiddenTypeOperand() const
unsigned getForbiddenTypeDiagnostic() const
The diagnostic ID to emit.
unsigned getForbiddenTypeArgument() const
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
@ ExpectedFunctionMethodOrBlock
@ ExpectedTypeOrNamespace
@ ExpectedVariableFieldOrTag
@ ExpectedVariableOrField
@ ExpectedFunctionOrMethod
@ ExpectedVariableOrFunction
@ ExpectedFunctionVariableOrClass
bool hasDeclarator(const Decl *D)
Return true if the given decl has a declarator that should have been processed by Sema::GetTypeForDec...
QualType getFunctionOrMethodResultType(const Decl *D)
bool isInstanceMethod(const Decl *D)
@ OK_Ordinary
An ordinary object is located at an address in memory.
CudaVersion ToCudaVersion(llvm::VersionTuple)
SourceRange getFunctionOrMethodResultSourceRange(const Decl *D)
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
QualType getFunctionOrMethodParamType(const Decl *D, unsigned Idx)
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Language
The language for the input, used to select and validate the language standard and possible actions.
AttributeArgumentNType
These constants match the enumerated choices of err_attribute_argument_n_type and err_attribute_argum...
@ AANT_ArgumentIntegerConstant
@ AANT_ArgumentBuiltinFunction
@ AANT_ArgumentIdentifier
@ SD_Automatic
Automatic storage duration (most local variables).
@ Result
The result type of a method or function.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
bool isFunctionOrMethodVariadic(const Decl *D)
bool isFuncOrMethodForAttrSubject(const Decl *D)
isFuncOrMethodForAttrSubject - Return true if the given decl has function type (function or function-...
OffloadArch StringToOffloadArch(llvm::StringRef S)
LLVM_READONLY bool isHexDigit(unsigned char c)
Return true if this character is an ASCII hex digit: [0-9a-fA-F].
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const char * OffloadArchToString(OffloadArch A)
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Generic
not a target-specific vector type
SourceRange getFunctionOrMethodParamRange(const Decl *D, unsigned Idx)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
@ Implicit
An implicit conversion.
Represents information about a change in availability for an entity, which is part of the encoding of...
VersionTuple Version
The version number at which the change occurred.
bool isValid() const
Determine whether this availability change is valid.
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr OSEnvPair iOStoWatchOSPair()
Returns the os-environment mapping pair that's used to represent the iOS -> watchOS version mapping.
static constexpr OSEnvPair iOStoTvOSPair()
Returns the os-environment mapping pair that's used to represent the iOS -> tvOS version mapping.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
Wraps an identifier and optional source location for the identifier.
Parts of a decomposed MSGuidDecl.
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
virtual AttrHandling handleDeclAttribute(Sema &S, Decl *D, const ParsedAttr &Attr) const
If this ParsedAttrInfo knows how to handle this ParsedAttr applied to this Decl then do so and return...
Contains information gathered from parsing the contents of TargetAttr.
std::vector< std::string > Features
StringRef BranchProtection