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();
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);
442 T = T.getNonReferenceType();
443 return T->isDependentType() || T->isFunctionPointerType();
452 S.
Diag(A.
getLoc(), diag::warn_thread_attribute_not_on_fun_ptr)
453 << A << (isa<FieldDecl>(VD) ? 1 : 0);
467 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
473 bool CheckParmVar =
false) {
474 const auto *VD = dyn_cast<ValueDecl>(D);
479 if (
const auto *PVD = dyn_cast<ParmVarDecl>(VD)) {
491 if (!
isa<AssertCapabilityAttr, AcquireCapabilityAttr,
492 TryAcquireCapabilityAttr, ReleaseCapabilityAttr,
493 RequiresCapabilityAttr, LocksExcludedAttr>(A))
496 const auto *VD = dyn_cast<ValueDecl>(D);
502 if (
const auto *PVD = dyn_cast<ParmVarDecl>(VD)) {
531 return !Args.empty();
540 GuardedByAttr(S.
Context, AL, Args.data(), Args.size()));
552 PtGuardedByAttr(S.
Context, AL, Args.data(), Args.size()));
563 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
580 Expr **StartArg = &Args[0];
582 AcquiredAfterAttr(S.
Context, AL, StartArg, Args.size()));
590 Expr **StartArg = &Args[0];
592 AcquiredBeforeAttr(S.
Context, AL, StartArg, Args.size()));
609template <
typename AttrInfo>
611 unsigned AttrArgNo) {
612 assert(AI.isArgExpr(AttrArgNo) &&
"Expected expression argument");
613 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
622 S.
Diag(SrcLoc, diag::err_attribute_integers_only)
637 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only) << AL;
648 ParamIdx SizeArgNo(SizeArgNoVal, D);
663 AllocSizeAttr(S.
Context, AL, SizeArgNo, NumberArgNo));
672 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
687 unsigned Size = Args.size();
704 unsigned Size = Args.size();
707 Expr **StartArg = &Args[0];
710 LocksExcludedAttr(S.
Context, AL, StartArg, Size));
716 if (!
Cond->isTypeDependent()) {
727 Msg =
"<no message provided>";
733 S.
Diag(AL.
getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
735 S.
Diag(PDiag.first, PDiag.second);
742 S.
Diag(AL.
getLoc(), diag::ext_clang_enable_if);
751 StringRef NewUserDiagnostic;
763 if (
const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
765 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
771 S.
Diag(DA->getLoc(), diag::warn_dllattr_ignored_exclusion_takes_precedence)
773 D->
dropAttrs<DLLExportAttr, DLLImportAttr>();
777 ExcludeFromExplicitInstantiationAttr(S.
Context, AL));
785 const CXXRecordDecl *ClassType;
787 llvm::SmallPtrSet<const ParmVarDecl *, 16> Parms;
791 ArgumentDependenceChecker(
const FunctionDecl *FD) {
793 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
801 bool referencesArgs(Expr *E) {
807 bool VisitCXXThisExpr(CXXThisExpr *E)
override {
809 "`this` doesn't refer to the enclosing class?");
814 bool VisitDeclRefExpr(DeclRefExpr *DRE)
override {
815 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DRE->
getDecl()))
816 if (Parms.count(PVD)) {
829 if (
const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
830 if (!MethodDecl->isStatic()) {
831 S.
Diag(AL.
getLoc(), diag::err_attribute_no_member_function) << AL;
838 if (
auto *E = dyn_cast<Expr *>(
Union))
839 return E->getBeginLoc();
843 S.
Diag(Loc, diag::err_attribute_argument_n_type) << AL << Index << T;
849 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.
getArgAsExpr(0));
852 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
861 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments_for)
868 for (
unsigned I = 1; I < AL.
getNumArgs(); ++I) {
880 if (Index > DeclFD->getNumParams()) {
881 S.
Diag(AL.
getLoc(), diag::err_attribute_bounds_for_function)
882 << AL << Index << DeclFD << DeclFD->getNumParams();
887 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
892 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
896 Indices.push_back(Index - 1);
900 S.
Context, AL, AttrFD, Indices.data(), Indices.size()));
904 S.
Diag(AL.
getLoc(), diag::ext_clang_diagnose_if);
911 StringRef DefaultSevStr;
915 DiagnoseIfAttr::DefaultSeverity DefaultSev;
916 if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
918 diag::err_diagnose_if_invalid_diagnostic_type);
922 StringRef WarningGroup;
926 if (WarningGroup.empty() ||
930 diag::err_diagnose_if_unknown_warning)
936 bool ArgDependent =
false;
937 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
938 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(
Cond);
940 S.
Context, AL,
Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
950 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
960 static constexpr const StringRef kWildcard =
"*";
963 bool HasWildcard =
false;
965 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
966 if (Name == kWildcard)
968 Names.push_back(Name);
972 if (
const auto *NBA = D->
getAttr<NoBuiltinAttr>())
973 for (StringRef BuiltinName : NBA->builtinNames())
974 AddBuiltinName(BuiltinName);
978 AddBuiltinName(kWildcard);
980 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
981 StringRef BuiltinName;
987 AddBuiltinName(BuiltinName);
989 S.
Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
990 << BuiltinName << AL;
995 Names.erase(llvm::unique(Names), Names.end());
998 if (HasWildcard && Names.size() > 1)
1000 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
1003 if (D->
hasAttr<NoBuiltinAttr>())
1006 NoBuiltinAttr(S.
Context, AL, Names.data(), Names.size()));
1010 if (D->
hasAttr<PassObjectSizeAttr>()) {
1011 S.
Diag(D->
getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
1034 S.
Diag(D->
getBeginLoc(), diag::err_attribute_pointers_only) << AL << 1;
1042 ConsumableAttr::ConsumedState DefaultState;
1046 if (!ConsumableAttr::ConvertStrToConsumedState(
1048 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1053 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1066 if (!RD->hasAttr<ConsumableAttr>()) {
1067 S.
Diag(AL.
getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1084 for (
unsigned ArgIndex = 0; ArgIndex < AL.
getNumArgs(); ++ArgIndex) {
1085 CallableWhenAttr::ConsumedState CallableState;
1087 StringRef StateString;
1098 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1100 S.
Diag(Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1104 States.push_back(CallableState);
1108 CallableWhenAttr(S.
Context, AL, States.data(), States.size()));
1112 ParamTypestateAttr::ConsumedState ParamState;
1118 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1120 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1121 << AL << StateString;
1125 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1146 ReturnTypestateAttr::ConsumedState ReturnState;
1150 if (!ReturnTypestateAttr::ConvertStrToConsumedState(
1152 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1157 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1194 SetTypestateAttr::ConsumedState NewState;
1198 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1199 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1204 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1216 TestTypestateAttr::ConsumedState TestState;
1220 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1221 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1226 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1241 if (
auto *TD = dyn_cast<TagDecl>(D))
1243 else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
1244 bool BitfieldByteAligned = (!FD->
getType()->isDependentType() &&
1250 if (BitfieldByteAligned)
1252 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1258 if (BitfieldByteAligned)
1259 S.
Diag(AL.
getLoc(), diag::warn_attribute_packed_for_bitfield);
1265 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
1271 assert(CTD &&
"attribute does not appertain to this declaration");
1279 if (!T.hasQualifiers() && T->isTypedefNameType()) {
1282 if (
const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1283 T->getAsCXXRecordDecl())) {
1284 Template = CTSD->getSpecializedTemplate();
1285 }
else if (
const auto *TST = T->getAs<TemplateSpecializationType>()) {
1286 while (TST && TST->isTypeAlias())
1287 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1289 Template = TST->getTemplateName().getAsTemplateDecl();
1298 S.
Diag(AL.
getLoc(), diag::err_attribute_not_typedef_for_specialization)
1301 S.
Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1310 NoSpecializationsAttr::Create(S.
Context, Message, AL));
1314 if (T->isDependentType())
1317 if (T->isReferenceType())
1320 T = T.getNonReferenceType();
1325 if (
const RecordType *UT = T->getAsUnionType()) {
1327 if (UD->
hasAttr<TransparentUnionAttr>()) {
1328 for (
const auto *I : UD->
fields()) {
1336 return T->isAnyPointerType() || T->isBlockPointerType();
1342 bool isReturnValue =
false) {
1345 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1346 << AL << AttrParmRange << TypeRange;
1348 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1349 << AL << AttrParmRange << TypeRange << 0;
1357 for (
unsigned I = 0; I < AL.
getNumArgs(); ++I) {
1361 D, AL, I + 1, Ex, Idx,
1374 NonNullArgs.push_back(Idx);
1385 I != E && !AnyPointers; ++I) {
1392 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_no_pointers);
1395 ParamIdx *Start = NonNullArgs.data();
1396 unsigned Size = NonNullArgs.size();
1397 llvm::array_pod_sort(Start, Start + Size);
1407 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1438 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1463 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1469 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1472 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1475 Diag(AttrLoc, diag::err_attribute_argument_type)
1480 if (!I->isPowerOf2()) {
1481 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1487 Diag(CI.
getLoc(), diag::warn_assume_aligned_too_great)
1492 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1506 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1521 << CI << FuncDecl->getParamDecl(Idx.
getASTIndex())->getSourceRange();
1531 if (AttrName.size() > 4 && AttrName.starts_with(
"__") &&
1532 AttrName.ends_with(
"__")) {
1533 AttrName = AttrName.drop_front(2).drop_back(2);
1549 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1555 OwnershipAttr::OwnershipKind K =
1556 OwnershipAttr(S.
Context, AL,
nullptr,
nullptr, 0).getOwnKind();
1560 case OwnershipAttr::Takes:
1561 case OwnershipAttr::Holds:
1563 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1567 case OwnershipAttr::Returns:
1569 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 2;
1577 if (K == OwnershipAttr::Returns &&
1579 S.
Diag(AL.
getLoc(), diag::err_ownership_takes_return_type) << AL;
1585 StringRef ModuleName =
Module->getName();
1592 if (K == OwnershipAttr::Returns && AL.
getNumArgs() == 1) {
1594 if (I->getOwnKind() == OwnershipAttr::Returns && I->args_size() > 0) {
1595 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1596 << I->args_begin()->getSourceIndex() << 0;
1597 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1605 for (
unsigned i = 1; i < AL.
getNumArgs(); ++i) {
1615 case OwnershipAttr::Takes:
1616 case OwnershipAttr::Holds:
1617 if (!T->isAnyPointerType() && !T->isBlockPointerType())
1620 case OwnershipAttr::Returns:
1621 if (!T->isIntegerType())
1626 S.
Diag(AL.
getLoc(), diag::err_ownership_type) << AL << Err
1635 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1636 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1639 I->isRegularKeywordAttribute());
1643 if (K == OwnershipAttr::Returns &&
1644 I->getOwnKind() == OwnershipAttr::Returns) {
1645 bool IHasArgs = I->args_size() > 0;
1647 if (!IHasArgs || !llvm::is_contained(I->args(), Idx)) {
1648 unsigned IIdx = IHasArgs ? I->args_begin()->getSourceIndex() : 0;
1650 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1651 << IIdx << (IHasArgs ? 0 : 1);
1653 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1657 }
else if (K == OwnershipAttr::Takes &&
1658 I->getOwnKind() == OwnershipAttr::Takes) {
1659 if (I->getModule()->getName() != ModuleName) {
1660 S.
Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1661 << I->getModule()->getName();
1662 S.
Diag(AL.
getLoc(), diag::note_ownership_takes_class_mismatch)
1669 OwnershipArgs.push_back(Idx);
1672 ParamIdx *Start = OwnershipArgs.data();
1673 unsigned Size = OwnershipArgs.size();
1674 llvm::array_pod_sort(Start, Start + Size);
1682 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1698 S.
Diag(AL.
getLoc(), diag::err_attribute_weakref_not_global_context)
1743 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1745 Demangled.reset(llvm::itaniumDemangle(Str,
false));
1756 if (MC->shouldMangleDeclName(ND)) {
1757 llvm::raw_svector_ostream Out(Name);
1761 Name = ND->getIdentifier()->getName();
1777 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 1;
1791 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_darwin);
1799 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_nvptx);
1803 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
1805 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 0;
1810 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1811 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << VD << 0;
1828 if (Model !=
"global-dynamic" && Model !=
"local-dynamic"
1829 && Model !=
"initial-exec" && Model !=
"local-exec") {
1830 S.
Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1840 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1852 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
1862 if (
auto *DRE = dyn_cast<DeclRefExpr>(DeallocE)) {
1863 DeallocFD = dyn_cast<FunctionDecl>(DRE->
getDecl());
1866 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1870 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(DeallocE)) {
1872 DeallocNI = ULE->getNameInfo();
1874 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1881 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function) << 0;
1889 DeallocPtrIdx =
ParamIdx(1, DeallocFD);
1900 diag::err_attribute_malloc_arg_not_function_with_pointer_arg)
1914 diag::err_attribute_malloc_arg_refers_to_non_pointer_type)
1923 S.
Diag(AL.
getLoc(), diag::warn_attribute_form_ignored) << AL;
1925 RestrictAttr(S.
Context, AL, DeallocE, DeallocPtrIdx));
1934 auto emitWarning = [
this, &CI](
unsigned NoteDiagID) {
1935 Diag(CI.
getLoc(), diag::warn_attribute_return_span_only) << CI;
1942 return emitWarning(diag::note_returned_incomplete_type);
1945 return emitWarning(diag::note_returned_not_struct);
1946 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1947 if (CXXRD->getNumBases() > 0) {
1948 return emitWarning(diag::note_type_inherits_from_base);
1952 auto FieldsCount = std::distance(FieldsBegin, RD->
field_end());
1953 if (FieldsCount != 2)
1954 return emitWarning(diag::note_returned_not_two_field_struct) << FieldsCount;
1955 QualType FirstFieldType = FieldsBegin->getType();
1956 QualType SecondFieldType = std::next(FieldsBegin)->getType();
1957 auto validatePointerType = [](
const QualType &T) {
1959 return T->isPointerType() && !T->isFunctionPointerType();
1961 auto checkIntegerType = [
this, emitWarning](
const QualType &T,
1962 const int FieldNo) ->
bool {
1963 const auto *BT = dyn_cast<BuiltinType>(T.getCanonicalType());
1964 if (!BT || !BT->isInteger())
1965 return emitWarning(diag::note_returned_not_integer_field) << FieldNo;
1967 if (
Context.getTypeSize(BT) < IntSize)
1968 return emitWarning(diag::note_returned_not_wide_enough_field)
1969 << FieldNo << IntSize;
1972 if (validatePointerType(FirstFieldType) &&
1973 validatePointerType(SecondFieldType)) {
1976 }
else if (validatePointerType(FirstFieldType)) {
1978 return checkIntegerType(SecondFieldType, 2);
1979 }
else if (validatePointerType(SecondFieldType)) {
1981 return checkIntegerType(FirstFieldType, 1);
1983 return emitWarning(diag::note_returned_not_span_struct);
1999 if (
const auto *
Other = D->
getAttr<CPUDispatchAttr>()) {
2000 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
2001 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
2004 }
else if (AL.
getParsedKind() == ParsedAttr::AT_CPUSpecific) {
2008 if (
const auto *
Other = D->
getAttr<CPUSpecificAttr>()) {
2009 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
2010 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
2017 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2018 if (MD->getParent()->isLambda()) {
2019 S.
Diag(AL.
getLoc(), diag::err_attribute_dll_lambda) << AL;
2030 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2039 S.
Diag(CPUArg->
getLoc(), diag::err_invalid_cpu_specific_dispatch_value)
2040 << CPUName << (AL.
getKind() == ParsedAttr::AT_CPUDispatch);
2046 return Target.CPUSpecificManglingCharacter(CPUName) ==
2049 S.
Diag(AL.
getLoc(), diag::warn_multiversion_duplicate_entries);
2056 if (AL.
getKind() == ParsedAttr::AT_CPUSpecific)
2058 CPUSpecificAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
2061 CPUDispatchAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
2066 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
2077 const auto &
Arch = Triple.getArch();
2078 if (
Arch != llvm::Triple::x86 &&
2079 (
Arch != llvm::Triple::arm &&
Arch != llvm::Triple::thumb)) {
2080 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_on_arch)
2081 << AL << Triple.getArchName();
2088 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
2105 const Stmt *OnlyStmt =
nullptr;
2107 if (
const auto *Compound = dyn_cast<CompoundStmt>(Body)) {
2108 if (Compound->size() != 1)
2110 OnlyStmt = *Compound->body_begin();
2116 if (
const auto *EWC = dyn_cast<ExprWithCleanups>(OnlyStmt)) {
2117 OnlyStmt = EWC->getSubExpr();
2121 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2122 if (MD && MD->isVirtual()) {
2123 const auto *RD = MD->getParent();
2124 return MD->hasAttr<FinalAttr>() || (RD && RD->isEffectivelyFinal());
2132 auto *FD = dyn_cast<FunctionDecl>(D);
2153 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2167 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
2193 S.
Diag(Attrs.
getLoc(), diag::warn_nocf_check_attribute_ignored);
2211 Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
2230 ? diag::err_attribute_wrong_decl_type
2231 : diag::warn_attribute_wrong_decl_type)
2267 if (VecReturnAttr *A = D->
getAttr<VecReturnAttr>()) {
2268 S.
Diag(AL.
getLoc(), diag::err_repeat_attribute) << A;
2276 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2281 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2285 for (
const auto *I : R->fields()) {
2286 if ((count == 1) || !I->getType()->isVectorType()) {
2287 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2303 diag::err_carries_dependency_param_not_function_decl);
2317 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2332 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2342 APValue(llvm::APSInt::getUnsigned(priority)));
2350 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
2369template <
typename AttrTy>
2381 VersionTuple Introduced,
2382 VersionTuple Deprecated,
2383 VersionTuple Obsoleted) {
2384 StringRef PlatformName
2385 = AvailabilityAttr::getPrettyPlatformName(Platform->
getName());
2386 if (PlatformName.empty())
2387 PlatformName = Platform->
getName();
2391 if (!Introduced.empty() && !Deprecated.empty() &&
2392 !(Introduced <= Deprecated)) {
2393 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2394 << 1 << PlatformName << Deprecated.getAsString()
2395 << 0 << Introduced.getAsString();
2399 if (!Introduced.empty() && !Obsoleted.empty() &&
2400 !(Introduced <= Obsoleted)) {
2401 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2402 << 2 << PlatformName << Obsoleted.getAsString()
2403 << 0 << Introduced.getAsString();
2407 if (!Deprecated.empty() && !Obsoleted.empty() &&
2408 !(Deprecated <= Obsoleted)) {
2409 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2410 << 2 << PlatformName << Obsoleted.getAsString()
2411 << 1 << Deprecated.getAsString();
2423 bool BeforeIsOkay) {
2424 if (
X.empty() || Y.empty())
2430 if (BeforeIsOkay &&
X < Y)
2438 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2439 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2443 VersionTuple MergedIntroduced = Introduced;
2444 VersionTuple MergedDeprecated = Deprecated;
2445 VersionTuple MergedObsoleted = Obsoleted;
2446 bool FoundAny =
false;
2447 bool OverrideOrImpl =
false;
2451 OverrideOrImpl =
false;
2457 OverrideOrImpl =
true;
2463 for (
unsigned i = 0, e = Attrs.size(); i != e;) {
2464 auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2471 if (OldEnvironment != Environment) {
2476 if (OldAA->getPlatform() != Platform) {
2479 if (InferredPlatformII) {
2480 if (OldAA->getPlatform() == InferredPlatformII)
2486 if (AvailabilityAttr *
Inf = OldAA->getInferredAttrAs();
2487 Inf &&
Inf->getPlatform() == Platform) {
2488 Attrs.erase(Attrs.begin() + i);
2500 if (OldAA->getPriority() < Priority)
2506 if (OldAA->getPriority() > Priority) {
2507 Attrs.erase(Attrs.begin() + i);
2513 VersionTuple OldIntroduced = OldAA->getIntroduced();
2514 VersionTuple OldDeprecated = OldAA->getDeprecated();
2515 VersionTuple OldObsoleted = OldAA->getObsoleted();
2516 bool OldIsUnavailable = OldAA->getUnavailable();
2518 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2519 !
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2521 !(OldIsUnavailable == IsUnavailable ||
2522 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2523 if (OverrideOrImpl) {
2525 VersionTuple FirstVersion;
2526 VersionTuple SecondVersion;
2527 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2529 FirstVersion = OldIntroduced;
2530 SecondVersion = Introduced;
2531 }
else if (!
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2533 FirstVersion = Deprecated;
2534 SecondVersion = OldDeprecated;
2535 }
else if (!
versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2537 FirstVersion = Obsoleted;
2538 SecondVersion = OldObsoleted;
2542 Diag(OldAA->getLocation(),
2543 diag::warn_mismatched_availability_override_unavail)
2544 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2556 Diag(OldAA->getLocation(),
2557 diag::warn_mismatched_availability_override)
2559 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2560 << FirstVersion.getAsString() << SecondVersion.getAsString()
2564 Diag(CI.
getLoc(), diag::note_overridden_method);
2566 Diag(CI.
getLoc(), diag::note_protocol_method);
2568 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2569 Diag(CI.
getLoc(), diag::note_previous_attribute);
2572 Attrs.erase(Attrs.begin() + i);
2577 VersionTuple MergedIntroduced2 = MergedIntroduced;
2578 VersionTuple MergedDeprecated2 = MergedDeprecated;
2579 VersionTuple MergedObsoleted2 = MergedObsoleted;
2581 if (MergedIntroduced2.empty())
2582 MergedIntroduced2 = OldIntroduced;
2583 if (MergedDeprecated2.empty())
2584 MergedDeprecated2 = OldDeprecated;
2585 if (MergedObsoleted2.empty())
2586 MergedObsoleted2 = OldObsoleted;
2589 MergedIntroduced2, MergedDeprecated2,
2590 MergedObsoleted2)) {
2591 Attrs.erase(Attrs.begin() + i);
2596 MergedIntroduced = MergedIntroduced2;
2597 MergedDeprecated = MergedDeprecated2;
2598 MergedObsoleted = MergedObsoleted2;
2604 MergedIntroduced == Introduced &&
2605 MergedDeprecated == Deprecated &&
2606 MergedObsoleted == Obsoleted)
2612 MergedDeprecated, MergedObsoleted) &&
2614 auto *Avail = ::new (
Context) AvailabilityAttr(
2615 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2616 Message, IsStrict, Replacement, Priority, Environment,
2626 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2627 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2632 D, CI, Platform,
Implicit, Introduced, Deprecated, Obsoleted,
2633 IsUnavailable, Message, IsStrict, Replacement, AMK, Priority,
2634 IIEnvironment, InferredPlatformII);
2635 if (!OrigAttr || !InferredPlatformII)
2638 auto *InferredAttr = ::new (
Context) AvailabilityAttr(
2639 Context, CI, InferredPlatformII, OrigAttr->getIntroduced(),
2640 OrigAttr->getDeprecated(), OrigAttr->getObsoleted(),
2641 OrigAttr->getUnavailable(), OrigAttr->getMessage(), OrigAttr->getStrict(),
2642 OrigAttr->getReplacement(),
2646 IIEnvironment,
nullptr);
2647 InferredAttr->setImplicit(
true);
2648 OrigAttr->setInferredAttr(InferredAttr);
2656 bool &IsUnavailable,
2657 VersionTuple &Introduced,
2658 VersionTuple &Deprecated,
2659 VersionTuple &Obsolete,
Sema &S) {
2662 if (TT.getOS() != llvm::Triple::XROS)
2666 NewII = &Context.Idents.get(
"xros");
2667 else if (II->
getName() ==
"ios_app_extension")
2668 NewII = &Context.Idents.get(
"xros_app_extension");
2673 auto MakeUnavailable = [&]() {
2674 IsUnavailable =
true;
2676 Introduced = VersionTuple();
2677 Deprecated = VersionTuple();
2678 Obsolete = VersionTuple();
2691 llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::XROS,
2692 llvm::Triple::UnknownEnvironment));
2698 if (!Introduced.empty()) {
2699 auto NewIntroduced = Mapping->mapIntroducedAvailabilityVersion(Introduced);
2700 if (!NewIntroduced) {
2704 Introduced = *NewIntroduced;
2707 if (!Obsolete.empty()) {
2709 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Obsolete);
2714 Obsolete = *NewObsolete;
2717 if (!Deprecated.empty()) {
2718 auto NewDeprecated =
2719 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Deprecated);
2720 Deprecated = NewDeprecated ? *NewDeprecated : VersionTuple();
2739 StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName(II->
getName());
2740 if (PrettyName.empty())
2741 S.
Diag(Platform->
getLoc(), diag::warn_availability_unknown_platform)
2744 auto *ND = dyn_cast<NamedDecl>(D);
2752 const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType(
2753 AvailabilityAttr::canonicalizePlatformName(II->
getName()));
2755 auto reportAndUpdateIfInvalidOS = [&](
auto &InputVersion) ->
void {
2756 const bool IsInValidRange =
2757 llvm::Triple::isValidVersionForOS(PlatformOS, InputVersion);
2759 auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS(
2760 PlatformOS, InputVersion, IsInValidRange);
2761 if (!IsInValidRange) {
2762 S.
Diag(Platform->
getLoc(), diag::warn_availability_invalid_os_version)
2763 << InputVersion.getAsString() << PrettyName;
2765 diag::note_availability_invalid_os_version_adjusted)
2766 << CanonicalVersion.getAsString();
2768 InputVersion = CanonicalVersion;
2771 if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2772 reportAndUpdateIfInvalidOS(Introduced.
Version);
2773 reportAndUpdateIfInvalidOS(Deprecated.
Version);
2774 reportAndUpdateIfInvalidOS(Obsoleted.
Version);
2780 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getMessageExpr()))
2781 Str = SE->getString();
2782 StringRef Replacement;
2783 if (
const auto *SE =
2785 Replacement = SE->getString();
2787 if (II->
isStr(
"swift")) {
2789 (!IsUnavailable && !Deprecated.
isValid())) {
2791 diag::warn_availability_swift_unavailable_deprecated_only);
2796 if (II->
isStr(
"fuchsia")) {
2797 std::optional<unsigned>
Min, Sub;
2799 (Sub = Introduced.
Version.getSubminor())) {
2800 S.
Diag(AL.
getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2815 if (EnvironmentLoc) {
2818 if (AvailabilityAttr::getEnvironmentType(
2820 llvm::Triple::EnvironmentType::UnknownEnvironment)
2822 diag::warn_availability_unknown_environment)
2826 diag::err_availability_unexpected_parameter)
2827 <<
"environment" << 1;
2833 if (II->
getName() ==
"anyappleos") {
2835 auto ValidateVersion = [&](
const llvm::VersionTuple &Version,
2839 S.
Diag(Loc, diag::err_availability_invalid_anyappleos_version)
2840 << Version.getAsString();
2854 if (!T.isOSDarwin())
2857 StringRef PlatformName;
2861 PlatformName =
"macos";
2862 else if (T.getOS() == llvm::Triple::IOS && T.isMacCatalystEnvironment())
2863 PlatformName =
"maccatalyst";
2865 PlatformName = llvm::Triple::getOSTypeName(T.getOS());
2875 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2877 InferredPlatformII);
2886 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2893 bool NewIsUnavailable = IsUnavailable;
2894 VersionTuple NewIntroduced = Introduced.
Version;
2895 VersionTuple NewDeprecated = Deprecated.
Version;
2896 VersionTuple NewObsoleted = Obsoleted.
Version;
2898 NewIntroduced, NewDeprecated,
2901 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2902 NewObsoleted, NewIsUnavailable, Str, IsStrict, Replacement,
2916 else if (II->
getName() ==
"ios_app_extension")
2921 const auto *IOSToWatchOSMapping =
2926 auto adjustWatchOSVersion =
2927 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2928 if (Version.empty())
2930 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2932 if (IOSToWatchOSMapping) {
2933 if (
auto MappedVersion = IOSToWatchOSMapping->map(
2934 Version, MinimumWatchOSVersion, std::nullopt)) {
2935 return *MappedVersion;
2939 auto Major = Version.getMajor();
2940 auto NewMajor = Major;
2943 else if (Major < 12)
2944 NewMajor = Major - 7;
2945 if (NewMajor >= 2) {
2946 if (Version.getMinor()) {
2947 if (Version.getSubminor())
2948 return VersionTuple(NewMajor, *Version.getMinor(),
2949 *Version.getSubminor());
2951 return VersionTuple(NewMajor, *Version.getMinor());
2953 return VersionTuple(NewMajor);
2956 return MinimumWatchOSVersion;
2959 auto NewIntroduced = adjustWatchOSVersion(Introduced.
Version);
2960 auto NewDeprecated = adjustWatchOSVersion(Deprecated.
Version);
2961 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.
Version);
2964 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2965 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2977 else if (II->
getName() ==
"ios_app_extension")
2982 const auto *IOSToTvOSMapping =
2987 auto AdjustTvOSVersion =
2988 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2989 if (Version.empty())
2992 if (IOSToTvOSMapping) {
2993 if (
auto MappedVersion = IOSToTvOSMapping->map(
2994 Version, VersionTuple(0, 0), std::nullopt)) {
2995 return *MappedVersion;
3001 auto NewIntroduced = AdjustTvOSVersion(Introduced.
Version);
3002 auto NewDeprecated = AdjustTvOSVersion(Deprecated.
Version);
3003 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.
Version);
3006 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
3007 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
3014 llvm::Triple::IOS &&
3016 auto GetSDKInfo = [&]() {
3025 else if (II->
getName() ==
"ios_app_extension")
3028 auto MinMacCatalystVersion = [](
const VersionTuple &
V) {
3031 if (
V.getMajor() < 13 ||
3032 (
V.getMajor() == 13 &&
V.getMinor() && *
V.getMinor() < 1))
3033 return VersionTuple(13, 1);
3037 ND, AL, NewII,
true ,
3038 MinMacCatalystVersion(Introduced.
Version),
3039 MinMacCatalystVersion(Deprecated.
Version),
3040 MinMacCatalystVersion(Obsoleted.
Version), IsUnavailable, Str,
3045 }
else if (II->
getName() ==
"macos" && GetSDKInfo() &&
3047 !Obsoleted.
Version.empty())) {
3048 if (
const auto *MacOStoMacCatalystMapping =
3049 GetSDKInfo()->getVersionMapping(
3056 auto RemapMacOSVersion =
3057 [&](
const VersionTuple &
V) -> std::optional<VersionTuple> {
3059 return std::nullopt;
3061 if (
V.getMajor() == 100000)
3062 return VersionTuple(100000);
3064 return MacOStoMacCatalystMapping->map(
V, VersionTuple(13, 1),
3067 std::optional<VersionTuple> NewIntroduced =
3068 RemapMacOSVersion(Introduced.
Version),
3070 RemapMacOSVersion(Deprecated.
Version),
3072 RemapMacOSVersion(Obsoleted.
Version);
3073 if (NewIntroduced || NewDeprecated || NewObsoleted) {
3074 auto VersionOrEmptyVersion =
3075 [](
const std::optional<VersionTuple> &
V) -> VersionTuple {
3076 return V ? *
V : VersionTuple();
3079 ND, AL, NewII,
true ,
3080 VersionOrEmptyVersion(NewIntroduced),
3081 VersionOrEmptyVersion(NewDeprecated),
3082 VersionOrEmptyVersion(NewObsoleted),
false, Str,
3101 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(0)))
3103 StringRef DefinedIn;
3104 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(1)))
3105 DefinedIn = SE->getString();
3106 bool IsGeneratedDeclaration = AL.
getArgAsIdent(2) !=
nullptr;
3108 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(3)))
3109 USR = SE->getString();
3116 VisibilityAttr::VisibilityType
Value) {
3117 if (VisibilityAttr *
Attr = D->
getAttr<VisibilityAttr>()) {
3119 Diag(Loc, diag::err_mismatched_visibility);
3126 typename T::VisibilityType value) {
3127 T *existingAttr = D->
getAttr<T>();
3129 typename T::VisibilityType existingValue = existingAttr->getVisibility();
3130 if (existingValue == value)
3132 S.
Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
3133 S.
Diag(CI.
getLoc(), diag::note_previous_attribute);
3141 VisibilityAttr::VisibilityType Vis) {
3142 return ::mergeVisibilityAttr<VisibilityAttr>(*
this, D, CI, Vis);
3147 TypeVisibilityAttr::VisibilityType Vis) {
3148 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*
this, D, CI, Vis);
3152 bool isTypeVisibility) {
3173 VisibilityAttr::VisibilityType
type;
3174 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr,
type)) {
3175 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
3182 if (
type == VisibilityAttr::Protected &&
3184 S.
Diag(AL.
getLoc(), diag::warn_attribute_protected_visibility);
3185 type = VisibilityAttr::Default;
3189 if (isTypeVisibility) {
3191 D, AL, (TypeVisibilityAttr::VisibilityType)
type);
3200 unsigned sentinel = (
unsigned)SentinelAttr::DefaultSentinel;
3203 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3205 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3210 if (Idx->isSigned() && Idx->isNegative()) {
3211 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_less_than_zero)
3216 sentinel = Idx->getZExtValue();
3219 unsigned nullPos = (
unsigned)SentinelAttr::DefaultNullPos;
3222 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3224 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3228 nullPos = Idx->getZExtValue();
3230 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
3233 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
3239 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3242 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3247 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3250 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
3251 if (!MD->isVariadic()) {
3252 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3255 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
3256 if (!BD->isVariadic()) {
3257 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
3260 }
else if (
const auto *
V = dyn_cast<VarDecl>(D)) {
3269 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3274 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
3278 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3284 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3296 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
3299 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
3300 if (MD->getReturnType()->isVoidType()) {
3301 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
3318 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3329 if (LO.CPlusPlus && !LO.CPlusPlus20)
3330 S.
Diag(AL.
getLoc(), diag::ext_cxx20_attr) << AL;
3334 }
else if (LO.CPlusPlus && !LO.CPlusPlus17)
3335 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
3342 S.
Diag(AL.
getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
3355 S.
Diag(AL.
getLoc(), diag::warn_attribute_invalid_on_definition)
3362 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3375template <
class Attribute>
3377 const unsigned Idx) {
3386 std::optional<llvm::APSInt> I = llvm::APSInt(64);
3393 if (!I->isIntN(32)) {
3395 <<
toString(*I, 10,
false) << 32 << 1;
3399 S.
Diag(E->
getExprLoc(), diag::err_attribute_requires_positive_integer)
3407 "Unexpected PerformCopyInitialization() failure.");
3413template <
typename WorkGroupAttr>
3416 for (
unsigned i = 0; i < 3; ++i) {
3423 auto IsZero = [&](
Expr *E) {
3424 if (E->isValueDependent())
3426 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.
Context);
3427 assert(I &&
"Non-integer constant expr");
3431 if (!llvm::all_of(WGSize, IsZero)) {
3432 for (
unsigned i = 0; i < 3; ++i) {
3434 if (IsZero(WGSize[i])) {
3435 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_is_zero)
3446 assert(L &&
"Non-integer constant expr");
3447 std::optional<llvm::APSInt> R = RHS->getIntegerConstantExpr(S.
Context);
3448 assert(L &&
"Non-integer constant expr");
3452 WorkGroupAttr *Existing = D->
getAttr<WorkGroupAttr>();
3454 !llvm::equal(std::initializer_list<Expr *>{Existing->getXDim(),
3455 Existing->getYDim(),
3456 Existing->getZDim()},
3458 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3461 WorkGroupAttr(S.
Context, AL, WGSize[0], WGSize[1], WGSize[2]));
3466 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
3472 assert(ParmTSI &&
"no type source info for attribute argument");
3477 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
3481 if (VecTypeHintAttr *A = D->
getAttr<VecTypeHintAttr>()) {
3483 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3495 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3500 if (SectionAttr *ExistingAttr = D->
getAttr<SectionAttr>()) {
3501 if (ExistingAttr->getName() == Name)
3503 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3505 Diag(CI.
getLoc(), diag::note_previous_attribute);
3512 if (!
Context.getTargetInfo().getTriple().isOSDarwin())
3513 return llvm::Error::success();
3516 StringRef Segment, Section;
3517 unsigned TAA, StubSize;
3519 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
3520 TAA, HasTAA, StubSize);
3525 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3555 if (Triple.isLoongArch()) {
3556 return Str ==
"normal" || Str ==
"medium" || Str ==
"extreme";
3558 assert(Triple.getArch() == llvm::Triple::x86_64 &&
3559 "only loongarch/x86-64 supported");
3560 return Str ==
"small" || Str ==
"large";
3567 auto IsTripleSupported = [](llvm::Triple &Triple) {
3568 return Triple.getArch() == llvm::Triple::ArchType::x86_64 ||
3569 Triple.isLoongArch();
3579 Triples.push_back(aux->getTriple());
3588 auto SupportedTripleIt = llvm::find_if(Triples, IsTripleSupported);
3589 if (SupportedTripleIt == Triples.end()) {
3590 S.
Diag(LiteralLoc, diag::warn_unknown_attribute_ignored) << AL;
3594 llvm::CodeModel::Model CM;
3595 if (!CodeModelAttr::ConvertStrToModel(Str, CM) ||
3597 S.
Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
3607 StringRef CodeSegName) {
3609 S.
Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3621 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3625 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3626 if (ExistingAttr->getName() == Name)
3628 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3630 Diag(CI.
getLoc(), diag::note_previous_attribute);
3643 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3644 if (!ExistingAttr->isImplicit()) {
3646 ExistingAttr->getName() == Str
3647 ? diag::warn_duplicate_codeseg_attribute
3648 : diag::err_conflicting_codeseg_attribute);
3660 if (AttrStr.contains(
"fpmath="))
3661 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3662 << Unsupported <<
None <<
"fpmath=" <<
Target;
3665 if (!
Context.getTargetInfo().supportsTargetAttributeTune() &&
3666 AttrStr.contains(
"tune="))
3667 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3671 Context.getTargetInfo().parseTargetAttr(AttrStr);
3673 if (!ParsedAttrs.
CPU.empty() &&
3674 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
CPU))
3675 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3678 if (!ParsedAttrs.
Tune.empty() &&
3679 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
Tune))
3680 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3683 if (
Context.getTargetInfo().getTriple().isRISCV()) {
3685 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3687 for (StringRef CurFeature : ParsedAttrs.
Features) {
3688 if (!CurFeature.starts_with(
'+') && !CurFeature.starts_with(
'-'))
3689 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3694 if (
Context.getTargetInfo().getTriple().isLoongArch()) {
3695 for (StringRef CurFeature : ParsedAttrs.
Features) {
3696 if (CurFeature.starts_with(
"!arch=")) {
3697 StringRef ArchValue = CurFeature.split(
"=").second.trim();
3698 return Diag(LiteralLoc, diag::err_attribute_unsupported)
3699 <<
"target(arch=..)" << ArchValue;
3705 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3709 auto CurFeature = StringRef(
Feature).drop_front();
3710 if (!
Context.getTargetInfo().isValidFeatureName(CurFeature))
3711 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3712 << Unsupported <<
None << CurFeature <<
Target;
3719 if (!
Context.getTargetInfo().validateBranchProtection(
3721 Context.getLangOpts(), DiagMsg)) {
3722 if (DiagMsg.empty())
3723 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3724 << Unsupported <<
None <<
"branch-protection" <<
Target;
3725 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3728 if (!DiagMsg.empty())
3729 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3749 TargetVersionAttr *NewAttr =
3761 TargetAttr *NewAttr = ::new (S.
Context) TargetAttr(S.
Context, AL, Str);
3768 if (
const auto *
Other = D->
getAttr<TargetClonesAttr>()) {
3769 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3770 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
3778 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
3779 if (MD->getParent()->isLambda()) {
3789 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
3794 Params.push_back(Param);
3795 Locations.push_back(Loc);
3816 for (
auto &SmallStr : NewParams)
3817 Params.push_back(SmallStr.str());
3819 TargetClonesAttr *NewAttr = ::new (S.
Context)
3820 TargetClonesAttr(S.
Context, AL, Params.data(), Params.size());
3832 MinVectorWidthAttr *Existing = D->
getAttr<MinVectorWidthAttr>();
3833 if (Existing && Existing->getVectorWidth() != VecWidth) {
3834 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3849 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
3851 S.
Diag(Loc, diag::warn_cleanup_ext);
3852 FD = dyn_cast<FunctionDecl>(DRE->
getDecl());
3855 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3859 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3860 if (ULE->hasExplicitTemplateArgs())
3861 S.
Diag(Loc, diag::warn_cleanup_ext);
3863 NI = ULE->getNameInfo();
3865 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3872 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3877 S.
Diag(Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3893 S.
Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3915 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3920 EnumExtensibilityAttr::Kind ExtensibilityKind;
3922 if (!EnumExtensibilityAttr::ConvertStrToKind(II->
getName(),
3923 ExtensibilityKind)) {
3924 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3929 EnumExtensibilityAttr(S.
Context, AL, ExtensibilityKind));
3947 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3957 if (
auto *OMD = dyn_cast<ObjCMethodDecl>(D))
3958 if (
auto *
Interface = OMD->getClassInterface())
3965 S.
Diag(AL.
getLoc(), diag::err_format_attribute_result_not)
3966 << (NotNSStringTy ?
"string type" :
"NSString")
3986 return llvm::StringSwitch<FormatAttrKind>(Format)
3993 .Cases({
"gnu_scanf",
"scanf",
"gnu_printf",
"printf",
"printf0",
3994 "gnu_strfmon",
"strfmon"},
4002 .Cases({
"gcc_diag",
"gcc_cdiag",
"gcc_cxxdiag",
"gcc_tdiag"},
4011 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
4016 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
4021 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
4027 uint32_t prioritynum;
4033 if (prioritynum > 65535) {
4034 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_range)
4042 if (prioritynum < 101)
4043 S.
Diag(AL.
getLoc(), diag::warn_init_priority_reserved)
4049 StringRef NewUserDiagnostic) {
4050 if (
const auto *EA = D->
getAttr<ErrorAttr>()) {
4052 assert((NewAttr ==
"error" || NewAttr ==
"warning") &&
4053 "unexpected normalized full name");
4054 bool Match = (EA->isError() && NewAttr ==
"error") ||
4055 (EA->isWarning() && NewAttr ==
"warning");
4057 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
4060 EA->isRegularKeywordAttribute());
4061 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
4064 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
4065 Diag(CI.
getLoc(), diag::warn_duplicate_attribute) << EA;
4066 Diag(EA->getLoc(), diag::note_previous_attribute);
4070 return ::new (
Context) ErrorAttr(
Context, CI, NewUserDiagnostic);
4078 if (F->getType() == Format &&
4079 F->getFormatIdx() == FormatIdx &&
4080 F->getFirstArg() == FirstArg) {
4083 if (F->getLocation().isInvalid())
4089 return ::new (
Context) FormatAttr(
Context, CI, Format, FormatIdx, FirstArg);
4099 if (F->getType() == Format && F->getFormatIdx() == FormatIdx) {
4101 F->getFormatString(), FormatStr))
4106 if (F->getLocation().isInvalid())
4113 FormatMatchesAttr(
Context, CI, Format, FormatIdx, FormatStr);
4131 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
4156 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
4167 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4175 if (HasImplicitThisParam) {
4178 diag::err_format_attribute_implicit_this_format_string)
4191 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
4212 if (FirstArg != 0) {
4216 S.
Diag(AL.
getLoc(), diag::err_format_strftime_third_parameter)
4224 if (FirstArg != Info.
NumArgs + 1) {
4225 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4228 std::to_string(Info.
NumArgs + 1));
4233 S.
Diag(D->
getLocation(), diag::warn_gcc_requires_variadic_function) << AL;
4238 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4245 FormatAttr *NewAttr =
4257 if (
auto *SL = dyn_cast<StringLiteral>(FormatStrExpr)) {
4266 S.
Diag(AL.
getLoc(), diag::err_format_nonliteral)
4274 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_no_callee)
4283 assert(FD &&
"Expected a function declaration!");
4285 llvm::StringMap<int> NameIdxMapping;
4286 NameIdxMapping[
"__"] = -1;
4288 NameIdxMapping[
"this"] = 0;
4292 NameIdxMapping[PVD->getName()] = Idx++;
4294 auto UnknownName = NameIdxMapping.end();
4297 for (
unsigned I = 0, E = AL.
getNumArgs(); I < E; ++I) {
4304 if (It == UnknownName) {
4305 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_argument_unknown)
4311 ArgIdx = It->second;
4318 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4324 if (ArgIdx < -1 || ArgIdx > NumArgs) {
4325 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4332 llvm_unreachable(
"Unexpected ParsedAttr argument type!");
4335 if (ArgIdx == 0 && !HasImplicitThisParam) {
4336 S.
Diag(AL.
getLoc(), diag::err_callback_implicit_this_not_available)
4343 if (!HasImplicitThisParam && ArgIdx > 0)
4346 EncodingIndices.push_back(ArgIdx);
4349 int CalleeIdx = EncodingIndices.front();
4353 if (CalleeIdx < (
int)HasImplicitThisParam) {
4354 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_invalid_callee)
4361 const Type *CalleeType =
4365 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4370 const Type *CalleeFnType =
4375 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
4376 if (!CalleeFnProtoType) {
4377 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4382 if (CalleeFnProtoType->getNumParams() != EncodingIndices.size() - 1) {
4383 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_arg_count_for_func)
4384 << AL <<
QualType{CalleeFnProtoType, 0}
4385 << CalleeFnProtoType->getNumParams()
4386 << (
unsigned)(EncodingIndices.size() - 1);
4390 if (CalleeFnProtoType->isVariadic()) {
4396 if (D->
hasAttr<CallbackAttr>()) {
4402 S.
Context, AL, EncodingIndices.data(), EncodingIndices.size()));
4406 StringRef ParamName) {
4409 Diag(AL.
getLoc(), diag::err_capture_by_attribute_no_entity)
4418 bool IsValid =
true;
4419 for (
unsigned I = 0; I < N; ++I) {
4422 Diag(E->
getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
4430 Diag(IdLoc->
getLoc(), diag::err_capture_by_references_itself)
4436 ParamLocs[I] = IdLoc->
getLoc();
4442 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices.data(), N, AL);
4443 CapturedBy->setArgs(ParamIdents, ParamLocs);
4450 if (D->
hasAttr<LifetimeCaptureByAttr>()) {
4451 S.
Diag(AL.
getLoc(), diag::err_capture_by_attribute_multiple)
4455 auto *PVD = dyn_cast<ParmVarDecl>(D);
4466 if (
auto *A = PVD->getAttr<LifetimeCaptureByAttr>())
4468 if (HasImplicitThisParam) {
4476 if (
auto *A = ATL.
getAttrAs<LifetimeCaptureByAttr>())
4477 Attrs.push_back(
const_cast<LifetimeCaptureByAttr *
>(A));
4482 llvm::StringMap<int> NameIdxMapping = {
4483 {
"global", LifetimeCaptureByAttr::Global},
4484 {
"unknown", LifetimeCaptureByAttr::Unknown}};
4486 if (HasImplicitThisParam) {
4487 NameIdxMapping[
"this"] = 0;
4491 NameIdxMapping[PVD->getName()] = Idx++;
4492 auto DisallowReservedParams = [&](StringRef Reserved) {
4494 if (PVD->getName() == Reserved)
4495 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
4496 << (PVD->getName() ==
"unknown");
4498 for (
auto *CapturedBy : Attrs) {
4499 const auto &Entities = CapturedBy->getArgIdents();
4500 for (
size_t I = 0; I < Entities.size(); ++I) {
4501 StringRef Name = Entities[I]->getName();
4502 auto It = NameIdxMapping.find(Name);
4503 if (It == NameIdxMapping.end()) {
4504 auto Loc = CapturedBy->getArgLocs()[I];
4505 if (!HasImplicitThisParam && Name ==
"this")
4506 Diag(Loc, diag::err_capture_by_implicit_this_not_available) << Loc;
4508 Diag(Loc, diag::err_capture_by_attribute_argument_unknown)
4509 << Entities[I] << Loc;
4512 if (Name ==
"unknown" || Name ==
"global")
4513 DisallowReservedParams(Name);
4514 CapturedBy->setParamIdx(I, It->second);
4523 return T.isFunctionPointerType() || T.isBlockPointerType();
4532 S.
Diag(AL.
getLoc(), diag::err_called_once_attribute_wrong_type);
4542 const auto *TD = dyn_cast<TypedefNameDecl>(D);
4543 if (TD && TD->getUnderlyingType()->isUnionType())
4544 RD = TD->getUnderlyingType()->getAsRecordDecl();
4546 RD = dyn_cast<RecordDecl>(D);
4549 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4557 diag::warn_transparent_union_attribute_not_definition);
4563 if (Field == FieldEnd) {
4564 S.
Diag(AL.
getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4572 diag::warn_transparent_union_attribute_floating)
4581 for (; Field != FieldEnd; ++Field) {
4582 QualType FieldType = Field->getType();
4596 S.
Diag(Field->getLocation(),
4597 diag::warn_transparent_union_attribute_field_size_align)
4598 << isSize << *Field << FieldBits;
4599 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4601 diag::note_transparent_union_first_field_size_align)
4602 << isSize << FirstBits;
4625 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4626 T = TD->getUnderlyingType();
4627 else if (
const auto *VD = dyn_cast<ValueDecl>(D))
4630 llvm_unreachable(
"Unknown decl type for align_value");
4632 if (!T->isDependentType() && !T->isAnyPointerType() &&
4633 !T->isReferenceType() && !T->isMemberPointerType()) {
4634 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4640 llvm::APSInt Alignment;
4642 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4646 if (!Alignment.isPowerOf2()) {
4647 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4669 diag::err_pack_expansion_without_parameter_packs);
4684 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4696 diag::err_pack_expansion_without_parameter_packs);
4723 const AlignedAttr &
Attr,
4728 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
4731 if (VD->isExceptionVariable())
4733 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
4734 if (FD->isBitField())
4736 }
else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4737 if (ED->getLangOpts().CPlusPlus)
4740 return S.
Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4745 if (DiagKind != -1) {
4746 return S.
Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4747 << &
Attr << DiagKind;
4753 bool IsPackExpansion) {
4754 AlignedAttr TmpAttr(
Context, CI,
true, E);
4758 if (TmpAttr.isAlignas() &&
4766 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4767 if (!TND->getUnderlyingType()->isDependentType()) {
4768 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4775 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
true, E);
4776 AA->setPackExpansion(IsPackExpansion);
4782 llvm::APSInt Alignment;
4784 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4789 if (
Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
4792 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4797 uint64_t AlignVal = Alignment.getZExtValue();
4803 if (!(TmpAttr.isAlignas() && !Alignment)) {
4804 if (!llvm::isPowerOf2_64(AlignVal)) {
4805 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4811 const auto *VD = dyn_cast<VarDecl>(D);
4813 unsigned MaxTLSAlign =
4814 Context.toCharUnitsFromBits(
Context.getTargetInfo().getMaxTLSAlign())
4816 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4818 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4819 << (
unsigned)AlignVal << VD << MaxTLSAlign;
4826 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4827 const Type *Ty = VD->getType().getTypePtr();
4829 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4830 << VD->getType() << 16;
4836 AA->setPackExpansion(IsPackExpansion);
4837 AA->setCachedAlignmentValue(
4838 static_cast<unsigned>(AlignVal *
Context.getCharWidth()));
4844 AlignedAttr TmpAttr(
Context, CI,
false, TS);
4848 if (TmpAttr.isAlignas() &&
4856 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4857 if (!TND->getUnderlyingType()->isDependentType()) {
4858 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4864 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4865 AA->setPackExpansion(IsPackExpansion);
4870 const auto *VD = dyn_cast<VarDecl>(D);
4871 unsigned AlignVal = TmpAttr.getAlignment(
Context);
4874 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4875 const Type *Ty = VD->getType().getTypePtr();
4877 Context.toCharUnitsFromBits(AlignVal).getQuantity() < 16) {
4878 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4879 << VD->getType() << 16;
4884 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4885 AA->setPackExpansion(IsPackExpansion);
4886 AA->setCachedAlignmentValue(AlignVal);
4891 assert(D->
hasAttrs() &&
"no attributes on decl");
4894 if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
4895 UnderlyingTy = DiagTy = VD->getType();
4898 if (
const auto *ED = dyn_cast<EnumDecl>(D))
4899 UnderlyingTy = ED->getIntegerType();
4908 AlignedAttr *AlignasAttr =
nullptr;
4909 AlignedAttr *LastAlignedAttr =
nullptr;
4912 if (I->isAlignmentDependent())
4916 Align = std::max(Align, I->getAlignment(
Context));
4917 LastAlignedAttr = I;
4921 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4922 << LastAlignedAttr << DiagTy;
4923 }
else if (AlignasAttr && Align) {
4926 if (NaturalAlign > RequestedAlign)
4927 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
4954 Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
4963 bool &IntegerMode,
bool &ComplexMode,
4966 ComplexMode =
false;
4968 switch (Str.size()) {
4988 DestWidth = Str[1] ==
'I' ? 0 : 128;
4996 DestWidth = Str[1] ==
'I' ? 0 : 128;
4999 if (Str[1] ==
'F') {
5000 IntegerMode =
false;
5001 }
else if (Str[1] ==
'C') {
5002 IntegerMode =
false;
5004 }
else if (Str[1] !=
'I') {
5013 else if (Str ==
"byte")
5017 if (Str ==
"pointer")
5021 if (Str ==
"unwind_word")
5037 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
5049 StringRef Str = Name->
getName();
5053 unsigned DestWidth = 0;
5054 bool IntegerMode =
true;
5055 bool ComplexMode =
false;
5057 llvm::APInt VectorSize(64, 0);
5058 if (Str.size() >= 4 && Str[0] ==
'V') {
5060 size_t StrSize = Str.size();
5061 size_t VectorStringLength = 0;
5062 while ((VectorStringLength + 1) < StrSize &&
5063 isdigit(Str[VectorStringLength + 1]))
5064 ++VectorStringLength;
5065 if (VectorStringLength &&
5066 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
5067 VectorSize.isPowerOf2()) {
5069 IntegerMode, ComplexMode, ExplicitType);
5071 if (!InInstantiation)
5072 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
5087 Diag(AttrLoc, diag::err_machine_mode) << 0 << Name;
5092 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
5093 OldTy = TD->getUnderlyingType();
5094 else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
5097 OldTy = ED->getIntegerType();
5112 OldElemTy = VT->getElementType();
5118 VectorSize.getBoolValue()) {
5119 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.
getRange();
5127 !IntegralOrAnyEnumType)
5128 Diag(AttrLoc, diag::err_mode_not_primitive);
5129 else if (IntegerMode) {
5130 if (!IntegralOrAnyEnumType)
5131 Diag(AttrLoc, diag::err_mode_wrong_type);
5132 }
else if (ComplexMode) {
5134 Diag(AttrLoc, diag::err_mode_wrong_type);
5137 Diag(AttrLoc, diag::err_mode_wrong_type);
5143 NewElemTy =
Context.getIntTypeForBitwidth(DestWidth,
5146 NewElemTy =
Context.getRealTypeForBitwidth(DestWidth, ExplicitType);
5148 if (NewElemTy.
isNull()) {
5150 if (!(DestWidth == 128 &&
5152 Diag(AttrLoc, diag::err_machine_mode) << 1 << Name;
5157 NewElemTy =
Context.getComplexType(NewElemTy);
5161 if (VectorSize.getBoolValue()) {
5162 NewTy =
Context.getVectorType(NewTy, VectorSize.getZExtValue(),
5167 Diag(AttrLoc, diag::err_complex_mode_vector_type);
5170 unsigned NumElements =
Context.getTypeSize(OldElemTy) *
5171 OldVT->getNumElements() /
5172 Context.getTypeSize(NewElemTy);
5174 Context.getVectorType(NewElemTy, NumElements, OldVT->getVectorKind());
5178 Diag(AttrLoc, diag::err_mode_wrong_type);
5183 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
5184 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
5185 else if (
auto *ED = dyn_cast<EnumDecl>(D))
5186 ED->setIntegerType(NewTy);
5214 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5215 Diag(CI.
getLoc(), diag::warn_attribute_ignored) << Ident;
5216 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5220 if (D->
hasAttr<AlwaysInlineAttr>())
5228 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5231 if (VD->getKind() != Decl::Var) {
5232 Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5239 if (VD->hasLocalStorage()) {
5240 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5247InternalLinkageAttr *
5249 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5252 if (VD->getKind() != Decl::Var) {
5253 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
5254 << &AL << AL.isRegularKeywordAttribute()
5260 if (VD->hasLocalStorage()) {
5261 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5270 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5271 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'minsize'";
5272 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5276 if (D->
hasAttr<MinSizeAttr>())
5284 if (AlwaysInlineAttr *Inline = D->
getAttr<AlwaysInlineAttr>()) {
5285 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
5286 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5289 if (MinSizeAttr *MinSize = D->
getAttr<MinSizeAttr>()) {
5290 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
5291 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5295 if (D->
hasAttr<OptimizeNoneAttr>())
5302 AlwaysInlineAttr AIA(S.
Context, AL);
5304 (AIA.isMSVCForceInline() || AIA.isMSVCForceInlineCalls())) {
5305 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
5308 if (AIA.isMSVCForceInlineCalls()) {
5309 S.
Diag(AL.
getLoc(), diag::warn_stmt_attribute_ignored_in_function)
5310 <<
"[[msvc::forceinline]]";
5314 if (AlwaysInlineAttr *Inline =
5331 if (VD->hasLocalStorage()) {
5332 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5339 if (
auto *A = D->
getAttr<CUDAConstantAttr>()) {
5340 if (!A->isImplicit())
5351 if (!S.
getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
5353 S.
Diag(AL.
getLoc(), diag::err_cuda_extern_shared) << VD;
5358 if (S.
getLangOpts().CUDA && VD->hasLocalStorage() &&
5377 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
5378 if (Method->isInstance()) {
5379 S.
Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
5383 S.
Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
5389 if (AL.
getKind() == ParsedAttr::AT_DeviceKernel)
5402 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5403 if (VD->hasLocalStorage()) {
5404 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5411 if (
auto *A = D->
getAttr<CUDADeviceAttr>()) {
5412 if (!A->isImplicit())
5420 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5421 if (VD->hasLocalStorage()) {
5422 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5428 if (!D->
hasAttr<HIPManagedAttr>())
5430 if (!D->
hasAttr<CUDADeviceAttr>())
5445 if (!Fn->isInlineSpecified()) {
5446 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
5451 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
5468 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5474 case ParsedAttr::AT_FastCall:
5477 case ParsedAttr::AT_StdCall:
5480 case ParsedAttr::AT_ThisCall:
5483 case ParsedAttr::AT_CDecl:
5486 case ParsedAttr::AT_Pascal:
5489 case ParsedAttr::AT_SwiftCall:
5492 case ParsedAttr::AT_SwiftAsyncCall:
5495 case ParsedAttr::AT_VectorCall:
5498 case ParsedAttr::AT_MSABI:
5501 case ParsedAttr::AT_SysVABI:
5504 case ParsedAttr::AT_RegCall:
5507 case ParsedAttr::AT_Pcs: {
5508 PcsAttr::PCSType PCS;
5511 PCS = PcsAttr::AAPCS;
5514 PCS = PcsAttr::AAPCS_VFP;
5517 llvm_unreachable(
"unexpected calling convention in pcs attribute");
5523 case ParsedAttr::AT_AArch64VectorPcs:
5526 case ParsedAttr::AT_AArch64SVEPcs:
5529 case ParsedAttr::AT_DeviceKernel: {
5531 assert(D->
hasAttr<DeviceKernelAttr>() &&
"Expected attribute");
5534 case ParsedAttr::AT_IntelOclBicc:
5537 case ParsedAttr::AT_PreserveMost:
5540 case ParsedAttr::AT_PreserveAll:
5543 case ParsedAttr::AT_M68kRTD:
5546 case ParsedAttr::AT_PreserveNone:
5549 case ParsedAttr::AT_RISCVVectorCC:
5552 case ParsedAttr::AT_RISCVVLSCC: {
5559 S.
Diag(AL.
getLoc(), diag::err_argument_invalid_range)
5564 S.
Diag(AL.
getLoc(), diag::err_argument_not_power_of_2);
5572 llvm_unreachable(
"unexpected attribute kind");
5577 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
5583 S.
Diag(AL.
getLoc(), diag::err_hidden_device_kernel) << FD;
5587 if (Triple.isNVPTX()) {
5591 if (!LangOpts.OpenCLCPlusPlus && (!FD || IsFunctionTemplate)) {
5592 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type_str)
5600 bool TargetDeviceEnvironment = Triple.isGPU() || Triple.isSPIR() ||
5602 if (!TargetDeviceEnvironment) {
5603 S.
Diag(AL.
getLoc(), diag::warn_cconv_unsupported)
5621 std::vector<StringRef> DiagnosticIdentifiers;
5622 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
5628 DiagnosticIdentifiers.push_back(RuleName);
5631 SuppressAttr(S.
Context, AL, DiagnosticIdentifiers.data(),
5632 DiagnosticIdentifiers.size()));
5641 unsigned SelectIdx = ~0
U;
5647 if (SelectIdx != ~0
U) {
5648 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument)
5660 if (AL.
getKind() == ParsedAttr::AT_Owner) {
5663 if (
const auto *OAttr = D->
getAttr<OwnerAttr>()) {
5664 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5665 ? OAttr->getDerefType().getTypePtr()
5668 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5671 OAttr->isRegularKeywordAttribute());
5672 S.
Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5677 Redecl->addAttr(::new (S.
Context) OwnerAttr(S.
Context, AL, DerefTypeLoc));
5682 if (
const auto *PAttr = D->
getAttr<PointerAttr>()) {
5683 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5684 ? PAttr->getDerefType().getTypePtr()
5687 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5690 PAttr->isRegularKeywordAttribute());
5691 S.
Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5696 Redecl->addAttr(::new (S.
Context)
5697 PointerAttr(S.
Context, AL, DerefTypeLoc));
5705 if (!D->
hasAttr<RandomizeLayoutAttr>())
5713 if (!D->
hasAttr<NoRandomizeLayoutAttr>())
5728 if (Attrs.
getKind() == ParsedAttr::AT_RISCVVLSCC) {
5736 unsigned ReqArgs = Attrs.
getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5743 bool IsTargetDefaultMSABI =
5744 Context.getTargetInfo().getTriple().isOSWindows() ||
5745 Context.getTargetInfo().getTriple().isUEFI();
5748 case ParsedAttr::AT_CDecl:
5751 case ParsedAttr::AT_FastCall:
5754 case ParsedAttr::AT_StdCall:
5757 case ParsedAttr::AT_ThisCall:
5760 case ParsedAttr::AT_Pascal:
5763 case ParsedAttr::AT_SwiftCall:
5766 case ParsedAttr::AT_SwiftAsyncCall:
5769 case ParsedAttr::AT_VectorCall:
5772 case ParsedAttr::AT_AArch64VectorPcs:
5775 case ParsedAttr::AT_AArch64SVEPcs:
5778 case ParsedAttr::AT_RegCall:
5781 case ParsedAttr::AT_MSABI:
5784 case ParsedAttr::AT_SysVABI:
5787 case ParsedAttr::AT_Pcs: {
5793 if (StrRef ==
"aapcs") {
5796 }
else if (StrRef ==
"aapcs-vfp") {
5805 case ParsedAttr::AT_IntelOclBicc:
5808 case ParsedAttr::AT_PreserveMost:
5811 case ParsedAttr::AT_PreserveAll:
5814 case ParsedAttr::AT_M68kRTD:
5817 case ParsedAttr::AT_PreserveNone:
5820 case ParsedAttr::AT_RISCVVectorCC:
5823 case ParsedAttr::AT_RISCVVLSCC: {
5826 unsigned ABIVLen = 128;
5832 if (Attrs.
getNumArgs() && (ABIVLen < 32 || ABIVLen > 65536)) {
5834 Diag(Attrs.
getLoc(), diag::err_argument_invalid_range)
5835 << ABIVLen << 32 << 65536;
5838 if (!llvm::isPowerOf2_64(ABIVLen)) {
5840 Diag(Attrs.
getLoc(), diag::err_argument_not_power_of_2);
5844 llvm::Log2_64(ABIVLen) - 5);
5847 case ParsedAttr::AT_DeviceKernel: {
5852 default: llvm_unreachable(
"unexpected attribute kind");
5857 auto *Aux =
Context.getAuxTargetInfo();
5865 bool CheckHost =
false, CheckDevice =
false;
5866 switch (CudaTarget) {
5879 llvm_unreachable(
"unexpected cuda target");
5881 auto *HostTI =
LangOpts.CUDAIsDevice ? Aux : &TI;
5882 auto *DeviceTI =
LangOpts.CUDAIsDevice ? &TI : Aux;
5883 if (CheckHost && HostTI)
5886 A = DeviceTI->checkCallingConvention(CC);
5887 }
else if (
LangOpts.SYCLIsDevice) {
5903 A = Aux->checkCallingConvention(CC);
5908 A = Aux->checkCallingConvention(CC);
5927 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
5932 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
5937 bool IsCXXMethod =
false, IsVariadic =
false;
5942 CC =
Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
5967 if (
Context.getTargetInfo().getRegParmMax() == 0) {
5968 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
5975 if (numParams >
Context.getTargetInfo().getRegParmMax()) {
5976 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
5988 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
5998 const CUDALaunchBoundsAttr &AL,
5999 const unsigned Idx) {
6008 std::optional<llvm::APSInt> I = llvm::APSInt(64);
6015 if (!I->isIntN(32)) {
6017 <<
toString(*I, 10,
false) << 32 << 1;
6021 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6029 "Unexpected PerformCopyInitialization() failure.");
6034CUDALaunchBoundsAttr *
6038 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
6059 MaxBlocks =
nullptr;
6071 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
6090static std::pair<Expr *, int>
6092 const unsigned Idx) {
6108 if (!I->isIntN(4)) {
6110 <<
toString(*I, 10,
false) << 4 << 1;
6114 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6124 CUDAClusterDimsAttr TmpAttr(
Context, CI,
X, Y, Z);
6130 if (!NewX || (Y && !NewY) || (Z && !NewZ))
6133 int FlatDim = ValX * ValY * ValZ;
6134 const llvm::Triple TT =
6135 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
6136 ?
Context.getAuxTargetInfo()->getTriple()
6137 :
Context.getTargetInfo().getTriple();
6141 else if (TT.isAMDGPU())
6148 if (FlatDim > MaxDim) {
6149 Diag(CI.
getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
6153 return CUDAClusterDimsAttr::Create(
Context, NewX, NewY, NewZ, CI);
6172 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6191 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6201 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6223 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
6226 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
6231 TypeTagIdx, IsPointer));
6237 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6246 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
6254 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
6277 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
6280 uint32_t Count = 0, Offset = 0;
6288 if (Count < Offset) {
6289 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
6300 diag::err_attribute_patchable_function_entry_invalid_section)
6304 if (Section.empty()) {
6306 diag::err_attribute_patchable_function_entry_invalid_section)
6307 <<
"section must not be empty";
6317 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6335 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6336 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
6347 if (
auto *CRD = dyn_cast<CXXRecordDecl>(D);
6348 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6359 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6365 assert(ParmTSI &&
"no type source info for attribute argument");
6367 diag::err_incomplete_type);
6377 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
6378 if (
const auto *UA = D->
getAttr<UuidAttr>()) {
6381 if (!UA->getGuid().empty()) {
6382 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6388 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
6393 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6398 StringRef OrigStrRef;
6405 StringRef StrRef = OrigStrRef;
6406 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
6407 StrRef = StrRef.drop_front().drop_back();
6410 if (StrRef.size() != 36) {
6411 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6415 for (
unsigned i = 0; i < 36; ++i) {
6416 if (i == 8 || i == 13 || i == 18 || i == 23) {
6417 if (StrRef[i] !=
'-') {
6418 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6422 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6429 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
6430 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
6431 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
6432 for (
unsigned i = 0; i != 8; ++i)
6433 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6444 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
6453 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6468 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
6472 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
6475 if (VD->hasLocalStorage()) {
6476 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
6484 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
6490 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6494 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6495 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6496 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6506 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6507 << AL <<
First << 0;
6508 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6511 if (
const auto *Preexisting = D->
getAttr<MSStructAttr>()) {
6512 if (Preexisting->isImplicit())
6521 if (
First->isImplicit()) {
6524 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6525 << AL <<
First << 0;
6526 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6536 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6540 Tags.push_back(Tag);
6543 if (
const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6544 if (!NS->isInline()) {
6545 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6548 if (NS->isAnonymousNamespace()) {
6549 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6553 Tags.push_back(NS->getName());
6559 Tags.erase(llvm::unique(Tags), Tags.end());
6562 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
6567 if (I->getBTFDeclTag() == Tag)
6586 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
6592 case llvm::Triple::msp430:
6595 case llvm::Triple::mipsel:
6596 case llvm::Triple::mips:
6599 case llvm::Triple::m68k:
6602 case llvm::Triple::x86:
6603 case llvm::Triple::x86_64:
6606 case llvm::Triple::avr:
6609 case llvm::Triple::riscv32:
6610 case llvm::Triple::riscv64:
6611 case llvm::Triple::riscv32be:
6612 case llvm::Triple::riscv64be:
6629 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
6644 if (D->
hasAttr<DLLExportAttr>()) {
6645 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
6649 if (D->
hasAttr<DLLImportAttr>())
6657 if (DLLImportAttr *Import = D->
getAttr<DLLImportAttr>()) {
6658 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6662 if (D->
hasAttr<DLLExportAttr>())
6675 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6685 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6687 MD->getParent()->isLambda()) {
6693 if (
auto *EA = D->
getAttr<ExcludeFromExplicitInstantiationAttr>()) {
6695 diag::warn_dllattr_ignored_exclusion_takes_precedence)
6700 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
6711 if (MSInheritanceAttr *IA = D->
getAttr<MSInheritanceAttr>()) {
6712 if (IA->getInheritanceModel() == Model)
6714 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6716 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
6721 if (RD->hasDefinition()) {
6728 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6732 if (RD->getDescribedClassTemplate()) {
6733 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6751 StringRef N(
"mutex");
6753 if (AL.
getKind() == ParsedAttr::AT_Capability &&
6766 if (!D->
hasAttr<CapabilityAttr>()) {
6767 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_requires_preceded)
6768 << AL << cast<NamedDecl>(D) <<
"'capability'";
6784 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
6840 RequiresCapabilityAttr *RCA = ::new (S.
Context)
6841 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
6847 if (
const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6848 if (NSD->isAnonymousNamespace()) {
6849 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6863 StringRef Str, Replacement;
6876 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6882 if (
const auto *S = dyn_cast<VarDecl>(D))
6883 return S->hasGlobalStorage();
6888 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6889 Sanitizer ==
"memtag";
6896 std::vector<StringRef> Sanitizers;
6898 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6899 StringRef SanitizerName;
6907 SanitizerName !=
"coverage")
6908 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6910 S.
Diag(D->
getLocation(), diag::warn_attribute_type_not_supported_global)
6911 << AL << SanitizerName;
6912 Sanitizers.push_back(SanitizerName);
6916 Sanitizers.size()));
6929 unsigned TranslatedSpellingIndex = 0;
6931 TranslatedSpellingIndex = 1;
6940 StringRef SanitizerName =
"address";
6943 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6947 StringRef SanitizerName =
"thread";
6950 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6954 StringRef SanitizerName =
"memory";
6957 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6972 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6973 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6974 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6979 D->
dropAttr<ZeroCallUsedRegsAttr>();
6995 case ParsedAttr::AT_CountedBy:
6996 CountInBytes =
false;
6999 case ParsedAttr::AT_CountedByOrNull:
7000 CountInBytes =
false;
7003 case ParsedAttr::AT_SizedBy:
7004 CountInBytes =
true;
7007 case ParsedAttr::AT_SizedByOrNull:
7008 CountInBytes =
true;
7012 llvm_unreachable(
"unexpected counted_by family attribute");
7020 FD->
getType(), CountExpr, CountInBytes, OrNull);
7031 FunctionReturnThunksAttr::Kind Kind;
7032 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
7033 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
7040 D->
dropAttr<FunctionReturnThunksAttr>();
7041 D->
addAttr(FunctionReturnThunksAttr::Create(S.
Context, Kind, AL));
7051 auto *VDecl = dyn_cast<VarDecl>(D);
7052 if (VDecl && !VDecl->isFunctionPointerType()) {
7053 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
7067 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
7071 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
7079 "uninitialized is only valid on automatic duration variables");
7090 bool IsKernReturnT =
false;
7091 while (
const auto *TT = T->getAs<
TypedefType>()) {
7092 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
7097 diag::warn_mig_server_routine_does_not_return_kern_return_t);
7107 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
7110 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
7123 if (
const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
7124 if (PVD->getType()->isIntegerType()) {
7125 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
7136template<
typename Attr>
7144template<
typename Attr>
7153 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7158 CFGuardAttr::GuardArg Arg;
7160 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
7161 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
7169template <
typename AttrTy>
7172 auto I = llvm::find_if(Attrs,
7173 [Name](
const AttrTy *A) {
7174 return A->getTCBName() == Name;
7176 return I == Attrs.end() ?
nullptr : *I;
7179template <
typename AttrTy,
typename ConflictingAttrTy>
7186 if (
const ConflictingAttrTy *ConflictingAttr =
7190 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
7204template <
typename AttrTy,
typename ConflictingAttrTy>
7207 StringRef TCBName = AL.getTCBName();
7208 if (
const ConflictingAttrTy *ConflictingAttr =
7210 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
7211 << ConflictingAttr->getAttrName()->getName()
7212 << AL.getAttrName()->getName() << TCBName;
7215 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
7223 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
7232 Decl *D,
const EnforceTCBLeafAttr &AL) {
7242 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7247 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
7252 if (D->
getAttr<VTablePointerAuthenticationAttr>()) {
7253 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
7257 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
7260 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
7262 S.
Diag(IL->
getLoc(), diag::err_invalid_authentication_key)
7266 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
7268 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
7272 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7277 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
7278 AddressDiscriminationMode::DefaultAddressDiscrimination;
7282 if (!VTablePointerAuthenticationAttr::
7283 ConvertStrToAddressDiscriminationMode(
7285 S.
Diag(IL->
getLoc(), diag::err_invalid_address_discrimination)
7289 if (AddressDiversityMode ==
7290 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
7292 S.
Diag(IL->
getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
7296 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7301 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
7302 DefaultExtraDiscrimination;
7306 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
7308 S.
Diag(IL->
getLoc(), diag::err_invalid_extra_discrimination)
7312 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
7314 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
7318 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7323 uint32_t CustomDiscriminationValue = 0;
7324 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
7326 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
7331 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7336 CustomDiscriminationValue)) {
7337 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
7340 }
else if (NumArgs > 3) {
7341 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
7346 S.
Context, AL, KeyType, AddressDiversityMode, ED,
7347 CustomDiscriminationValue));
7354 return Existing->getModularImplFn() == ModularImplFn &&
7355 Existing->getImplName() == ImplName &&
7356 Existing->aspects_size() == Aspects.size() &&
7357 llvm::equal(Existing->aspects(), Aspects);
7363 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7365 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
7366 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
7370 return ::new (
Context) ModularFormatAttr(
Context, CI, ModularImplFn, ImplName,
7371 Aspects.data(), Aspects.size());
7377 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
7385 llvm::DenseSet<StringRef> SeenAspects;
7386 for (
unsigned I = 2, E = AL.
getNumArgs(); I != E; ++I) {
7390 if (!SeenAspects.insert(Aspect).second) {
7392 diag::err_modular_format_duplicate_aspect)
7397 Aspects.push_back(Aspect);
7403 llvm::sort(Aspects);
7406 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7408 S.
Diag(AL.
getLoc(), diag::err_duplicate_attribute) << *Existing;
7409 S.
Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7416 S.
Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7432 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
7433 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7436 if (IsLastAttrArg && AttrHasVariadicArg)
7444 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7456 if (PersonalityAttr *PA = D->
getAttr<PersonalityAttr>()) {
7460 Diag(PA->getLocation(), diag::err_mismatched_personality);
7461 Diag(CI.
getLoc(), diag::note_previous_attribute);
7473 S.
Diag(E->
getExprLoc(), diag::err_attribute_personality_arg_not_function)
7503 S.
Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
7506 S.
Diag(AL.
getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7515 AL.
getKind() == ParsedAttr::AT_NoInline) {
7516 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
7518 if (PVD->hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
7519 S.
Diag(AL.
getLoc(), diag::err_hlsl_attr_incompatible)
7520 <<
"'noinline'" <<
"'groupshared' parameter";
7534 if (MustDelayArgs) {
7544 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
7570 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7579 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
7592 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
7602 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
7613 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
7616 case ParsedAttr::AT_Interrupt:
7619 case ParsedAttr::AT_ARMInterruptSaveFP:
7622 case ParsedAttr::AT_X86ForceAlignArgPointer:
7625 case ParsedAttr::AT_ReadOnlyPlacement:
7628 case ParsedAttr::AT_DLLExport:
7629 case ParsedAttr::AT_DLLImport:
7632 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7635 case ParsedAttr::AT_AMDGPUWavesPerEU:
7638 case ParsedAttr::AT_AMDGPUNumSGPR:
7641 case ParsedAttr::AT_AMDGPUNumVGPR:
7644 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7647 case ParsedAttr::AT_AVRSignal:
7650 case ParsedAttr::AT_BPFPreserveAccessIndex:
7653 case ParsedAttr::AT_BPFPreserveStaticOffset:
7656 case ParsedAttr::AT_BTFDeclTag:
7659 case ParsedAttr::AT_WebAssemblyExportName:
7662 case ParsedAttr::AT_WebAssemblyImportModule:
7665 case ParsedAttr::AT_WebAssemblyImportName:
7668 case ParsedAttr::AT_IBOutlet:
7671 case ParsedAttr::AT_IBOutletCollection:
7674 case ParsedAttr::AT_IFunc:
7677 case ParsedAttr::AT_Alias:
7680 case ParsedAttr::AT_Aligned:
7683 case ParsedAttr::AT_AlignValue:
7686 case ParsedAttr::AT_AllocSize:
7689 case ParsedAttr::AT_AlwaysInline:
7692 case ParsedAttr::AT_AnalyzerNoReturn:
7695 case ParsedAttr::AT_TLSModel:
7698 case ParsedAttr::AT_Annotate:
7701 case ParsedAttr::AT_Availability:
7704 case ParsedAttr::AT_CarriesDependency:
7707 case ParsedAttr::AT_CPUDispatch:
7708 case ParsedAttr::AT_CPUSpecific:
7711 case ParsedAttr::AT_Common:
7714 case ParsedAttr::AT_CUDAConstant:
7717 case ParsedAttr::AT_PassObjectSize:
7720 case ParsedAttr::AT_Constructor:
7723 case ParsedAttr::AT_Deprecated:
7726 case ParsedAttr::AT_Destructor:
7729 case ParsedAttr::AT_EnableIf:
7732 case ParsedAttr::AT_Error:
7735 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7738 case ParsedAttr::AT_DiagnoseIf:
7741 case ParsedAttr::AT_DiagnoseAsBuiltin:
7744 case ParsedAttr::AT_NoBuiltin:
7747 case ParsedAttr::AT_CFIUncheckedCallee:
7750 case ParsedAttr::AT_ExtVectorType:
7753 case ParsedAttr::AT_ExternalSourceSymbol:
7756 case ParsedAttr::AT_MinSize:
7759 case ParsedAttr::AT_OptimizeNone:
7762 case ParsedAttr::AT_EnumExtensibility:
7765 case ParsedAttr::AT_SYCLKernel:
7768 case ParsedAttr::AT_SYCLExternal:
7771 case ParsedAttr::AT_SYCLKernelEntryPoint:
7774 case ParsedAttr::AT_SYCLSpecialClass:
7777 case ParsedAttr::AT_Format:
7780 case ParsedAttr::AT_FormatMatches:
7783 case ParsedAttr::AT_FormatArg:
7786 case ParsedAttr::AT_Callback:
7789 case ParsedAttr::AT_LifetimeCaptureBy:
7792 case ParsedAttr::AT_CalledOnce:
7795 case ParsedAttr::AT_CUDAGlobal:
7798 case ParsedAttr::AT_CUDADevice:
7801 case ParsedAttr::AT_CUDAGridConstant:
7804 case ParsedAttr::AT_HIPManaged:
7807 case ParsedAttr::AT_GNUInline:
7810 case ParsedAttr::AT_CUDALaunchBounds:
7813 case ParsedAttr::AT_CUDAClusterDims:
7816 case ParsedAttr::AT_CUDANoCluster:
7819 case ParsedAttr::AT_Restrict:
7822 case ParsedAttr::AT_MallocSpan:
7825 case ParsedAttr::AT_Mode:
7828 case ParsedAttr::AT_NonString:
7831 case ParsedAttr::AT_NonNull:
7832 if (
auto *PVD = dyn_cast<ParmVarDecl>(D))
7837 case ParsedAttr::AT_ReturnsNonNull:
7840 case ParsedAttr::AT_NoEscape:
7843 case ParsedAttr::AT_MaybeUndef:
7846 case ParsedAttr::AT_AssumeAligned:
7849 case ParsedAttr::AT_AllocAlign:
7852 case ParsedAttr::AT_Ownership:
7855 case ParsedAttr::AT_Naked:
7858 case ParsedAttr::AT_NoReturn:
7861 case ParsedAttr::AT_CXX11NoReturn:
7864 case ParsedAttr::AT_AnyX86NoCfCheck:
7867 case ParsedAttr::AT_NoThrow:
7871 case ParsedAttr::AT_CUDAShared:
7874 case ParsedAttr::AT_VecReturn:
7877 case ParsedAttr::AT_ObjCOwnership:
7880 case ParsedAttr::AT_ObjCPreciseLifetime:
7883 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7886 case ParsedAttr::AT_ObjCRequiresSuper:
7889 case ParsedAttr::AT_ObjCBridge:
7892 case ParsedAttr::AT_ObjCBridgeMutable:
7895 case ParsedAttr::AT_ObjCBridgeRelated:
7898 case ParsedAttr::AT_ObjCDesignatedInitializer:
7901 case ParsedAttr::AT_ObjCRuntimeName:
7904 case ParsedAttr::AT_ObjCBoxable:
7907 case ParsedAttr::AT_NSErrorDomain:
7910 case ParsedAttr::AT_CFConsumed:
7911 case ParsedAttr::AT_NSConsumed:
7912 case ParsedAttr::AT_OSConsumed:
7917 case ParsedAttr::AT_OSReturnsRetainedOnZero:
7920 diag::warn_ns_attribute_wrong_parameter_type,
7923 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
7926 diag::warn_ns_attribute_wrong_parameter_type,
7929 case ParsedAttr::AT_NSReturnsAutoreleased:
7930 case ParsedAttr::AT_NSReturnsNotRetained:
7931 case ParsedAttr::AT_NSReturnsRetained:
7932 case ParsedAttr::AT_CFReturnsNotRetained:
7933 case ParsedAttr::AT_CFReturnsRetained:
7934 case ParsedAttr::AT_OSReturnsNotRetained:
7935 case ParsedAttr::AT_OSReturnsRetained:
7938 case ParsedAttr::AT_WorkGroupSizeHint:
7941 case ParsedAttr::AT_ReqdWorkGroupSize:
7944 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
7947 case ParsedAttr::AT_VecTypeHint:
7950 case ParsedAttr::AT_InitPriority:
7953 case ParsedAttr::AT_Packed:
7956 case ParsedAttr::AT_PreferredName:
7959 case ParsedAttr::AT_NoSpecializations:
7962 case ParsedAttr::AT_Section:
7965 case ParsedAttr::AT_CodeModel:
7968 case ParsedAttr::AT_RandomizeLayout:
7971 case ParsedAttr::AT_NoRandomizeLayout:
7974 case ParsedAttr::AT_CodeSeg:
7977 case ParsedAttr::AT_Target:
7980 case ParsedAttr::AT_TargetVersion:
7983 case ParsedAttr::AT_TargetClones:
7986 case ParsedAttr::AT_MinVectorWidth:
7989 case ParsedAttr::AT_Unavailable:
7992 case ParsedAttr::AT_OMPAssume:
7995 case ParsedAttr::AT_ObjCDirect:
7998 case ParsedAttr::AT_ObjCDirectMembers:
8002 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
8005 case ParsedAttr::AT_Unused:
8008 case ParsedAttr::AT_Visibility:
8011 case ParsedAttr::AT_TypeVisibility:
8014 case ParsedAttr::AT_WarnUnusedResult:
8017 case ParsedAttr::AT_WeakRef:
8020 case ParsedAttr::AT_WeakImport:
8023 case ParsedAttr::AT_TransparentUnion:
8026 case ParsedAttr::AT_ObjCMethodFamily:
8029 case ParsedAttr::AT_ObjCNSObject:
8032 case ParsedAttr::AT_ObjCIndependentClass:
8035 case ParsedAttr::AT_Blocks:
8038 case ParsedAttr::AT_Sentinel:
8041 case ParsedAttr::AT_Cleanup:
8044 case ParsedAttr::AT_NoDebug:
8047 case ParsedAttr::AT_CmseNSEntry:
8050 case ParsedAttr::AT_StdCall:
8051 case ParsedAttr::AT_CDecl:
8052 case ParsedAttr::AT_FastCall:
8053 case ParsedAttr::AT_ThisCall:
8054 case ParsedAttr::AT_Pascal:
8055 case ParsedAttr::AT_RegCall:
8056 case ParsedAttr::AT_SwiftCall:
8057 case ParsedAttr::AT_SwiftAsyncCall:
8058 case ParsedAttr::AT_VectorCall:
8059 case ParsedAttr::AT_MSABI:
8060 case ParsedAttr::AT_SysVABI:
8061 case ParsedAttr::AT_Pcs:
8062 case ParsedAttr::AT_IntelOclBicc:
8063 case ParsedAttr::AT_PreserveMost:
8064 case ParsedAttr::AT_PreserveAll:
8065 case ParsedAttr::AT_AArch64VectorPcs:
8066 case ParsedAttr::AT_AArch64SVEPcs:
8067 case ParsedAttr::AT_M68kRTD:
8068 case ParsedAttr::AT_PreserveNone:
8069 case ParsedAttr::AT_RISCVVectorCC:
8070 case ParsedAttr::AT_RISCVVLSCC:
8073 case ParsedAttr::AT_DeviceKernel:
8076 case ParsedAttr::AT_Suppress:
8079 case ParsedAttr::AT_Owner:
8080 case ParsedAttr::AT_Pointer:
8083 case ParsedAttr::AT_OpenCLAccess:
8086 case ParsedAttr::AT_OpenCLNoSVM:
8089 case ParsedAttr::AT_SwiftContext:
8092 case ParsedAttr::AT_SwiftAsyncContext:
8095 case ParsedAttr::AT_SwiftErrorResult:
8098 case ParsedAttr::AT_SwiftIndirectResult:
8101 case ParsedAttr::AT_InternalLinkage:
8104 case ParsedAttr::AT_ZeroCallUsedRegs:
8107 case ParsedAttr::AT_FunctionReturnThunks:
8110 case ParsedAttr::AT_NoMerge:
8113 case ParsedAttr::AT_NoUniqueAddress:
8117 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
8121 case ParsedAttr::AT_CountedBy:
8122 case ParsedAttr::AT_CountedByOrNull:
8123 case ParsedAttr::AT_SizedBy:
8124 case ParsedAttr::AT_SizedByOrNull:
8128 case ParsedAttr::AT_NoFieldProtection:
8132 case ParsedAttr::AT_Personality:
8137 case ParsedAttr::AT_LayoutVersion:
8140 case ParsedAttr::AT_Uuid:
8143 case ParsedAttr::AT_MSInheritance:
8146 case ParsedAttr::AT_Thread:
8149 case ParsedAttr::AT_MSConstexpr:
8152 case ParsedAttr::AT_HybridPatchable:
8157 case ParsedAttr::AT_RootSignature:
8160 case ParsedAttr::AT_HLSLNumThreads:
8163 case ParsedAttr::AT_HLSLWaveSize:
8166 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
8169 case ParsedAttr::AT_HLSLVkExtBuiltinOutput:
8172 case ParsedAttr::AT_HLSLVkPushConstant:
8175 case ParsedAttr::AT_HLSLVkConstantId:
8178 case ParsedAttr::AT_HLSLVkBinding:
8181 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
8184 case ParsedAttr::AT_HLSLPackOffset:
8187 case ParsedAttr::AT_HLSLShader:
8190 case ParsedAttr::AT_HLSLResourceBinding:
8193 case ParsedAttr::AT_HLSLParamModifier:
8196 case ParsedAttr::AT_HLSLMatrixLayout:
8199 case ParsedAttr::AT_HLSLUnparsedSemantic:
8202 case ParsedAttr::AT_HLSLVkLocation:
8206 case ParsedAttr::AT_AbiTag:
8209 case ParsedAttr::AT_CFGuard:
8214 case ParsedAttr::AT_PtGuardedVar:
8217 case ParsedAttr::AT_NoSanitize:
8220 case ParsedAttr::AT_NoSanitizeAddress:
8223 case ParsedAttr::AT_NoSanitizeThread:
8226 case ParsedAttr::AT_NoSanitizeMemory:
8229 case ParsedAttr::AT_GuardedBy:
8232 case ParsedAttr::AT_PtGuardedBy:
8235 case ParsedAttr::AT_LockReturned:
8238 case ParsedAttr::AT_LocksExcluded:
8241 case ParsedAttr::AT_AcquiredBefore:
8244 case ParsedAttr::AT_AcquiredAfter:
8249 case ParsedAttr::AT_Capability:
8250 case ParsedAttr::AT_Lockable:
8253 case ParsedAttr::AT_ReentrantCapability:
8256 case ParsedAttr::AT_RequiresCapability:
8260 case ParsedAttr::AT_AssertCapability:
8263 case ParsedAttr::AT_AcquireCapability:
8266 case ParsedAttr::AT_ReleaseCapability:
8269 case ParsedAttr::AT_TryAcquireCapability:
8274 case ParsedAttr::AT_Consumable:
8277 case ParsedAttr::AT_CallableWhen:
8280 case ParsedAttr::AT_ParamTypestate:
8283 case ParsedAttr::AT_ReturnTypestate:
8286 case ParsedAttr::AT_SetTypestate:
8289 case ParsedAttr::AT_TestTypestate:
8294 case ParsedAttr::AT_ArgumentWithTypeTag:
8297 case ParsedAttr::AT_TypeTagForDatatype:
8302 case ParsedAttr::AT_SwiftAsyncName:
8305 case ParsedAttr::AT_SwiftAttr:
8308 case ParsedAttr::AT_SwiftBridge:
8311 case ParsedAttr::AT_SwiftError:
8314 case ParsedAttr::AT_SwiftName:
8317 case ParsedAttr::AT_SwiftNewType:
8320 case ParsedAttr::AT_SwiftAsync:
8323 case ParsedAttr::AT_SwiftAsyncError:
8328 case ParsedAttr::AT_XRayLogArgs:
8332 case ParsedAttr::AT_PatchableFunctionEntry:
8336 case ParsedAttr::AT_AlwaysDestroy:
8337 case ParsedAttr::AT_NoDestroy:
8341 case ParsedAttr::AT_Uninitialized:
8345 case ParsedAttr::AT_ObjCExternallyRetained:
8349 case ParsedAttr::AT_MIGServerRoutine:
8353 case ParsedAttr::AT_MSAllocator:
8357 case ParsedAttr::AT_ArmBuiltinAlias:
8361 case ParsedAttr::AT_ArmLocallyStreaming:
8365 case ParsedAttr::AT_ArmNew:
8369 case ParsedAttr::AT_AcquireHandle:
8373 case ParsedAttr::AT_ReleaseHandle:
8377 case ParsedAttr::AT_UnsafeBufferUsage:
8381 case ParsedAttr::AT_UseHandle:
8385 case ParsedAttr::AT_EnforceTCB:
8389 case ParsedAttr::AT_EnforceTCBLeaf:
8393 case ParsedAttr::AT_BuiltinAlias:
8397 case ParsedAttr::AT_PreferredType:
8401 case ParsedAttr::AT_UsingIfExists:
8405 case ParsedAttr::AT_TypeNullable:
8409 case ParsedAttr::AT_VTablePointerAuthentication:
8413 case ParsedAttr::AT_ModularFormat:
8417 case ParsedAttr::AT_MSStruct:
8421 case ParsedAttr::AT_GCCStruct:
8425 case ParsedAttr::AT_PointerFieldProtection:
8428 diag::err_attribute_pointer_field_protection_experimental)
8437 return D->
hasAttr<DeviceKernelAttr>() ||
8445 if (AttrList.
empty())
8456 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8466 if (!(D->
hasAttr<DeviceKernelAttr>() ||
8467 (D->
hasAttr<CUDAGlobalAttr>() &&
8468 Context.getTargetInfo().getTriple().isSPIRV()))) {
8470 if (
const auto *A = D->
getAttr<ReqdWorkGroupSizeAttr>()) {
8475 }
else if (
const auto *A = D->
getAttr<WorkGroupSizeHintAttr>()) {
8478 }
else if (
const auto *A = D->
getAttr<VecTypeHintAttr>()) {
8481 }
else if (
const auto *A = D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8487 if (
const auto *A = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8491 }
else if (
const auto *A = D->
getAttr<AMDGPUWavesPerEUAttr>()) {
8495 }
else if (
const auto *A = D->
getAttr<AMDGPUNumSGPRAttr>()) {
8499 }
else if (
const auto *A = D->
getAttr<AMDGPUNumVGPRAttr>()) {
8516 if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8517 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8518 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8519 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8521 if (HasGlobal || HasHost != HasDevice) {
8522 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8523 Guide->setInvalidDecl();
8524 }
else if (HasHost && HasDevice) {
8525 Diag(Guide->getLocation(),
8526 diag::warn_deduction_guide_target_attr_deprecated);
8532 (D->
hasAttr<ConstructorAttr>() || D->
hasAttr<DestructorAttr>()) &&
8535 << (D->
hasAttr<ConstructorAttr>() ?
"constructors" :
"destructors");
8544 if (D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
8547 D->
dropAttr<ObjCDesignatedInitializerAttr>();
8554 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8561 if (D && D->
hasAttr<BPFPreserveAccessIndexAttr>())
8568 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8572 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8584 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8592 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8609 std::optional<StringRef> CorrectedScopeName =
8611 if (CorrectedScopeName) {
8612 ScopeName = *CorrectedScopeName;
8618 if (CorrectedAttrName) {
8619 AttrName = *CorrectedAttrName;
8622 if (CorrectedScopeName || CorrectedAttrName) {
8623 std::string CorrectedFullName =
8627 diag::warn_unknown_attribute_ignored_suggestion);
8629 D << AL << CorrectedFullName;
8634 if (CorrectedScopeName) {
8638 if (CorrectedAttrName) {
8643 Diag(NR.
getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8651 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
8673 for (
const auto &AI : FT->param_types()) {
8675 Param->setScopeInfo(0, Params.size());
8676 Params.push_back(Param);
8678 NewFD->setParams(Params);
8680 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
8682 VD->getInnerLocStart(), VD->getLocation(), II,
8683 VD->getType(), VD->getTypeSourceInfo(),
8684 VD->getStorageClass());
8685 if (VD->getQualifier())
8686 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8719 if (
auto *VD = dyn_cast<VarDecl>(D))
8720 if (VD->isExternC())
8722 if (
auto *FD = dyn_cast<FunctionDecl>(D))
8730 auto &WeakInfos = I->second;
8731 for (
const auto &W : WeakInfos)
8733 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
8734 WeakInfos.swap(EmptyWeakInfos);
8746 auto ProcessAttributesWithSliding =
8754 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8755 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8760 AL.diagnoseAppertainsTo(*
this, D);
8775 .WithIncludeCXX11Attributes(
false)
8776 .WithIgnoreTypeAttributes(
true));
8785 .WithIncludeCXX11Attributes(
false)
8786 .WithIgnoreTypeAttributes(
true));
8804 UnavailableAttr::ImplicitReason &reason) {
8818 if (
diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8819 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8820 reason = UnavailableAttr::IR_ForbiddenWeak;
8829 reason = UnavailableAttr::IR_ARCForbiddenType;
8839 auto Reason = UnavailableAttr::IR_None;
8841 assert(Reason &&
"didn't set reason?");
8846 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
8849 if (FD->
hasAttr<UnavailableAttr>() &&
8851 diag::err_arc_array_param_no_ownership) {
8882 bool AnyAccessFailures =
false;
8890 switch (
diag.Kind) {
8894 if (!
decl->isInvalidDecl())
8906 AnyAccessFailures =
true;
8919 assert(curPool &&
"re-emitting in undelayed context not supported");
8920 curPool->
steal(pool);
8937 QualType ParamTy = FD->getParamDecl(0)->getType();
8940 FD->getParamDecl(0)->getLocation(), ParamTy, Ty)) &&
8942 this->
Diag(Attr->getArgLoc(),
8943 diag::err_attribute_cleanup_func_arg_incompatible_type)
8944 << NI.
getName() << ParamTy << Ty;
8952 if (this->
Context.getAsArrayType(T))
8953 T = this->
Context.getBaseElementType(T);
8954 if (!T->isRecordType()) {
8955 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.
Result
Implement __builtin_bit_cast and related operations.
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 bool checkThreadSafetyValueDeclIsFunPtr(Sema &S, const ValueDecl *VD, const AttributeCommonInfo &A)
Checks that thread-safety attributes on variables or fields apply only to function pointer types.
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 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 bool checkThreadSafetyAttrSubject(Sema &S, Decl *D, const ParsedAttr &AL, bool CheckParmVar=false)
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 bool checkFunParamsAreScopedLockable(Sema &S, const ParmVarDecl *ParamDecl, const AttributeCommonInfo &AL)
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 isFunctionPointerOrDependent(QualType T)
True if T (or its pointee, after stripping a top-level reference) is a function pointer or dependent.
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 handleMatrixLayoutAttr(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)
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
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)
bool checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A)
Recheck instantiated thread-safety attributes that could not be validated on the dependent pattern de...
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks, bool IgnoreArch=false)
Create a CUDALaunchBoundsAttr attribute.
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)
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)
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