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) {
5893 A = Aux->checkCallingConvention(CC);
5911 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
5916 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
5921 bool IsCXXMethod =
false, IsVariadic =
false;
5926 CC =
Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
5951 if (
Context.getTargetInfo().getRegParmMax() == 0) {
5952 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
5959 if (numParams >
Context.getTargetInfo().getRegParmMax()) {
5960 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
5972 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
5982 const CUDALaunchBoundsAttr &AL,
5983 const unsigned Idx) {
5992 std::optional<llvm::APSInt> I = llvm::APSInt(64);
5999 if (!I->isIntN(32)) {
6001 <<
toString(*I, 10,
false) << 32 << 1;
6005 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6013 "Unexpected PerformCopyInitialization() failure.");
6018CUDALaunchBoundsAttr *
6020 Expr *MinBlocks,
Expr *MaxBlocks) {
6021 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
6039 MaxBlocks =
nullptr;
6048 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
6067static std::pair<Expr *, int>
6069 const unsigned Idx) {
6085 if (!I->isIntN(4)) {
6087 <<
toString(*I, 10,
false) << 4 << 1;
6091 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6101 CUDAClusterDimsAttr TmpAttr(
Context, CI,
X, Y, Z);
6107 if (!NewX || (Y && !NewY) || (Z && !NewZ))
6110 int FlatDim = ValX * ValY * ValZ;
6111 const llvm::Triple TT =
6112 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
6113 ?
Context.getAuxTargetInfo()->getTriple()
6114 :
Context.getTargetInfo().getTriple();
6118 else if (TT.isAMDGPU())
6125 if (FlatDim > MaxDim) {
6126 Diag(CI.
getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
6130 return CUDAClusterDimsAttr::Create(
Context, NewX, NewY, NewZ, CI);
6149 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6168 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6178 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6200 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
6203 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
6208 TypeTagIdx, IsPointer));
6214 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6223 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
6231 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
6254 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
6257 uint32_t Count = 0, Offset = 0;
6265 if (Count < Offset) {
6266 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
6277 diag::err_attribute_patchable_function_entry_invalid_section)
6281 if (Section.empty()) {
6283 diag::err_attribute_patchable_function_entry_invalid_section)
6284 <<
"section must not be empty";
6294 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6312 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6313 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
6324 if (
auto *CRD = dyn_cast<CXXRecordDecl>(D);
6325 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6336 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6342 assert(ParmTSI &&
"no type source info for attribute argument");
6344 diag::err_incomplete_type);
6354 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
6355 if (
const auto *UA = D->
getAttr<UuidAttr>()) {
6358 if (!UA->getGuid().empty()) {
6359 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6365 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
6370 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6375 StringRef OrigStrRef;
6382 StringRef StrRef = OrigStrRef;
6383 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
6384 StrRef = StrRef.drop_front().drop_back();
6387 if (StrRef.size() != 36) {
6388 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6392 for (
unsigned i = 0; i < 36; ++i) {
6393 if (i == 8 || i == 13 || i == 18 || i == 23) {
6394 if (StrRef[i] !=
'-') {
6395 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6399 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6406 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
6407 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
6408 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
6409 for (
unsigned i = 0; i != 8; ++i)
6410 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6421 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
6430 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6445 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
6449 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
6452 if (VD->hasLocalStorage()) {
6453 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
6461 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
6467 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6471 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6472 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6473 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6483 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6484 << AL <<
First << 0;
6485 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6488 if (
const auto *Preexisting = D->
getAttr<MSStructAttr>()) {
6489 if (Preexisting->isImplicit())
6498 if (
First->isImplicit()) {
6501 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6502 << AL <<
First << 0;
6503 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6513 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6517 Tags.push_back(Tag);
6520 if (
const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6521 if (!NS->isInline()) {
6522 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6525 if (NS->isAnonymousNamespace()) {
6526 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6530 Tags.push_back(NS->getName());
6536 Tags.erase(llvm::unique(Tags), Tags.end());
6539 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
6544 if (I->getBTFDeclTag() == Tag)
6563 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
6569 case llvm::Triple::msp430:
6572 case llvm::Triple::mipsel:
6573 case llvm::Triple::mips:
6576 case llvm::Triple::m68k:
6579 case llvm::Triple::x86:
6580 case llvm::Triple::x86_64:
6583 case llvm::Triple::avr:
6586 case llvm::Triple::riscv32:
6587 case llvm::Triple::riscv64:
6588 case llvm::Triple::riscv32be:
6589 case llvm::Triple::riscv64be:
6606 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
6621 if (D->
hasAttr<DLLExportAttr>()) {
6622 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
6626 if (D->
hasAttr<DLLImportAttr>())
6634 if (DLLImportAttr *Import = D->
getAttr<DLLImportAttr>()) {
6635 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6639 if (D->
hasAttr<DLLExportAttr>())
6652 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6662 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6664 MD->getParent()->isLambda()) {
6670 if (
auto *EA = D->
getAttr<ExcludeFromExplicitInstantiationAttr>()) {
6672 diag::warn_dllattr_ignored_exclusion_takes_precedence)
6677 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
6688 if (MSInheritanceAttr *IA = D->
getAttr<MSInheritanceAttr>()) {
6689 if (IA->getInheritanceModel() == Model)
6691 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6693 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
6698 if (RD->hasDefinition()) {
6705 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6709 if (RD->getDescribedClassTemplate()) {
6710 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6728 StringRef N(
"mutex");
6730 if (AL.
getKind() == ParsedAttr::AT_Capability &&
6743 if (!D->
hasAttr<CapabilityAttr>()) {
6744 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_requires_preceded)
6745 << AL << cast<NamedDecl>(D) <<
"'capability'";
6761 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
6817 RequiresCapabilityAttr *RCA = ::new (S.
Context)
6818 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
6824 if (
const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6825 if (NSD->isAnonymousNamespace()) {
6826 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6840 StringRef Str, Replacement;
6853 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6859 if (
const auto *S = dyn_cast<VarDecl>(D))
6860 return S->hasGlobalStorage();
6865 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6866 Sanitizer ==
"memtag";
6873 std::vector<StringRef> Sanitizers;
6875 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6876 StringRef SanitizerName;
6884 SanitizerName !=
"coverage")
6885 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6887 S.
Diag(D->
getLocation(), diag::warn_attribute_type_not_supported_global)
6888 << AL << SanitizerName;
6889 Sanitizers.push_back(SanitizerName);
6893 Sanitizers.size()));
6906 unsigned TranslatedSpellingIndex = 0;
6908 TranslatedSpellingIndex = 1;
6917 StringRef SanitizerName =
"address";
6920 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6924 StringRef SanitizerName =
"thread";
6927 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6931 StringRef SanitizerName =
"memory";
6934 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6949 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6950 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6951 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6956 D->
dropAttr<ZeroCallUsedRegsAttr>();
6972 case ParsedAttr::AT_CountedBy:
6973 CountInBytes =
false;
6976 case ParsedAttr::AT_CountedByOrNull:
6977 CountInBytes =
false;
6980 case ParsedAttr::AT_SizedBy:
6981 CountInBytes =
true;
6984 case ParsedAttr::AT_SizedByOrNull:
6985 CountInBytes =
true;
6989 llvm_unreachable(
"unexpected counted_by family attribute");
6997 FD->
getType(), CountExpr, CountInBytes, OrNull);
7008 FunctionReturnThunksAttr::Kind Kind;
7009 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
7010 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
7017 D->
dropAttr<FunctionReturnThunksAttr>();
7018 D->
addAttr(FunctionReturnThunksAttr::Create(S.
Context, Kind, AL));
7028 auto *VDecl = dyn_cast<VarDecl>(D);
7029 if (VDecl && !VDecl->isFunctionPointerType()) {
7030 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
7044 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
7048 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
7056 "uninitialized is only valid on automatic duration variables");
7067 bool IsKernReturnT =
false;
7068 while (
const auto *TT = T->getAs<
TypedefType>()) {
7069 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
7074 diag::warn_mig_server_routine_does_not_return_kern_return_t);
7084 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
7087 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
7100 if (
const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
7101 if (PVD->getType()->isIntegerType()) {
7102 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
7113template<
typename Attr>
7121template<
typename Attr>
7130 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7135 CFGuardAttr::GuardArg Arg;
7137 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
7138 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
7146template <
typename AttrTy>
7149 auto I = llvm::find_if(Attrs,
7150 [Name](
const AttrTy *A) {
7151 return A->getTCBName() == Name;
7153 return I == Attrs.end() ?
nullptr : *I;
7156template <
typename AttrTy,
typename ConflictingAttrTy>
7163 if (
const ConflictingAttrTy *ConflictingAttr =
7167 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
7181template <
typename AttrTy,
typename ConflictingAttrTy>
7184 StringRef TCBName = AL.getTCBName();
7185 if (
const ConflictingAttrTy *ConflictingAttr =
7187 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
7188 << ConflictingAttr->getAttrName()->getName()
7189 << AL.getAttrName()->getName() << TCBName;
7192 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
7200 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
7209 Decl *D,
const EnforceTCBLeafAttr &AL) {
7219 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7224 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
7229 if (D->
getAttr<VTablePointerAuthenticationAttr>()) {
7230 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
7234 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
7237 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
7239 S.
Diag(IL->
getLoc(), diag::err_invalid_authentication_key)
7243 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
7245 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
7249 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7254 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
7255 AddressDiscriminationMode::DefaultAddressDiscrimination;
7259 if (!VTablePointerAuthenticationAttr::
7260 ConvertStrToAddressDiscriminationMode(
7262 S.
Diag(IL->
getLoc(), diag::err_invalid_address_discrimination)
7266 if (AddressDiversityMode ==
7267 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
7269 S.
Diag(IL->
getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
7273 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7278 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
7279 DefaultExtraDiscrimination;
7283 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
7285 S.
Diag(IL->
getLoc(), diag::err_invalid_extra_discrimination)
7289 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
7291 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
7295 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7300 uint32_t CustomDiscriminationValue = 0;
7301 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
7303 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
7308 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7313 CustomDiscriminationValue)) {
7314 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
7317 }
else if (NumArgs > 3) {
7318 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
7323 S.
Context, AL, KeyType, AddressDiversityMode, ED,
7324 CustomDiscriminationValue));
7331 return Existing->getModularImplFn() == ModularImplFn &&
7332 Existing->getImplName() == ImplName &&
7333 Existing->aspects_size() == Aspects.size() &&
7334 llvm::equal(Existing->aspects(), Aspects);
7340 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7342 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
7343 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
7347 return ::new (
Context) ModularFormatAttr(
Context, CI, ModularImplFn, ImplName,
7348 Aspects.data(), Aspects.size());
7354 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
7362 llvm::DenseSet<StringRef> SeenAspects;
7363 for (
unsigned I = 2, E = AL.
getNumArgs(); I != E; ++I) {
7367 if (!SeenAspects.insert(Aspect).second) {
7369 diag::err_modular_format_duplicate_aspect)
7374 Aspects.push_back(Aspect);
7380 llvm::sort(Aspects);
7383 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7385 S.
Diag(AL.
getLoc(), diag::err_duplicate_attribute) << *Existing;
7386 S.
Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7393 S.
Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7409 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
7410 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7413 if (IsLastAttrArg && AttrHasVariadicArg)
7421 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7433 if (PersonalityAttr *PA = D->
getAttr<PersonalityAttr>()) {
7437 Diag(PA->getLocation(), diag::err_mismatched_personality);
7438 Diag(CI.
getLoc(), diag::note_previous_attribute);
7450 S.
Diag(E->
getExprLoc(), diag::err_attribute_personality_arg_not_function)
7480 S.
Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
7483 S.
Diag(AL.
getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7492 AL.
getKind() == ParsedAttr::AT_NoInline) {
7493 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
7495 if (PVD->hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
7496 S.
Diag(AL.
getLoc(), diag::err_hlsl_attr_incompatible)
7497 <<
"'noinline'" <<
"'groupshared' parameter";
7511 if (MustDelayArgs) {
7521 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
7547 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7556 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
7569 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
7579 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
7590 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
7593 case ParsedAttr::AT_Interrupt:
7596 case ParsedAttr::AT_ARMInterruptSaveFP:
7599 case ParsedAttr::AT_X86ForceAlignArgPointer:
7602 case ParsedAttr::AT_ReadOnlyPlacement:
7605 case ParsedAttr::AT_DLLExport:
7606 case ParsedAttr::AT_DLLImport:
7609 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7612 case ParsedAttr::AT_AMDGPUWavesPerEU:
7615 case ParsedAttr::AT_AMDGPUNumSGPR:
7618 case ParsedAttr::AT_AMDGPUNumVGPR:
7621 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7624 case ParsedAttr::AT_AVRSignal:
7627 case ParsedAttr::AT_BPFPreserveAccessIndex:
7630 case ParsedAttr::AT_BPFPreserveStaticOffset:
7633 case ParsedAttr::AT_BTFDeclTag:
7636 case ParsedAttr::AT_WebAssemblyExportName:
7639 case ParsedAttr::AT_WebAssemblyImportModule:
7642 case ParsedAttr::AT_WebAssemblyImportName:
7645 case ParsedAttr::AT_IBOutlet:
7648 case ParsedAttr::AT_IBOutletCollection:
7651 case ParsedAttr::AT_IFunc:
7654 case ParsedAttr::AT_Alias:
7657 case ParsedAttr::AT_Aligned:
7660 case ParsedAttr::AT_AlignValue:
7663 case ParsedAttr::AT_AllocSize:
7666 case ParsedAttr::AT_AlwaysInline:
7669 case ParsedAttr::AT_AnalyzerNoReturn:
7672 case ParsedAttr::AT_TLSModel:
7675 case ParsedAttr::AT_Annotate:
7678 case ParsedAttr::AT_Availability:
7681 case ParsedAttr::AT_CarriesDependency:
7684 case ParsedAttr::AT_CPUDispatch:
7685 case ParsedAttr::AT_CPUSpecific:
7688 case ParsedAttr::AT_Common:
7691 case ParsedAttr::AT_CUDAConstant:
7694 case ParsedAttr::AT_PassObjectSize:
7697 case ParsedAttr::AT_Constructor:
7700 case ParsedAttr::AT_Deprecated:
7703 case ParsedAttr::AT_Destructor:
7706 case ParsedAttr::AT_EnableIf:
7709 case ParsedAttr::AT_Error:
7712 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7715 case ParsedAttr::AT_DiagnoseIf:
7718 case ParsedAttr::AT_DiagnoseAsBuiltin:
7721 case ParsedAttr::AT_NoBuiltin:
7724 case ParsedAttr::AT_CFIUncheckedCallee:
7727 case ParsedAttr::AT_ExtVectorType:
7730 case ParsedAttr::AT_ExternalSourceSymbol:
7733 case ParsedAttr::AT_MinSize:
7736 case ParsedAttr::AT_OptimizeNone:
7739 case ParsedAttr::AT_EnumExtensibility:
7742 case ParsedAttr::AT_SYCLKernel:
7745 case ParsedAttr::AT_SYCLExternal:
7748 case ParsedAttr::AT_SYCLKernelEntryPoint:
7751 case ParsedAttr::AT_SYCLSpecialClass:
7754 case ParsedAttr::AT_Format:
7757 case ParsedAttr::AT_FormatMatches:
7760 case ParsedAttr::AT_FormatArg:
7763 case ParsedAttr::AT_Callback:
7766 case ParsedAttr::AT_LifetimeCaptureBy:
7769 case ParsedAttr::AT_CalledOnce:
7772 case ParsedAttr::AT_CUDAGlobal:
7775 case ParsedAttr::AT_CUDADevice:
7778 case ParsedAttr::AT_CUDAGridConstant:
7781 case ParsedAttr::AT_HIPManaged:
7784 case ParsedAttr::AT_GNUInline:
7787 case ParsedAttr::AT_CUDALaunchBounds:
7790 case ParsedAttr::AT_CUDAClusterDims:
7793 case ParsedAttr::AT_CUDANoCluster:
7796 case ParsedAttr::AT_Restrict:
7799 case ParsedAttr::AT_MallocSpan:
7802 case ParsedAttr::AT_Mode:
7805 case ParsedAttr::AT_NonString:
7808 case ParsedAttr::AT_NonNull:
7809 if (
auto *PVD = dyn_cast<ParmVarDecl>(D))
7814 case ParsedAttr::AT_ReturnsNonNull:
7817 case ParsedAttr::AT_NoEscape:
7820 case ParsedAttr::AT_MaybeUndef:
7823 case ParsedAttr::AT_AssumeAligned:
7826 case ParsedAttr::AT_AllocAlign:
7829 case ParsedAttr::AT_Ownership:
7832 case ParsedAttr::AT_Naked:
7835 case ParsedAttr::AT_NoReturn:
7838 case ParsedAttr::AT_CXX11NoReturn:
7841 case ParsedAttr::AT_AnyX86NoCfCheck:
7844 case ParsedAttr::AT_NoThrow:
7848 case ParsedAttr::AT_CUDAShared:
7851 case ParsedAttr::AT_VecReturn:
7854 case ParsedAttr::AT_ObjCOwnership:
7857 case ParsedAttr::AT_ObjCPreciseLifetime:
7860 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7863 case ParsedAttr::AT_ObjCRequiresSuper:
7866 case ParsedAttr::AT_ObjCBridge:
7869 case ParsedAttr::AT_ObjCBridgeMutable:
7872 case ParsedAttr::AT_ObjCBridgeRelated:
7875 case ParsedAttr::AT_ObjCDesignatedInitializer:
7878 case ParsedAttr::AT_ObjCRuntimeName:
7881 case ParsedAttr::AT_ObjCBoxable:
7884 case ParsedAttr::AT_NSErrorDomain:
7887 case ParsedAttr::AT_CFConsumed:
7888 case ParsedAttr::AT_NSConsumed:
7889 case ParsedAttr::AT_OSConsumed:
7894 case ParsedAttr::AT_OSReturnsRetainedOnZero:
7897 diag::warn_ns_attribute_wrong_parameter_type,
7900 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
7903 diag::warn_ns_attribute_wrong_parameter_type,
7906 case ParsedAttr::AT_NSReturnsAutoreleased:
7907 case ParsedAttr::AT_NSReturnsNotRetained:
7908 case ParsedAttr::AT_NSReturnsRetained:
7909 case ParsedAttr::AT_CFReturnsNotRetained:
7910 case ParsedAttr::AT_CFReturnsRetained:
7911 case ParsedAttr::AT_OSReturnsNotRetained:
7912 case ParsedAttr::AT_OSReturnsRetained:
7915 case ParsedAttr::AT_WorkGroupSizeHint:
7918 case ParsedAttr::AT_ReqdWorkGroupSize:
7921 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
7924 case ParsedAttr::AT_VecTypeHint:
7927 case ParsedAttr::AT_InitPriority:
7930 case ParsedAttr::AT_Packed:
7933 case ParsedAttr::AT_PreferredName:
7936 case ParsedAttr::AT_NoSpecializations:
7939 case ParsedAttr::AT_Section:
7942 case ParsedAttr::AT_CodeModel:
7945 case ParsedAttr::AT_RandomizeLayout:
7948 case ParsedAttr::AT_NoRandomizeLayout:
7951 case ParsedAttr::AT_CodeSeg:
7954 case ParsedAttr::AT_Target:
7957 case ParsedAttr::AT_TargetVersion:
7960 case ParsedAttr::AT_TargetClones:
7963 case ParsedAttr::AT_MinVectorWidth:
7966 case ParsedAttr::AT_Unavailable:
7969 case ParsedAttr::AT_OMPAssume:
7972 case ParsedAttr::AT_ObjCDirect:
7975 case ParsedAttr::AT_ObjCDirectMembers:
7979 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
7982 case ParsedAttr::AT_Unused:
7985 case ParsedAttr::AT_Visibility:
7988 case ParsedAttr::AT_TypeVisibility:
7991 case ParsedAttr::AT_WarnUnusedResult:
7994 case ParsedAttr::AT_WeakRef:
7997 case ParsedAttr::AT_WeakImport:
8000 case ParsedAttr::AT_TransparentUnion:
8003 case ParsedAttr::AT_ObjCMethodFamily:
8006 case ParsedAttr::AT_ObjCNSObject:
8009 case ParsedAttr::AT_ObjCIndependentClass:
8012 case ParsedAttr::AT_Blocks:
8015 case ParsedAttr::AT_Sentinel:
8018 case ParsedAttr::AT_Cleanup:
8021 case ParsedAttr::AT_NoDebug:
8024 case ParsedAttr::AT_CmseNSEntry:
8027 case ParsedAttr::AT_StdCall:
8028 case ParsedAttr::AT_CDecl:
8029 case ParsedAttr::AT_FastCall:
8030 case ParsedAttr::AT_ThisCall:
8031 case ParsedAttr::AT_Pascal:
8032 case ParsedAttr::AT_RegCall:
8033 case ParsedAttr::AT_SwiftCall:
8034 case ParsedAttr::AT_SwiftAsyncCall:
8035 case ParsedAttr::AT_VectorCall:
8036 case ParsedAttr::AT_MSABI:
8037 case ParsedAttr::AT_SysVABI:
8038 case ParsedAttr::AT_Pcs:
8039 case ParsedAttr::AT_IntelOclBicc:
8040 case ParsedAttr::AT_PreserveMost:
8041 case ParsedAttr::AT_PreserveAll:
8042 case ParsedAttr::AT_AArch64VectorPcs:
8043 case ParsedAttr::AT_AArch64SVEPcs:
8044 case ParsedAttr::AT_M68kRTD:
8045 case ParsedAttr::AT_PreserveNone:
8046 case ParsedAttr::AT_RISCVVectorCC:
8047 case ParsedAttr::AT_RISCVVLSCC:
8050 case ParsedAttr::AT_DeviceKernel:
8053 case ParsedAttr::AT_Suppress:
8056 case ParsedAttr::AT_Owner:
8057 case ParsedAttr::AT_Pointer:
8060 case ParsedAttr::AT_OpenCLAccess:
8063 case ParsedAttr::AT_OpenCLNoSVM:
8066 case ParsedAttr::AT_SwiftContext:
8069 case ParsedAttr::AT_SwiftAsyncContext:
8072 case ParsedAttr::AT_SwiftErrorResult:
8075 case ParsedAttr::AT_SwiftIndirectResult:
8078 case ParsedAttr::AT_InternalLinkage:
8081 case ParsedAttr::AT_ZeroCallUsedRegs:
8084 case ParsedAttr::AT_FunctionReturnThunks:
8087 case ParsedAttr::AT_NoMerge:
8090 case ParsedAttr::AT_NoUniqueAddress:
8094 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
8098 case ParsedAttr::AT_CountedBy:
8099 case ParsedAttr::AT_CountedByOrNull:
8100 case ParsedAttr::AT_SizedBy:
8101 case ParsedAttr::AT_SizedByOrNull:
8105 case ParsedAttr::AT_NoFieldProtection:
8109 case ParsedAttr::AT_Personality:
8114 case ParsedAttr::AT_LayoutVersion:
8117 case ParsedAttr::AT_Uuid:
8120 case ParsedAttr::AT_MSInheritance:
8123 case ParsedAttr::AT_Thread:
8126 case ParsedAttr::AT_MSConstexpr:
8129 case ParsedAttr::AT_HybridPatchable:
8134 case ParsedAttr::AT_RootSignature:
8137 case ParsedAttr::AT_HLSLNumThreads:
8140 case ParsedAttr::AT_HLSLWaveSize:
8143 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
8146 case ParsedAttr::AT_HLSLVkExtBuiltinOutput:
8149 case ParsedAttr::AT_HLSLVkPushConstant:
8152 case ParsedAttr::AT_HLSLVkConstantId:
8155 case ParsedAttr::AT_HLSLVkBinding:
8158 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
8161 case ParsedAttr::AT_HLSLPackOffset:
8164 case ParsedAttr::AT_HLSLShader:
8167 case ParsedAttr::AT_HLSLResourceBinding:
8170 case ParsedAttr::AT_HLSLParamModifier:
8173 case ParsedAttr::AT_HLSLMatrixLayout:
8176 case ParsedAttr::AT_HLSLUnparsedSemantic:
8179 case ParsedAttr::AT_HLSLVkLocation:
8183 case ParsedAttr::AT_AbiTag:
8186 case ParsedAttr::AT_CFGuard:
8191 case ParsedAttr::AT_PtGuardedVar:
8194 case ParsedAttr::AT_NoSanitize:
8197 case ParsedAttr::AT_NoSanitizeAddress:
8200 case ParsedAttr::AT_NoSanitizeThread:
8203 case ParsedAttr::AT_NoSanitizeMemory:
8206 case ParsedAttr::AT_GuardedBy:
8209 case ParsedAttr::AT_PtGuardedBy:
8212 case ParsedAttr::AT_LockReturned:
8215 case ParsedAttr::AT_LocksExcluded:
8218 case ParsedAttr::AT_AcquiredBefore:
8221 case ParsedAttr::AT_AcquiredAfter:
8226 case ParsedAttr::AT_Capability:
8227 case ParsedAttr::AT_Lockable:
8230 case ParsedAttr::AT_ReentrantCapability:
8233 case ParsedAttr::AT_RequiresCapability:
8237 case ParsedAttr::AT_AssertCapability:
8240 case ParsedAttr::AT_AcquireCapability:
8243 case ParsedAttr::AT_ReleaseCapability:
8246 case ParsedAttr::AT_TryAcquireCapability:
8251 case ParsedAttr::AT_Consumable:
8254 case ParsedAttr::AT_CallableWhen:
8257 case ParsedAttr::AT_ParamTypestate:
8260 case ParsedAttr::AT_ReturnTypestate:
8263 case ParsedAttr::AT_SetTypestate:
8266 case ParsedAttr::AT_TestTypestate:
8271 case ParsedAttr::AT_ArgumentWithTypeTag:
8274 case ParsedAttr::AT_TypeTagForDatatype:
8279 case ParsedAttr::AT_SwiftAsyncName:
8282 case ParsedAttr::AT_SwiftAttr:
8285 case ParsedAttr::AT_SwiftBridge:
8288 case ParsedAttr::AT_SwiftError:
8291 case ParsedAttr::AT_SwiftName:
8294 case ParsedAttr::AT_SwiftNewType:
8297 case ParsedAttr::AT_SwiftAsync:
8300 case ParsedAttr::AT_SwiftAsyncError:
8305 case ParsedAttr::AT_XRayLogArgs:
8309 case ParsedAttr::AT_PatchableFunctionEntry:
8313 case ParsedAttr::AT_AlwaysDestroy:
8314 case ParsedAttr::AT_NoDestroy:
8318 case ParsedAttr::AT_Uninitialized:
8322 case ParsedAttr::AT_ObjCExternallyRetained:
8326 case ParsedAttr::AT_MIGServerRoutine:
8330 case ParsedAttr::AT_MSAllocator:
8334 case ParsedAttr::AT_ArmBuiltinAlias:
8338 case ParsedAttr::AT_ArmLocallyStreaming:
8342 case ParsedAttr::AT_ArmNew:
8346 case ParsedAttr::AT_AcquireHandle:
8350 case ParsedAttr::AT_ReleaseHandle:
8354 case ParsedAttr::AT_UnsafeBufferUsage:
8358 case ParsedAttr::AT_UseHandle:
8362 case ParsedAttr::AT_EnforceTCB:
8366 case ParsedAttr::AT_EnforceTCBLeaf:
8370 case ParsedAttr::AT_BuiltinAlias:
8374 case ParsedAttr::AT_PreferredType:
8378 case ParsedAttr::AT_UsingIfExists:
8382 case ParsedAttr::AT_TypeNullable:
8386 case ParsedAttr::AT_VTablePointerAuthentication:
8390 case ParsedAttr::AT_ModularFormat:
8394 case ParsedAttr::AT_MSStruct:
8398 case ParsedAttr::AT_GCCStruct:
8402 case ParsedAttr::AT_PointerFieldProtection:
8405 diag::err_attribute_pointer_field_protection_experimental)
8414 return D->
hasAttr<DeviceKernelAttr>() ||
8422 if (AttrList.
empty())
8433 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8443 if (!(D->
hasAttr<DeviceKernelAttr>() ||
8444 (D->
hasAttr<CUDAGlobalAttr>() &&
8445 Context.getTargetInfo().getTriple().isSPIRV()))) {
8447 if (
const auto *A = D->
getAttr<ReqdWorkGroupSizeAttr>()) {
8452 }
else if (
const auto *A = D->
getAttr<WorkGroupSizeHintAttr>()) {
8455 }
else if (
const auto *A = D->
getAttr<VecTypeHintAttr>()) {
8458 }
else if (
const auto *A = D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8464 if (
const auto *A = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8468 }
else if (
const auto *A = D->
getAttr<AMDGPUWavesPerEUAttr>()) {
8472 }
else if (
const auto *A = D->
getAttr<AMDGPUNumSGPRAttr>()) {
8476 }
else if (
const auto *A = D->
getAttr<AMDGPUNumVGPRAttr>()) {
8493 if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8494 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8495 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8496 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8498 if (HasGlobal || HasHost != HasDevice) {
8499 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8500 Guide->setInvalidDecl();
8501 }
else if (HasHost && HasDevice) {
8502 Diag(Guide->getLocation(),
8503 diag::warn_deduction_guide_target_attr_deprecated);
8509 (D->
hasAttr<ConstructorAttr>() || D->
hasAttr<DestructorAttr>()) &&
8512 << (D->
hasAttr<ConstructorAttr>() ?
"constructors" :
"destructors");
8521 if (D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
8524 D->
dropAttr<ObjCDesignatedInitializerAttr>();
8531 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8538 if (D && D->
hasAttr<BPFPreserveAccessIndexAttr>())
8545 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8549 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8561 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8569 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8586 std::optional<StringRef> CorrectedScopeName =
8588 if (CorrectedScopeName) {
8589 ScopeName = *CorrectedScopeName;
8595 if (CorrectedAttrName) {
8596 AttrName = *CorrectedAttrName;
8599 if (CorrectedScopeName || CorrectedAttrName) {
8600 std::string CorrectedFullName =
8604 diag::warn_unknown_attribute_ignored_suggestion);
8606 D << AL << CorrectedFullName;
8611 if (CorrectedScopeName) {
8615 if (CorrectedAttrName) {
8620 Diag(NR.
getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8628 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
8650 for (
const auto &AI : FT->param_types()) {
8652 Param->setScopeInfo(0, Params.size());
8653 Params.push_back(Param);
8655 NewFD->setParams(Params);
8657 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
8659 VD->getInnerLocStart(), VD->getLocation(), II,
8660 VD->getType(), VD->getTypeSourceInfo(),
8661 VD->getStorageClass());
8662 if (VD->getQualifier())
8663 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8696 if (
auto *VD = dyn_cast<VarDecl>(D))
8697 if (VD->isExternC())
8699 if (
auto *FD = dyn_cast<FunctionDecl>(D))
8707 auto &WeakInfos = I->second;
8708 for (
const auto &W : WeakInfos)
8710 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
8711 WeakInfos.swap(EmptyWeakInfos);
8723 auto ProcessAttributesWithSliding =
8731 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8732 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8737 AL.diagnoseAppertainsTo(*
this, D);
8752 .WithIncludeCXX11Attributes(
false)
8753 .WithIgnoreTypeAttributes(
true));
8762 .WithIncludeCXX11Attributes(
false)
8763 .WithIgnoreTypeAttributes(
true));
8781 UnavailableAttr::ImplicitReason &reason) {
8795 if (
diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8796 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8797 reason = UnavailableAttr::IR_ForbiddenWeak;
8806 reason = UnavailableAttr::IR_ARCForbiddenType;
8816 auto Reason = UnavailableAttr::IR_None;
8818 assert(Reason &&
"didn't set reason?");
8823 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
8826 if (FD->
hasAttr<UnavailableAttr>() &&
8828 diag::err_arc_array_param_no_ownership) {
8859 bool AnyAccessFailures =
false;
8867 switch (
diag.Kind) {
8871 if (!
decl->isInvalidDecl())
8883 AnyAccessFailures =
true;
8896 assert(curPool &&
"re-emitting in undelayed context not supported");
8897 curPool->
steal(pool);
8914 QualType ParamTy = FD->getParamDecl(0)->getType();
8916 FD->getParamDecl(0)->getLocation(), ParamTy, Ty))) {
8917 this->
Diag(Attr->getArgLoc(),
8918 diag::err_attribute_cleanup_func_arg_incompatible_type)
8919 << NI.
getName() << ParamTy << Ty;
8927 if (this->
Context.getAsArrayType(T))
8928 T = this->
Context.getBaseElementType(T);
8929 if (!T->isRecordType()) {
8930 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)
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...
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ AP_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute.
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
@ AP_PragmaClangAttribute_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute that was applied ...
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc, StringRef Platform)
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
Create an CUDALaunchBoundsAttr attribute.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
LifetimeCaptureByAttr * ParseLifetimeCaptureByAttr(const ParsedAttr &AL, StringRef ParamName)
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
bool isBeingDefined() const
Return true if this decl is currently being defined.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
bool isTLSSupported() const
Whether the target supports thread-local storage.
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this target.
virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const
virtual bool hasProtectedVisibility() const
Does this target support "protected" visibility?
virtual unsigned getUnwindWordWidth() const
unsigned getCharWidth() const
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
const llvm::VersionTuple & getSDKVersion() const
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Base wrapper for a particular "section" of type source info.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
bool isBlockPointerType() const
bool isBooleanType() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isVectorType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isFloatingType() const
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
Base class for declarations which introduce a typedef-name.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
@ TLS_None
Not a TLS variable.
Represents a GCC generic vector type.
Captures information about a #pragma weak directive.
const IdentifierInfo * getAlias() const
SourceLocation getLocation() const
A collection of diagnostics which were delayed.
const DelayedDiagnosticPool * getParent() const
void steal(DelayedDiagnosticPool &pool)
Steal the diagnostics from the given pool.
pool_iterator pool_end() const
SmallVectorImpl< DelayedDiagnostic >::const_iterator pool_iterator
pool_iterator pool_begin() const
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
QualType getForbiddenTypeOperand() const
unsigned getForbiddenTypeDiagnostic() const
The diagnostic ID to emit.
unsigned getForbiddenTypeArgument() const
Defines the clang::TargetInfo interface.
Enums for the diagnostics of target, target_version and target_clones.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
bool isa(CodeGen::Address addr)
@ ExpectedFunctionMethodOrBlock
@ ExpectedTypeOrNamespace
@ ExpectedVariableFieldOrTag
@ ExpectedVariableOrField
@ ExpectedFunctionOrMethod
@ ExpectedFunctionOrClassOrEnum
@ ExpectedVariableOrFunction
@ ExpectedFunctionVariableOrClass
@ ExpectedNonMemberFunction
void handleSimpleAttributeOrDiagnose(SemaBase &S, Decl *D, const AttributeCommonInfo &CI, bool PassesCheck, unsigned DiagID, DiagnosticArgs &&...ExtraArgs)
Add an attribute AttrType to declaration D, provided that PassesCheck is true.
bool hasDeclarator(const Decl *D)
Return true if the given decl has a declarator that should have been processed by Sema::GetTypeForDec...
QualType getFunctionOrMethodResultType(const Decl *D)
@ OK_Ordinary
An ordinary object is located at an address in memory.
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
CudaVersion ToCudaVersion(llvm::VersionTuple)
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool checkAttrMutualExclusion(SemaBase &S, Decl *D, const ParsedAttr &AL)
Diagnose mutually exclusive attributes when present on a given declaration.
void inferNoReturnAttr(Sema &S, Decl *D)
SourceRange getFunctionOrMethodResultSourceRange(const Decl *D)
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
QualType getFunctionOrMethodParamType(const Decl *D, unsigned Idx)
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Language
The language for the input, used to select and validate the language standard and possible actions.
AttributeArgumentNType
These constants match the enumerated choices of err_attribute_argument_n_type and err_attribute_argum...
@ AANT_ArgumentIntegerConstant
@ AANT_ArgumentBuiltinFunction
@ AANT_ArgumentIdentifier
@ SD_Automatic
Automatic storage duration (most local variables).
bool isLambdaCallOperator(const CXXMethodDecl *MD)
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