65#include "llvm/ADT/APSInt.h"
66#include "llvm/ADT/STLExtras.h"
67#include "llvm/ADT/StringExtras.h"
68#include "llvm/Demangle/Demangle.h"
69#include "llvm/IR/DerivedTypes.h"
70#include "llvm/MC/MCSectionMachO.h"
71#include "llvm/Support/Error.h"
72#include "llvm/Support/ErrorHandling.h"
73#include "llvm/Support/MathExtras.h"
74#include "llvm/Support/raw_ostream.h"
75#include "llvm/TargetParser/Triple.h"
101template <
typename AttrInfo>
103 int &Val,
unsigned Idx =
UINT_MAX) {
108 if (UVal > (uint32_t)std::numeric_limits<int>::max()) {
112 <<
toString(I, 10,
false) << 32 << 0;
121 const Expr *E, StringRef &Str,
127 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
133 Str = Literal->getString();
143 Diag(Loc->
getLoc(), diag::err_attribute_argument_type)
149 *ArgLocation = Loc->
getLoc();
159 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
164 Str = Literal->getString();
182 return !Result.empty();
185 bool foundStarOperator = IsOverloadedOperatorPresent(
Record, OO_Star);
186 bool foundArrowOperator = IsOverloadedOperatorPresent(
Record, OO_Arrow);
187 if (foundStarOperator && foundArrowOperator)
194 for (
const auto &BaseSpecifier : CXXRecord->bases()) {
195 if (!foundStarOperator)
196 foundStarOperator = IsOverloadedOperatorPresent(
197 BaseSpecifier.getType()->getAsRecordDecl(), OO_Star);
198 if (!foundArrowOperator)
199 foundArrowOperator = IsOverloadedOperatorPresent(
200 BaseSpecifier.getType()->getAsRecordDecl(), OO_Arrow);
203 if (foundStarOperator && foundArrowOperator)
223 if (!RD->isCompleteDefinition())
230 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_pointer) << AL << QT;
242 return PT->getPointeeType()->getAsRecordDecl();
247template <
typename AttrType>
254 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(RD)) {
256 return !Base->hasAttr<AttrType>();
270 if (!RD->isCompleteDefinition())
288 if (!RD->isCompleteDefinition())
303 return TN->
hasAttr<CapabilityAttr>();
322 if (
const auto *E = dyn_cast<CastExpr>(Ex))
324 else if (
const auto *E = dyn_cast<ParenExpr>(Ex))
326 else if (
const auto *E = dyn_cast<UnaryOperator>(Ex)) {
327 if (E->getOpcode() == UO_LNot || E->getOpcode() == UO_AddrOf ||
328 E->getOpcode() == UO_Deref)
331 }
else if (
const auto *E = dyn_cast<BinaryOperator>(Ex)) {
332 if (E->getOpcode() == BO_LAnd || E->getOpcode() == BO_LOr)
350 bool ParamIdxOk =
false) {
355 const auto *MD = dyn_cast<const CXXMethodDecl>(D);
356 if (MD && !MD->isStatic()) {
362 diag::warn_thread_attribute_not_on_capability_member)
363 << AL << MD->getParent();
365 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_non_static_member)
370 for (
unsigned Idx = Sidx; Idx < AL.
getNumArgs(); ++Idx) {
375 Args.push_back(ArgExp);
379 if (
const auto *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
380 if (StrLit->getLength() == 0 ||
381 (StrLit->isOrdinary() && StrLit->getString() ==
"*")) {
384 Args.push_back(ArgExp);
390 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_ignored) << AL;
391 Args.push_back(ArgExp);
399 if (
const auto *UOp = dyn_cast<UnaryOperator>(ArgExp))
400 if (UOp->getOpcode() == UO_AddrOf)
401 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
402 if (DRE->getDecl()->isCXXInstanceMember())
403 ArgTy = DRE->getDecl()->getType();
409 if (!RD && ParamIdxOk) {
410 const auto *FD = dyn_cast<FunctionDecl>(D);
411 const auto *IL = dyn_cast<IntegerLiteral>(ArgExp);
413 unsigned int NumParams = FD->getNumParams();
414 llvm::APInt ArgValue = IL->getValue();
415 uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
416 uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
417 if (!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
419 diag::err_attribute_argument_out_of_bounds_extra_info)
420 << AL << Idx + 1 << NumParams;
423 ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
432 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_argument_not_lockable)
435 Args.push_back(ArgExp);
447 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
469 return !Args.empty();
478 GuardedByAttr(S.
Context, AL, Args.data(), Args.size()));
490 PtGuardedByAttr(S.
Context, AL, Args.data(), Args.size()));
501 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
518 Expr **StartArg = &Args[0];
520 AcquiredAfterAttr(S.
Context, AL, StartArg, Args.size()));
528 Expr **StartArg = &Args[0];
530 AcquiredBeforeAttr(S.
Context, AL, StartArg, Args.size()));
547template <
typename AttrInfo>
549 unsigned AttrArgNo) {
550 assert(AI.isArgExpr(AttrArgNo) &&
"Expected expression argument");
551 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
560 S.
Diag(SrcLoc, diag::err_attribute_integers_only)
575 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only) << AL;
586 ParamIdx SizeArgNo(SizeArgNoVal, D);
601 AllocSizeAttr(S.
Context, AL, SizeArgNo, NumberArgNo));
610 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
625 unsigned Size = Args.size();
633 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
643 unsigned Size = Args.size();
646 Expr **StartArg = &Args[0];
649 LocksExcludedAttr(S.
Context, AL, StartArg, Size));
655 if (!
Cond->isTypeDependent()) {
666 Msg =
"<no message provided>";
672 S.
Diag(AL.
getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
674 S.
Diag(PDiag.first, PDiag.second);
681 S.
Diag(AL.
getLoc(), diag::ext_clang_enable_if);
690 StringRef NewUserDiagnostic;
702 if (
const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
704 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
710 S.
Diag(DA->getLoc(), diag::warn_dllattr_ignored_exclusion_takes_precedence)
712 D->
dropAttrs<DLLExportAttr, DLLImportAttr>();
716 ExcludeFromExplicitInstantiationAttr(S.
Context, AL));
724 const CXXRecordDecl *ClassType;
726 llvm::SmallPtrSet<const ParmVarDecl *, 16> Parms;
730 ArgumentDependenceChecker(
const FunctionDecl *FD) {
732 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
740 bool referencesArgs(Expr *E) {
746 bool VisitCXXThisExpr(CXXThisExpr *E)
override {
748 "`this` doesn't refer to the enclosing class?");
753 bool VisitDeclRefExpr(DeclRefExpr *DRE)
override {
754 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DRE->
getDecl()))
755 if (Parms.count(PVD)) {
768 if (
const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
769 if (!MethodDecl->isStatic()) {
770 S.
Diag(AL.
getLoc(), diag::err_attribute_no_member_function) << AL;
777 if (
auto *E = dyn_cast<Expr *>(
Union))
778 return E->getBeginLoc();
782 S.
Diag(Loc, diag::err_attribute_argument_n_type) << AL << Index << T;
788 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.
getArgAsExpr(0));
791 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
800 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments_for)
807 for (
unsigned I = 1; I < AL.
getNumArgs(); ++I) {
819 if (Index > DeclFD->getNumParams()) {
820 S.
Diag(AL.
getLoc(), diag::err_attribute_bounds_for_function)
821 << AL << Index << DeclFD << DeclFD->getNumParams();
826 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
831 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
835 Indices.push_back(Index - 1);
839 S.
Context, AL, AttrFD, Indices.data(), Indices.size()));
843 S.
Diag(AL.
getLoc(), diag::ext_clang_diagnose_if);
850 StringRef DefaultSevStr;
854 DiagnoseIfAttr::DefaultSeverity DefaultSev;
855 if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
857 diag::err_diagnose_if_invalid_diagnostic_type);
861 StringRef WarningGroup;
865 if (WarningGroup.empty() ||
869 diag::err_diagnose_if_unknown_warning)
875 bool ArgDependent =
false;
876 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
877 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(
Cond);
879 S.
Context, AL,
Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
889 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
899 static constexpr const StringRef kWildcard =
"*";
902 bool HasWildcard =
false;
904 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
905 if (Name == kWildcard)
907 Names.push_back(Name);
911 if (
const auto *NBA = D->
getAttr<NoBuiltinAttr>())
912 for (StringRef BuiltinName : NBA->builtinNames())
913 AddBuiltinName(BuiltinName);
917 AddBuiltinName(kWildcard);
919 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
920 StringRef BuiltinName;
926 AddBuiltinName(BuiltinName);
928 S.
Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
929 << BuiltinName << AL;
934 Names.erase(llvm::unique(Names), Names.end());
937 if (HasWildcard && Names.size() > 1)
939 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
942 if (D->
hasAttr<NoBuiltinAttr>())
945 NoBuiltinAttr(S.
Context, AL, Names.data(), Names.size()));
949 if (D->
hasAttr<PassObjectSizeAttr>()) {
950 S.
Diag(D->
getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
973 S.
Diag(D->
getBeginLoc(), diag::err_attribute_pointers_only) << AL << 1;
981 ConsumableAttr::ConsumedState DefaultState;
985 if (!ConsumableAttr::ConvertStrToConsumedState(
987 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
992 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1005 if (!RD->hasAttr<ConsumableAttr>()) {
1006 S.
Diag(AL.
getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1023 for (
unsigned ArgIndex = 0; ArgIndex < AL.
getNumArgs(); ++ArgIndex) {
1024 CallableWhenAttr::ConsumedState CallableState;
1026 StringRef StateString;
1037 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1039 S.
Diag(Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1043 States.push_back(CallableState);
1047 CallableWhenAttr(S.
Context, AL, States.data(), States.size()));
1051 ParamTypestateAttr::ConsumedState ParamState;
1057 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1059 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1060 << AL << StateString;
1064 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1085 ReturnTypestateAttr::ConsumedState ReturnState;
1089 if (!ReturnTypestateAttr::ConvertStrToConsumedState(
1091 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1096 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1133 SetTypestateAttr::ConsumedState NewState;
1137 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1138 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1143 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1155 TestTypestateAttr::ConsumedState TestState;
1159 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1160 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1165 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1180 if (
auto *TD = dyn_cast<TagDecl>(D))
1182 else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
1183 bool BitfieldByteAligned = (!FD->
getType()->isDependentType() &&
1189 if (BitfieldByteAligned)
1191 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1197 if (BitfieldByteAligned)
1198 S.
Diag(AL.
getLoc(), diag::warn_attribute_packed_for_bitfield);
1204 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
1210 assert(CTD &&
"attribute does not appertain to this declaration");
1218 if (!T.hasQualifiers() && T->isTypedefNameType()) {
1221 if (
const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1222 T->getAsCXXRecordDecl())) {
1223 Template = CTSD->getSpecializedTemplate();
1224 }
else if (
const auto *TST = T->getAs<TemplateSpecializationType>()) {
1225 while (TST && TST->isTypeAlias())
1226 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1228 Template = TST->getTemplateName().getAsTemplateDecl();
1237 S.
Diag(AL.
getLoc(), diag::err_attribute_not_typedef_for_specialization)
1240 S.
Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1249 NoSpecializationsAttr::Create(S.
Context, Message, AL));
1253 if (T->isDependentType())
1256 if (T->isReferenceType())
1259 T = T.getNonReferenceType();
1264 if (
const RecordType *UT = T->getAsUnionType()) {
1266 if (UD->
hasAttr<TransparentUnionAttr>()) {
1267 for (
const auto *I : UD->
fields()) {
1275 return T->isAnyPointerType() || T->isBlockPointerType();
1281 bool isReturnValue =
false) {
1284 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1285 << AL << AttrParmRange << TypeRange;
1287 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1288 << AL << AttrParmRange << TypeRange << 0;
1296 for (
unsigned I = 0; I < AL.
getNumArgs(); ++I) {
1300 D, AL, I + 1, Ex, Idx,
1313 NonNullArgs.push_back(Idx);
1324 I != E && !AnyPointers; ++I) {
1331 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_no_pointers);
1334 ParamIdx *Start = NonNullArgs.data();
1335 unsigned Size = NonNullArgs.size();
1336 llvm::array_pod_sort(Start, Start + Size);
1346 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1377 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1402 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1408 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1411 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1414 Diag(AttrLoc, diag::err_attribute_argument_type)
1419 if (!I->isPowerOf2()) {
1420 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1426 Diag(CI.
getLoc(), diag::warn_assume_aligned_too_great)
1431 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1445 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1460 << CI << FuncDecl->getParamDecl(Idx.
getASTIndex())->getSourceRange();
1470 if (AttrName.size() > 4 && AttrName.starts_with(
"__") &&
1471 AttrName.ends_with(
"__")) {
1472 AttrName = AttrName.drop_front(2).drop_back(2);
1488 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1494 OwnershipAttr::OwnershipKind K =
1495 OwnershipAttr(S.
Context, AL,
nullptr,
nullptr, 0).getOwnKind();
1499 case OwnershipAttr::Takes:
1500 case OwnershipAttr::Holds:
1502 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1506 case OwnershipAttr::Returns:
1508 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 2;
1516 if (K == OwnershipAttr::Returns &&
1518 S.
Diag(AL.
getLoc(), diag::err_ownership_takes_return_type) << AL;
1524 StringRef ModuleName =
Module->getName();
1530 for (
unsigned i = 1; i < AL.
getNumArgs(); ++i) {
1540 case OwnershipAttr::Takes:
1541 case OwnershipAttr::Holds:
1542 if (!T->isAnyPointerType() && !T->isBlockPointerType())
1545 case OwnershipAttr::Returns:
1546 if (!T->isIntegerType())
1551 S.
Diag(AL.
getLoc(), diag::err_ownership_type) << AL << Err
1560 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1561 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1564 I->isRegularKeywordAttribute());
1566 }
else if (K == OwnershipAttr::Returns &&
1567 I->getOwnKind() == OwnershipAttr::Returns) {
1570 if (!llvm::is_contained(I->args(), Idx)) {
1571 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1572 << I->args_begin()->getSourceIndex();
1574 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1578 }
else if (K == OwnershipAttr::Takes &&
1579 I->getOwnKind() == OwnershipAttr::Takes) {
1580 if (I->getModule()->getName() != ModuleName) {
1581 S.
Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1582 << I->getModule()->getName();
1583 S.
Diag(AL.
getLoc(), diag::note_ownership_takes_class_mismatch)
1590 OwnershipArgs.push_back(Idx);
1593 ParamIdx *Start = OwnershipArgs.data();
1594 unsigned Size = OwnershipArgs.size();
1595 llvm::array_pod_sort(Start, Start + Size);
1603 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1619 S.
Diag(AL.
getLoc(), diag::err_attribute_weakref_not_global_context)
1664 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1666 Demangled.reset(llvm::itaniumDemangle(Str,
false));
1677 if (MC->shouldMangleDeclName(ND)) {
1678 llvm::raw_svector_ostream Out(Name);
1682 Name = ND->getIdentifier()->getName();
1698 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 1;
1712 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_darwin);
1720 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_nvptx);
1724 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
1726 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 0;
1731 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1732 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << VD << 0;
1749 if (Model !=
"global-dynamic" && Model !=
"local-dynamic"
1750 && Model !=
"initial-exec" && Model !=
"local-exec") {
1751 S.
Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1761 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1773 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
1783 if (
auto *DRE = dyn_cast<DeclRefExpr>(DeallocE)) {
1784 DeallocFD = dyn_cast<FunctionDecl>(DRE->
getDecl());
1787 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1791 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(DeallocE)) {
1793 DeallocNI = ULE->getNameInfo();
1795 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1802 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function) << 0;
1810 DeallocPtrIdx =
ParamIdx(1, DeallocFD);
1821 diag::err_attribute_malloc_arg_not_function_with_pointer_arg)
1835 diag::err_attribute_malloc_arg_refers_to_non_pointer_type)
1844 S.
Diag(AL.
getLoc(), diag::warn_attribute_form_ignored) << AL;
1846 RestrictAttr(S.
Context, AL, DeallocE, DeallocPtrIdx));
1855 auto emitWarning = [
this, &CI](
unsigned NoteDiagID) {
1856 Diag(CI.
getLoc(), diag::warn_attribute_return_span_only) << CI;
1863 return emitWarning(diag::note_returned_incomplete_type);
1866 return emitWarning(diag::note_returned_not_struct);
1867 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1868 if (CXXRD->getNumBases() > 0) {
1869 return emitWarning(diag::note_type_inherits_from_base);
1873 auto FieldsCount = std::distance(FieldsBegin, RD->
field_end());
1874 if (FieldsCount != 2)
1875 return emitWarning(diag::note_returned_not_two_field_struct) << FieldsCount;
1876 QualType FirstFieldType = FieldsBegin->getType();
1877 QualType SecondFieldType = std::next(FieldsBegin)->getType();
1878 auto validatePointerType = [](
const QualType &T) {
1880 return T->isPointerType() && !T->isFunctionPointerType();
1882 auto checkIntegerType = [
this, emitWarning](
const QualType &T,
1883 const int FieldNo) ->
bool {
1884 const auto *BT = dyn_cast<BuiltinType>(T.getCanonicalType());
1885 if (!BT || !BT->isInteger())
1886 return emitWarning(diag::note_returned_not_integer_field) << FieldNo;
1888 if (
Context.getTypeSize(BT) < IntSize)
1889 return emitWarning(diag::note_returned_not_wide_enough_field)
1890 << FieldNo << IntSize;
1893 if (validatePointerType(FirstFieldType) &&
1894 validatePointerType(SecondFieldType)) {
1897 }
else if (validatePointerType(FirstFieldType)) {
1899 return checkIntegerType(SecondFieldType, 2);
1900 }
else if (validatePointerType(SecondFieldType)) {
1902 return checkIntegerType(FirstFieldType, 1);
1904 return emitWarning(diag::note_returned_not_span_struct);
1920 if (
const auto *
Other = D->
getAttr<CPUDispatchAttr>()) {
1921 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1922 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1925 }
else if (AL.
getParsedKind() == ParsedAttr::AT_CPUSpecific) {
1929 if (
const auto *
Other = D->
getAttr<CPUSpecificAttr>()) {
1930 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1931 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1938 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
1939 if (MD->getParent()->isLambda()) {
1940 S.
Diag(AL.
getLoc(), diag::err_attribute_dll_lambda) << AL;
1951 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1960 S.
Diag(CPUArg->
getLoc(), diag::err_invalid_cpu_specific_dispatch_value)
1961 << CPUName << (AL.
getKind() == ParsedAttr::AT_CPUDispatch);
1967 return Target.CPUSpecificManglingCharacter(CPUName) ==
1970 S.
Diag(AL.
getLoc(), diag::warn_multiversion_duplicate_entries);
1977 if (AL.
getKind() == ParsedAttr::AT_CPUSpecific)
1979 CPUSpecificAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1982 CPUDispatchAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1987 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
1998 const auto &
Arch = Triple.getArch();
1999 if (
Arch != llvm::Triple::x86 &&
2000 (
Arch != llvm::Triple::arm &&
Arch != llvm::Triple::thumb)) {
2001 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_on_arch)
2002 << AL << Triple.getArchName();
2009 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
2026 const Stmt *OnlyStmt =
nullptr;
2028 if (
const auto *Compound = dyn_cast<CompoundStmt>(Body)) {
2029 if (Compound->size() != 1)
2031 OnlyStmt = *Compound->body_begin();
2037 if (
const auto *EWC = dyn_cast<ExprWithCleanups>(OnlyStmt)) {
2038 OnlyStmt = EWC->getSubExpr();
2042 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2043 if (MD && MD->isVirtual()) {
2044 const auto *RD = MD->getParent();
2045 return MD->hasAttr<FinalAttr>() || (RD && RD->isEffectivelyFinal());
2053 auto *FD = dyn_cast<FunctionDecl>(D);
2074 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2088 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
2114 S.
Diag(Attrs.
getLoc(), diag::warn_nocf_check_attribute_ignored);
2132 Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
2151 ? diag::err_attribute_wrong_decl_type
2152 : diag::warn_attribute_wrong_decl_type)
2188 if (VecReturnAttr *A = D->
getAttr<VecReturnAttr>()) {
2189 S.
Diag(AL.
getLoc(), diag::err_repeat_attribute) << A;
2197 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2202 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2206 for (
const auto *I : R->fields()) {
2207 if ((count == 1) || !I->getType()->isVectorType()) {
2208 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2224 diag::err_carries_dependency_param_not_function_decl);
2238 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2253 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2263 APValue(llvm::APSInt::getUnsigned(priority)));
2271 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
2290template <
typename AttrTy>
2302 VersionTuple Introduced,
2303 VersionTuple Deprecated,
2304 VersionTuple Obsoleted) {
2305 StringRef PlatformName
2306 = AvailabilityAttr::getPrettyPlatformName(Platform->
getName());
2307 if (PlatformName.empty())
2308 PlatformName = Platform->
getName();
2312 if (!Introduced.empty() && !Deprecated.empty() &&
2313 !(Introduced <= Deprecated)) {
2314 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2315 << 1 << PlatformName << Deprecated.getAsString()
2316 << 0 << Introduced.getAsString();
2320 if (!Introduced.empty() && !Obsoleted.empty() &&
2321 !(Introduced <= Obsoleted)) {
2322 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2323 << 2 << PlatformName << Obsoleted.getAsString()
2324 << 0 << Introduced.getAsString();
2328 if (!Deprecated.empty() && !Obsoleted.empty() &&
2329 !(Deprecated <= Obsoleted)) {
2330 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2331 << 2 << PlatformName << Obsoleted.getAsString()
2332 << 1 << Deprecated.getAsString();
2344 bool BeforeIsOkay) {
2345 if (
X.empty() || Y.empty())
2351 if (BeforeIsOkay &&
X < Y)
2359 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2360 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2364 VersionTuple MergedIntroduced = Introduced;
2365 VersionTuple MergedDeprecated = Deprecated;
2366 VersionTuple MergedObsoleted = Obsoleted;
2367 bool FoundAny =
false;
2368 bool OverrideOrImpl =
false;
2372 OverrideOrImpl =
false;
2378 OverrideOrImpl =
true;
2384 for (
unsigned i = 0, e = Attrs.size(); i != e;) {
2385 auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2392 if (OldEnvironment != Environment) {
2397 if (OldAA->getPlatform() != Platform) {
2400 if (InferredPlatformII) {
2401 if (OldAA->getPlatform() == InferredPlatformII)
2407 if (AvailabilityAttr *
Inf = OldAA->getInferredAttrAs();
2408 Inf &&
Inf->getPlatform() == Platform) {
2409 Attrs.erase(Attrs.begin() + i);
2421 if (OldAA->getPriority() < Priority)
2427 if (OldAA->getPriority() > Priority) {
2428 Attrs.erase(Attrs.begin() + i);
2434 VersionTuple OldIntroduced = OldAA->getIntroduced();
2435 VersionTuple OldDeprecated = OldAA->getDeprecated();
2436 VersionTuple OldObsoleted = OldAA->getObsoleted();
2437 bool OldIsUnavailable = OldAA->getUnavailable();
2439 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2440 !
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2442 !(OldIsUnavailable == IsUnavailable ||
2443 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2444 if (OverrideOrImpl) {
2446 VersionTuple FirstVersion;
2447 VersionTuple SecondVersion;
2448 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2450 FirstVersion = OldIntroduced;
2451 SecondVersion = Introduced;
2452 }
else if (!
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2454 FirstVersion = Deprecated;
2455 SecondVersion = OldDeprecated;
2456 }
else if (!
versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2458 FirstVersion = Obsoleted;
2459 SecondVersion = OldObsoleted;
2463 Diag(OldAA->getLocation(),
2464 diag::warn_mismatched_availability_override_unavail)
2465 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2477 Diag(OldAA->getLocation(),
2478 diag::warn_mismatched_availability_override)
2480 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2481 << FirstVersion.getAsString() << SecondVersion.getAsString()
2485 Diag(CI.
getLoc(), diag::note_overridden_method);
2487 Diag(CI.
getLoc(), diag::note_protocol_method);
2489 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2490 Diag(CI.
getLoc(), diag::note_previous_attribute);
2493 Attrs.erase(Attrs.begin() + i);
2498 VersionTuple MergedIntroduced2 = MergedIntroduced;
2499 VersionTuple MergedDeprecated2 = MergedDeprecated;
2500 VersionTuple MergedObsoleted2 = MergedObsoleted;
2502 if (MergedIntroduced2.empty())
2503 MergedIntroduced2 = OldIntroduced;
2504 if (MergedDeprecated2.empty())
2505 MergedDeprecated2 = OldDeprecated;
2506 if (MergedObsoleted2.empty())
2507 MergedObsoleted2 = OldObsoleted;
2510 MergedIntroduced2, MergedDeprecated2,
2511 MergedObsoleted2)) {
2512 Attrs.erase(Attrs.begin() + i);
2517 MergedIntroduced = MergedIntroduced2;
2518 MergedDeprecated = MergedDeprecated2;
2519 MergedObsoleted = MergedObsoleted2;
2525 MergedIntroduced == Introduced &&
2526 MergedDeprecated == Deprecated &&
2527 MergedObsoleted == Obsoleted)
2533 MergedDeprecated, MergedObsoleted) &&
2535 auto *Avail = ::new (
Context) AvailabilityAttr(
2536 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2537 Message, IsStrict, Replacement, Priority, Environment,
2547 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2548 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2553 D, CI, Platform,
Implicit, Introduced, Deprecated, Obsoleted,
2554 IsUnavailable, Message, IsStrict, Replacement, AMK, Priority,
2555 IIEnvironment, InferredPlatformII);
2556 if (!OrigAttr || !InferredPlatformII)
2559 auto *InferredAttr = ::new (
Context) AvailabilityAttr(
2560 Context, CI, InferredPlatformII, OrigAttr->getIntroduced(),
2561 OrigAttr->getDeprecated(), OrigAttr->getObsoleted(),
2562 OrigAttr->getUnavailable(), OrigAttr->getMessage(), OrigAttr->getStrict(),
2563 OrigAttr->getReplacement(),
2567 IIEnvironment,
nullptr);
2568 InferredAttr->setImplicit(
true);
2569 OrigAttr->setInferredAttr(InferredAttr);
2577 bool &IsUnavailable,
2578 VersionTuple &Introduced,
2579 VersionTuple &Deprecated,
2580 VersionTuple &Obsolete,
Sema &S) {
2583 if (TT.getOS() != llvm::Triple::XROS)
2587 NewII = &Context.Idents.get(
"xros");
2588 else if (II->
getName() ==
"ios_app_extension")
2589 NewII = &Context.Idents.get(
"xros_app_extension");
2594 auto MakeUnavailable = [&]() {
2595 IsUnavailable =
true;
2597 Introduced = VersionTuple();
2598 Deprecated = VersionTuple();
2599 Obsolete = VersionTuple();
2612 llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::XROS,
2613 llvm::Triple::UnknownEnvironment));
2619 if (!Introduced.empty()) {
2620 auto NewIntroduced = Mapping->mapIntroducedAvailabilityVersion(Introduced);
2621 if (!NewIntroduced) {
2625 Introduced = *NewIntroduced;
2628 if (!Obsolete.empty()) {
2630 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Obsolete);
2635 Obsolete = *NewObsolete;
2638 if (!Deprecated.empty()) {
2639 auto NewDeprecated =
2640 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Deprecated);
2641 Deprecated = NewDeprecated ? *NewDeprecated : VersionTuple();
2660 StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName(II->
getName());
2661 if (PrettyName.empty())
2662 S.
Diag(Platform->
getLoc(), diag::warn_availability_unknown_platform)
2665 auto *ND = dyn_cast<NamedDecl>(D);
2673 const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType(
2674 AvailabilityAttr::canonicalizePlatformName(II->
getName()));
2676 auto reportAndUpdateIfInvalidOS = [&](
auto &InputVersion) ->
void {
2677 const bool IsInValidRange =
2678 llvm::Triple::isValidVersionForOS(PlatformOS, InputVersion);
2680 auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS(
2681 PlatformOS, InputVersion, IsInValidRange);
2682 if (!IsInValidRange) {
2683 S.
Diag(Platform->
getLoc(), diag::warn_availability_invalid_os_version)
2684 << InputVersion.getAsString() << PrettyName;
2686 diag::note_availability_invalid_os_version_adjusted)
2687 << CanonicalVersion.getAsString();
2689 InputVersion = CanonicalVersion;
2692 if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2693 reportAndUpdateIfInvalidOS(Introduced.
Version);
2694 reportAndUpdateIfInvalidOS(Deprecated.
Version);
2695 reportAndUpdateIfInvalidOS(Obsoleted.
Version);
2701 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getMessageExpr()))
2702 Str = SE->getString();
2703 StringRef Replacement;
2704 if (
const auto *SE =
2706 Replacement = SE->getString();
2708 if (II->
isStr(
"swift")) {
2710 (!IsUnavailable && !Deprecated.
isValid())) {
2712 diag::warn_availability_swift_unavailable_deprecated_only);
2717 if (II->
isStr(
"fuchsia")) {
2718 std::optional<unsigned>
Min, Sub;
2720 (Sub = Introduced.
Version.getSubminor())) {
2721 S.
Diag(AL.
getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2736 if (EnvironmentLoc) {
2739 if (AvailabilityAttr::getEnvironmentType(
2741 llvm::Triple::EnvironmentType::UnknownEnvironment)
2743 diag::warn_availability_unknown_environment)
2747 diag::err_availability_unexpected_parameter)
2748 <<
"environment" << 1;
2754 if (II->
getName() ==
"anyappleos") {
2756 auto ValidateVersion = [&](
const llvm::VersionTuple &Version,
2760 S.
Diag(Loc, diag::err_availability_invalid_anyappleos_version)
2761 << Version.getAsString();
2775 if (!T.isOSDarwin())
2778 StringRef PlatformName;
2782 PlatformName =
"macos";
2783 else if (T.getOS() == llvm::Triple::IOS && T.isMacCatalystEnvironment())
2784 PlatformName =
"maccatalyst";
2786 PlatformName = llvm::Triple::getOSTypeName(T.getOS());
2796 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2798 InferredPlatformII);
2807 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2814 bool NewIsUnavailable = IsUnavailable;
2815 VersionTuple NewIntroduced = Introduced.
Version;
2816 VersionTuple NewDeprecated = Deprecated.
Version;
2817 VersionTuple NewObsoleted = Obsoleted.
Version;
2819 NewIntroduced, NewDeprecated,
2822 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2823 NewObsoleted, NewIsUnavailable, Str, IsStrict, Replacement,
2837 else if (II->
getName() ==
"ios_app_extension")
2842 const auto *IOSToWatchOSMapping =
2847 auto adjustWatchOSVersion =
2848 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2849 if (Version.empty())
2851 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2853 if (IOSToWatchOSMapping) {
2854 if (
auto MappedVersion = IOSToWatchOSMapping->map(
2855 Version, MinimumWatchOSVersion, std::nullopt)) {
2856 return *MappedVersion;
2860 auto Major = Version.getMajor();
2861 auto NewMajor = Major;
2864 else if (Major < 12)
2865 NewMajor = Major - 7;
2866 if (NewMajor >= 2) {
2867 if (Version.getMinor()) {
2868 if (Version.getSubminor())
2869 return VersionTuple(NewMajor, *Version.getMinor(),
2870 *Version.getSubminor());
2872 return VersionTuple(NewMajor, *Version.getMinor());
2874 return VersionTuple(NewMajor);
2877 return MinimumWatchOSVersion;
2880 auto NewIntroduced = adjustWatchOSVersion(Introduced.
Version);
2881 auto NewDeprecated = adjustWatchOSVersion(Deprecated.
Version);
2882 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.
Version);
2885 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2886 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2898 else if (II->
getName() ==
"ios_app_extension")
2903 const auto *IOSToTvOSMapping =
2908 auto AdjustTvOSVersion =
2909 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2910 if (Version.empty())
2913 if (IOSToTvOSMapping) {
2914 if (
auto MappedVersion = IOSToTvOSMapping->map(
2915 Version, VersionTuple(0, 0), std::nullopt)) {
2916 return *MappedVersion;
2922 auto NewIntroduced = AdjustTvOSVersion(Introduced.
Version);
2923 auto NewDeprecated = AdjustTvOSVersion(Deprecated.
Version);
2924 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.
Version);
2927 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2928 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2935 llvm::Triple::IOS &&
2937 auto GetSDKInfo = [&]() {
2946 else if (II->
getName() ==
"ios_app_extension")
2949 auto MinMacCatalystVersion = [](
const VersionTuple &
V) {
2952 if (
V.getMajor() < 13 ||
2953 (
V.getMajor() == 13 &&
V.getMinor() && *
V.getMinor() < 1))
2954 return VersionTuple(13, 1);
2958 ND, AL, NewII,
true ,
2959 MinMacCatalystVersion(Introduced.
Version),
2960 MinMacCatalystVersion(Deprecated.
Version),
2961 MinMacCatalystVersion(Obsoleted.
Version), IsUnavailable, Str,
2966 }
else if (II->
getName() ==
"macos" && GetSDKInfo() &&
2968 !Obsoleted.
Version.empty())) {
2969 if (
const auto *MacOStoMacCatalystMapping =
2970 GetSDKInfo()->getVersionMapping(
2977 auto RemapMacOSVersion =
2978 [&](
const VersionTuple &
V) -> std::optional<VersionTuple> {
2980 return std::nullopt;
2982 if (
V.getMajor() == 100000)
2983 return VersionTuple(100000);
2985 return MacOStoMacCatalystMapping->map(
V, VersionTuple(13, 1),
2988 std::optional<VersionTuple> NewIntroduced =
2989 RemapMacOSVersion(Introduced.
Version),
2991 RemapMacOSVersion(Deprecated.
Version),
2993 RemapMacOSVersion(Obsoleted.
Version);
2994 if (NewIntroduced || NewDeprecated || NewObsoleted) {
2995 auto VersionOrEmptyVersion =
2996 [](
const std::optional<VersionTuple> &
V) -> VersionTuple {
2997 return V ? *
V : VersionTuple();
3000 ND, AL, NewII,
true ,
3001 VersionOrEmptyVersion(NewIntroduced),
3002 VersionOrEmptyVersion(NewDeprecated),
3003 VersionOrEmptyVersion(NewObsoleted),
false, Str,
3022 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(0)))
3024 StringRef DefinedIn;
3025 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(1)))
3026 DefinedIn = SE->getString();
3027 bool IsGeneratedDeclaration = AL.
getArgAsIdent(2) !=
nullptr;
3029 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(3)))
3030 USR = SE->getString();
3037 VisibilityAttr::VisibilityType
Value) {
3038 if (VisibilityAttr *
Attr = D->
getAttr<VisibilityAttr>()) {
3040 Diag(Loc, diag::err_mismatched_visibility);
3047 typename T::VisibilityType value) {
3048 T *existingAttr = D->
getAttr<T>();
3050 typename T::VisibilityType existingValue = existingAttr->getVisibility();
3051 if (existingValue == value)
3053 S.
Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
3054 S.
Diag(CI.
getLoc(), diag::note_previous_attribute);
3062 VisibilityAttr::VisibilityType Vis) {
3063 return ::mergeVisibilityAttr<VisibilityAttr>(*
this, D, CI, Vis);
3068 TypeVisibilityAttr::VisibilityType Vis) {
3069 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*
this, D, CI, Vis);
3073 bool isTypeVisibility) {
3094 VisibilityAttr::VisibilityType
type;
3095 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr,
type)) {
3096 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
3103 if (
type == VisibilityAttr::Protected &&
3105 S.
Diag(AL.
getLoc(), diag::warn_attribute_protected_visibility);
3106 type = VisibilityAttr::Default;
3110 if (isTypeVisibility) {
3112 D, AL, (TypeVisibilityAttr::VisibilityType)
type);
3121 unsigned sentinel = (
unsigned)SentinelAttr::DefaultSentinel;
3124 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3126 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3131 if (Idx->isSigned() && Idx->isNegative()) {
3132 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_less_than_zero)
3137 sentinel = Idx->getZExtValue();
3140 unsigned nullPos = (
unsigned)SentinelAttr::DefaultNullPos;
3143 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3145 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3149 nullPos = Idx->getZExtValue();
3151 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
3154 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
3160 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3163 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3168 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3171 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
3172 if (!MD->isVariadic()) {
3173 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3176 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
3177 if (!BD->isVariadic()) {
3178 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
3181 }
else if (
const auto *
V = dyn_cast<VarDecl>(D)) {
3190 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3195 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
3199 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3205 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3217 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
3220 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
3221 if (MD->getReturnType()->isVoidType()) {
3222 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
3239 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3250 if (LO.CPlusPlus && !LO.CPlusPlus20)
3251 S.
Diag(AL.
getLoc(), diag::ext_cxx20_attr) << AL;
3255 }
else if (LO.CPlusPlus && !LO.CPlusPlus17)
3256 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
3263 S.
Diag(AL.
getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
3276 S.
Diag(AL.
getLoc(), diag::warn_attribute_invalid_on_definition)
3283 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3296template <
class Attribute>
3298 const unsigned Idx) {
3307 std::optional<llvm::APSInt> I = llvm::APSInt(64);
3314 if (!I->isIntN(32)) {
3316 <<
toString(*I, 10,
false) << 32 << 1;
3320 S.
Diag(E->
getExprLoc(), diag::err_attribute_requires_positive_integer)
3328 "Unexpected PerformCopyInitialization() failure.");
3334template <
typename WorkGroupAttr>
3337 for (
unsigned i = 0; i < 3; ++i) {
3344 auto IsZero = [&](
Expr *E) {
3345 if (E->isValueDependent())
3347 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.
Context);
3348 assert(I &&
"Non-integer constant expr");
3352 if (!llvm::all_of(WGSize, IsZero)) {
3353 for (
unsigned i = 0; i < 3; ++i) {
3355 if (IsZero(WGSize[i])) {
3356 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_is_zero)
3367 assert(L &&
"Non-integer constant expr");
3368 std::optional<llvm::APSInt> R = RHS->getIntegerConstantExpr(S.
Context);
3369 assert(L &&
"Non-integer constant expr");
3373 WorkGroupAttr *Existing = D->
getAttr<WorkGroupAttr>();
3375 !llvm::equal(std::initializer_list<Expr *>{Existing->getXDim(),
3376 Existing->getYDim(),
3377 Existing->getZDim()},
3379 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3382 WorkGroupAttr(S.
Context, AL, WGSize[0], WGSize[1], WGSize[2]));
3387 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
3393 assert(ParmTSI &&
"no type source info for attribute argument");
3398 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
3402 if (VecTypeHintAttr *A = D->
getAttr<VecTypeHintAttr>()) {
3404 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3416 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3421 if (SectionAttr *ExistingAttr = D->
getAttr<SectionAttr>()) {
3422 if (ExistingAttr->getName() == Name)
3424 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3426 Diag(CI.
getLoc(), diag::note_previous_attribute);
3433 if (!
Context.getTargetInfo().getTriple().isOSDarwin())
3434 return llvm::Error::success();
3437 StringRef Segment, Section;
3438 unsigned TAA, StubSize;
3440 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
3441 TAA, HasTAA, StubSize);
3446 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3476 if (Triple.isLoongArch()) {
3477 return Str ==
"normal" || Str ==
"medium" || Str ==
"extreme";
3479 assert(Triple.getArch() == llvm::Triple::x86_64 &&
3480 "only loongarch/x86-64 supported");
3481 return Str ==
"small" || Str ==
"large";
3488 auto IsTripleSupported = [](llvm::Triple &Triple) {
3489 return Triple.getArch() == llvm::Triple::ArchType::x86_64 ||
3490 Triple.isLoongArch();
3500 Triples.push_back(aux->getTriple());
3509 auto SupportedTripleIt = llvm::find_if(Triples, IsTripleSupported);
3510 if (SupportedTripleIt == Triples.end()) {
3511 S.
Diag(LiteralLoc, diag::warn_unknown_attribute_ignored) << AL;
3515 llvm::CodeModel::Model CM;
3516 if (!CodeModelAttr::ConvertStrToModel(Str, CM) ||
3518 S.
Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
3528 StringRef CodeSegName) {
3530 S.
Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3542 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3546 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3547 if (ExistingAttr->getName() == Name)
3549 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3551 Diag(CI.
getLoc(), diag::note_previous_attribute);
3564 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3565 if (!ExistingAttr->isImplicit()) {
3567 ExistingAttr->getName() == Str
3568 ? diag::warn_duplicate_codeseg_attribute
3569 : diag::err_conflicting_codeseg_attribute);
3581 if (AttrStr.contains(
"fpmath="))
3582 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3583 << Unsupported <<
None <<
"fpmath=" <<
Target;
3586 if (!
Context.getTargetInfo().supportsTargetAttributeTune() &&
3587 AttrStr.contains(
"tune="))
3588 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3592 Context.getTargetInfo().parseTargetAttr(AttrStr);
3594 if (!ParsedAttrs.
CPU.empty() &&
3595 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
CPU))
3596 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3599 if (!ParsedAttrs.
Tune.empty() &&
3600 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
Tune))
3601 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3604 if (
Context.getTargetInfo().getTriple().isRISCV()) {
3606 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3608 for (StringRef CurFeature : ParsedAttrs.
Features) {
3609 if (!CurFeature.starts_with(
'+') && !CurFeature.starts_with(
'-'))
3610 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3615 if (
Context.getTargetInfo().getTriple().isLoongArch()) {
3616 for (StringRef CurFeature : ParsedAttrs.
Features) {
3617 if (CurFeature.starts_with(
"!arch=")) {
3618 StringRef ArchValue = CurFeature.split(
"=").second.trim();
3619 return Diag(LiteralLoc, diag::err_attribute_unsupported)
3620 <<
"target(arch=..)" << ArchValue;
3626 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3630 auto CurFeature = StringRef(
Feature).drop_front();
3631 if (!
Context.getTargetInfo().isValidFeatureName(CurFeature))
3632 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3633 << Unsupported <<
None << CurFeature <<
Target;
3640 if (!
Context.getTargetInfo().validateBranchProtection(
3642 Context.getLangOpts(), DiagMsg)) {
3643 if (DiagMsg.empty())
3644 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3645 << Unsupported <<
None <<
"branch-protection" <<
Target;
3646 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3649 if (!DiagMsg.empty())
3650 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3670 TargetVersionAttr *NewAttr =
3682 TargetAttr *NewAttr = ::new (S.
Context) TargetAttr(S.
Context, AL, Str);
3689 if (
const auto *
Other = D->
getAttr<TargetClonesAttr>()) {
3690 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3691 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
3699 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
3700 if (MD->getParent()->isLambda()) {
3710 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
3715 Params.push_back(Param);
3716 Locations.push_back(Loc);
3737 for (
auto &SmallStr : NewParams)
3738 Params.push_back(SmallStr.str());
3740 TargetClonesAttr *NewAttr = ::new (S.
Context)
3741 TargetClonesAttr(S.
Context, AL, Params.data(), Params.size());
3753 MinVectorWidthAttr *Existing = D->
getAttr<MinVectorWidthAttr>();
3754 if (Existing && Existing->getVectorWidth() != VecWidth) {
3755 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3770 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
3772 S.
Diag(Loc, diag::warn_cleanup_ext);
3773 FD = dyn_cast<FunctionDecl>(DRE->
getDecl());
3776 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3780 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3781 if (ULE->hasExplicitTemplateArgs())
3782 S.
Diag(Loc, diag::warn_cleanup_ext);
3784 NI = ULE->getNameInfo();
3786 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3793 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3798 S.
Diag(Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3814 S.
Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3836 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3841 EnumExtensibilityAttr::Kind ExtensibilityKind;
3843 if (!EnumExtensibilityAttr::ConvertStrToKind(II->
getName(),
3844 ExtensibilityKind)) {
3845 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3850 EnumExtensibilityAttr(S.
Context, AL, ExtensibilityKind));
3868 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3878 if (
auto *OMD = dyn_cast<ObjCMethodDecl>(D))
3879 if (
auto *
Interface = OMD->getClassInterface())
3886 S.
Diag(AL.
getLoc(), diag::err_format_attribute_result_not)
3887 << (NotNSStringTy ?
"string type" :
"NSString")
3907 return llvm::StringSwitch<FormatAttrKind>(Format)
3914 .Cases({
"gnu_scanf",
"scanf",
"gnu_printf",
"printf",
"printf0",
3915 "gnu_strfmon",
"strfmon"},
3923 .Cases({
"gcc_diag",
"gcc_cdiag",
"gcc_cxxdiag",
"gcc_tdiag"},
3932 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
3937 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
3942 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
3948 uint32_t prioritynum;
3954 if (prioritynum > 65535) {
3955 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_range)
3963 if (prioritynum < 101)
3964 S.
Diag(AL.
getLoc(), diag::warn_init_priority_reserved)
3970 StringRef NewUserDiagnostic) {
3971 if (
const auto *EA = D->
getAttr<ErrorAttr>()) {
3973 assert((NewAttr ==
"error" || NewAttr ==
"warning") &&
3974 "unexpected normalized full name");
3975 bool Match = (EA->isError() && NewAttr ==
"error") ||
3976 (EA->isWarning() && NewAttr ==
"warning");
3978 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
3981 EA->isRegularKeywordAttribute());
3982 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
3985 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
3986 Diag(CI.
getLoc(), diag::warn_duplicate_attribute) << EA;
3987 Diag(EA->getLoc(), diag::note_previous_attribute);
3991 return ::new (
Context) ErrorAttr(
Context, CI, NewUserDiagnostic);
3999 if (F->getType() == Format &&
4000 F->getFormatIdx() == FormatIdx &&
4001 F->getFirstArg() == FirstArg) {
4004 if (F->getLocation().isInvalid())
4010 return ::new (
Context) FormatAttr(
Context, CI, Format, FormatIdx, FirstArg);
4020 if (F->getType() == Format && F->getFormatIdx() == FormatIdx) {
4022 F->getFormatString(), FormatStr))
4027 if (F->getLocation().isInvalid())
4034 FormatMatchesAttr(
Context, CI, Format, FormatIdx, FormatStr);
4052 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
4077 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
4088 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4096 if (HasImplicitThisParam) {
4099 diag::err_format_attribute_implicit_this_format_string)
4112 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
4133 if (FirstArg != 0) {
4137 S.
Diag(AL.
getLoc(), diag::err_format_strftime_third_parameter)
4145 if (FirstArg != Info.
NumArgs + 1) {
4146 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4149 std::to_string(Info.
NumArgs + 1));
4154 S.
Diag(D->
getLocation(), diag::warn_gcc_requires_variadic_function) << AL;
4159 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4166 FormatAttr *NewAttr =
4178 if (
auto *SL = dyn_cast<StringLiteral>(FormatStrExpr)) {
4187 S.
Diag(AL.
getLoc(), diag::err_format_nonliteral)
4195 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_no_callee)
4204 assert(FD &&
"Expected a function declaration!");
4206 llvm::StringMap<int> NameIdxMapping;
4207 NameIdxMapping[
"__"] = -1;
4209 NameIdxMapping[
"this"] = 0;
4213 NameIdxMapping[PVD->getName()] = Idx++;
4215 auto UnknownName = NameIdxMapping.end();
4218 for (
unsigned I = 0, E = AL.
getNumArgs(); I < E; ++I) {
4225 if (It == UnknownName) {
4226 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_argument_unknown)
4232 ArgIdx = It->second;
4239 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4245 if (ArgIdx < -1 || ArgIdx > NumArgs) {
4246 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4253 llvm_unreachable(
"Unexpected ParsedAttr argument type!");
4256 if (ArgIdx == 0 && !HasImplicitThisParam) {
4257 S.
Diag(AL.
getLoc(), diag::err_callback_implicit_this_not_available)
4264 if (!HasImplicitThisParam && ArgIdx > 0)
4267 EncodingIndices.push_back(ArgIdx);
4270 int CalleeIdx = EncodingIndices.front();
4274 if (CalleeIdx < (
int)HasImplicitThisParam) {
4275 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_invalid_callee)
4282 const Type *CalleeType =
4286 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4291 const Type *CalleeFnType =
4296 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
4297 if (!CalleeFnProtoType) {
4298 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4303 if (CalleeFnProtoType->getNumParams() != EncodingIndices.size() - 1) {
4304 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_arg_count_for_func)
4305 << AL <<
QualType{CalleeFnProtoType, 0}
4306 << CalleeFnProtoType->getNumParams()
4307 << (
unsigned)(EncodingIndices.size() - 1);
4311 if (CalleeFnProtoType->isVariadic()) {
4317 if (D->
hasAttr<CallbackAttr>()) {
4323 S.
Context, AL, EncodingIndices.data(), EncodingIndices.size()));
4327 StringRef ParamName) {
4330 Diag(AL.
getLoc(), diag::err_capture_by_attribute_no_entity)
4339 bool IsValid =
true;
4340 for (
unsigned I = 0; I < N; ++I) {
4343 Diag(E->
getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
4351 Diag(IdLoc->
getLoc(), diag::err_capture_by_references_itself)
4357 ParamLocs[I] = IdLoc->
getLoc();
4363 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices.data(), N, AL);
4364 CapturedBy->setArgs(ParamIdents, ParamLocs);
4371 if (D->
hasAttr<LifetimeCaptureByAttr>()) {
4372 S.
Diag(AL.
getLoc(), diag::err_capture_by_attribute_multiple)
4376 auto *PVD = dyn_cast<ParmVarDecl>(D);
4387 if (
auto *A = PVD->getAttr<LifetimeCaptureByAttr>())
4389 if (HasImplicitThisParam) {
4397 if (
auto *A = ATL.
getAttrAs<LifetimeCaptureByAttr>())
4398 Attrs.push_back(
const_cast<LifetimeCaptureByAttr *
>(A));
4403 llvm::StringMap<int> NameIdxMapping = {
4404 {
"global", LifetimeCaptureByAttr::Global},
4405 {
"unknown", LifetimeCaptureByAttr::Unknown}};
4407 if (HasImplicitThisParam) {
4408 NameIdxMapping[
"this"] = 0;
4412 NameIdxMapping[PVD->getName()] = Idx++;
4413 auto DisallowReservedParams = [&](StringRef Reserved) {
4415 if (PVD->getName() == Reserved)
4416 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
4417 << (PVD->getName() ==
"unknown");
4419 for (
auto *CapturedBy : Attrs) {
4420 const auto &Entities = CapturedBy->getArgIdents();
4421 for (
size_t I = 0; I < Entities.size(); ++I) {
4422 StringRef Name = Entities[I]->getName();
4423 auto It = NameIdxMapping.find(Name);
4424 if (It == NameIdxMapping.end()) {
4425 auto Loc = CapturedBy->getArgLocs()[I];
4426 if (!HasImplicitThisParam && Name ==
"this")
4427 Diag(Loc, diag::err_capture_by_implicit_this_not_available) << Loc;
4429 Diag(Loc, diag::err_capture_by_attribute_argument_unknown)
4430 << Entities[I] << Loc;
4433 if (Name ==
"unknown" || Name ==
"global")
4434 DisallowReservedParams(Name);
4435 CapturedBy->setParamIdx(I, It->second);
4444 return T.isFunctionPointerType() || T.isBlockPointerType();
4453 S.
Diag(AL.
getLoc(), diag::err_called_once_attribute_wrong_type);
4463 const auto *TD = dyn_cast<TypedefNameDecl>(D);
4464 if (TD && TD->getUnderlyingType()->isUnionType())
4465 RD = TD->getUnderlyingType()->getAsRecordDecl();
4467 RD = dyn_cast<RecordDecl>(D);
4470 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4478 diag::warn_transparent_union_attribute_not_definition);
4484 if (Field == FieldEnd) {
4485 S.
Diag(AL.
getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4493 diag::warn_transparent_union_attribute_floating)
4502 for (; Field != FieldEnd; ++Field) {
4503 QualType FieldType = Field->getType();
4517 S.
Diag(Field->getLocation(),
4518 diag::warn_transparent_union_attribute_field_size_align)
4519 << isSize << *Field << FieldBits;
4520 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4522 diag::note_transparent_union_first_field_size_align)
4523 << isSize << FirstBits;
4546 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4547 T = TD->getUnderlyingType();
4548 else if (
const auto *VD = dyn_cast<ValueDecl>(D))
4551 llvm_unreachable(
"Unknown decl type for align_value");
4553 if (!T->isDependentType() && !T->isAnyPointerType() &&
4554 !T->isReferenceType() && !T->isMemberPointerType()) {
4555 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4561 llvm::APSInt Alignment;
4563 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4567 if (!Alignment.isPowerOf2()) {
4568 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4590 diag::err_pack_expansion_without_parameter_packs);
4605 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4617 diag::err_pack_expansion_without_parameter_packs);
4644 const AlignedAttr &
Attr,
4649 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
4652 if (VD->isExceptionVariable())
4654 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
4655 if (FD->isBitField())
4657 }
else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4658 if (ED->getLangOpts().CPlusPlus)
4661 return S.
Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4666 if (DiagKind != -1) {
4667 return S.
Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4668 << &
Attr << DiagKind;
4674 bool IsPackExpansion) {
4675 AlignedAttr TmpAttr(
Context, CI,
true, E);
4679 if (TmpAttr.isAlignas() &&
4687 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4688 if (!TND->getUnderlyingType()->isDependentType()) {
4689 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4696 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
true, E);
4697 AA->setPackExpansion(IsPackExpansion);
4703 llvm::APSInt Alignment;
4705 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4710 if (
Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
4713 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4718 uint64_t AlignVal = Alignment.getZExtValue();
4724 if (!(TmpAttr.isAlignas() && !Alignment)) {
4725 if (!llvm::isPowerOf2_64(AlignVal)) {
4726 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4732 const auto *VD = dyn_cast<VarDecl>(D);
4734 unsigned MaxTLSAlign =
4735 Context.toCharUnitsFromBits(
Context.getTargetInfo().getMaxTLSAlign())
4737 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4739 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4740 << (
unsigned)AlignVal << VD << MaxTLSAlign;
4747 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4748 const Type *Ty = VD->getType().getTypePtr();
4750 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4751 << VD->getType() << 16;
4757 AA->setPackExpansion(IsPackExpansion);
4758 AA->setCachedAlignmentValue(
4759 static_cast<unsigned>(AlignVal *
Context.getCharWidth()));
4765 AlignedAttr TmpAttr(
Context, CI,
false, TS);
4769 if (TmpAttr.isAlignas() &&
4777 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4778 if (!TND->getUnderlyingType()->isDependentType()) {
4779 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4785 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4786 AA->setPackExpansion(IsPackExpansion);
4791 const auto *VD = dyn_cast<VarDecl>(D);
4792 unsigned AlignVal = TmpAttr.getAlignment(
Context);
4795 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4796 const Type *Ty = VD->getType().getTypePtr();
4798 Context.toCharUnitsFromBits(AlignVal).getQuantity() < 16) {
4799 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4800 << VD->getType() << 16;
4805 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4806 AA->setPackExpansion(IsPackExpansion);
4807 AA->setCachedAlignmentValue(AlignVal);
4812 assert(D->
hasAttrs() &&
"no attributes on decl");
4815 if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
4816 UnderlyingTy = DiagTy = VD->getType();
4819 if (
const auto *ED = dyn_cast<EnumDecl>(D))
4820 UnderlyingTy = ED->getIntegerType();
4829 AlignedAttr *AlignasAttr =
nullptr;
4830 AlignedAttr *LastAlignedAttr =
nullptr;
4833 if (I->isAlignmentDependent())
4837 Align = std::max(Align, I->getAlignment(
Context));
4838 LastAlignedAttr = I;
4842 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4843 << LastAlignedAttr << DiagTy;
4844 }
else if (AlignasAttr && Align) {
4847 if (NaturalAlign > RequestedAlign)
4848 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
4875 Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
4884 bool &IntegerMode,
bool &ComplexMode,
4887 ComplexMode =
false;
4889 switch (Str.size()) {
4909 DestWidth = Str[1] ==
'I' ? 0 : 128;
4917 DestWidth = Str[1] ==
'I' ? 0 : 128;
4920 if (Str[1] ==
'F') {
4921 IntegerMode =
false;
4922 }
else if (Str[1] ==
'C') {
4923 IntegerMode =
false;
4925 }
else if (Str[1] !=
'I') {
4934 else if (Str ==
"byte")
4938 if (Str ==
"pointer")
4942 if (Str ==
"unwind_word")
4958 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
4970 StringRef Str = Name->
getName();
4974 unsigned DestWidth = 0;
4975 bool IntegerMode =
true;
4976 bool ComplexMode =
false;
4978 llvm::APInt VectorSize(64, 0);
4979 if (Str.size() >= 4 && Str[0] ==
'V') {
4981 size_t StrSize = Str.size();
4982 size_t VectorStringLength = 0;
4983 while ((VectorStringLength + 1) < StrSize &&
4984 isdigit(Str[VectorStringLength + 1]))
4985 ++VectorStringLength;
4986 if (VectorStringLength &&
4987 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
4988 VectorSize.isPowerOf2()) {
4990 IntegerMode, ComplexMode, ExplicitType);
4992 if (!InInstantiation)
4993 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
5008 Diag(AttrLoc, diag::err_machine_mode) << 0 << Name;
5013 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
5014 OldTy = TD->getUnderlyingType();
5015 else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
5018 OldTy = ED->getIntegerType();
5033 OldElemTy = VT->getElementType();
5039 VectorSize.getBoolValue()) {
5040 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.
getRange();
5048 !IntegralOrAnyEnumType)
5049 Diag(AttrLoc, diag::err_mode_not_primitive);
5050 else if (IntegerMode) {
5051 if (!IntegralOrAnyEnumType)
5052 Diag(AttrLoc, diag::err_mode_wrong_type);
5053 }
else if (ComplexMode) {
5055 Diag(AttrLoc, diag::err_mode_wrong_type);
5058 Diag(AttrLoc, diag::err_mode_wrong_type);
5064 NewElemTy =
Context.getIntTypeForBitwidth(DestWidth,
5067 NewElemTy =
Context.getRealTypeForBitwidth(DestWidth, ExplicitType);
5069 if (NewElemTy.
isNull()) {
5071 if (!(DestWidth == 128 &&
5073 Diag(AttrLoc, diag::err_machine_mode) << 1 << Name;
5078 NewElemTy =
Context.getComplexType(NewElemTy);
5082 if (VectorSize.getBoolValue()) {
5083 NewTy =
Context.getVectorType(NewTy, VectorSize.getZExtValue(),
5088 Diag(AttrLoc, diag::err_complex_mode_vector_type);
5091 unsigned NumElements =
Context.getTypeSize(OldElemTy) *
5092 OldVT->getNumElements() /
5093 Context.getTypeSize(NewElemTy);
5095 Context.getVectorType(NewElemTy, NumElements, OldVT->getVectorKind());
5099 Diag(AttrLoc, diag::err_mode_wrong_type);
5104 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
5105 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
5106 else if (
auto *ED = dyn_cast<EnumDecl>(D))
5107 ED->setIntegerType(NewTy);
5135 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5136 Diag(CI.
getLoc(), diag::warn_attribute_ignored) << Ident;
5137 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5141 if (D->
hasAttr<AlwaysInlineAttr>())
5149 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5152 if (VD->getKind() != Decl::Var) {
5153 Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5160 if (VD->hasLocalStorage()) {
5161 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5168InternalLinkageAttr *
5170 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5173 if (VD->getKind() != Decl::Var) {
5174 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
5175 << &AL << AL.isRegularKeywordAttribute()
5181 if (VD->hasLocalStorage()) {
5182 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5191 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5192 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'minsize'";
5193 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5197 if (D->
hasAttr<MinSizeAttr>())
5205 if (AlwaysInlineAttr *Inline = D->
getAttr<AlwaysInlineAttr>()) {
5206 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
5207 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5210 if (MinSizeAttr *MinSize = D->
getAttr<MinSizeAttr>()) {
5211 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
5212 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5216 if (D->
hasAttr<OptimizeNoneAttr>())
5223 AlwaysInlineAttr AIA(S.
Context, AL);
5225 (AIA.isMSVCForceInline() || AIA.isMSVCForceInlineCalls())) {
5226 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
5229 if (AIA.isMSVCForceInlineCalls()) {
5230 S.
Diag(AL.
getLoc(), diag::warn_stmt_attribute_ignored_in_function)
5231 <<
"[[msvc::forceinline]]";
5235 if (AlwaysInlineAttr *Inline =
5252 if (VD->hasLocalStorage()) {
5253 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5260 if (
auto *A = D->
getAttr<CUDAConstantAttr>()) {
5261 if (!A->isImplicit())
5272 if (!S.
getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
5274 S.
Diag(AL.
getLoc(), diag::err_cuda_extern_shared) << VD;
5279 if (S.
getLangOpts().CUDA && VD->hasLocalStorage() &&
5298 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
5299 if (Method->isInstance()) {
5300 S.
Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
5304 S.
Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
5310 if (AL.
getKind() == ParsedAttr::AT_DeviceKernel)
5323 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5324 if (VD->hasLocalStorage()) {
5325 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5332 if (
auto *A = D->
getAttr<CUDADeviceAttr>()) {
5333 if (!A->isImplicit())
5341 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5342 if (VD->hasLocalStorage()) {
5343 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5349 if (!D->
hasAttr<HIPManagedAttr>())
5351 if (!D->
hasAttr<CUDADeviceAttr>())
5366 if (!Fn->isInlineSpecified()) {
5367 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
5372 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
5389 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5395 case ParsedAttr::AT_FastCall:
5398 case ParsedAttr::AT_StdCall:
5401 case ParsedAttr::AT_ThisCall:
5404 case ParsedAttr::AT_CDecl:
5407 case ParsedAttr::AT_Pascal:
5410 case ParsedAttr::AT_SwiftCall:
5413 case ParsedAttr::AT_SwiftAsyncCall:
5416 case ParsedAttr::AT_VectorCall:
5419 case ParsedAttr::AT_MSABI:
5422 case ParsedAttr::AT_SysVABI:
5425 case ParsedAttr::AT_RegCall:
5428 case ParsedAttr::AT_Pcs: {
5429 PcsAttr::PCSType PCS;
5432 PCS = PcsAttr::AAPCS;
5435 PCS = PcsAttr::AAPCS_VFP;
5438 llvm_unreachable(
"unexpected calling convention in pcs attribute");
5444 case ParsedAttr::AT_AArch64VectorPcs:
5447 case ParsedAttr::AT_AArch64SVEPcs:
5450 case ParsedAttr::AT_DeviceKernel: {
5452 assert(D->
hasAttr<DeviceKernelAttr>() &&
"Expected attribute");
5455 case ParsedAttr::AT_IntelOclBicc:
5458 case ParsedAttr::AT_PreserveMost:
5461 case ParsedAttr::AT_PreserveAll:
5464 case ParsedAttr::AT_M68kRTD:
5467 case ParsedAttr::AT_PreserveNone:
5470 case ParsedAttr::AT_RISCVVectorCC:
5473 case ParsedAttr::AT_RISCVVLSCC: {
5480 S.
Diag(AL.
getLoc(), diag::err_argument_invalid_range)
5485 S.
Diag(AL.
getLoc(), diag::err_argument_not_power_of_2);
5493 llvm_unreachable(
"unexpected attribute kind");
5498 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
5504 S.
Diag(AL.
getLoc(), diag::err_hidden_device_kernel) << FD;
5508 if (Triple.isNVPTX()) {
5512 if (!LangOpts.OpenCLCPlusPlus && (!FD || IsFunctionTemplate)) {
5513 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type_str)
5521 bool TargetDeviceEnvironment = Triple.isGPU() || Triple.isSPIR() ||
5523 if (!TargetDeviceEnvironment) {
5524 S.
Diag(AL.
getLoc(), diag::warn_cconv_unsupported)
5542 std::vector<StringRef> DiagnosticIdentifiers;
5543 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
5549 DiagnosticIdentifiers.push_back(RuleName);
5552 SuppressAttr(S.
Context, AL, DiagnosticIdentifiers.data(),
5553 DiagnosticIdentifiers.size()));
5562 unsigned SelectIdx = ~0
U;
5568 if (SelectIdx != ~0
U) {
5569 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument)
5581 if (AL.
getKind() == ParsedAttr::AT_Owner) {
5584 if (
const auto *OAttr = D->
getAttr<OwnerAttr>()) {
5585 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5586 ? OAttr->getDerefType().getTypePtr()
5589 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5592 OAttr->isRegularKeywordAttribute());
5593 S.
Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5598 Redecl->addAttr(::new (S.
Context) OwnerAttr(S.
Context, AL, DerefTypeLoc));
5603 if (
const auto *PAttr = D->
getAttr<PointerAttr>()) {
5604 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5605 ? PAttr->getDerefType().getTypePtr()
5608 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5611 PAttr->isRegularKeywordAttribute());
5612 S.
Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5617 Redecl->addAttr(::new (S.
Context)
5618 PointerAttr(S.
Context, AL, DerefTypeLoc));
5626 if (!D->
hasAttr<RandomizeLayoutAttr>())
5634 if (!D->
hasAttr<NoRandomizeLayoutAttr>())
5649 if (Attrs.
getKind() == ParsedAttr::AT_RISCVVLSCC) {
5657 unsigned ReqArgs = Attrs.
getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5664 bool IsTargetDefaultMSABI =
5665 Context.getTargetInfo().getTriple().isOSWindows() ||
5666 Context.getTargetInfo().getTriple().isUEFI();
5669 case ParsedAttr::AT_CDecl:
5672 case ParsedAttr::AT_FastCall:
5675 case ParsedAttr::AT_StdCall:
5678 case ParsedAttr::AT_ThisCall:
5681 case ParsedAttr::AT_Pascal:
5684 case ParsedAttr::AT_SwiftCall:
5687 case ParsedAttr::AT_SwiftAsyncCall:
5690 case ParsedAttr::AT_VectorCall:
5693 case ParsedAttr::AT_AArch64VectorPcs:
5696 case ParsedAttr::AT_AArch64SVEPcs:
5699 case ParsedAttr::AT_RegCall:
5702 case ParsedAttr::AT_MSABI:
5705 case ParsedAttr::AT_SysVABI:
5708 case ParsedAttr::AT_Pcs: {
5714 if (StrRef ==
"aapcs") {
5717 }
else if (StrRef ==
"aapcs-vfp") {
5726 case ParsedAttr::AT_IntelOclBicc:
5729 case ParsedAttr::AT_PreserveMost:
5732 case ParsedAttr::AT_PreserveAll:
5735 case ParsedAttr::AT_M68kRTD:
5738 case ParsedAttr::AT_PreserveNone:
5741 case ParsedAttr::AT_RISCVVectorCC:
5744 case ParsedAttr::AT_RISCVVLSCC: {
5747 unsigned ABIVLen = 128;
5753 if (Attrs.
getNumArgs() && (ABIVLen < 32 || ABIVLen > 65536)) {
5755 Diag(Attrs.
getLoc(), diag::err_argument_invalid_range)
5756 << ABIVLen << 32 << 65536;
5759 if (!llvm::isPowerOf2_64(ABIVLen)) {
5761 Diag(Attrs.
getLoc(), diag::err_argument_not_power_of_2);
5765 llvm::Log2_64(ABIVLen) - 5);
5768 case ParsedAttr::AT_DeviceKernel: {
5773 default: llvm_unreachable(
"unexpected attribute kind");
5778 auto *Aux =
Context.getAuxTargetInfo();
5786 bool CheckHost =
false, CheckDevice =
false;
5787 switch (CudaTarget) {
5800 llvm_unreachable(
"unexpected cuda target");
5802 auto *HostTI =
LangOpts.CUDAIsDevice ? Aux : &TI;
5803 auto *DeviceTI =
LangOpts.CUDAIsDevice ? &TI : Aux;
5804 if (CheckHost && HostTI)
5807 A = DeviceTI->checkCallingConvention(CC);
5816 A = Aux->checkCallingConvention(CC);
5834 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
5839 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
5844 bool IsCXXMethod =
false, IsVariadic =
false;
5849 CC =
Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
5874 if (
Context.getTargetInfo().getRegParmMax() == 0) {
5875 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
5882 if (numParams >
Context.getTargetInfo().getRegParmMax()) {
5883 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
5895 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
5905 const CUDALaunchBoundsAttr &AL,
5906 const unsigned Idx) {
5915 std::optional<llvm::APSInt> I = llvm::APSInt(64);
5922 if (!I->isIntN(32)) {
5924 <<
toString(*I, 10,
false) << 32 << 1;
5928 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
5936 "Unexpected PerformCopyInitialization() failure.");
5941CUDALaunchBoundsAttr *
5943 Expr *MinBlocks,
Expr *MaxBlocks) {
5944 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5962 MaxBlocks =
nullptr;
5971 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5990static std::pair<Expr *, int>
5992 const unsigned Idx) {
6008 if (!I->isIntN(4)) {
6010 <<
toString(*I, 10,
false) << 4 << 1;
6014 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6024 CUDAClusterDimsAttr TmpAttr(
Context, CI,
X, Y, Z);
6030 if (!NewX || (Y && !NewY) || (Z && !NewZ))
6033 int FlatDim = ValX * ValY * ValZ;
6034 const llvm::Triple TT =
6035 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
6036 ?
Context.getAuxTargetInfo()->getTriple()
6037 :
Context.getTargetInfo().getTriple();
6041 else if (TT.isAMDGPU())
6048 if (FlatDim > MaxDim) {
6049 Diag(CI.
getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
6053 return CUDAClusterDimsAttr::Create(
Context, NewX, NewY, NewZ, CI);
6072 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6091 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6101 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6123 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
6126 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
6131 TypeTagIdx, IsPointer));
6137 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6146 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
6154 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
6177 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
6180 uint32_t Count = 0, Offset = 0;
6188 if (Count < Offset) {
6189 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
6200 diag::err_attribute_patchable_function_entry_invalid_section)
6204 if (Section.empty()) {
6206 diag::err_attribute_patchable_function_entry_invalid_section)
6207 <<
"section must not be empty";
6217 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6235 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6236 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
6247 if (
auto *CRD = dyn_cast<CXXRecordDecl>(D);
6248 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6259 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6265 assert(ParmTSI &&
"no type source info for attribute argument");
6267 diag::err_incomplete_type);
6277 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
6278 if (
const auto *UA = D->
getAttr<UuidAttr>()) {
6281 if (!UA->getGuid().empty()) {
6282 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6288 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
6293 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6298 StringRef OrigStrRef;
6305 StringRef StrRef = OrigStrRef;
6306 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
6307 StrRef = StrRef.drop_front().drop_back();
6310 if (StrRef.size() != 36) {
6311 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6315 for (
unsigned i = 0; i < 36; ++i) {
6316 if (i == 8 || i == 13 || i == 18 || i == 23) {
6317 if (StrRef[i] !=
'-') {
6318 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6322 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6329 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
6330 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
6331 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
6332 for (
unsigned i = 0; i != 8; ++i)
6333 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6344 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
6353 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6368 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
6372 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
6375 if (VD->hasLocalStorage()) {
6376 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
6384 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
6390 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6394 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6395 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6396 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6406 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6407 << AL <<
First << 0;
6408 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6411 if (
const auto *Preexisting = D->
getAttr<MSStructAttr>()) {
6412 if (Preexisting->isImplicit())
6421 if (
First->isImplicit()) {
6424 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6425 << AL <<
First << 0;
6426 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6436 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6440 Tags.push_back(Tag);
6443 if (
const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6444 if (!NS->isInline()) {
6445 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6448 if (NS->isAnonymousNamespace()) {
6449 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6453 Tags.push_back(NS->getName());
6459 Tags.erase(llvm::unique(Tags), Tags.end());
6462 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
6467 if (I->getBTFDeclTag() == Tag)
6486 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
6492 case llvm::Triple::msp430:
6495 case llvm::Triple::mipsel:
6496 case llvm::Triple::mips:
6499 case llvm::Triple::m68k:
6502 case llvm::Triple::x86:
6503 case llvm::Triple::x86_64:
6506 case llvm::Triple::avr:
6509 case llvm::Triple::riscv32:
6510 case llvm::Triple::riscv64:
6511 case llvm::Triple::riscv32be:
6512 case llvm::Triple::riscv64be:
6529 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
6544 if (D->
hasAttr<DLLExportAttr>()) {
6545 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
6549 if (D->
hasAttr<DLLImportAttr>())
6557 if (DLLImportAttr *Import = D->
getAttr<DLLImportAttr>()) {
6558 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6562 if (D->
hasAttr<DLLExportAttr>())
6575 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6585 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6587 MD->getParent()->isLambda()) {
6593 if (
auto *EA = D->
getAttr<ExcludeFromExplicitInstantiationAttr>()) {
6595 diag::warn_dllattr_ignored_exclusion_takes_precedence)
6600 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
6611 if (MSInheritanceAttr *IA = D->
getAttr<MSInheritanceAttr>()) {
6612 if (IA->getInheritanceModel() == Model)
6614 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6616 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
6621 if (RD->hasDefinition()) {
6628 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6632 if (RD->getDescribedClassTemplate()) {
6633 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6651 StringRef N(
"mutex");
6653 if (AL.
getKind() == ParsedAttr::AT_Capability &&
6666 if (!D->
hasAttr<CapabilityAttr>()) {
6667 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_requires_preceded)
6668 << AL << cast<NamedDecl>(D) <<
"'capability'";
6681 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
6686 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6710 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6723 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6736 RequiresCapabilityAttr *RCA = ::new (S.
Context)
6737 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
6743 if (
const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6744 if (NSD->isAnonymousNamespace()) {
6745 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6759 StringRef Str, Replacement;
6772 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6778 if (
const auto *S = dyn_cast<VarDecl>(D))
6779 return S->hasGlobalStorage();
6784 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6785 Sanitizer ==
"memtag";
6792 std::vector<StringRef> Sanitizers;
6794 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6795 StringRef SanitizerName;
6803 SanitizerName !=
"coverage")
6804 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6806 S.
Diag(D->
getLocation(), diag::warn_attribute_type_not_supported_global)
6807 << AL << SanitizerName;
6808 Sanitizers.push_back(SanitizerName);
6812 Sanitizers.size()));
6825 unsigned TranslatedSpellingIndex = 0;
6827 TranslatedSpellingIndex = 1;
6836 StringRef SanitizerName =
"address";
6839 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6843 StringRef SanitizerName =
"thread";
6846 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6850 StringRef SanitizerName =
"memory";
6853 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6868 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6869 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6870 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6875 D->
dropAttr<ZeroCallUsedRegsAttr>();
6884 auto *FD = dyn_cast<FieldDecl>(D);
6894 case ParsedAttr::AT_CountedBy:
6895 CountInBytes =
false;
6898 case ParsedAttr::AT_CountedByOrNull:
6899 CountInBytes =
false;
6902 case ParsedAttr::AT_SizedBy:
6903 CountInBytes =
true;
6906 case ParsedAttr::AT_SizedByOrNull:
6907 CountInBytes =
true;
6911 llvm_unreachable(
"unexpected counted_by family attribute");
6918 FD->
getType(), CountExpr, CountInBytes, OrNull);
6929 FunctionReturnThunksAttr::Kind Kind;
6930 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
6931 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6938 D->
dropAttr<FunctionReturnThunksAttr>();
6939 D->
addAttr(FunctionReturnThunksAttr::Create(S.
Context, Kind, AL));
6949 auto *VDecl = dyn_cast<VarDecl>(D);
6950 if (VDecl && !VDecl->isFunctionPointerType()) {
6951 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
6965 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
6969 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
6977 "uninitialized is only valid on automatic duration variables");
6988 bool IsKernReturnT =
false;
6989 while (
const auto *TT = T->getAs<
TypedefType>()) {
6990 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
6995 diag::warn_mig_server_routine_does_not_return_kern_return_t);
7005 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
7008 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
7021 if (
const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
7022 if (PVD->getType()->isIntegerType()) {
7023 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
7034template<
typename Attr>
7042template<
typename Attr>
7051 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7056 CFGuardAttr::GuardArg Arg;
7058 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
7059 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
7067template <
typename AttrTy>
7070 auto I = llvm::find_if(Attrs,
7071 [Name](
const AttrTy *A) {
7072 return A->getTCBName() == Name;
7074 return I == Attrs.end() ?
nullptr : *I;
7077template <
typename AttrTy,
typename ConflictingAttrTy>
7084 if (
const ConflictingAttrTy *ConflictingAttr =
7088 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
7102template <
typename AttrTy,
typename ConflictingAttrTy>
7105 StringRef TCBName = AL.getTCBName();
7106 if (
const ConflictingAttrTy *ConflictingAttr =
7108 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
7109 << ConflictingAttr->getAttrName()->getName()
7110 << AL.getAttrName()->getName() << TCBName;
7113 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
7121 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
7130 Decl *D,
const EnforceTCBLeafAttr &AL) {
7140 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7145 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
7150 if (D->
getAttr<VTablePointerAuthenticationAttr>()) {
7151 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
7155 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
7158 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
7160 S.
Diag(IL->
getLoc(), diag::err_invalid_authentication_key)
7164 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
7166 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
7170 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7175 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
7176 AddressDiscriminationMode::DefaultAddressDiscrimination;
7180 if (!VTablePointerAuthenticationAttr::
7181 ConvertStrToAddressDiscriminationMode(
7183 S.
Diag(IL->
getLoc(), diag::err_invalid_address_discrimination)
7187 if (AddressDiversityMode ==
7188 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
7190 S.
Diag(IL->
getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
7194 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7199 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
7200 DefaultExtraDiscrimination;
7204 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
7206 S.
Diag(IL->
getLoc(), diag::err_invalid_extra_discrimination)
7210 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
7212 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
7216 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7221 uint32_t CustomDiscriminationValue = 0;
7222 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
7224 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
7229 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7234 CustomDiscriminationValue)) {
7235 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
7238 }
else if (NumArgs > 3) {
7239 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
7244 S.
Context, AL, KeyType, AddressDiversityMode, ED,
7245 CustomDiscriminationValue));
7252 return Existing->getModularImplFn() == ModularImplFn &&
7253 Existing->getImplName() == ImplName &&
7254 Existing->aspects_size() == Aspects.size() &&
7255 llvm::equal(Existing->aspects(), Aspects);
7261 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7263 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
7264 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
7268 return ::new (
Context) ModularFormatAttr(
Context, CI, ModularImplFn, ImplName,
7269 Aspects.data(), Aspects.size());
7275 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
7283 llvm::DenseSet<StringRef> SeenAspects;
7284 for (
unsigned I = 2, E = AL.
getNumArgs(); I != E; ++I) {
7288 if (!SeenAspects.insert(Aspect).second) {
7290 diag::err_modular_format_duplicate_aspect)
7295 Aspects.push_back(Aspect);
7301 llvm::sort(Aspects);
7304 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7306 S.
Diag(AL.
getLoc(), diag::err_duplicate_attribute) << *Existing;
7307 S.
Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7314 S.
Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7330 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
7331 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7334 if (IsLastAttrArg && AttrHasVariadicArg)
7342 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7354 if (PersonalityAttr *PA = D->
getAttr<PersonalityAttr>()) {
7358 Diag(PA->getLocation(), diag::err_mismatched_personality);
7359 Diag(CI.
getLoc(), diag::note_previous_attribute);
7371 S.
Diag(E->
getExprLoc(), diag::err_attribute_personality_arg_not_function)
7401 S.
Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
7404 S.
Diag(AL.
getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7413 AL.
getKind() == ParsedAttr::AT_NoInline) {
7414 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
7416 if (PVD->hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
7417 S.
Diag(AL.
getLoc(), diag::err_hlsl_attr_incompatible)
7418 <<
"'noinline'" <<
"'groupshared' parameter";
7432 if (MustDelayArgs) {
7442 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
7468 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7477 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
7490 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
7500 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
7511 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
7514 case ParsedAttr::AT_Interrupt:
7517 case ParsedAttr::AT_ARMInterruptSaveFP:
7520 case ParsedAttr::AT_X86ForceAlignArgPointer:
7523 case ParsedAttr::AT_ReadOnlyPlacement:
7526 case ParsedAttr::AT_DLLExport:
7527 case ParsedAttr::AT_DLLImport:
7530 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7533 case ParsedAttr::AT_AMDGPUWavesPerEU:
7536 case ParsedAttr::AT_AMDGPUNumSGPR:
7539 case ParsedAttr::AT_AMDGPUNumVGPR:
7542 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7545 case ParsedAttr::AT_AVRSignal:
7548 case ParsedAttr::AT_BPFPreserveAccessIndex:
7551 case ParsedAttr::AT_BPFPreserveStaticOffset:
7554 case ParsedAttr::AT_BTFDeclTag:
7557 case ParsedAttr::AT_WebAssemblyExportName:
7560 case ParsedAttr::AT_WebAssemblyImportModule:
7563 case ParsedAttr::AT_WebAssemblyImportName:
7566 case ParsedAttr::AT_IBOutlet:
7569 case ParsedAttr::AT_IBOutletCollection:
7572 case ParsedAttr::AT_IFunc:
7575 case ParsedAttr::AT_Alias:
7578 case ParsedAttr::AT_Aligned:
7581 case ParsedAttr::AT_AlignValue:
7584 case ParsedAttr::AT_AllocSize:
7587 case ParsedAttr::AT_AlwaysInline:
7590 case ParsedAttr::AT_AnalyzerNoReturn:
7593 case ParsedAttr::AT_TLSModel:
7596 case ParsedAttr::AT_Annotate:
7599 case ParsedAttr::AT_Availability:
7602 case ParsedAttr::AT_CarriesDependency:
7605 case ParsedAttr::AT_CPUDispatch:
7606 case ParsedAttr::AT_CPUSpecific:
7609 case ParsedAttr::AT_Common:
7612 case ParsedAttr::AT_CUDAConstant:
7615 case ParsedAttr::AT_PassObjectSize:
7618 case ParsedAttr::AT_Constructor:
7621 case ParsedAttr::AT_Deprecated:
7624 case ParsedAttr::AT_Destructor:
7627 case ParsedAttr::AT_EnableIf:
7630 case ParsedAttr::AT_Error:
7633 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7636 case ParsedAttr::AT_DiagnoseIf:
7639 case ParsedAttr::AT_DiagnoseAsBuiltin:
7642 case ParsedAttr::AT_NoBuiltin:
7645 case ParsedAttr::AT_CFIUncheckedCallee:
7648 case ParsedAttr::AT_ExtVectorType:
7651 case ParsedAttr::AT_ExternalSourceSymbol:
7654 case ParsedAttr::AT_MinSize:
7657 case ParsedAttr::AT_OptimizeNone:
7660 case ParsedAttr::AT_EnumExtensibility:
7663 case ParsedAttr::AT_SYCLKernel:
7666 case ParsedAttr::AT_SYCLExternal:
7669 case ParsedAttr::AT_SYCLKernelEntryPoint:
7672 case ParsedAttr::AT_SYCLSpecialClass:
7675 case ParsedAttr::AT_Format:
7678 case ParsedAttr::AT_FormatMatches:
7681 case ParsedAttr::AT_FormatArg:
7684 case ParsedAttr::AT_Callback:
7687 case ParsedAttr::AT_LifetimeCaptureBy:
7690 case ParsedAttr::AT_CalledOnce:
7693 case ParsedAttr::AT_CUDAGlobal:
7696 case ParsedAttr::AT_CUDADevice:
7699 case ParsedAttr::AT_CUDAGridConstant:
7702 case ParsedAttr::AT_HIPManaged:
7705 case ParsedAttr::AT_GNUInline:
7708 case ParsedAttr::AT_CUDALaunchBounds:
7711 case ParsedAttr::AT_CUDAClusterDims:
7714 case ParsedAttr::AT_CUDANoCluster:
7717 case ParsedAttr::AT_Restrict:
7720 case ParsedAttr::AT_MallocSpan:
7723 case ParsedAttr::AT_Mode:
7726 case ParsedAttr::AT_NonString:
7729 case ParsedAttr::AT_NonNull:
7730 if (
auto *PVD = dyn_cast<ParmVarDecl>(D))
7735 case ParsedAttr::AT_ReturnsNonNull:
7738 case ParsedAttr::AT_NoEscape:
7741 case ParsedAttr::AT_MaybeUndef:
7744 case ParsedAttr::AT_AssumeAligned:
7747 case ParsedAttr::AT_AllocAlign:
7750 case ParsedAttr::AT_Ownership:
7753 case ParsedAttr::AT_Naked:
7756 case ParsedAttr::AT_NoReturn:
7759 case ParsedAttr::AT_CXX11NoReturn:
7762 case ParsedAttr::AT_AnyX86NoCfCheck:
7765 case ParsedAttr::AT_NoThrow:
7769 case ParsedAttr::AT_CUDAShared:
7772 case ParsedAttr::AT_VecReturn:
7775 case ParsedAttr::AT_ObjCOwnership:
7778 case ParsedAttr::AT_ObjCPreciseLifetime:
7781 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7784 case ParsedAttr::AT_ObjCRequiresSuper:
7787 case ParsedAttr::AT_ObjCBridge:
7790 case ParsedAttr::AT_ObjCBridgeMutable:
7793 case ParsedAttr::AT_ObjCBridgeRelated:
7796 case ParsedAttr::AT_ObjCDesignatedInitializer:
7799 case ParsedAttr::AT_ObjCRuntimeName:
7802 case ParsedAttr::AT_ObjCBoxable:
7805 case ParsedAttr::AT_NSErrorDomain:
7808 case ParsedAttr::AT_CFConsumed:
7809 case ParsedAttr::AT_NSConsumed:
7810 case ParsedAttr::AT_OSConsumed:
7815 case ParsedAttr::AT_OSReturnsRetainedOnZero:
7818 diag::warn_ns_attribute_wrong_parameter_type,
7821 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
7824 diag::warn_ns_attribute_wrong_parameter_type,
7827 case ParsedAttr::AT_NSReturnsAutoreleased:
7828 case ParsedAttr::AT_NSReturnsNotRetained:
7829 case ParsedAttr::AT_NSReturnsRetained:
7830 case ParsedAttr::AT_CFReturnsNotRetained:
7831 case ParsedAttr::AT_CFReturnsRetained:
7832 case ParsedAttr::AT_OSReturnsNotRetained:
7833 case ParsedAttr::AT_OSReturnsRetained:
7836 case ParsedAttr::AT_WorkGroupSizeHint:
7839 case ParsedAttr::AT_ReqdWorkGroupSize:
7842 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
7845 case ParsedAttr::AT_VecTypeHint:
7848 case ParsedAttr::AT_InitPriority:
7851 case ParsedAttr::AT_Packed:
7854 case ParsedAttr::AT_PreferredName:
7857 case ParsedAttr::AT_NoSpecializations:
7860 case ParsedAttr::AT_Section:
7863 case ParsedAttr::AT_CodeModel:
7866 case ParsedAttr::AT_RandomizeLayout:
7869 case ParsedAttr::AT_NoRandomizeLayout:
7872 case ParsedAttr::AT_CodeSeg:
7875 case ParsedAttr::AT_Target:
7878 case ParsedAttr::AT_TargetVersion:
7881 case ParsedAttr::AT_TargetClones:
7884 case ParsedAttr::AT_MinVectorWidth:
7887 case ParsedAttr::AT_Unavailable:
7890 case ParsedAttr::AT_OMPAssume:
7893 case ParsedAttr::AT_ObjCDirect:
7896 case ParsedAttr::AT_ObjCDirectMembers:
7900 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
7903 case ParsedAttr::AT_Unused:
7906 case ParsedAttr::AT_Visibility:
7909 case ParsedAttr::AT_TypeVisibility:
7912 case ParsedAttr::AT_WarnUnusedResult:
7915 case ParsedAttr::AT_WeakRef:
7918 case ParsedAttr::AT_WeakImport:
7921 case ParsedAttr::AT_TransparentUnion:
7924 case ParsedAttr::AT_ObjCMethodFamily:
7927 case ParsedAttr::AT_ObjCNSObject:
7930 case ParsedAttr::AT_ObjCIndependentClass:
7933 case ParsedAttr::AT_Blocks:
7936 case ParsedAttr::AT_Sentinel:
7939 case ParsedAttr::AT_Cleanup:
7942 case ParsedAttr::AT_NoDebug:
7945 case ParsedAttr::AT_CmseNSEntry:
7948 case ParsedAttr::AT_StdCall:
7949 case ParsedAttr::AT_CDecl:
7950 case ParsedAttr::AT_FastCall:
7951 case ParsedAttr::AT_ThisCall:
7952 case ParsedAttr::AT_Pascal:
7953 case ParsedAttr::AT_RegCall:
7954 case ParsedAttr::AT_SwiftCall:
7955 case ParsedAttr::AT_SwiftAsyncCall:
7956 case ParsedAttr::AT_VectorCall:
7957 case ParsedAttr::AT_MSABI:
7958 case ParsedAttr::AT_SysVABI:
7959 case ParsedAttr::AT_Pcs:
7960 case ParsedAttr::AT_IntelOclBicc:
7961 case ParsedAttr::AT_PreserveMost:
7962 case ParsedAttr::AT_PreserveAll:
7963 case ParsedAttr::AT_AArch64VectorPcs:
7964 case ParsedAttr::AT_AArch64SVEPcs:
7965 case ParsedAttr::AT_M68kRTD:
7966 case ParsedAttr::AT_PreserveNone:
7967 case ParsedAttr::AT_RISCVVectorCC:
7968 case ParsedAttr::AT_RISCVVLSCC:
7971 case ParsedAttr::AT_DeviceKernel:
7974 case ParsedAttr::AT_Suppress:
7977 case ParsedAttr::AT_Owner:
7978 case ParsedAttr::AT_Pointer:
7981 case ParsedAttr::AT_OpenCLAccess:
7984 case ParsedAttr::AT_OpenCLNoSVM:
7987 case ParsedAttr::AT_SwiftContext:
7990 case ParsedAttr::AT_SwiftAsyncContext:
7993 case ParsedAttr::AT_SwiftErrorResult:
7996 case ParsedAttr::AT_SwiftIndirectResult:
7999 case ParsedAttr::AT_InternalLinkage:
8002 case ParsedAttr::AT_ZeroCallUsedRegs:
8005 case ParsedAttr::AT_FunctionReturnThunks:
8008 case ParsedAttr::AT_NoMerge:
8011 case ParsedAttr::AT_NoUniqueAddress:
8015 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
8019 case ParsedAttr::AT_CountedBy:
8020 case ParsedAttr::AT_CountedByOrNull:
8021 case ParsedAttr::AT_SizedBy:
8022 case ParsedAttr::AT_SizedByOrNull:
8026 case ParsedAttr::AT_NoFieldProtection:
8030 case ParsedAttr::AT_Personality:
8035 case ParsedAttr::AT_LayoutVersion:
8038 case ParsedAttr::AT_Uuid:
8041 case ParsedAttr::AT_MSInheritance:
8044 case ParsedAttr::AT_Thread:
8047 case ParsedAttr::AT_MSConstexpr:
8050 case ParsedAttr::AT_HybridPatchable:
8055 case ParsedAttr::AT_RootSignature:
8058 case ParsedAttr::AT_HLSLNumThreads:
8061 case ParsedAttr::AT_HLSLWaveSize:
8064 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
8067 case ParsedAttr::AT_HLSLVkExtBuiltinOutput:
8070 case ParsedAttr::AT_HLSLVkPushConstant:
8073 case ParsedAttr::AT_HLSLVkConstantId:
8076 case ParsedAttr::AT_HLSLVkBinding:
8079 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
8082 case ParsedAttr::AT_HLSLPackOffset:
8085 case ParsedAttr::AT_HLSLShader:
8088 case ParsedAttr::AT_HLSLResourceBinding:
8091 case ParsedAttr::AT_HLSLParamModifier:
8094 case ParsedAttr::AT_HLSLUnparsedSemantic:
8097 case ParsedAttr::AT_HLSLVkLocation:
8101 case ParsedAttr::AT_AbiTag:
8104 case ParsedAttr::AT_CFGuard:
8109 case ParsedAttr::AT_PtGuardedVar:
8112 case ParsedAttr::AT_NoSanitize:
8115 case ParsedAttr::AT_NoSanitizeAddress:
8118 case ParsedAttr::AT_NoSanitizeThread:
8121 case ParsedAttr::AT_NoSanitizeMemory:
8124 case ParsedAttr::AT_GuardedBy:
8127 case ParsedAttr::AT_PtGuardedBy:
8130 case ParsedAttr::AT_LockReturned:
8133 case ParsedAttr::AT_LocksExcluded:
8136 case ParsedAttr::AT_AcquiredBefore:
8139 case ParsedAttr::AT_AcquiredAfter:
8144 case ParsedAttr::AT_Capability:
8145 case ParsedAttr::AT_Lockable:
8148 case ParsedAttr::AT_ReentrantCapability:
8151 case ParsedAttr::AT_RequiresCapability:
8155 case ParsedAttr::AT_AssertCapability:
8158 case ParsedAttr::AT_AcquireCapability:
8161 case ParsedAttr::AT_ReleaseCapability:
8164 case ParsedAttr::AT_TryAcquireCapability:
8169 case ParsedAttr::AT_Consumable:
8172 case ParsedAttr::AT_CallableWhen:
8175 case ParsedAttr::AT_ParamTypestate:
8178 case ParsedAttr::AT_ReturnTypestate:
8181 case ParsedAttr::AT_SetTypestate:
8184 case ParsedAttr::AT_TestTypestate:
8189 case ParsedAttr::AT_ArgumentWithTypeTag:
8192 case ParsedAttr::AT_TypeTagForDatatype:
8197 case ParsedAttr::AT_SwiftAsyncName:
8200 case ParsedAttr::AT_SwiftAttr:
8203 case ParsedAttr::AT_SwiftBridge:
8206 case ParsedAttr::AT_SwiftError:
8209 case ParsedAttr::AT_SwiftName:
8212 case ParsedAttr::AT_SwiftNewType:
8215 case ParsedAttr::AT_SwiftAsync:
8218 case ParsedAttr::AT_SwiftAsyncError:
8223 case ParsedAttr::AT_XRayLogArgs:
8227 case ParsedAttr::AT_PatchableFunctionEntry:
8231 case ParsedAttr::AT_AlwaysDestroy:
8232 case ParsedAttr::AT_NoDestroy:
8236 case ParsedAttr::AT_Uninitialized:
8240 case ParsedAttr::AT_ObjCExternallyRetained:
8244 case ParsedAttr::AT_MIGServerRoutine:
8248 case ParsedAttr::AT_MSAllocator:
8252 case ParsedAttr::AT_ArmBuiltinAlias:
8256 case ParsedAttr::AT_ArmLocallyStreaming:
8260 case ParsedAttr::AT_ArmNew:
8264 case ParsedAttr::AT_AcquireHandle:
8268 case ParsedAttr::AT_ReleaseHandle:
8272 case ParsedAttr::AT_UnsafeBufferUsage:
8276 case ParsedAttr::AT_UseHandle:
8280 case ParsedAttr::AT_EnforceTCB:
8284 case ParsedAttr::AT_EnforceTCBLeaf:
8288 case ParsedAttr::AT_BuiltinAlias:
8292 case ParsedAttr::AT_PreferredType:
8296 case ParsedAttr::AT_UsingIfExists:
8300 case ParsedAttr::AT_TypeNullable:
8304 case ParsedAttr::AT_VTablePointerAuthentication:
8308 case ParsedAttr::AT_ModularFormat:
8312 case ParsedAttr::AT_MSStruct:
8316 case ParsedAttr::AT_GCCStruct:
8320 case ParsedAttr::AT_PointerFieldProtection:
8323 diag::err_attribute_pointer_field_protection_experimental)
8332 return D->
hasAttr<DeviceKernelAttr>() ||
8340 if (AttrList.
empty())
8351 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8361 if (!(D->
hasAttr<DeviceKernelAttr>() ||
8362 (D->
hasAttr<CUDAGlobalAttr>() &&
8363 Context.getTargetInfo().getTriple().isSPIRV()))) {
8365 if (
const auto *A = D->
getAttr<ReqdWorkGroupSizeAttr>()) {
8370 }
else if (
const auto *A = D->
getAttr<WorkGroupSizeHintAttr>()) {
8373 }
else if (
const auto *A = D->
getAttr<VecTypeHintAttr>()) {
8376 }
else if (
const auto *A = D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8382 if (
const auto *A = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8386 }
else if (
const auto *A = D->
getAttr<AMDGPUWavesPerEUAttr>()) {
8390 }
else if (
const auto *A = D->
getAttr<AMDGPUNumSGPRAttr>()) {
8394 }
else if (
const auto *A = D->
getAttr<AMDGPUNumVGPRAttr>()) {
8411 if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8412 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8413 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8414 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8416 if (HasGlobal || HasHost != HasDevice) {
8417 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8418 Guide->setInvalidDecl();
8419 }
else if (HasHost && HasDevice) {
8420 Diag(Guide->getLocation(),
8421 diag::warn_deduction_guide_target_attr_deprecated);
8427 (D->
hasAttr<ConstructorAttr>() || D->
hasAttr<DestructorAttr>()) &&
8430 << (D->
hasAttr<ConstructorAttr>() ?
"constructors" :
"destructors");
8439 if (D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
8442 D->
dropAttr<ObjCDesignatedInitializerAttr>();
8449 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8456 if (D && D->
hasAttr<BPFPreserveAccessIndexAttr>())
8463 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8467 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8479 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8487 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8504 std::optional<StringRef> CorrectedScopeName =
8506 if (CorrectedScopeName) {
8507 ScopeName = *CorrectedScopeName;
8513 if (CorrectedAttrName) {
8514 AttrName = *CorrectedAttrName;
8517 if (CorrectedScopeName || CorrectedAttrName) {
8518 std::string CorrectedFullName =
8522 diag::warn_unknown_attribute_ignored_suggestion);
8524 D << AL << CorrectedFullName;
8529 if (CorrectedScopeName) {
8533 if (CorrectedAttrName) {
8538 Diag(NR.
getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8546 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
8568 for (
const auto &AI : FT->param_types()) {
8570 Param->setScopeInfo(0, Params.size());
8571 Params.push_back(Param);
8573 NewFD->setParams(Params);
8575 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
8577 VD->getInnerLocStart(), VD->getLocation(), II,
8578 VD->getType(), VD->getTypeSourceInfo(),
8579 VD->getStorageClass());
8580 if (VD->getQualifier())
8581 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8614 if (
auto *VD = dyn_cast<VarDecl>(D))
8615 if (VD->isExternC())
8617 if (
auto *FD = dyn_cast<FunctionDecl>(D))
8625 auto &WeakInfos = I->second;
8626 for (
const auto &W : WeakInfos)
8628 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
8629 WeakInfos.swap(EmptyWeakInfos);
8641 auto ProcessAttributesWithSliding =
8649 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8650 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8655 AL.diagnoseAppertainsTo(*
this, D);
8670 .WithIncludeCXX11Attributes(
false)
8671 .WithIgnoreTypeAttributes(
true));
8680 .WithIncludeCXX11Attributes(
false)
8681 .WithIgnoreTypeAttributes(
true));
8699 UnavailableAttr::ImplicitReason &reason) {
8713 if (
diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8714 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8715 reason = UnavailableAttr::IR_ForbiddenWeak;
8724 reason = UnavailableAttr::IR_ARCForbiddenType;
8734 auto Reason = UnavailableAttr::IR_None;
8736 assert(Reason &&
"didn't set reason?");
8741 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
8744 if (FD->
hasAttr<UnavailableAttr>() &&
8746 diag::err_arc_array_param_no_ownership) {
8777 bool AnyAccessFailures =
false;
8785 switch (
diag.Kind) {
8789 if (!
decl->isInvalidDecl())
8801 AnyAccessFailures =
true;
8814 assert(curPool &&
"re-emitting in undelayed context not supported");
8815 curPool->
steal(pool);
8832 QualType ParamTy = FD->getParamDecl(0)->getType();
8834 FD->getParamDecl(0)->getLocation(), ParamTy, Ty))) {
8835 this->
Diag(Attr->getArgLoc(),
8836 diag::err_attribute_cleanup_func_arg_incompatible_type)
8837 << NI.
getName() << ParamTy << Ty;
8845 if (this->
Context.getAsArrayType(T))
8846 T = this->
Context.getBaseElementType(T);
8847 if (!T->isRecordType()) {
8848 this->
Diag(A->
getLoc(), diag::err_init_priority_object_attr);
Defines the clang::ASTContext interface.
static SmallString< 64 > normalizeName(StringRef AttrName, StringRef ScopeName, AttributeCommonInfo::Syntax SyntaxUsed)
static OffloadArch getOffloadArch(const CodeGenModule &CGM)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
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 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 void handleCodeSegAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static const RecordDecl * getRecordDecl(QualType QT)
Checks that the passed in QualType either is of RecordType or points to RecordType.
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)
static void handleUninitializedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRequiresCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeviceKernelAttr(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 handleFormatMatchesAttr(Sema &S, Decl *D, const ParsedAttr &AL)
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 bool modularFormatAttrsEquiv(const ModularFormatAttr *Existing, const IdentifierInfo *ModularImplFn, StringRef ImplName, ArrayRef< StringRef > Aspects)
static void handleAlignValueAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static Expr * makeAttributeArgExpr(Sema &S, Expr *E, const Attribute &Attr, const unsigned Idx)
static void handleLifetimeCaptureByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkGuardedByAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleNoCfCheckAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleMallocSpanAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSpecializations(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsSmartPointer(Sema &S, const RecordDecl *Record)
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 handleNoPFPAttrField(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 handleModularFormat(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 https://gcc.gnu.org/onlinedocs/gcc/Common-Fu...
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 handleMSStructAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonStringAttr(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 bool isValidCodeModelAttr(llvm::Triple &Triple, StringRef Str)
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 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 handlePersonalityAttr(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 handleNoSanitizeAddressAttr(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 shouldInferAvailabilityAttribute(const ParsedAttr &AL, IdentifierInfo *&II, bool &IsUnavailable, VersionTuple &Introduced, VersionTuple &Deprecated, VersionTuple &Obsolete, Sema &S)
Returns true if the given availability attribute should be inferred, and adjusts the value of the att...
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 handleCFIUncheckedCalleeAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleLaunchBoundsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDependencyAttr(Sema &S, Scope *Scope, Decl *D, const ParsedAttr &AL)
static void handleNoBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGCCStructAttr(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 handleNoClusterAttr(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 handleCallbackAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((callback(CalleeIdx, PayloadIdx0, ...))) attributes.
static AttributeCommonInfo getNoSanitizeAttrInfo(const ParsedAttr &NoSanitizeSpecificAttr)
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 handleNoSanitizeThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A)
static bool isKnownToAlwaysThrow(const FunctionDecl *FD)
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 std::pair< Expr *, int > makeClusterDimsArgExpr(Sema &S, Expr *E, const CUDAClusterDimsAttr &AL, const unsigned Idx)
static void handleNoSanitizeMemoryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
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 bool isIntOrBool(Expr *Exp)
Check if the passed-in expression is of type int or bool.
static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y, bool BeforeIsOkay)
Check whether the two versions match.
static bool isSanitizerAttributeAllowedOnGlobals(StringRef Sanitizer)
static void handleClusterDimsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool handleFormatAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, FormatAttrCommon *Info)
Handle attribute((format(type,idx,firstarg))) attributes based on https://gcc.gnu....
static void handleCallConvAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static ExprResult sharedGetConstructorDestructorAttrExpr(Sema &S, 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 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 handleReentrantCapabilityAttr(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?
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 bool checkAvailabilityAttr(Sema &S, SourceRange Range, const IdentifierInfo *Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted)
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 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 PowerPC.
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.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
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()
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
DeclarationNameTable DeclarationNames
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
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.
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.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const TargetInfo & getTargetInfo() const
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.
Represents an access specifier followed by colon ':'.
Attr - This represents one attribute.
SourceLocation getScopeLoc() const
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 isExplicitScope() const
StringRef getNormalizedAttrName(StringRef ScopeName) const
std::optional< StringRef > tryGetCorrectedAttrName(StringRef ScopeName, StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts) const
bool isGNUAttribute() const
bool isRegularKeywordAttribute() const
SourceRange getNormalizedRange() const
std::optional< StringRef > tryGetCorrectedScopeName(StringRef ScopeName) const
SourceLocation getLoc() const
const IdentifierInfo * getAttrName() const
StringRef getNormalizedScopeName() 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.
static bool validateAnyAppleOSVersion(const llvm::VersionTuple &Version)
Returns true if the anyAppleOS version is valid (empty or >= 26.0).
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.
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.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The information about the darwin SDK that was used during this compilation.
const RelatedTargetVersionMapping * getVersionMapping(OSEnvPair Kind) const
The results of name lookup within 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.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
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
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
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).
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
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.
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, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
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.
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
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.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
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.
A simple pair of identifier info and location.
SourceLocation getLoc() const
IdentifierInfo * getIdentifierInfo() const
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() const
bool isTargetDevice() const
True when compiling for an offloading target device.
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.
bool isExternallyVisible() const
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...
bool isValid() const
Is this parameter index valid?
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.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
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
specific_decl_iterator< FieldDecl > field_iterator
RecordDecl * getDefinitionOrSelf() const
field_iterator field_begin() 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 handleInterruptSaveFPAttr(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 checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
bool SveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool MveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetClonesAttr(SmallVectorImpl< StringRef > &Params, SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams)
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)
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
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 handleVkLocationAttr(Decl *D, const ParsedAttr &AL)
void handleSemanticAttr(Decl *D, const ParsedAttr &AL)
void handleShaderAttr(Decl *D, const ParsedAttr &AL)
void handleVkExtBuiltinOutputAttr(Decl *D, const ParsedAttr &AL)
void handlePackOffsetAttr(Decl *D, const ParsedAttr &AL)
void handleParamModifierAttr(Decl *D, const ParsedAttr &AL)
void handleRootSignatureAttr(Decl *D, const ParsedAttr &AL)
void handleResourceBindingAttr(Decl *D, const ParsedAttr &AL)
void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL)
void handleVkExtBuiltinInputAttr(Decl *D, const ParsedAttr &AL)
void handleVkPushConstantAttr(Decl *D, const ParsedAttr &AL)
void handleVkBindingAttr(Decl *D, const ParsedAttr &AL)
void handleVkConstantIdAttr(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 checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
bool isAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
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)
bool checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
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)
DelayedDiagnosticsState ParsingDeclState
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.
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII=nullptr)
bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI, unsigned AttrArgNum, const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis=false, bool CanIndexVariadicArguments=false)
Check if IdxExpr is a valid parameter index for a function or instance method D.
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.
void PopParsingDeclaration(ParsingDeclState state, Decl *decl)
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
bool CheckFormatStringsCompatible(FormatStringType FST, const StringLiteral *AuthoritativeFormatString, const StringLiteral *TestedFormatString, const Expr *FunctionCallArg=nullptr)
Verify that two format strings (as understood by attribute(format) and attribute(format_matches) are ...
bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS)
Check whether the given variable declaration has a size that fits within the address space it is decl...
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...
PersonalityAttr * mergePersonalityAttr(Decl *D, FunctionDecl *Routine, const AttributeCommonInfo &CI)
AvailabilityAttr * mergeAndInferAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII)
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)
DiagnosticsEngine & getDiagnostics() const
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
ASTContext & getASTContext() const
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
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)
void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI)
Add a no_cluster attribute to a particular declaration.
FPOptions & getCurFPFeatures()
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Expression
An arbitrary expression.
const LangOptions & getLangOpts() const
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
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)
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
const LangOptions & LangOpts
static const uint64_t MaximumAlignment
CUDAClusterDimsAttr * createClusterDimsAttr(const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
Add a cluster_dims attribute to a particular declaration.
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)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnInitPriorityAttr(Decl *D, const Attr *A)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
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
void ActOnCleanupAttr(Decl *D, const Attr *A)
static FormatStringType GetFormatStringType(StringRef FormatFlavor)
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
bool ValidateFormatString(FormatStringType FST, const StringLiteral *Str)
Verify that one format string (as understood by attribute(format)) is self-consistent; for instance,...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
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.
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
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)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ AP_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute.
@ 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_PragmaClangAttribute_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute that was applied ...
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
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.
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,...
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
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.
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)
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.
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
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
Stmt - This represents one statement.
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.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
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.
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this target.
virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const
virtual bool hasProtectedVisibility() const
Does this target support "protected" visibility?
virtual unsigned getUnwindWordWidth() const
unsigned getCharWidth() const
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
const llvm::VersionTuple & getSDKVersion() const
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
The base class of all kinds of template declarations (e.g., class, function, etc.).
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.
bool isBlockPointerType() const
bool isBooleanType() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
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).
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
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
bool isEnumeralType() 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 isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
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 isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isVectorType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
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,...
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.
Enums for the diagnostics of target, target_version and target_clones.
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.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
bool isa(CodeGen::Address addr)
@ ExpectedFunctionMethodOrBlock
@ ExpectedTypeOrNamespace
@ ExpectedVariableFieldOrTag
@ ExpectedVariableOrField
@ ExpectedFunctionOrMethod
@ ExpectedFunctionOrClassOrEnum
@ ExpectedVariableOrFunction
@ ExpectedFunctionVariableOrClass
@ ExpectedNonMemberFunction
void handleSimpleAttributeOrDiagnose(SemaBase &S, Decl *D, const AttributeCommonInfo &CI, bool PassesCheck, unsigned DiagID, DiagnosticArgs &&...ExtraArgs)
Add an attribute AttrType to declaration D, provided that PassesCheck is true.
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)
@ OK_Ordinary
An ordinary object is located at an address in memory.
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
CudaVersion ToCudaVersion(llvm::VersionTuple)
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool checkAttrMutualExclusion(SemaBase &S, Decl *D, const ParsedAttr &AL)
Diagnose mutually exclusive attributes when present on a given declaration.
void inferNoReturnAttr(Sema &S, Decl *D)
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).
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
@ 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)
@ Template
We are parsing a template declaration.
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)
void handleSimpleAttribute(SemaBase &S, Decl *D, const AttributeCommonInfo &CI)
Applies the given attribute to the Decl without performing any additional semantic checking.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool hasImplicitObjectParameter(const Decl *D)
@ 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.
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.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Generic
not a target-specific vector type
U cast(CodeGen::Address addr)
SourceRange getFunctionOrMethodParamRange(const Decl *D, unsigned Idx)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
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.
SourceLocation KeywordLoc
The location of the keyword indicating the kind of change.
A value that describes two os-environment pairs that can be used as a key to the version map in the S...
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.
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
bool IncludeCXX11Attributes
bool IgnoreTypeAttributes