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/NVPTXTargetParser.h"
76#include "llvm/TargetParser/Triple.h"
102template <
typename AttrInfo>
104 int &Val,
unsigned Idx =
UINT_MAX) {
109 if (UVal > (
uint32_t)std::numeric_limits<int>::max()) {
113 <<
toString(I, 10,
false) << 32 << 0;
122 const Expr *E, StringRef &Str,
128 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
134 Str = Literal->getString();
144 Diag(Loc->
getLoc(), diag::err_attribute_argument_type)
150 *ArgLocation = Loc->
getLoc();
160 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
165 Str = Literal->getString();
186 bool foundStarOperator = IsOverloadedOperatorPresent(
Record, OO_Star);
187 bool foundArrowOperator = IsOverloadedOperatorPresent(
Record, OO_Arrow);
188 if (foundStarOperator && foundArrowOperator)
195 for (
const auto &BaseSpecifier : CXXRecord->bases()) {
196 if (!foundStarOperator)
197 foundStarOperator = IsOverloadedOperatorPresent(
198 BaseSpecifier.getType()->getAsRecordDecl(), OO_Star);
199 if (!foundArrowOperator)
200 foundArrowOperator = IsOverloadedOperatorPresent(
201 BaseSpecifier.getType()->getAsRecordDecl(), OO_Arrow);
204 if (foundStarOperator && foundArrowOperator)
224 if (!RD->isCompleteDefinition())
231 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_pointer) << AL << QT;
243 return PT->getPointeeType()->getAsRecordDecl();
248template <
typename AttrType>
255 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(RD)) {
257 return !Base->hasAttr<AttrType>();
271 if (!RD->isCompleteDefinition())
289 if (!RD->isCompleteDefinition())
304 return TN->
hasAttr<CapabilityAttr>();
323 if (
const auto *E = dyn_cast<CastExpr>(Ex))
325 else if (
const auto *E = dyn_cast<ParenExpr>(Ex))
327 else if (
const auto *E = dyn_cast<UnaryOperator>(Ex)) {
328 if (E->getOpcode() == UO_LNot || E->getOpcode() == UO_AddrOf ||
329 E->getOpcode() == UO_Deref)
332 }
else if (
const auto *E = dyn_cast<BinaryOperator>(Ex)) {
333 if (E->getOpcode() == BO_LAnd || E->getOpcode() == BO_LOr)
351 bool ParamIdxOk =
false) {
356 const auto *MD = dyn_cast<const CXXMethodDecl>(D);
357 if (MD && !MD->isStatic()) {
363 diag::warn_thread_attribute_not_on_capability_member)
364 << AL << MD->getParent();
366 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_non_static_member)
371 for (
unsigned Idx = Sidx; Idx < AL.
getNumArgs(); ++Idx) {
376 Args.push_back(ArgExp);
380 if (
const auto *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
381 if (StrLit->getLength() == 0 ||
382 (StrLit->isOrdinary() && StrLit->getString() ==
"*")) {
385 Args.push_back(ArgExp);
391 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_ignored) << AL;
392 Args.push_back(ArgExp);
400 if (
const auto *UOp = dyn_cast<UnaryOperator>(ArgExp))
401 if (UOp->getOpcode() == UO_AddrOf)
402 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
403 if (DRE->getDecl()->isCXXInstanceMember())
404 ArgTy = DRE->getDecl()->getType();
410 if (!RD && ParamIdxOk) {
411 const auto *FD = dyn_cast<FunctionDecl>(D);
412 const auto *IL = dyn_cast<IntegerLiteral>(ArgExp);
414 unsigned int NumParams = FD->getNumParams();
415 llvm::APInt ArgValue = IL->getValue();
416 uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
417 uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
418 if (!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
420 diag::err_attribute_argument_out_of_bounds_extra_info)
421 << AL << Idx + 1 << NumParams;
424 ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
433 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_argument_not_lockable)
436 Args.push_back(ArgExp);
444 T =
T.getNonReferenceType();
445 return T->isDependentType() ||
T->isFunctionPointerType() ||
455 S.
Diag(A.
getLoc(), diag::warn_thread_attribute_not_on_fun_ptr)
456 << A << (isa<FieldDecl>(VD) ? 1 : 0);
470 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
476 bool CheckParmVar =
false) {
477 const auto *VD = dyn_cast<ValueDecl>(D);
482 if (
const auto *PVD = dyn_cast<ParmVarDecl>(VD)) {
494 if (!
isa<AssertCapabilityAttr, AcquireCapabilityAttr,
495 TryAcquireCapabilityAttr, ReleaseCapabilityAttr,
496 RequiresCapabilityAttr, LocksExcludedAttr>(A))
499 const auto *VD = dyn_cast<ValueDecl>(D);
505 if (
const auto *PVD = dyn_cast<ParmVarDecl>(VD)) {
534 return !Args.empty();
543 GuardedByAttr(S.
Context, AL, Args.data(), Args.size()));
555 PtGuardedByAttr(S.
Context, AL, Args.data(), Args.size()));
566 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
583 Expr **StartArg = &Args[0];
585 AcquiredAfterAttr(S.
Context, AL, StartArg, Args.size()));
593 Expr **StartArg = &Args[0];
595 AcquiredBeforeAttr(S.
Context, AL, StartArg, Args.size()));
612template <
typename AttrInfo>
614 unsigned AttrArgNo) {
615 assert(AI.isArgExpr(AttrArgNo) &&
"Expected expression argument");
616 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
625 S.
Diag(SrcLoc, diag::err_attribute_integers_only)
640 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only) << AL;
651 ParamIdx SizeArgNo(SizeArgNoVal, D);
666 AllocSizeAttr(S.
Context, AL, SizeArgNo, NumberArgNo));
675 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
690 unsigned Size = Args.size();
707 unsigned Size = Args.size();
710 Expr **StartArg = &Args[0];
713 LocksExcludedAttr(S.
Context, AL, StartArg, Size));
717 Expr *&Cond, StringRef &Msg) {
723 Cond = Converted.
get();
730 Msg =
"<no message provided>";
736 S.
Diag(AL.
getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
738 S.
Diag(PDiag.first, PDiag.second);
745 S.
Diag(AL.
getLoc(), diag::ext_clang_enable_if);
754 StringRef NewUserDiagnostic;
766 if (
const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
768 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
774 S.
Diag(DA->getLoc(), diag::warn_dllattr_ignored_exclusion_takes_precedence)
776 D->
dropAttrs<DLLExportAttr, DLLImportAttr>();
780 ExcludeFromExplicitInstantiationAttr(S.
Context, AL));
788 const CXXRecordDecl *ClassType;
790 llvm::SmallPtrSet<const ParmVarDecl *, 16> Parms;
794 ArgumentDependenceChecker(
const FunctionDecl *FD) {
796 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
804 bool referencesArgs(Expr *E) {
810 bool VisitCXXThisExpr(CXXThisExpr *E)
override {
812 "`this` doesn't refer to the enclosing class?");
817 bool VisitDeclRefExpr(DeclRefExpr *DRE)
override {
818 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DRE->
getDecl()))
819 if (Parms.count(PVD)) {
832 if (
const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
833 if (!MethodDecl->isStatic()) {
834 S.
Diag(AL.
getLoc(), diag::err_attribute_no_member_function) << AL;
841 if (
auto *E = dyn_cast<Expr *>(
Union))
842 return E->getBeginLoc();
846 S.
Diag(Loc, diag::err_attribute_argument_n_type) << AL << Index <<
T;
852 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.
getArgAsExpr(0));
855 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
864 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments_for)
871 for (
unsigned I = 1; I < AL.
getNumArgs(); ++I) {
883 if (Index > DeclFD->getNumParams()) {
884 S.
Diag(AL.
getLoc(), diag::err_attribute_bounds_for_function)
885 << AL << Index << DeclFD << DeclFD->getNumParams();
890 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
895 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
899 Indices.push_back(Index - 1);
903 S.
Context, AL, AttrFD, Indices.data(), Indices.size()));
907 S.
Diag(AL.
getLoc(), diag::ext_clang_diagnose_if);
914 StringRef DefaultSevStr;
918 DiagnoseIfAttr::DefaultSeverity DefaultSev;
919 if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
921 diag::err_diagnose_if_invalid_diagnostic_type);
925 StringRef WarningGroup;
929 if (WarningGroup.empty() ||
933 diag::err_diagnose_if_unknown_warning)
939 bool ArgDependent =
false;
940 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
941 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(Cond);
943 S.
Context, AL, Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
953 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
963 static constexpr const StringRef kWildcard =
"*";
966 bool HasWildcard =
false;
968 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
969 if (Name == kWildcard)
971 Names.push_back(Name);
975 if (
const auto *NBA = D->
getAttr<NoBuiltinAttr>())
976 for (StringRef BuiltinName : NBA->builtinNames())
977 AddBuiltinName(BuiltinName);
981 AddBuiltinName(kWildcard);
983 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
984 StringRef BuiltinName;
990 AddBuiltinName(BuiltinName);
992 S.
Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
993 << BuiltinName << AL;
998 Names.erase(llvm::unique(Names), Names.end());
1001 if (HasWildcard && Names.size() > 1)
1003 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
1006 if (D->
hasAttr<NoBuiltinAttr>())
1009 NoBuiltinAttr(S.
Context, AL, Names.data(), Names.size()));
1013 if (D->
hasAttr<PassObjectSizeAttr>()) {
1014 S.
Diag(D->
getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
1037 S.
Diag(D->
getBeginLoc(), diag::err_attribute_pointers_only) << AL << 1;
1045 ConsumableAttr::ConsumedState DefaultState;
1049 if (!ConsumableAttr::ConvertStrToConsumedState(
1051 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1056 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1069 if (!RD->hasAttr<ConsumableAttr>()) {
1070 S.
Diag(AL.
getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1087 for (
unsigned ArgIndex = 0; ArgIndex < AL.
getNumArgs(); ++ArgIndex) {
1088 CallableWhenAttr::ConsumedState CallableState;
1090 StringRef StateString;
1101 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1103 S.
Diag(Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1107 States.push_back(CallableState);
1111 CallableWhenAttr(S.
Context, AL, States.data(), States.size()));
1115 ParamTypestateAttr::ConsumedState ParamState;
1121 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1123 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1124 << AL << StateString;
1128 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1149 ReturnTypestateAttr::ConsumedState ReturnState;
1153 if (!ReturnTypestateAttr::ConvertStrToConsumedState(
1155 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1160 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1197 SetTypestateAttr::ConsumedState NewState;
1201 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1202 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1207 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1219 TestTypestateAttr::ConsumedState TestState;
1223 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1224 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1229 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1244 if (
auto *TD = dyn_cast<TagDecl>(D))
1246 else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
1247 bool BitfieldByteAligned = (!FD->
getType()->isDependentType() &&
1253 if (BitfieldByteAligned)
1255 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1261 if (BitfieldByteAligned)
1262 S.
Diag(AL.
getLoc(), diag::warn_attribute_packed_for_bitfield);
1268 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
1274 assert(CTD &&
"attribute does not appertain to this declaration");
1282 if (!
T.hasQualifiers() &&
T->isTypedefNameType()) {
1285 if (
const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1286 T->getAsCXXRecordDecl())) {
1287 Template = CTSD->getSpecializedTemplate();
1288 }
else if (
const auto *TST =
T->getAs<TemplateSpecializationType>()) {
1289 while (TST && TST->isTypeAlias())
1290 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1292 Template = TST->getTemplateName().getAsTemplateDecl();
1301 S.
Diag(AL.
getLoc(), diag::err_attribute_not_typedef_for_specialization)
1304 S.
Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1313 NoSpecializationsAttr::Create(S.
Context, Message, AL));
1317 if (
T->isDependentType())
1320 if (
T->isReferenceType())
1323 T =
T.getNonReferenceType();
1328 if (
const RecordType *UT =
T->getAsUnionType()) {
1330 if (UD->
hasAttr<TransparentUnionAttr>()) {
1331 for (
const auto *I : UD->
fields()) {
1339 return T->isAnyPointerType() ||
T->isBlockPointerType();
1345 bool isReturnValue =
false) {
1348 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1349 << AL << AttrParmRange << TypeRange;
1351 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1352 << AL << AttrParmRange << TypeRange << 0;
1360 for (
unsigned I = 0; I < AL.
getNumArgs(); ++I) {
1364 D, AL, I + 1, Ex, Idx,
1377 NonNullArgs.push_back(Idx);
1388 I != E && !AnyPointers; ++I) {
1395 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_no_pointers);
1398 ParamIdx *Start = NonNullArgs.data();
1399 unsigned Size = NonNullArgs.size();
1400 llvm::array_pod_sort(Start, Start + Size);
1410 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1441 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1466 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1472 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1475 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1478 Diag(AttrLoc, diag::err_attribute_argument_type)
1483 if (!I->isPowerOf2()) {
1484 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1490 Diag(CI.
getLoc(), diag::warn_assume_aligned_too_great)
1495 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1509 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1533 if (AttrName.size() > 4 && AttrName.starts_with(
"__") &&
1534 AttrName.ends_with(
"__")) {
1535 AttrName = AttrName.drop_front(2).drop_back(2);
1551 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1557 OwnershipAttr::OwnershipKind K =
1558 OwnershipAttr(S.
Context, AL,
nullptr,
nullptr, 0).getOwnKind();
1562 case OwnershipAttr::Takes:
1563 case OwnershipAttr::Holds:
1565 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1569 case OwnershipAttr::Returns:
1571 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 2;
1579 if (K == OwnershipAttr::Returns &&
1581 S.
Diag(AL.
getLoc(), diag::err_ownership_takes_return_type) << AL;
1587 StringRef ModuleName =
Module->getName();
1594 if (K == OwnershipAttr::Returns && AL.
getNumArgs() == 1) {
1596 if (I->getOwnKind() == OwnershipAttr::Returns && I->args_size() > 0) {
1597 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1598 << I->args_begin()->getSourceIndex() << 0;
1599 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1607 for (
unsigned i = 1; i < AL.
getNumArgs(); ++i) {
1617 case OwnershipAttr::Takes:
1618 case OwnershipAttr::Holds:
1619 if (!
T->isAnyPointerType() && !
T->isBlockPointerType())
1622 case OwnershipAttr::Returns:
1623 if (!
T->isIntegerType())
1628 S.
Diag(AL.
getLoc(), diag::err_ownership_type) << AL << Err
1637 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1638 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1641 I->isRegularKeywordAttribute());
1645 if (K == OwnershipAttr::Returns &&
1646 I->getOwnKind() == OwnershipAttr::Returns) {
1647 bool IHasArgs = I->args_size() > 0;
1649 if (!IHasArgs || !llvm::is_contained(I->args(), Idx)) {
1650 unsigned IIdx = IHasArgs ? I->args_begin()->getSourceIndex() : 0;
1652 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1653 << IIdx << (IHasArgs ? 0 : 1);
1655 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1659 }
else if (K == OwnershipAttr::Takes &&
1660 I->getOwnKind() == OwnershipAttr::Takes) {
1661 if (I->getModule()->getName() != ModuleName) {
1662 S.
Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1663 << I->getModule()->getName();
1664 S.
Diag(AL.
getLoc(), diag::note_ownership_takes_class_mismatch)
1671 OwnershipArgs.push_back(Idx);
1674 ParamIdx *Start = OwnershipArgs.data();
1675 unsigned Size = OwnershipArgs.size();
1676 llvm::array_pod_sort(Start, Start + Size);
1684 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1700 S.
Diag(AL.
getLoc(), diag::err_attribute_weakref_not_global_context)
1745 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1747 Demangled.reset(llvm::itaniumDemangle(Str,
false));
1758 if (MC->shouldMangleDeclName(ND)) {
1759 llvm::raw_svector_ostream Out(Name);
1763 Name = ND->getIdentifier()->getName();
1779 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 1;
1793 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_darwin);
1801 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_nvptx);
1805 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
1807 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 0;
1812 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1813 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << VD << 0;
1830 if (Model !=
"global-dynamic" && Model !=
"local-dynamic"
1831 && Model !=
"initial-exec" && Model !=
"local-exec") {
1832 S.
Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1842 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1854 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
1864 if (
auto *DRE = dyn_cast<DeclRefExpr>(DeallocE)) {
1865 DeallocFD = dyn_cast<FunctionDecl>(DRE->
getDecl());
1868 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1872 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(DeallocE)) {
1874 DeallocNI = ULE->getNameInfo();
1876 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1883 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function) << 0;
1891 DeallocPtrIdx =
ParamIdx(1, DeallocFD);
1902 diag::err_attribute_malloc_arg_not_function_with_pointer_arg)
1916 diag::err_attribute_malloc_arg_refers_to_non_pointer_type)
1925 S.
Diag(AL.
getLoc(), diag::warn_attribute_form_ignored) << AL;
1927 RestrictAttr(S.
Context, AL, DeallocE, DeallocPtrIdx));
1936 auto emitWarning = [
this, &CI](
unsigned NoteDiagID) {
1937 Diag(CI.
getLoc(), diag::warn_attribute_return_span_only) << CI;
1944 return emitWarning(diag::note_returned_incomplete_type);
1947 return emitWarning(diag::note_returned_not_struct);
1948 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1949 if (CXXRD->getNumBases() > 0) {
1950 return emitWarning(diag::note_type_inherits_from_base);
1954 auto FieldsCount = std::distance(FieldsBegin, RD->
field_end());
1955 if (FieldsCount != 2)
1956 return emitWarning(diag::note_returned_not_two_field_struct) << FieldsCount;
1957 QualType FirstFieldType = FieldsBegin->getType();
1958 QualType SecondFieldType = std::next(FieldsBegin)->getType();
1959 auto validatePointerType = [](
const QualType &
T) {
1961 return T->isPointerType() && !
T->isFunctionPointerType();
1963 auto checkIntegerType = [
this, emitWarning](
const QualType &
T,
1964 const int FieldNo) ->
bool {
1965 const auto *BT = dyn_cast<BuiltinType>(
T.getCanonicalType());
1966 if (!BT || !BT->isInteger())
1967 return emitWarning(diag::note_returned_not_integer_field) << FieldNo;
1969 if (
Context.getTypeSize(BT) < IntSize)
1970 return emitWarning(diag::note_returned_not_wide_enough_field)
1971 << FieldNo << IntSize;
1974 if (validatePointerType(FirstFieldType) &&
1975 validatePointerType(SecondFieldType)) {
1978 }
else if (validatePointerType(FirstFieldType)) {
1980 return checkIntegerType(SecondFieldType, 2);
1981 }
else if (validatePointerType(SecondFieldType)) {
1983 return checkIntegerType(FirstFieldType, 1);
1985 return emitWarning(diag::note_returned_not_span_struct);
2001 if (
const auto *
Other = D->
getAttr<CPUDispatchAttr>()) {
2002 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
2003 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
2006 }
else if (AL.
getParsedKind() == ParsedAttr::AT_CPUSpecific) {
2010 if (
const auto *
Other = D->
getAttr<CPUSpecificAttr>()) {
2011 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
2012 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
2019 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2020 if (MD->getParent()->isLambda()) {
2021 S.
Diag(AL.
getLoc(), diag::err_attribute_dll_lambda) << AL;
2032 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2041 S.
Diag(CPUArg->
getLoc(), diag::err_invalid_cpu_specific_dispatch_value)
2042 << CPUName << (AL.
getKind() == ParsedAttr::AT_CPUDispatch);
2048 return Target.CPUSpecificManglingCharacter(CPUName) ==
2051 S.
Diag(AL.
getLoc(), diag::warn_multiversion_duplicate_entries);
2058 if (AL.
getKind() == ParsedAttr::AT_CPUSpecific)
2060 CPUSpecificAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
2063 CPUDispatchAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
2068 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
2079 const auto &
Arch = Triple.getArch();
2080 if (
Arch != llvm::Triple::x86 &&
2081 (
Arch != llvm::Triple::arm &&
Arch != llvm::Triple::thumb)) {
2082 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_on_arch)
2083 << AL << Triple.getArchName();
2090 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
2107 const Stmt *OnlyStmt =
nullptr;
2109 if (
const auto *Compound = dyn_cast<CompoundStmt>(Body)) {
2110 if (Compound->size() != 1)
2112 OnlyStmt = *Compound->body_begin();
2118 if (
const auto *EWC = dyn_cast<ExprWithCleanups>(OnlyStmt)) {
2119 OnlyStmt = EWC->getSubExpr();
2123 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2124 if (MD && MD->isVirtual()) {
2125 const auto *RD = MD->getParent();
2126 return MD->hasAttr<FinalAttr>() || (RD && RD->isEffectivelyFinal());
2134 auto *FD = dyn_cast<FunctionDecl>(D);
2155 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2169 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
2195 S.
Diag(Attrs.
getLoc(), diag::warn_nocf_check_attribute_ignored);
2213 Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
2232 ? diag::err_attribute_wrong_decl_type
2233 : diag::warn_attribute_wrong_decl_type)
2269 if (VecReturnAttr *A = D->
getAttr<VecReturnAttr>()) {
2270 S.
Diag(AL.
getLoc(), diag::err_repeat_attribute) << A;
2278 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2283 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2287 for (
const auto *I : R->fields()) {
2288 if ((count == 1) || !I->getType()->isVectorType()) {
2289 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2304 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2319 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2329 APValue(llvm::APSInt::getUnsigned(priority)));
2337 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
2356template <
typename AttrTy>
2368 VersionTuple Introduced,
2369 VersionTuple Deprecated,
2370 VersionTuple Obsoleted) {
2371 StringRef PlatformName
2372 = AvailabilityAttr::getPrettyPlatformName(Platform->
getName());
2373 if (PlatformName.empty())
2374 PlatformName = Platform->
getName();
2378 if (!Introduced.empty() && !Deprecated.empty() &&
2379 !(Introduced <= Deprecated)) {
2380 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2381 << 1 << PlatformName << Deprecated.getAsString()
2382 << 0 << Introduced.getAsString();
2386 if (!Introduced.empty() && !Obsoleted.empty() &&
2387 !(Introduced <= Obsoleted)) {
2388 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2389 << 2 << PlatformName << Obsoleted.getAsString()
2390 << 0 << Introduced.getAsString();
2394 if (!Deprecated.empty() && !Obsoleted.empty() &&
2395 !(Deprecated <= Obsoleted)) {
2396 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2397 << 2 << PlatformName << Obsoleted.getAsString()
2398 << 1 << Deprecated.getAsString();
2410 bool BeforeIsOkay) {
2411 if (
X.empty() || Y.empty())
2417 if (BeforeIsOkay &&
X < Y)
2425 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2426 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2430 VersionTuple MergedIntroduced = Introduced;
2431 VersionTuple MergedDeprecated = Deprecated;
2432 VersionTuple MergedObsoleted = Obsoleted;
2433 bool FoundAny =
false;
2434 bool OverrideOrImpl =
false;
2438 OverrideOrImpl =
false;
2444 OverrideOrImpl =
true;
2450 for (
unsigned i = 0, e = Attrs.size(); i != e;) {
2451 auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2458 if (OldEnvironment != Environment) {
2463 if (OldAA->getPlatform() != Platform) {
2466 if (InferredPlatformII) {
2467 if (OldAA->getPlatform() == InferredPlatformII)
2473 if (AvailabilityAttr *
Inf = OldAA->getInferredAttrAs();
2474 Inf &&
Inf->getPlatform() == Platform) {
2475 Attrs.erase(Attrs.begin() + i);
2487 if (OldAA->getPriority() < Priority)
2493 if (OldAA->getPriority() > Priority) {
2494 Attrs.erase(Attrs.begin() + i);
2500 VersionTuple OldIntroduced = OldAA->getIntroduced();
2501 VersionTuple OldDeprecated = OldAA->getDeprecated();
2502 VersionTuple OldObsoleted = OldAA->getObsoleted();
2503 bool OldIsUnavailable = OldAA->getUnavailable();
2505 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2506 !
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2508 !(OldIsUnavailable == IsUnavailable ||
2509 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2510 if (OverrideOrImpl) {
2512 VersionTuple FirstVersion;
2513 VersionTuple SecondVersion;
2514 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2516 FirstVersion = OldIntroduced;
2517 SecondVersion = Introduced;
2518 }
else if (!
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2520 FirstVersion = Deprecated;
2521 SecondVersion = OldDeprecated;
2522 }
else if (!
versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2524 FirstVersion = Obsoleted;
2525 SecondVersion = OldObsoleted;
2529 Diag(OldAA->getLocation(),
2530 diag::warn_mismatched_availability_override_unavail)
2531 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2543 Diag(OldAA->getLocation(),
2544 diag::warn_mismatched_availability_override)
2546 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2547 << FirstVersion.getAsString() << SecondVersion.getAsString()
2551 Diag(CI.
getLoc(), diag::note_overridden_method);
2553 Diag(CI.
getLoc(), diag::note_protocol_method);
2555 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2556 Diag(CI.
getLoc(), diag::note_previous_attribute);
2559 Attrs.erase(Attrs.begin() + i);
2564 VersionTuple MergedIntroduced2 = MergedIntroduced;
2565 VersionTuple MergedDeprecated2 = MergedDeprecated;
2566 VersionTuple MergedObsoleted2 = MergedObsoleted;
2568 if (MergedIntroduced2.empty())
2569 MergedIntroduced2 = OldIntroduced;
2570 if (MergedDeprecated2.empty())
2571 MergedDeprecated2 = OldDeprecated;
2572 if (MergedObsoleted2.empty())
2573 MergedObsoleted2 = OldObsoleted;
2576 MergedIntroduced2, MergedDeprecated2,
2577 MergedObsoleted2)) {
2578 Attrs.erase(Attrs.begin() + i);
2583 MergedIntroduced = MergedIntroduced2;
2584 MergedDeprecated = MergedDeprecated2;
2585 MergedObsoleted = MergedObsoleted2;
2591 MergedIntroduced == Introduced &&
2592 MergedDeprecated == Deprecated &&
2593 MergedObsoleted == Obsoleted)
2599 MergedDeprecated, MergedObsoleted) &&
2601 auto *Avail = ::new (
Context) AvailabilityAttr(
2602 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2603 Message, IsStrict, Replacement, Priority, Environment,
2613 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2614 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2619 D, CI, Platform,
Implicit, Introduced, Deprecated, Obsoleted,
2620 IsUnavailable, Message, IsStrict, Replacement, AMK, Priority,
2621 IIEnvironment, InferredPlatformII);
2622 if (!OrigAttr || !InferredPlatformII)
2625 auto *InferredAttr = ::new (
Context) AvailabilityAttr(
2626 Context, CI, InferredPlatformII, OrigAttr->getIntroduced(),
2627 OrigAttr->getDeprecated(), OrigAttr->getObsoleted(),
2628 OrigAttr->getUnavailable(), OrigAttr->getMessage(), OrigAttr->getStrict(),
2629 OrigAttr->getReplacement(),
2633 IIEnvironment,
nullptr);
2634 InferredAttr->setImplicit(
true);
2635 OrigAttr->setInferredAttr(InferredAttr);
2643 bool &IsUnavailable,
2644 VersionTuple &Introduced,
2645 VersionTuple &Deprecated,
2646 VersionTuple &Obsolete,
Sema &S) {
2649 if (TT.getOS() != llvm::Triple::XROS)
2653 NewII = &Context.Idents.get(
"xros");
2654 else if (II->
getName() ==
"ios_app_extension")
2655 NewII = &Context.Idents.get(
"xros_app_extension");
2660 auto MakeUnavailable = [&]() {
2661 IsUnavailable =
true;
2663 Introduced = VersionTuple();
2664 Deprecated = VersionTuple();
2665 Obsolete = VersionTuple();
2678 llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::XROS,
2679 llvm::Triple::UnknownEnvironment));
2685 if (!Introduced.empty()) {
2686 auto NewIntroduced = Mapping->mapIntroducedAvailabilityVersion(Introduced);
2687 if (!NewIntroduced) {
2691 Introduced = *NewIntroduced;
2694 if (!Obsolete.empty()) {
2696 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Obsolete);
2701 Obsolete = *NewObsolete;
2704 if (!Deprecated.empty()) {
2705 auto NewDeprecated =
2706 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Deprecated);
2707 Deprecated = NewDeprecated ? *NewDeprecated : VersionTuple();
2726 StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName(II->
getName());
2727 if (PrettyName.empty())
2728 S.
Diag(Platform->
getLoc(), diag::warn_availability_unknown_platform)
2731 auto *ND = dyn_cast<NamedDecl>(D);
2739 const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType(
2740 AvailabilityAttr::canonicalizePlatformName(II->
getName()));
2742 auto reportAndUpdateIfInvalidOS = [&](
auto &InputVersion) ->
void {
2743 const bool IsInValidRange =
2744 llvm::Triple::isValidVersionForOS(PlatformOS, InputVersion);
2746 auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS(
2747 PlatformOS, InputVersion, IsInValidRange);
2748 if (!IsInValidRange) {
2749 S.
Diag(Platform->
getLoc(), diag::warn_availability_invalid_os_version)
2750 << InputVersion.getAsString() << PrettyName;
2752 diag::note_availability_invalid_os_version_adjusted)
2753 << CanonicalVersion.getAsString();
2755 InputVersion = CanonicalVersion;
2758 if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2759 reportAndUpdateIfInvalidOS(Introduced.
Version);
2760 reportAndUpdateIfInvalidOS(Deprecated.
Version);
2761 reportAndUpdateIfInvalidOS(Obsoleted.
Version);
2767 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getMessageExpr()))
2768 Str = SE->getString();
2769 StringRef Replacement;
2770 if (
const auto *SE =
2772 Replacement = SE->getString();
2774 if (II->
isStr(
"swift")) {
2776 (!IsUnavailable && !Deprecated.
isValid())) {
2778 diag::warn_availability_swift_unavailable_deprecated_only);
2783 if (II->
isStr(
"fuchsia")) {
2784 std::optional<unsigned>
Min, Sub;
2786 (Sub = Introduced.
Version.getSubminor())) {
2787 S.
Diag(AL.
getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2802 if (EnvironmentLoc) {
2805 if (AvailabilityAttr::getEnvironmentType(
2807 llvm::Triple::EnvironmentType::UnknownEnvironment)
2809 diag::warn_availability_unknown_environment)
2813 diag::err_availability_unexpected_parameter)
2814 <<
"environment" << 1;
2820 if (II->
getName() ==
"anyappleos") {
2822 auto ValidateVersion = [&](
const llvm::VersionTuple &Version,
2826 S.
Diag(Loc, diag::err_availability_invalid_anyappleos_version)
2827 << Version.getAsString();
2841 if (!
T.isOSDarwin())
2844 StringRef PlatformName;
2848 PlatformName =
"macos";
2849 else if (
T.getOS() == llvm::Triple::IOS &&
T.isMacCatalystEnvironment())
2850 PlatformName =
"maccatalyst";
2852 PlatformName = llvm::Triple::getOSTypeName(
T.getOS());
2862 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2864 InferredPlatformII);
2873 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2880 bool NewIsUnavailable = IsUnavailable;
2881 VersionTuple NewIntroduced = Introduced.
Version;
2882 VersionTuple NewDeprecated = Deprecated.
Version;
2883 VersionTuple NewObsoleted = Obsoleted.
Version;
2885 NewIntroduced, NewDeprecated,
2888 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2889 NewObsoleted, NewIsUnavailable, Str, IsStrict, Replacement,
2903 else if (II->
getName() ==
"ios_app_extension")
2908 const auto *IOSToWatchOSMapping =
2913 auto adjustWatchOSVersion =
2914 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2915 if (Version.empty())
2917 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2919 if (IOSToWatchOSMapping) {
2920 if (
auto MappedVersion = IOSToWatchOSMapping->map(
2921 Version, MinimumWatchOSVersion, std::nullopt)) {
2922 return *MappedVersion;
2926 auto Major = Version.getMajor();
2927 auto NewMajor = Major;
2930 else if (Major < 12)
2931 NewMajor = Major - 7;
2932 if (NewMajor >= 2) {
2933 if (Version.getMinor()) {
2934 if (Version.getSubminor())
2935 return VersionTuple(NewMajor, *Version.getMinor(),
2936 *Version.getSubminor());
2938 return VersionTuple(NewMajor, *Version.getMinor());
2940 return VersionTuple(NewMajor);
2943 return MinimumWatchOSVersion;
2946 auto NewIntroduced = adjustWatchOSVersion(Introduced.
Version);
2947 auto NewDeprecated = adjustWatchOSVersion(Deprecated.
Version);
2948 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.
Version);
2951 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2952 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2964 else if (II->
getName() ==
"ios_app_extension")
2969 const auto *IOSToTvOSMapping =
2974 auto AdjustTvOSVersion =
2975 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2976 if (Version.empty())
2979 if (IOSToTvOSMapping) {
2980 if (
auto MappedVersion = IOSToTvOSMapping->map(
2981 Version, VersionTuple(0, 0), std::nullopt)) {
2982 return *MappedVersion;
2988 auto NewIntroduced = AdjustTvOSVersion(Introduced.
Version);
2989 auto NewDeprecated = AdjustTvOSVersion(Deprecated.
Version);
2990 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.
Version);
2993 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2994 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
3001 llvm::Triple::IOS &&
3003 auto GetSDKInfo = [&]() {
3012 else if (II->
getName() ==
"ios_app_extension")
3015 auto MinMacCatalystVersion = [](
const VersionTuple &
V) {
3018 if (
V.getMajor() < 13 ||
3019 (
V.getMajor() == 13 &&
V.getMinor() && *
V.getMinor() < 1))
3020 return VersionTuple(13, 1);
3024 ND, AL, NewII,
true ,
3025 MinMacCatalystVersion(Introduced.
Version),
3026 MinMacCatalystVersion(Deprecated.
Version),
3027 MinMacCatalystVersion(Obsoleted.
Version), IsUnavailable, Str,
3032 }
else if (II->
getName() ==
"macos" && GetSDKInfo() &&
3034 !Obsoleted.
Version.empty())) {
3035 if (
const auto *MacOStoMacCatalystMapping =
3036 GetSDKInfo()->getVersionMapping(
3043 auto RemapMacOSVersion =
3044 [&](
const VersionTuple &
V) -> std::optional<VersionTuple> {
3046 return std::nullopt;
3048 if (
V.getMajor() == 100000)
3049 return VersionTuple(100000);
3051 return MacOStoMacCatalystMapping->map(
V, VersionTuple(13, 1),
3054 std::optional<VersionTuple> NewIntroduced =
3055 RemapMacOSVersion(Introduced.
Version),
3057 RemapMacOSVersion(Deprecated.
Version),
3059 RemapMacOSVersion(Obsoleted.
Version);
3060 if (NewIntroduced || NewDeprecated || NewObsoleted) {
3061 auto VersionOrEmptyVersion =
3062 [](
const std::optional<VersionTuple> &
V) -> VersionTuple {
3063 return V ? *
V : VersionTuple();
3066 ND, AL, NewII,
true ,
3067 VersionOrEmptyVersion(NewIntroduced),
3068 VersionOrEmptyVersion(NewDeprecated),
3069 VersionOrEmptyVersion(NewObsoleted),
false, Str,
3088 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(0)))
3090 StringRef DefinedIn;
3091 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(1)))
3092 DefinedIn = SE->getString();
3093 bool IsGeneratedDeclaration = AL.
getArgAsIdent(2) !=
nullptr;
3095 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(3)))
3096 USR = SE->getString();
3103 VisibilityAttr::VisibilityType
Value) {
3104 if (VisibilityAttr *
Attr = D->
getAttr<VisibilityAttr>()) {
3106 Diag(Loc, diag::err_mismatched_visibility);
3113 typename T::VisibilityType value) {
3116 typename T::VisibilityType existingValue = existingAttr->getVisibility();
3117 if (existingValue == value)
3119 S.
Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
3120 S.
Diag(CI.
getLoc(), diag::note_previous_attribute);
3128 VisibilityAttr::VisibilityType Vis) {
3129 return ::mergeVisibilityAttr<VisibilityAttr>(*
this, D, CI, Vis);
3134 TypeVisibilityAttr::VisibilityType Vis) {
3135 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*
this, D, CI, Vis);
3139 bool isTypeVisibility) {
3160 VisibilityAttr::VisibilityType
type;
3161 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr,
type)) {
3162 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
3169 if (
type == VisibilityAttr::Protected &&
3171 S.
Diag(AL.
getLoc(), diag::warn_attribute_protected_visibility);
3172 type = VisibilityAttr::Default;
3176 if (isTypeVisibility) {
3178 D, AL, (TypeVisibilityAttr::VisibilityType)
type);
3187 unsigned sentinel = (
unsigned)SentinelAttr::DefaultSentinel;
3190 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3192 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3197 if (Idx->isSigned() && Idx->isNegative()) {
3198 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_less_than_zero)
3203 sentinel = Idx->getZExtValue();
3206 unsigned nullPos = (
unsigned)SentinelAttr::DefaultNullPos;
3209 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3211 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3215 nullPos = Idx->getZExtValue();
3217 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
3220 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
3226 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3229 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3234 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3237 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
3238 if (!MD->isVariadic()) {
3239 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3242 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
3243 if (!BD->isVariadic()) {
3244 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
3247 }
else if (
const auto *
V = dyn_cast<VarDecl>(D)) {
3256 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3261 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
3265 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3271 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3283 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
3286 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
3287 if (MD->getReturnType()->isVoidType()) {
3288 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
3305 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3316 if (LO.CPlusPlus && !LO.CPlusPlus20)
3317 S.
Diag(AL.
getLoc(), diag::ext_cxx20_attr) << AL;
3321 }
else if (LO.CPlusPlus && !LO.CPlusPlus17)
3322 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
3329 S.
Diag(AL.
getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
3342 S.
Diag(AL.
getLoc(), diag::warn_attribute_invalid_on_definition)
3349 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3362template <
class Attribute>
3364 const unsigned Idx) {
3373 std::optional<llvm::APSInt> I = llvm::APSInt(64);
3380 if (!I->isIntN(32)) {
3382 <<
toString(*I, 10,
false) << 32 << 1;
3386 S.
Diag(E->
getExprLoc(), diag::err_attribute_requires_positive_integer)
3394 "Unexpected PerformCopyInitialization() failure.");
3400template <
typename WorkGroupAttr>
3403 for (
unsigned i = 0; i < 3; ++i) {
3410 auto IsZero = [&](
Expr *E) {
3411 if (E->isValueDependent())
3413 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.
Context);
3414 assert(I &&
"Non-integer constant expr");
3418 if (!llvm::all_of(WGSize, IsZero)) {
3419 for (
unsigned i = 0; i < 3; ++i) {
3421 if (IsZero(WGSize[i])) {
3422 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_is_zero)
3433 assert(L &&
"Non-integer constant expr");
3434 std::optional<llvm::APSInt> R = RHS->getIntegerConstantExpr(S.
Context);
3435 assert(L &&
"Non-integer constant expr");
3439 WorkGroupAttr *Existing = D->
getAttr<WorkGroupAttr>();
3441 !llvm::equal(std::initializer_list<Expr *>{Existing->getXDim(),
3442 Existing->getYDim(),
3443 Existing->getZDim()},
3445 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3448 WorkGroupAttr(S.
Context, AL, WGSize[0], WGSize[1], WGSize[2]));
3453 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
3459 assert(ParmTSI &&
"no type source info for attribute argument");
3464 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
3468 if (VecTypeHintAttr *A = D->
getAttr<VecTypeHintAttr>()) {
3470 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3482 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3487 if (SectionAttr *ExistingAttr = D->
getAttr<SectionAttr>()) {
3488 if (ExistingAttr->getName() == Name)
3490 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3492 Diag(CI.
getLoc(), diag::note_previous_attribute);
3499 if (!
Context.getTargetInfo().getTriple().isOSDarwin())
3500 return llvm::Error::success();
3503 StringRef Segment, Section;
3504 unsigned TAA, StubSize;
3506 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
3507 TAA, HasTAA, StubSize);
3512 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3542 if (Triple.isLoongArch()) {
3543 return Str ==
"normal" || Str ==
"medium" || Str ==
"extreme";
3545 assert(Triple.getArch() == llvm::Triple::x86_64 &&
3546 "only loongarch/x86-64 supported");
3547 return Str ==
"small" || Str ==
"large";
3554 auto IsTripleSupported = [](llvm::Triple &Triple) {
3555 return Triple.getArch() == llvm::Triple::ArchType::x86_64 ||
3556 Triple.isLoongArch();
3566 Triples.push_back(aux->getTriple());
3575 auto SupportedTripleIt = llvm::find_if(Triples, IsTripleSupported);
3576 if (SupportedTripleIt == Triples.end()) {
3577 S.
Diag(LiteralLoc, diag::warn_unknown_attribute_ignored) << AL;
3581 llvm::CodeModel::Model CM;
3582 if (!CodeModelAttr::ConvertStrToModel(Str, CM) ||
3584 S.
Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
3594 StringRef CodeSegName) {
3596 S.
Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3608 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3612 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3613 if (ExistingAttr->getName() == Name)
3615 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3617 Diag(CI.
getLoc(), diag::note_previous_attribute);
3630 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3631 if (!ExistingAttr->isImplicit()) {
3633 ExistingAttr->getName() == Str
3634 ? diag::warn_duplicate_codeseg_attribute
3635 : diag::err_conflicting_codeseg_attribute);
3647 if (AttrStr.contains(
"fpmath="))
3648 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3649 << Unsupported <<
None <<
"fpmath=" <<
Target;
3652 if (!
Context.getTargetInfo().supportsTargetAttributeTune() &&
3653 AttrStr.contains(
"tune="))
3654 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3658 Context.getTargetInfo().parseTargetAttr(AttrStr);
3660 if (!ParsedAttrs.
CPU.empty() &&
3661 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
CPU))
3662 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3665 if (!ParsedAttrs.
Tune.empty() &&
3666 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
Tune))
3667 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3670 if (
Context.getTargetInfo().getTriple().isRISCV()) {
3672 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3674 for (StringRef CurFeature : ParsedAttrs.
Features) {
3675 if (!CurFeature.starts_with(
'+') && !CurFeature.starts_with(
'-'))
3676 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3681 if (
Context.getTargetInfo().getTriple().isLoongArch()) {
3682 for (StringRef CurFeature : ParsedAttrs.
Features) {
3683 if (CurFeature.starts_with(
"!arch=")) {
3684 StringRef ArchValue = CurFeature.split(
"=").second.trim();
3685 return Diag(LiteralLoc, diag::err_attribute_unsupported)
3686 <<
"target(arch=..)" << ArchValue;
3692 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3696 auto CurFeature = StringRef(
Feature).drop_front();
3697 if (!
Context.getTargetInfo().isValidFeatureName(CurFeature))
3698 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3699 << Unsupported <<
None << CurFeature <<
Target;
3706 if (!
Context.getTargetInfo().validateBranchProtection(
3708 Context.getLangOpts(), DiagMsg)) {
3709 if (DiagMsg.empty())
3710 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3711 << Unsupported <<
None <<
"branch-protection" <<
Target;
3712 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3715 if (!DiagMsg.empty())
3716 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3736 TargetVersionAttr *NewAttr =
3748 TargetAttr *NewAttr = ::new (S.
Context) TargetAttr(S.
Context, AL, Str);
3755 if (
const auto *
Other = D->
getAttr<TargetClonesAttr>()) {
3756 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3757 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
3765 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
3766 if (MD->getParent()->isLambda()) {
3776 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
3781 Params.push_back(Param);
3782 Locations.push_back(Loc);
3803 for (
auto &SmallStr : NewParams)
3804 Params.push_back(SmallStr.str());
3806 TargetClonesAttr *NewAttr = ::new (S.
Context)
3807 TargetClonesAttr(S.
Context, AL, Params.data(), Params.size());
3819 MinVectorWidthAttr *Existing = D->
getAttr<MinVectorWidthAttr>();
3820 if (Existing && Existing->getVectorWidth() != VecWidth) {
3821 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3836 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
3838 S.
Diag(Loc, diag::warn_cleanup_ext);
3839 FD = dyn_cast<FunctionDecl>(DRE->
getDecl());
3842 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3846 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3847 if (ULE->hasExplicitTemplateArgs())
3848 S.
Diag(Loc, diag::warn_cleanup_ext);
3850 NI = ULE->getNameInfo();
3852 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3859 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3864 S.
Diag(Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3880 S.
Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3896 if (
const auto *A = D->
getAttr<CleanupAttr>()) {
3897 S.
Diag(A->getLoc(), diag::warn_duplicate_cleanup_attr) << A->getRange();
3909 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3914 EnumExtensibilityAttr::Kind ExtensibilityKind;
3916 if (!EnumExtensibilityAttr::ConvertStrToKind(II->
getName(),
3917 ExtensibilityKind)) {
3918 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3923 EnumExtensibilityAttr(S.
Context, AL, ExtensibilityKind));
3941 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3951 if (
auto *OMD = dyn_cast<ObjCMethodDecl>(D))
3952 if (
auto *
Interface = OMD->getClassInterface())
3959 S.
Diag(AL.
getLoc(), diag::err_format_attribute_result_not)
3960 << (NotNSStringTy ?
"string type" :
"NSString")
3980 return llvm::StringSwitch<FormatAttrKind>(Format)
3987 .Cases({
"gnu_scanf",
"scanf",
"gnu_printf",
"printf",
"printf0",
3988 "gnu_strfmon",
"strfmon"},
3996 .Cases({
"gcc_diag",
"gcc_cdiag",
"gcc_cxxdiag",
"gcc_tdiag"},
4005 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
4010 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
4015 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
4027 if (prioritynum > 65535) {
4028 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_range)
4036 if (prioritynum < 101)
4037 S.
Diag(AL.
getLoc(), diag::warn_init_priority_reserved)
4043 StringRef NewUserDiagnostic) {
4044 if (
const auto *EA = D->
getAttr<ErrorAttr>()) {
4046 assert((NewAttr ==
"error" || NewAttr ==
"warning") &&
4047 "unexpected normalized full name");
4048 bool Match = (EA->isError() && NewAttr ==
"error") ||
4049 (EA->isWarning() && NewAttr ==
"warning");
4051 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
4054 EA->isRegularKeywordAttribute());
4055 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
4058 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
4059 Diag(CI.
getLoc(), diag::warn_duplicate_attribute) << EA;
4060 Diag(EA->getLoc(), diag::note_previous_attribute);
4064 return ::new (
Context) ErrorAttr(
Context, CI, NewUserDiagnostic);
4072 if (F->getType() == Format &&
4073 F->getFormatIdx() == FormatIdx &&
4074 F->getFirstArg() == FirstArg) {
4077 if (F->getLocation().isInvalid())
4083 return ::new (
Context) FormatAttr(
Context, CI, Format, FormatIdx, FirstArg);
4093 if (F->getType() == Format && F->getFormatIdx() == FormatIdx) {
4095 F->getFormatString(), FormatStr))
4100 if (F->getLocation().isInvalid())
4107 FormatMatchesAttr(
Context, CI, Format, FormatIdx, FormatStr);
4125 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
4150 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
4161 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4169 if (HasImplicitThisParam) {
4172 diag::err_format_attribute_implicit_this_format_string)
4185 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
4206 if (FirstArg != 0) {
4210 S.
Diag(AL.
getLoc(), diag::err_format_strftime_third_parameter)
4218 if (FirstArg != Info.
NumArgs + 1) {
4219 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4222 std::to_string(Info.
NumArgs + 1));
4227 S.
Diag(D->
getLocation(), diag::warn_gcc_requires_variadic_function) << AL;
4232 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4239 FormatAttr *NewAttr =
4251 if (
auto *SL = dyn_cast<StringLiteral>(FormatStrExpr)) {
4260 S.
Diag(AL.
getLoc(), diag::err_format_nonliteral)
4268 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_no_callee)
4277 assert(FD &&
"Expected a function declaration!");
4279 llvm::StringMap<int> NameIdxMapping;
4280 NameIdxMapping[
"__"] = -1;
4282 NameIdxMapping[
"this"] = 0;
4286 NameIdxMapping[PVD->getName()] = Idx++;
4288 auto UnknownName = NameIdxMapping.end();
4291 for (
unsigned I = 0, E = AL.
getNumArgs(); I < E; ++I) {
4298 if (It == UnknownName) {
4299 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_argument_unknown)
4305 ArgIdx = It->second;
4312 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4318 if (ArgIdx < -1 || ArgIdx > NumArgs) {
4319 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4326 llvm_unreachable(
"Unexpected ParsedAttr argument type!");
4329 if (ArgIdx == 0 && !HasImplicitThisParam) {
4330 S.
Diag(AL.
getLoc(), diag::err_callback_implicit_this_not_available)
4337 if (!HasImplicitThisParam && ArgIdx > 0)
4340 EncodingIndices.push_back(ArgIdx);
4343 int CalleeIdx = EncodingIndices.front();
4347 if (CalleeIdx < (
int)HasImplicitThisParam) {
4348 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_invalid_callee)
4355 const Type *CalleeType =
4359 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4364 const Type *CalleeFnType =
4369 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
4370 if (!CalleeFnProtoType) {
4371 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4376 if (CalleeFnProtoType->getNumParams() != EncodingIndices.size() - 1) {
4377 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_arg_count_for_func)
4378 << AL <<
QualType{CalleeFnProtoType, 0}
4379 << CalleeFnProtoType->getNumParams()
4380 << (
unsigned)(EncodingIndices.size() - 1);
4384 if (CalleeFnProtoType->isVariadic()) {
4390 if (D->
hasAttr<CallbackAttr>()) {
4396 S.
Context, AL, EncodingIndices.data(), EncodingIndices.size()));
4400 StringRef ParamName) {
4402 StringRef SpecialEntity;
4403 if (AttrName ==
"lifetime_capture_by_this")
4404 SpecialEntity =
"this";
4405 else if (AttrName ==
"lifetime_capture_by_global")
4406 SpecialEntity =
"global";
4407 else if (AttrName ==
"lifetime_capture_by_unknown")
4408 SpecialEntity =
"unknown";
4410 if (!SpecialEntity.empty() && AL.
getNumArgs() != 0) {
4411 Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
4416 if (SpecialEntity.empty() && AL.
getNumArgs() == 0) {
4417 Diag(AL.
getLoc(), diag::err_capture_by_attribute_no_entity)
4421 unsigned N = SpecialEntity.empty() ? AL.
getNumArgs() : 1;
4426 if (!SpecialEntity.empty()) {
4427 ParamIdents[0] = &
Context.Idents.get(SpecialEntity);
4429 int FakeParamIndices[] = {LifetimeCaptureByAttr::Invalid};
4431 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices, 1, AL);
4432 CapturedBy->setArgs(ParamIdents, ParamLocs);
4436 bool IsValid =
true;
4437 for (
unsigned I = 0; I < N; ++I) {
4440 Diag(E->
getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
4448 StringRef Replacement;
4450 Replacement =
"lifetime_capture_by_this";
4451 else if (Name ==
"global")
4452 Replacement =
"lifetime_capture_by_global";
4453 else if (Name ==
"unknown")
4454 Replacement =
"lifetime_capture_by_unknown";
4455 if (!Replacement.empty())
4456 Diag(IdLoc->
getLoc(), diag::warn_deprecated_capture_by_special_entity)
4457 << Name << Replacement << IdLoc->
getLoc();
4459 Diag(IdLoc->
getLoc(), diag::err_capture_by_references_itself)
4465 ParamLocs[I] = IdLoc->
getLoc();
4471 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices.data(), N, AL);
4472 CapturedBy->setArgs(ParamIdents, ParamLocs);
4478 auto *PVD = dyn_cast<ParmVarDecl>(D);
4485 auto GetSpellingKind = [](
const LifetimeCaptureByAttr *A) {
4487 return SpellingKind::This;
4489 return SpellingKind::Global;
4491 return SpellingKind::Unknown;
4492 return SpellingKind::ParameterList;
4494 auto GetSpellingName = [](SpellingKind Kind) -> StringRef {
4496 case SpellingKind::ParameterList:
4497 return "lifetime_capture_by";
4498 case SpellingKind::This:
4499 return "lifetime_capture_by_this";
4500 case SpellingKind::Global:
4501 return "lifetime_capture_by_global";
4502 case SpellingKind::Unknown:
4503 return "lifetime_capture_by_unknown";
4505 llvm_unreachable(
"unknown lifetime_capture_by spelling kind");
4508 SpellingKind NewKind = GetSpellingKind(CaptureByAttr);
4509 for (
const auto *Existing : D->
specific_attrs<LifetimeCaptureByAttr>()) {
4510 if (GetSpellingKind(Existing) == NewKind) {
4511 S.
Diag(AL.
getLoc(), diag::err_capture_by_attribute_multiple)
4512 << GetSpellingName(NewKind) << AL.
getRange();
4524 for (
auto *A : PVD->specific_attrs<LifetimeCaptureByAttr>())
4526 if (HasImplicitThisParam) {
4534 if (
auto *A = ATL.
getAttrAs<LifetimeCaptureByAttr>())
4535 Attrs.push_back(
const_cast<LifetimeCaptureByAttr *
>(A));
4540 llvm::StringMap<int> NameIdxMapping = {
4541 {
"global", LifetimeCaptureByAttr::Global},
4542 {
"unknown", LifetimeCaptureByAttr::Unknown}};
4544 if (HasImplicitThisParam) {
4545 NameIdxMapping[
"this"] = 0;
4549 NameIdxMapping[PVD->getName()] = Idx++;
4550 auto DisallowReservedParams = [&](StringRef Reserved) {
4552 if (PVD->getName() == Reserved)
4553 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
4556 for (
auto *CapturedBy : Attrs) {
4557 const auto &Entities = CapturedBy->getArgIdents();
4558 for (
size_t I = 0; I < Entities.size(); ++I) {
4559 StringRef Name = Entities[I]->getName();
4560 auto It = NameIdxMapping.find(Name);
4561 if (It == NameIdxMapping.end()) {
4562 auto Loc = CapturedBy->getArgLocs()[I];
4563 if (!HasImplicitThisParam && Name ==
"this") {
4565 CapturedBy->isStandaloneSpecial()
4566 ? diag::err_capture_by_this_attr_without_implicit_this
4567 : diag::err_capture_by_implicit_this_not_available;
4568 Diag(Loc, DiagID) << Loc;
4570 Diag(Loc, diag::err_capture_by_attribute_argument_unknown)
4571 << Entities[I] << Loc;
4574 if ((Name ==
"unknown" || Name ==
"global") &&
4575 !CapturedBy->isStandaloneSpecial())
4576 DisallowReservedParams(Name);
4577 CapturedBy->setParamIdx(I, It->second);
4586 return T.isFunctionPointerType() ||
T.isBlockPointerType();
4595 S.
Diag(AL.
getLoc(), diag::err_called_once_attribute_wrong_type);
4605 const auto *TD = dyn_cast<TypedefNameDecl>(D);
4606 if (TD && TD->getUnderlyingType()->isUnionType())
4607 RD = TD->getUnderlyingType()->getAsRecordDecl();
4609 RD = dyn_cast<RecordDecl>(D);
4612 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4620 diag::warn_transparent_union_attribute_not_definition);
4626 if (Field == FieldEnd) {
4627 S.
Diag(AL.
getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4635 diag::warn_transparent_union_attribute_floating)
4644 for (; Field != FieldEnd; ++Field) {
4645 QualType FieldType = Field->getType();
4659 S.
Diag(Field->getLocation(),
4660 diag::warn_transparent_union_attribute_field_size_align)
4661 << isSize << *Field << FieldBits;
4662 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4664 diag::note_transparent_union_first_field_size_align)
4665 << isSize << FirstBits;
4688 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4689 T = TD->getUnderlyingType();
4690 else if (
const auto *VD = dyn_cast<ValueDecl>(D))
4693 llvm_unreachable(
"Unknown decl type for align_value");
4695 if (!
T->isDependentType() && !
T->isAnyPointerType() &&
4696 !
T->isReferenceType() && !
T->isMemberPointerType()) {
4697 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4703 llvm::APSInt Alignment;
4705 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4709 if (!Alignment.isPowerOf2()) {
4710 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4732 diag::err_pack_expansion_without_parameter_packs);
4747 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4759 diag::err_pack_expansion_without_parameter_packs);
4786 const AlignedAttr &
Attr,
4791 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
4794 if (VD->isExceptionVariable())
4796 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
4797 if (FD->isBitField())
4799 }
else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4800 if (ED->getLangOpts().CPlusPlus)
4803 return S.
Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4808 if (DiagKind != -1) {
4809 return S.
Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4810 << &
Attr << DiagKind;
4816 bool IsPackExpansion) {
4817 AlignedAttr TmpAttr(
Context, CI,
true, E);
4821 if (TmpAttr.isAlignas() &&
4829 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4830 if (!TND->getUnderlyingType()->isDependentType()) {
4831 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4838 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
true, E);
4839 AA->setPackExpansion(IsPackExpansion);
4845 llvm::APSInt Alignment;
4847 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4852 if (
Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
4855 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4860 uint64_t AlignVal = Alignment.getZExtValue();
4866 if (!(TmpAttr.isAlignas() && !Alignment)) {
4867 if (!llvm::isPowerOf2_64(AlignVal)) {
4868 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4874 const auto *VD = dyn_cast<VarDecl>(D);
4876 unsigned MaxTLSAlign =
4877 Context.toCharUnitsFromBits(
Context.getTargetInfo().getMaxTLSAlign())
4879 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4881 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4882 << (
unsigned)AlignVal << VD << MaxTLSAlign;
4889 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4890 const Type *Ty = VD->getType().getTypePtr();
4892 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4893 << VD->getType() << 16;
4899 AA->setPackExpansion(IsPackExpansion);
4900 AA->setCachedAlignmentValue(
4901 static_cast<unsigned>(AlignVal *
Context.getCharWidth()));
4907 AlignedAttr TmpAttr(
Context, CI,
false, TS);
4911 if (TmpAttr.isAlignas() &&
4919 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4920 if (!TND->getUnderlyingType()->isDependentType()) {
4921 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4927 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4928 AA->setPackExpansion(IsPackExpansion);
4933 const auto *VD = dyn_cast<VarDecl>(D);
4934 unsigned AlignVal = TmpAttr.getAlignment(
Context);
4937 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4938 const Type *Ty = VD->getType().getTypePtr();
4940 Context.toCharUnitsFromBits(AlignVal).getQuantity() < 16) {
4941 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4942 << VD->getType() << 16;
4947 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4948 AA->setPackExpansion(IsPackExpansion);
4949 AA->setCachedAlignmentValue(AlignVal);
4954 assert(D->
hasAttrs() &&
"no attributes on decl");
4957 if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
4958 UnderlyingTy = DiagTy = VD->getType();
4961 if (
const auto *ED = dyn_cast<EnumDecl>(D))
4962 UnderlyingTy = ED->getIntegerType();
4971 AlignedAttr *AlignasAttr =
nullptr;
4972 AlignedAttr *LastAlignedAttr =
nullptr;
4975 if (I->isAlignmentDependent())
4979 Align = std::max(Align, I->getAlignment(
Context));
4980 LastAlignedAttr = I;
4984 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4985 << LastAlignedAttr << DiagTy;
4986 }
else if (AlignasAttr && Align) {
4989 if (NaturalAlign > RequestedAlign)
4990 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
5017 Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
5026 bool &IntegerMode,
bool &ComplexMode,
5029 ComplexMode =
false;
5031 switch (Str.size()) {
5051 DestWidth = Str[1] ==
'I' ? 0 : 128;
5059 DestWidth = Str[1] ==
'I' ? 0 : 128;
5062 if (Str[1] ==
'F') {
5063 IntegerMode =
false;
5064 }
else if (Str[1] ==
'C') {
5065 IntegerMode =
false;
5067 }
else if (Str[1] !=
'I') {
5076 else if (Str ==
"byte")
5080 if (Str ==
"pointer")
5084 if (Str ==
"unwind_word")
5100 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
5112 StringRef Str = Name->
getName();
5116 unsigned DestWidth = 0;
5117 bool IntegerMode =
true;
5118 bool ComplexMode =
false;
5120 llvm::APInt VectorSize(64, 0);
5121 if (Str.size() >= 4 && Str[0] ==
'V') {
5123 size_t StrSize = Str.size();
5124 size_t VectorStringLength = 0;
5125 while ((VectorStringLength + 1) < StrSize &&
5126 isdigit(Str[VectorStringLength + 1]))
5127 ++VectorStringLength;
5128 if (VectorStringLength &&
5129 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
5130 VectorSize.isPowerOf2()) {
5132 IntegerMode, ComplexMode, ExplicitType);
5134 if (!InInstantiation)
5135 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
5150 Diag(AttrLoc, diag::err_machine_mode) << 0 << Name;
5155 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
5156 OldTy = TD->getUnderlyingType();
5157 else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
5160 OldTy = ED->getIntegerType();
5175 OldElemTy = VT->getElementType();
5181 VectorSize.getBoolValue()) {
5182 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.
getRange();
5190 !IntegralOrAnyEnumType)
5191 Diag(AttrLoc, diag::err_mode_not_primitive);
5192 else if (IntegerMode) {
5193 if (!IntegralOrAnyEnumType)
5194 Diag(AttrLoc, diag::err_mode_wrong_type);
5195 }
else if (ComplexMode) {
5197 Diag(AttrLoc, diag::err_mode_wrong_type);
5200 Diag(AttrLoc, diag::err_mode_wrong_type);
5206 NewElemTy =
Context.getIntTypeForBitwidth(DestWidth,
5209 NewElemTy =
Context.getRealTypeForBitwidth(DestWidth, ExplicitType);
5211 if (NewElemTy.
isNull()) {
5215 if (!(DestWidth == 128 &&
getLangOpts().isTargetDevice()))
5216 Diag(AttrLoc, diag::err_machine_mode) << 1 << Name;
5221 NewElemTy =
Context.getComplexType(NewElemTy);
5225 if (VectorSize.getBoolValue()) {
5226 NewTy =
Context.getVectorType(NewTy, VectorSize.getZExtValue(),
5231 Diag(AttrLoc, diag::err_complex_mode_vector_type);
5234 unsigned NumElements =
Context.getTypeSize(OldElemTy) *
5235 OldVT->getNumElements() /
5236 Context.getTypeSize(NewElemTy);
5238 Context.getVectorType(NewElemTy, NumElements, OldVT->getVectorKind());
5242 Diag(AttrLoc, diag::err_mode_wrong_type);
5247 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
5248 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
5249 else if (
auto *ED = dyn_cast<EnumDecl>(D))
5250 ED->setIntegerType(NewTy);
5278 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5279 Diag(CI.
getLoc(), diag::warn_attribute_ignored) << Ident;
5280 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5284 if (D->
hasAttr<AlwaysInlineAttr>())
5292 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5295 if (VD->getKind() != Decl::Var) {
5296 Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5303 if (VD->hasLocalStorage()) {
5304 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5311InternalLinkageAttr *
5313 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5316 if (VD->getKind() != Decl::Var) {
5317 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
5318 << &AL << AL.isRegularKeywordAttribute()
5324 if (VD->hasLocalStorage()) {
5325 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5334 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5335 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'minsize'";
5336 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5340 if (D->
hasAttr<MinSizeAttr>())
5348 if (AlwaysInlineAttr *Inline = D->
getAttr<AlwaysInlineAttr>()) {
5349 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
5350 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5353 if (MinSizeAttr *MinSize = D->
getAttr<MinSizeAttr>()) {
5354 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
5355 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5359 if (D->
hasAttr<OptimizeNoneAttr>())
5366 AlwaysInlineAttr AIA(S.
Context, AL);
5368 (AIA.isMSVCForceInline() || AIA.isMSVCForceInlineCalls())) {
5369 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
5372 if (AIA.isMSVCForceInlineCalls()) {
5373 S.
Diag(AL.
getLoc(), diag::warn_stmt_attribute_ignored_in_function)
5374 <<
"[[msvc::forceinline]]";
5378 if (AlwaysInlineAttr *Inline =
5395 if (VD->hasLocalStorage()) {
5396 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5403 if (
auto *A = D->
getAttr<CUDAConstantAttr>()) {
5404 if (!A->isImplicit())
5415 if (!S.
getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
5417 S.
Diag(AL.
getLoc(), diag::err_cuda_extern_shared) << VD;
5422 if (S.
getLangOpts().CUDA && VD->hasLocalStorage() &&
5441 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
5442 if (Method->isInstance()) {
5443 S.
Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
5447 S.
Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
5454 case ParsedAttr::AT_DeviceKernel:
5455 if (!D->
hasAttr<DeviceKernelAttr>())
5458 case ParsedAttr::AT_CUDAGlobal:
5459 if (!D->
hasAttr<CUDAGlobalAttr>())
5463 llvm_unreachable(
"Unexpected attribute kind");
5474 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5475 if (VD->hasLocalStorage()) {
5476 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5483 if (
auto *A = D->
getAttr<CUDADeviceAttr>()) {
5484 if (!A->isImplicit())
5492 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5493 if (VD->hasLocalStorage()) {
5494 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5500 if (!D->
hasAttr<HIPManagedAttr>())
5502 if (!D->
hasAttr<CUDADeviceAttr>())
5517 if (!Fn->isInlineSpecified()) {
5518 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
5523 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
5540 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5546 case ParsedAttr::AT_FastCall:
5549 case ParsedAttr::AT_StdCall:
5552 case ParsedAttr::AT_ThisCall:
5555 case ParsedAttr::AT_CDecl:
5558 case ParsedAttr::AT_Pascal:
5561 case ParsedAttr::AT_SwiftCall:
5564 case ParsedAttr::AT_SwiftAsyncCall:
5567 case ParsedAttr::AT_VectorCall:
5570 case ParsedAttr::AT_MSABI:
5573 case ParsedAttr::AT_SysVABI:
5576 case ParsedAttr::AT_RegCall:
5579 case ParsedAttr::AT_Pcs: {
5580 PcsAttr::PCSType PCS;
5583 PCS = PcsAttr::AAPCS;
5586 PCS = PcsAttr::AAPCS_VFP;
5589 llvm_unreachable(
"unexpected calling convention in pcs attribute");
5595 case ParsedAttr::AT_AArch64VectorPcs:
5598 case ParsedAttr::AT_AArch64SVEPcs:
5601 case ParsedAttr::AT_DeviceKernel: {
5603 assert(D->
hasAttr<DeviceKernelAttr>() &&
"Expected attribute");
5606 case ParsedAttr::AT_IntelOclBicc:
5609 case ParsedAttr::AT_PreserveMost:
5612 case ParsedAttr::AT_PreserveAll:
5615 case ParsedAttr::AT_M68kRTD:
5618 case ParsedAttr::AT_PreserveNone:
5621 case ParsedAttr::AT_RISCVVectorCC:
5624 case ParsedAttr::AT_RISCVVLSCC: {
5631 S.
Diag(AL.
getLoc(), diag::err_argument_invalid_range)
5636 S.
Diag(AL.
getLoc(), diag::err_argument_not_power_of_2);
5644 llvm_unreachable(
"unexpected attribute kind");
5649 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
5655 S.
Diag(AL.
getLoc(), diag::err_hidden_device_kernel) << FD;
5659 if (Triple.isNVPTX()) {
5663 if (!LangOpts.OpenCLCPlusPlus && (!FD || IsFunctionTemplate)) {
5664 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type_str)
5672 bool TargetDeviceEnvironment = Triple.isGPU() || Triple.isSPIR() ||
5674 if (!TargetDeviceEnvironment) {
5675 S.
Diag(AL.
getLoc(), diag::warn_cconv_unsupported)
5693 std::vector<StringRef> DiagnosticIdentifiers;
5694 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
5700 DiagnosticIdentifiers.push_back(RuleName);
5703 SuppressAttr(S.
Context, AL, DiagnosticIdentifiers.data(),
5704 DiagnosticIdentifiers.size()));
5713 unsigned SelectIdx = ~0
U;
5719 if (SelectIdx != ~0
U) {
5720 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument)
5732 if (AL.
getKind() == ParsedAttr::AT_Owner) {
5735 if (
const auto *OAttr = D->
getAttr<OwnerAttr>()) {
5736 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5737 ? OAttr->getDerefType().getTypePtr()
5740 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5743 OAttr->isRegularKeywordAttribute());
5744 S.
Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5749 Redecl->addAttr(::new (S.
Context) OwnerAttr(S.
Context, AL, DerefTypeLoc));
5754 if (
const auto *PAttr = D->
getAttr<PointerAttr>()) {
5755 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5756 ? PAttr->getDerefType().getTypePtr()
5759 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5762 PAttr->isRegularKeywordAttribute());
5763 S.
Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5768 Redecl->addAttr(::new (S.
Context)
5769 PointerAttr(S.
Context, AL, DerefTypeLoc));
5777 if (!D->
hasAttr<RandomizeLayoutAttr>())
5785 if (!D->
hasAttr<NoRandomizeLayoutAttr>())
5800 if (Attrs.
getKind() == ParsedAttr::AT_RISCVVLSCC) {
5808 unsigned ReqArgs = Attrs.
getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5815 bool IsTargetDefaultMSABI =
5816 Context.getTargetInfo().getTriple().isOSWindows() ||
5817 Context.getTargetInfo().getTriple().isUEFI();
5820 case ParsedAttr::AT_CDecl:
5823 case ParsedAttr::AT_FastCall:
5826 case ParsedAttr::AT_StdCall:
5829 case ParsedAttr::AT_ThisCall:
5832 case ParsedAttr::AT_Pascal:
5835 case ParsedAttr::AT_SwiftCall:
5838 case ParsedAttr::AT_SwiftAsyncCall:
5841 case ParsedAttr::AT_VectorCall:
5844 case ParsedAttr::AT_AArch64VectorPcs:
5847 case ParsedAttr::AT_AArch64SVEPcs:
5850 case ParsedAttr::AT_RegCall:
5853 case ParsedAttr::AT_MSABI:
5856 case ParsedAttr::AT_SysVABI:
5859 case ParsedAttr::AT_Pcs: {
5865 if (StrRef ==
"aapcs") {
5868 }
else if (StrRef ==
"aapcs-vfp") {
5877 case ParsedAttr::AT_IntelOclBicc:
5880 case ParsedAttr::AT_PreserveMost:
5883 case ParsedAttr::AT_PreserveAll:
5886 case ParsedAttr::AT_M68kRTD:
5889 case ParsedAttr::AT_PreserveNone:
5892 case ParsedAttr::AT_RISCVVectorCC:
5895 case ParsedAttr::AT_RISCVVLSCC: {
5898 unsigned ABIVLen = 128;
5904 if (Attrs.
getNumArgs() && (ABIVLen < 32 || ABIVLen > 65536)) {
5906 Diag(Attrs.
getLoc(), diag::err_argument_invalid_range)
5907 << ABIVLen << 32 << 65536;
5910 if (!llvm::isPowerOf2_64(ABIVLen)) {
5912 Diag(Attrs.
getLoc(), diag::err_argument_not_power_of_2);
5916 llvm::Log2_64(ABIVLen) - 5);
5919 case ParsedAttr::AT_DeviceKernel: {
5924 default: llvm_unreachable(
"unexpected attribute kind");
5929 auto *Aux =
Context.getAuxTargetInfo();
5937 bool CheckHost =
false, CheckDevice =
false;
5938 switch (CudaTarget) {
5951 llvm_unreachable(
"unexpected cuda target");
5953 auto *HostTI =
LangOpts.CUDAIsDevice ? Aux : &TI;
5954 auto *DeviceTI =
LangOpts.CUDAIsDevice ? &TI : Aux;
5955 if (CheckHost && HostTI)
5958 A = DeviceTI->checkCallingConvention(CC);
5959 }
else if (
LangOpts.SYCLIsDevice) {
5975 A = Aux->checkCallingConvention(CC);
5980 A = Aux->checkCallingConvention(CC);
5999 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
6004 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
6009 bool IsCXXMethod =
false, IsVariadic =
false;
6014 CC =
Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
6039 if (
Context.getTargetInfo().getRegParmMax() == 0) {
6040 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
6047 if (numParams >
Context.getTargetInfo().getRegParmMax()) {
6048 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
6060 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
6070 const CUDALaunchBoundsAttr &AL,
6071 const unsigned Idx) {
6080 std::optional<llvm::APSInt> I = llvm::APSInt(64);
6087 if (!I->isIntN(32)) {
6089 <<
toString(*I, 10,
false) << 32 << 1;
6093 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6101 "Unexpected PerformCopyInitialization() failure.");
6106CUDALaunchBoundsAttr *
6110 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
6126 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
6136 MaxBlocks =
nullptr;
6142 MaxBlocks =
nullptr;
6154 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
6173static std::pair<Expr *, int>
6175 const unsigned Idx) {
6191 if (!I->isIntN(4)) {
6193 <<
toString(*I, 10,
false) << 4 << 1;
6197 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
6207 CUDAClusterDimsAttr TmpAttr(
Context, CI,
X, Y, Z);
6213 if (!NewX || (Y && !NewY) || (Z && !NewZ))
6216 int FlatDim = ValX * ValY * ValZ;
6217 const llvm::Triple TT =
6218 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
6219 ?
Context.getAuxTargetInfo()->getTriple()
6220 :
Context.getTargetInfo().getTriple();
6224 else if (TT.isAMDGPU())
6231 if (FlatDim > MaxDim) {
6232 Diag(CI.
getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
6236 return CUDAClusterDimsAttr::Create(
Context, NewX, NewY, NewZ, CI);
6253 llvm::NVPTX::getSmVersion(
Arch.nvptxKind()) < 900) ||
6256 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6273 llvm::NVPTX::getSmVersion(
Arch.nvptxKind()) < 900) ||
6276 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
6286 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6308 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
6311 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
6316 TypeTagIdx, IsPointer));
6322 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6331 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
6339 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
6362 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
6373 if (Count < Offset) {
6374 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
6385 diag::err_attribute_patchable_function_entry_invalid_section)
6389 if (Section.empty()) {
6391 diag::err_attribute_patchable_function_entry_invalid_section)
6392 <<
"section must not be empty";
6402 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6420 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6421 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
6432 if (
auto *CRD = dyn_cast<CXXRecordDecl>(D);
6433 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6444 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6450 assert(ParmTSI &&
"no type source info for attribute argument");
6452 diag::err_incomplete_type);
6462 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
6463 if (
const auto *UA = D->
getAttr<UuidAttr>()) {
6466 if (!UA->getGuid().empty()) {
6467 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6473 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
6478 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6483 StringRef OrigStrRef;
6490 StringRef StrRef = OrigStrRef;
6491 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
6492 StrRef = StrRef.drop_front().drop_back();
6495 if (StrRef.size() != 36) {
6496 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6500 for (
unsigned i = 0; i < 36; ++i) {
6501 if (i == 8 || i == 13 || i == 18 || i == 23) {
6502 if (StrRef[i] !=
'-') {
6503 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6507 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6514 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
6515 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
6516 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
6517 for (
unsigned i = 0; i != 8; ++i)
6518 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6529 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
6538 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6553 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
6557 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
6560 if (VD->hasLocalStorage()) {
6561 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
6569 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
6575 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6579 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6580 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6581 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6591 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6592 << AL <<
First << 0;
6593 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6596 if (
const auto *Preexisting = D->
getAttr<MSStructAttr>()) {
6597 if (Preexisting->isImplicit())
6606 if (
First->isImplicit()) {
6609 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6610 << AL <<
First << 0;
6611 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6621 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6625 Tags.push_back(Tag);
6628 if (
const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6629 if (!NS->isInline()) {
6630 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6633 if (NS->isAnonymousNamespace()) {
6634 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6638 Tags.push_back(NS->getName());
6644 Tags.erase(llvm::unique(Tags), Tags.end());
6647 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
6652 if (I->getBTFDeclTag() == Tag)
6671 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
6677 case llvm::Triple::msp430:
6680 case llvm::Triple::mipsel:
6681 case llvm::Triple::mips:
6684 case llvm::Triple::m68k:
6687 case llvm::Triple::x86:
6688 case llvm::Triple::x86_64:
6691 case llvm::Triple::avr:
6694 case llvm::Triple::riscv32:
6695 case llvm::Triple::riscv64:
6696 case llvm::Triple::riscv32be:
6697 case llvm::Triple::riscv64be:
6714 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
6729 if (D->
hasAttr<DLLExportAttr>()) {
6730 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
6734 if (D->
hasAttr<DLLImportAttr>())
6742 if (DLLImportAttr *Import = D->
getAttr<DLLImportAttr>()) {
6743 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6747 if (D->
hasAttr<DLLExportAttr>())
6760 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6770 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6772 MD->getParent()->isLambda()) {
6778 if (
auto *EA = D->
getAttr<ExcludeFromExplicitInstantiationAttr>()) {
6780 diag::warn_dllattr_ignored_exclusion_takes_precedence)
6785 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
6796 if (MSInheritanceAttr *IA = D->
getAttr<MSInheritanceAttr>()) {
6797 if (IA->getInheritanceModel() == Model)
6799 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6801 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
6806 if (RD->hasDefinition()) {
6813 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6817 if (RD->getDescribedClassTemplate()) {
6818 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6836 StringRef N(
"mutex");
6838 if (AL.
getKind() == ParsedAttr::AT_Capability &&
6851 if (!D->
hasAttr<CapabilityAttr>()) {
6852 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_requires_preceded)
6853 << AL << cast<NamedDecl>(D) <<
"'capability'";
6869 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
6925 RequiresCapabilityAttr *RCA = ::new (S.
Context)
6926 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
6932 if (
const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6933 if (NSD->isAnonymousNamespace()) {
6934 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6948 StringRef Str, Replacement;
6961 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6967 if (
const auto *S = dyn_cast<VarDecl>(D))
6968 return S->hasGlobalStorage();
6973 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6974 Sanitizer ==
"memtag";
6981 std::vector<StringRef> Sanitizers;
6983 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6984 StringRef SanitizerName;
6992 SanitizerName !=
"coverage")
6993 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6995 S.
Diag(D->
getLocation(), diag::warn_attribute_type_not_supported_global)
6996 << AL << SanitizerName;
6997 Sanitizers.push_back(SanitizerName);
7001 Sanitizers.size()));
7014 unsigned TranslatedSpellingIndex = 0;
7016 TranslatedSpellingIndex = 1;
7025 StringRef SanitizerName =
"address";
7028 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
7032 StringRef SanitizerName =
"thread";
7035 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
7039 StringRef SanitizerName =
"memory";
7042 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
7057 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
7058 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
7059 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
7064 D->
dropAttr<ZeroCallUsedRegsAttr>();
7080 case ParsedAttr::AT_CountedBy:
7081 CountInBytes =
false;
7084 case ParsedAttr::AT_CountedByOrNull:
7085 CountInBytes =
false;
7088 case ParsedAttr::AT_SizedBy:
7089 CountInBytes =
true;
7092 case ParsedAttr::AT_SizedByOrNull:
7093 CountInBytes =
true;
7097 llvm_unreachable(
"unexpected counted_by family attribute");
7105 FD->
getType(), CountExpr, CountInBytes, OrNull);
7116 FunctionReturnThunksAttr::Kind Kind;
7117 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
7118 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
7125 D->
dropAttr<FunctionReturnThunksAttr>();
7126 D->
addAttr(FunctionReturnThunksAttr::Create(S.
Context, Kind, AL));
7136 auto *VDecl = dyn_cast<VarDecl>(D);
7137 if (VDecl && !VDecl->isFunctionPointerType()) {
7138 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
7152 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
7156 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
7164 "uninitialized is only valid on automatic duration variables");
7175 bool IsKernReturnT =
false;
7177 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
7182 diag::warn_mig_server_routine_does_not_return_kern_return_t);
7192 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
7195 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
7208 if (
const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
7209 if (PVD->getType()->isIntegerType()) {
7210 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
7221template<
typename Attr>
7229template<
typename Attr>
7238 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7243 CFGuardAttr::GuardArg Arg;
7245 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
7246 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
7254template <
typename AttrTy>
7257 auto I = llvm::find_if(Attrs,
7258 [Name](
const AttrTy *A) {
7259 return A->getTCBName() == Name;
7261 return I == Attrs.end() ?
nullptr : *I;
7264template <
typename AttrTy,
typename ConflictingAttrTy>
7271 if (
const ConflictingAttrTy *ConflictingAttr =
7275 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
7289template <
typename AttrTy,
typename ConflictingAttrTy>
7292 StringRef TCBName = AL.getTCBName();
7293 if (
const ConflictingAttrTy *ConflictingAttr =
7295 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
7296 << ConflictingAttr->getAttrName()->getName()
7297 << AL.getAttrName()->getName() << TCBName;
7300 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
7308 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
7317 Decl *D,
const EnforceTCBLeafAttr &AL) {
7327 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7332 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
7337 if (D->
getAttr<VTablePointerAuthenticationAttr>()) {
7338 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
7342 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
7345 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
7347 S.
Diag(IL->
getLoc(), diag::err_invalid_authentication_key)
7351 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
7353 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
7357 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7362 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
7363 AddressDiscriminationMode::DefaultAddressDiscrimination;
7367 if (!VTablePointerAuthenticationAttr::
7368 ConvertStrToAddressDiscriminationMode(
7370 S.
Diag(IL->
getLoc(), diag::err_invalid_address_discrimination)
7374 if (AddressDiversityMode ==
7375 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
7377 S.
Diag(IL->
getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
7381 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7386 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
7387 DefaultExtraDiscrimination;
7391 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
7393 S.
Diag(IL->
getLoc(), diag::err_invalid_extra_discrimination)
7397 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
7399 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
7403 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7408 uint32_t CustomDiscriminationValue = 0;
7409 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
7411 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
7416 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7421 CustomDiscriminationValue)) {
7422 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
7425 }
else if (NumArgs > 3) {
7426 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
7431 S.
Context, AL, KeyType, AddressDiversityMode, ED,
7432 CustomDiscriminationValue));
7439 return Existing->getModularImplFn() == ModularImplFn &&
7440 Existing->getImplName() == ImplName &&
7441 Existing->aspects_size() == Aspects.size() &&
7442 llvm::equal(Existing->aspects(), Aspects);
7448 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7450 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
7451 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
7455 return ::new (
Context) ModularFormatAttr(
Context, CI, ModularImplFn, ImplName,
7456 Aspects.data(), Aspects.size());
7462 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
7470 llvm::DenseSet<StringRef> SeenAspects;
7471 for (
unsigned I = 2, E = AL.
getNumArgs(); I != E; ++I) {
7475 if (!SeenAspects.insert(Aspect).second) {
7477 diag::err_modular_format_duplicate_aspect)
7482 Aspects.push_back(Aspect);
7488 llvm::sort(Aspects);
7491 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7493 S.
Diag(AL.
getLoc(), diag::err_duplicate_attribute) << *Existing;
7494 S.
Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7501 S.
Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7517 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
7518 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7521 if (IsLastAttrArg && AttrHasVariadicArg)
7529 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7541 if (PersonalityAttr *PA = D->
getAttr<PersonalityAttr>()) {
7545 Diag(PA->getLocation(), diag::err_mismatched_personality);
7546 Diag(CI.
getLoc(), diag::note_previous_attribute);
7558 S.
Diag(E->
getExprLoc(), diag::err_attribute_personality_arg_not_function)
7588 S.
Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
7591 S.
Diag(AL.
getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7600 AL.
getKind() == ParsedAttr::AT_NoInline) {
7601 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
7603 if (PVD->hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
7604 S.
Diag(AL.
getLoc(), diag::err_hlsl_attr_incompatible)
7605 <<
"'noinline'" <<
"'groupshared' parameter";
7619 if (MustDelayArgs) {
7629 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
7655 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7664 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
7677 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
7687 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
7698 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
7701 case ParsedAttr::AT_Interrupt:
7704 case ParsedAttr::AT_ARMInterruptSaveFP:
7707 case ParsedAttr::AT_X86ForceAlignArgPointer:
7710 case ParsedAttr::AT_ReadOnlyPlacement:
7713 case ParsedAttr::AT_DLLExport:
7714 case ParsedAttr::AT_DLLImport:
7717 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7720 case ParsedAttr::AT_AMDGPUWavesPerEU:
7723 case ParsedAttr::AT_AMDGPUNumSGPR:
7726 case ParsedAttr::AT_AMDGPUNumVGPR:
7729 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7732 case ParsedAttr::AT_AVRSignal:
7735 case ParsedAttr::AT_BPFPreserveAccessIndex:
7738 case ParsedAttr::AT_BPFPreserveStaticOffset:
7741 case ParsedAttr::AT_BTFDeclTag:
7744 case ParsedAttr::AT_WebAssemblyExportName:
7747 case ParsedAttr::AT_WebAssemblyImportModule:
7750 case ParsedAttr::AT_WebAssemblyImportName:
7753 case ParsedAttr::AT_IBOutlet:
7756 case ParsedAttr::AT_IBOutletCollection:
7759 case ParsedAttr::AT_IFunc:
7762 case ParsedAttr::AT_Alias:
7765 case ParsedAttr::AT_Aligned:
7768 case ParsedAttr::AT_AlignValue:
7771 case ParsedAttr::AT_AllocSize:
7774 case ParsedAttr::AT_AlwaysInline:
7777 case ParsedAttr::AT_AnalyzerNoReturn:
7780 case ParsedAttr::AT_TLSModel:
7783 case ParsedAttr::AT_Annotate:
7786 case ParsedAttr::AT_Availability:
7789 case ParsedAttr::AT_CPUDispatch:
7790 case ParsedAttr::AT_CPUSpecific:
7793 case ParsedAttr::AT_Common:
7796 case ParsedAttr::AT_CUDAConstant:
7799 case ParsedAttr::AT_PassObjectSize:
7802 case ParsedAttr::AT_Constructor:
7805 case ParsedAttr::AT_Deprecated:
7808 case ParsedAttr::AT_Destructor:
7811 case ParsedAttr::AT_EnableIf:
7814 case ParsedAttr::AT_Error:
7817 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7820 case ParsedAttr::AT_DiagnoseIf:
7823 case ParsedAttr::AT_DiagnoseAsBuiltin:
7826 case ParsedAttr::AT_NoBuiltin:
7829 case ParsedAttr::AT_CFIUncheckedCallee:
7832 case ParsedAttr::AT_ExtVectorType:
7835 case ParsedAttr::AT_ExternalSourceSymbol:
7838 case ParsedAttr::AT_MinSize:
7841 case ParsedAttr::AT_OptimizeNone:
7844 case ParsedAttr::AT_EnumExtensibility:
7847 case ParsedAttr::AT_SYCLKernel:
7850 case ParsedAttr::AT_SYCLExternal:
7853 case ParsedAttr::AT_SYCLKernelEntryPoint:
7856 case ParsedAttr::AT_SYCLSpecialClass:
7859 case ParsedAttr::AT_Format:
7862 case ParsedAttr::AT_FormatMatches:
7865 case ParsedAttr::AT_FormatArg:
7868 case ParsedAttr::AT_Callback:
7871 case ParsedAttr::AT_LifetimeCaptureBy:
7874 case ParsedAttr::AT_CalledOnce:
7877 case ParsedAttr::AT_CUDAGlobal:
7880 case ParsedAttr::AT_CUDADevice:
7883 case ParsedAttr::AT_CUDAGridConstant:
7886 case ParsedAttr::AT_HIPManaged:
7889 case ParsedAttr::AT_GNUInline:
7892 case ParsedAttr::AT_CUDALaunchBounds:
7895 case ParsedAttr::AT_CUDAClusterDims:
7898 case ParsedAttr::AT_CUDANoCluster:
7901 case ParsedAttr::AT_Restrict:
7904 case ParsedAttr::AT_MallocSpan:
7907 case ParsedAttr::AT_Mode:
7910 case ParsedAttr::AT_NonString:
7913 case ParsedAttr::AT_NonNull:
7914 if (
auto *PVD = dyn_cast<ParmVarDecl>(D))
7919 case ParsedAttr::AT_ReturnsNonNull:
7922 case ParsedAttr::AT_NoEscape:
7925 case ParsedAttr::AT_MaybeUndef:
7928 case ParsedAttr::AT_AssumeAligned:
7931 case ParsedAttr::AT_AllocAlign:
7934 case ParsedAttr::AT_Ownership:
7937 case ParsedAttr::AT_Naked:
7940 case ParsedAttr::AT_NoReturn:
7943 case ParsedAttr::AT_CXX11NoReturn:
7946 case ParsedAttr::AT_AnyX86NoCfCheck:
7949 case ParsedAttr::AT_NoThrow:
7953 case ParsedAttr::AT_CUDAShared:
7956 case ParsedAttr::AT_VecReturn:
7959 case ParsedAttr::AT_ObjCOwnership:
7962 case ParsedAttr::AT_ObjCPreciseLifetime:
7965 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7968 case ParsedAttr::AT_ObjCRequiresSuper:
7971 case ParsedAttr::AT_ObjCBridge:
7974 case ParsedAttr::AT_ObjCBridgeMutable:
7977 case ParsedAttr::AT_ObjCBridgeRelated:
7980 case ParsedAttr::AT_ObjCDesignatedInitializer:
7983 case ParsedAttr::AT_ObjCRuntimeName:
7986 case ParsedAttr::AT_ObjCBoxable:
7989 case ParsedAttr::AT_NSErrorDomain:
7992 case ParsedAttr::AT_CFConsumed:
7993 case ParsedAttr::AT_NSConsumed:
7994 case ParsedAttr::AT_OSConsumed:
7999 case ParsedAttr::AT_OSReturnsRetainedOnZero:
8002 diag::warn_ns_attribute_wrong_parameter_type,
8005 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
8008 diag::warn_ns_attribute_wrong_parameter_type,
8011 case ParsedAttr::AT_NSReturnsAutoreleased:
8012 case ParsedAttr::AT_NSReturnsNotRetained:
8013 case ParsedAttr::AT_NSReturnsRetained:
8014 case ParsedAttr::AT_CFReturnsNotRetained:
8015 case ParsedAttr::AT_CFReturnsRetained:
8016 case ParsedAttr::AT_OSReturnsNotRetained:
8017 case ParsedAttr::AT_OSReturnsRetained:
8020 case ParsedAttr::AT_WorkGroupSizeHint:
8023 case ParsedAttr::AT_ReqdWorkGroupSize:
8026 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
8029 case ParsedAttr::AT_VecTypeHint:
8032 case ParsedAttr::AT_InitPriority:
8035 case ParsedAttr::AT_Packed:
8038 case ParsedAttr::AT_PreferredName:
8041 case ParsedAttr::AT_NoSpecializations:
8044 case ParsedAttr::AT_Section:
8047 case ParsedAttr::AT_CodeModel:
8050 case ParsedAttr::AT_RandomizeLayout:
8053 case ParsedAttr::AT_NoRandomizeLayout:
8056 case ParsedAttr::AT_CodeSeg:
8059 case ParsedAttr::AT_Target:
8062 case ParsedAttr::AT_TargetVersion:
8065 case ParsedAttr::AT_TargetClones:
8068 case ParsedAttr::AT_MinVectorWidth:
8071 case ParsedAttr::AT_Unavailable:
8074 case ParsedAttr::AT_OMPAssume:
8077 case ParsedAttr::AT_ObjCDirect:
8080 case ParsedAttr::AT_ObjCDirectMembers:
8084 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
8087 case ParsedAttr::AT_Unused:
8090 case ParsedAttr::AT_Visibility:
8093 case ParsedAttr::AT_TypeVisibility:
8096 case ParsedAttr::AT_WarnUnusedResult:
8099 case ParsedAttr::AT_WeakRef:
8102 case ParsedAttr::AT_WeakImport:
8105 case ParsedAttr::AT_TransparentUnion:
8108 case ParsedAttr::AT_ObjCMethodFamily:
8111 case ParsedAttr::AT_ObjCNSObject:
8114 case ParsedAttr::AT_ObjCIndependentClass:
8117 case ParsedAttr::AT_Blocks:
8120 case ParsedAttr::AT_Sentinel:
8123 case ParsedAttr::AT_Cleanup:
8126 case ParsedAttr::AT_NoDebug:
8129 case ParsedAttr::AT_CmseNSEntry:
8132 case ParsedAttr::AT_StdCall:
8133 case ParsedAttr::AT_CDecl:
8134 case ParsedAttr::AT_FastCall:
8135 case ParsedAttr::AT_ThisCall:
8136 case ParsedAttr::AT_Pascal:
8137 case ParsedAttr::AT_RegCall:
8138 case ParsedAttr::AT_SwiftCall:
8139 case ParsedAttr::AT_SwiftAsyncCall:
8140 case ParsedAttr::AT_VectorCall:
8141 case ParsedAttr::AT_MSABI:
8142 case ParsedAttr::AT_SysVABI:
8143 case ParsedAttr::AT_Pcs:
8144 case ParsedAttr::AT_IntelOclBicc:
8145 case ParsedAttr::AT_PreserveMost:
8146 case ParsedAttr::AT_PreserveAll:
8147 case ParsedAttr::AT_AArch64VectorPcs:
8148 case ParsedAttr::AT_AArch64SVEPcs:
8149 case ParsedAttr::AT_M68kRTD:
8150 case ParsedAttr::AT_PreserveNone:
8151 case ParsedAttr::AT_RISCVVectorCC:
8152 case ParsedAttr::AT_RISCVVLSCC:
8155 case ParsedAttr::AT_DeviceKernel:
8158 case ParsedAttr::AT_Suppress:
8161 case ParsedAttr::AT_Owner:
8162 case ParsedAttr::AT_Pointer:
8165 case ParsedAttr::AT_OpenCLAccess:
8168 case ParsedAttr::AT_OpenCLNoSVM:
8171 case ParsedAttr::AT_SwiftContext:
8174 case ParsedAttr::AT_SwiftAsyncContext:
8177 case ParsedAttr::AT_SwiftErrorResult:
8180 case ParsedAttr::AT_SwiftIndirectResult:
8183 case ParsedAttr::AT_InternalLinkage:
8186 case ParsedAttr::AT_ZeroCallUsedRegs:
8189 case ParsedAttr::AT_FunctionReturnThunks:
8192 case ParsedAttr::AT_NoMerge:
8195 case ParsedAttr::AT_NoUniqueAddress:
8199 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
8203 case ParsedAttr::AT_CountedBy:
8204 case ParsedAttr::AT_CountedByOrNull:
8205 case ParsedAttr::AT_SizedBy:
8206 case ParsedAttr::AT_SizedByOrNull:
8210 case ParsedAttr::AT_NoFieldProtection:
8214 case ParsedAttr::AT_Personality:
8219 case ParsedAttr::AT_LayoutVersion:
8222 case ParsedAttr::AT_Uuid:
8225 case ParsedAttr::AT_MSInheritance:
8228 case ParsedAttr::AT_Thread:
8231 case ParsedAttr::AT_MSConstexpr:
8234 case ParsedAttr::AT_HybridPatchable:
8239 case ParsedAttr::AT_RootSignature:
8242 case ParsedAttr::AT_HLSLNumThreads:
8245 case ParsedAttr::AT_HLSLWaveSize:
8248 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
8251 case ParsedAttr::AT_HLSLVkExtBuiltinOutput:
8254 case ParsedAttr::AT_HLSLVkPushConstant:
8257 case ParsedAttr::AT_HLSLVkConstantId:
8260 case ParsedAttr::AT_HLSLVkBinding:
8263 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
8266 case ParsedAttr::AT_HLSLPackOffset:
8269 case ParsedAttr::AT_HLSLShader:
8272 case ParsedAttr::AT_HLSLResourceBinding:
8275 case ParsedAttr::AT_HLSLParamModifier:
8278 case ParsedAttr::AT_HLSLUnparsedSemantic:
8281 case ParsedAttr::AT_HLSLVkLocation:
8285 case ParsedAttr::AT_AbiTag:
8288 case ParsedAttr::AT_CFGuard:
8293 case ParsedAttr::AT_PtGuardedVar:
8296 case ParsedAttr::AT_NoSanitize:
8299 case ParsedAttr::AT_NoSanitizeAddress:
8302 case ParsedAttr::AT_NoSanitizeThread:
8305 case ParsedAttr::AT_NoSanitizeMemory:
8308 case ParsedAttr::AT_GuardedBy:
8311 case ParsedAttr::AT_PtGuardedBy:
8314 case ParsedAttr::AT_LockReturned:
8317 case ParsedAttr::AT_LocksExcluded:
8320 case ParsedAttr::AT_AcquiredBefore:
8323 case ParsedAttr::AT_AcquiredAfter:
8328 case ParsedAttr::AT_Capability:
8329 case ParsedAttr::AT_Lockable:
8332 case ParsedAttr::AT_ReentrantCapability:
8335 case ParsedAttr::AT_RequiresCapability:
8339 case ParsedAttr::AT_AssertCapability:
8342 case ParsedAttr::AT_AcquireCapability:
8345 case ParsedAttr::AT_ReleaseCapability:
8348 case ParsedAttr::AT_TryAcquireCapability:
8353 case ParsedAttr::AT_Consumable:
8356 case ParsedAttr::AT_CallableWhen:
8359 case ParsedAttr::AT_ParamTypestate:
8362 case ParsedAttr::AT_ReturnTypestate:
8365 case ParsedAttr::AT_SetTypestate:
8368 case ParsedAttr::AT_TestTypestate:
8373 case ParsedAttr::AT_ArgumentWithTypeTag:
8376 case ParsedAttr::AT_TypeTagForDatatype:
8381 case ParsedAttr::AT_SwiftAsyncName:
8384 case ParsedAttr::AT_SwiftAttr:
8387 case ParsedAttr::AT_SwiftBridge:
8390 case ParsedAttr::AT_SwiftError:
8393 case ParsedAttr::AT_SwiftName:
8396 case ParsedAttr::AT_SwiftNewType:
8399 case ParsedAttr::AT_SwiftAsync:
8402 case ParsedAttr::AT_SwiftAsyncError:
8407 case ParsedAttr::AT_XRayLogArgs:
8411 case ParsedAttr::AT_PatchableFunctionEntry:
8415 case ParsedAttr::AT_AlwaysDestroy:
8416 case ParsedAttr::AT_NoDestroy:
8420 case ParsedAttr::AT_Uninitialized:
8424 case ParsedAttr::AT_ObjCExternallyRetained:
8428 case ParsedAttr::AT_MIGServerRoutine:
8432 case ParsedAttr::AT_MSAllocator:
8436 case ParsedAttr::AT_ArmBuiltinAlias:
8440 case ParsedAttr::AT_ArmLocallyStreaming:
8444 case ParsedAttr::AT_ArmNew:
8448 case ParsedAttr::AT_AcquireHandle:
8452 case ParsedAttr::AT_ReleaseHandle:
8456 case ParsedAttr::AT_UnsafeBufferUsage:
8460 case ParsedAttr::AT_UseHandle:
8464 case ParsedAttr::AT_EnforceTCB:
8468 case ParsedAttr::AT_EnforceTCBLeaf:
8472 case ParsedAttr::AT_BuiltinAlias:
8476 case ParsedAttr::AT_PreferredType:
8480 case ParsedAttr::AT_UsingIfExists:
8484 case ParsedAttr::AT_TypeNullable:
8488 case ParsedAttr::AT_VTablePointerAuthentication:
8492 case ParsedAttr::AT_ModularFormat:
8496 case ParsedAttr::AT_MSStruct:
8500 case ParsedAttr::AT_GCCStruct:
8504 case ParsedAttr::AT_PointerFieldProtection:
8507 diag::err_attribute_pointer_field_protection_experimental)
8516 return D->
hasAttr<DeviceKernelAttr>() ||
8525 const auto *Flat = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>();
8526 const auto *Reqd = D->
getAttr<ReqdWorkGroupSizeAttr>();
8530 auto Eval = [&](
Expr *E) -> std::optional<uint64_t> {
8531 if (E->isValueDependent())
8532 return std::nullopt;
8533 std::optional<llvm::APSInt>
V = E->getIntegerConstantExpr(S.
Context);
8535 return std::nullopt;
8536 return V->getZExtValue();
8539 std::optional<uint64_t>
X = Eval(Reqd->getXDim());
8540 std::optional<uint64_t> Y = Eval(Reqd->getYDim());
8541 std::optional<uint64_t> Z = Eval(Reqd->getZDim());
8542 std::optional<uint64_t>
Min = Eval(Flat->getMin());
8543 std::optional<uint64_t>
Max = Eval(Flat->getMax());
8544 if (!
X || !Y || !Z || !
Min || !
Max)
8547 uint64_t Product = *
X * *Y * *Z;
8548 if (*
Min != Product || *
Max != Product) {
8549 S.
Diag(Flat->getLocation(),
8550 diag::err_attribute_amdgpu_flat_work_group_size_mismatch);
8558 if (AttrList.
empty())
8569 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8579 if (!(D->
hasAttr<DeviceKernelAttr>() ||
8580 (D->
hasAttr<CUDAGlobalAttr>() &&
8581 Context.getTargetInfo().getTriple().isSPIRV()))) {
8583 if (
const auto *A = D->
getAttr<ReqdWorkGroupSizeAttr>()) {
8588 }
else if (
const auto *A = D->
getAttr<WorkGroupSizeHintAttr>()) {
8591 }
else if (
const auto *A = D->
getAttr<VecTypeHintAttr>()) {
8594 }
else if (
const auto *A = D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8600 if (
const auto *A = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8604 }
else if (
const auto *A = D->
getAttr<AMDGPUWavesPerEUAttr>()) {
8608 }
else if (
const auto *A = D->
getAttr<AMDGPUNumSGPRAttr>()) {
8612 }
else if (
const auto *A = D->
getAttr<AMDGPUNumVGPRAttr>()) {
8630 if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8631 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8632 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8633 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8635 if (HasGlobal || HasHost != HasDevice) {
8636 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8637 Guide->setInvalidDecl();
8638 }
else if (HasHost && HasDevice) {
8639 Diag(Guide->getLocation(),
8640 diag::warn_deduction_guide_target_attr_deprecated);
8646 (D->
hasAttr<ConstructorAttr>() || D->
hasAttr<DestructorAttr>()) &&
8649 << (D->
hasAttr<ConstructorAttr>() ?
"constructors" :
"destructors");
8658 if (D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
8661 D->
dropAttr<ObjCDesignatedInitializerAttr>();
8668 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8675 if (D && D->
hasAttr<BPFPreserveAccessIndexAttr>())
8682 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8685 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8697 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8705 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8722 std::optional<StringRef> CorrectedScopeName =
8724 if (CorrectedScopeName) {
8725 ScopeName = *CorrectedScopeName;
8731 if (CorrectedAttrName) {
8732 AttrName = *CorrectedAttrName;
8735 if (CorrectedScopeName || CorrectedAttrName) {
8736 std::string CorrectedFullName =
8740 diag::warn_unknown_attribute_ignored_suggestion);
8742 D << AL << CorrectedFullName;
8747 if (CorrectedScopeName) {
8751 if (CorrectedAttrName) {
8756 Diag(NR.
getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8764 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
8786 for (
const auto &AI : FT->param_types()) {
8788 Param->setScopeInfo(0, Params.size());
8789 Params.push_back(Param);
8791 NewFD->setParams(Params);
8793 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
8795 VD->getInnerLocStart(), VD->getLocation(), II,
8796 VD->getType(), VD->getTypeSourceInfo(),
8797 VD->getStorageClass());
8798 if (VD->getQualifier())
8799 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8832 if (
auto *VD = dyn_cast<VarDecl>(D))
8833 if (VD->isExternC())
8835 if (
auto *FD = dyn_cast<FunctionDecl>(D))
8843 auto &WeakInfos = I->second;
8844 for (
const auto &W : WeakInfos)
8846 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
8847 WeakInfos.swap(EmptyWeakInfos);
8859 auto ProcessAttributesWithSliding =
8867 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8868 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8873 AL.diagnoseAppertainsTo(*
this, D);
8888 .WithIncludeCXX11Attributes(
false)
8889 .WithIgnoreTypeAttributes(
true));
8898 .WithIncludeCXX11Attributes(
false)
8899 .WithIgnoreTypeAttributes(
true));
8917 UnavailableAttr::ImplicitReason &reason) {
8931 if (
diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8932 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8933 reason = UnavailableAttr::IR_ForbiddenWeak;
8942 reason = UnavailableAttr::IR_ARCForbiddenType;
8952 auto Reason = UnavailableAttr::IR_None;
8954 assert(Reason &&
"didn't set reason?");
8959 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
8962 if (FD->
hasAttr<UnavailableAttr>() &&
8964 diag::err_arc_array_param_no_ownership) {
8995 bool AnyAccessFailures =
false;
9003 switch (
diag.Kind) {
9007 if (!
decl->isInvalidDecl())
9019 AnyAccessFailures =
true;
9032 assert(curPool &&
"re-emitting in undelayed context not supported");
9033 curPool->
steal(pool);
9050 QualType ParamTy = FD->getParamDecl(0)->getType();
9053 FD->getParamDecl(0)->getLocation(), ParamTy, Ty)) &&
9055 this->
Diag(Attr->getArgLoc(),
9056 diag::err_attribute_cleanup_func_arg_incompatible_type)
9057 << NI.
getName() << ParamTy << Ty;
9065 if (this->
Context.getAsArrayType(
T))
9066 T = this->
Context.getBaseElementType(
T);
9067 if (!
T->isRecordType()) {
9068 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)
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 or functio...
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 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 bool isCallbackOrDependent(QualType T)
True if T names a function to call: a function pointer, a function reference, or a reference to a fun...
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 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 checkAMDGPUReqdWorkGroupSize(Sema &S, Decl *D)
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 OffloadArch getOffloadArch(const TargetInfo &TI)
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 void ProcessDeclAttribute(Sema &S, Decl *D, const ParsedAttr &AL, const Sema::ProcessDeclAttributeOptions &Options)
ProcessDeclAttribute - Apply the specific attribute to the specified decl if the attribute applies to...
static bool typeHasCapability(Sema &S, QualType Ty)
static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isFunctionLike(const Type &T)
static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCFGuardAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReentrantCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsPointer(Sema &S, const Decl *D, const ParsedAttr &AL)
Check if passed in Decl is a pointer type.
static bool isForbiddenTypeAllowed(Sema &S, Decl *D, const DelayedDiagnostic &diag, UnavailableAttr::ImplicitReason &reason)
Is the given declaration allowed to use a forbidden type?
static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleModeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
handleModeAttr - This attribute modifies the width of a decl with primitive type.
static bool checkAvailabilityAttr(Sema &S, SourceRange Range, const IdentifierInfo *Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted)
static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkPositiveIntArgument(Sema &S, const AttrInfo &AI, const Expr *Expr, int &Val, unsigned Idx=UINT_MAX)
Wrapper around checkUInt32Argument, with an extra check to be sure that the result will fit into a re...
static void handleVecReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isGlobalVar(const Decl *D)
static void handleTLSModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis functions specific to M68k.
This file declares semantic analysis functions specific to MIPS.
This file declares semantic analysis functions specific to MSP430.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis routines for OpenCL.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
This file declares semantic analysis functions specific to X86.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
a trap message and trap category.
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...
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
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.
A processor an offloading action can target.
llvm::NVPTX::GPUKind nvptxKind() const
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.
void handleAMDGPUMaxNumWorkGroupsAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUFlatWorkGroupSizeAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumSGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumVGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUWavesPerEUAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptSaveFPAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleBuiltinAliasAttr(Decl *D, const ParsedAttr &AL)
void handleNewAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
bool SveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool MveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetClonesAttr(SmallVectorImpl< StringRef > &Params, SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams)
bool CdeAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleSignalAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handlePreserveAIRecord(RecordDecl *RD)
void handlePreserveAccessIndexAttr(Decl *D, const ParsedAttr &AL)
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
SemaDiagnosticBuilder DiagIfHostCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as host cod...
void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL)
void handleVkLocationAttr(Decl *D, const ParsedAttr &AL)
void handleSemanticAttr(Decl *D, const ParsedAttr &AL)
void handleShaderAttr(Decl *D, const ParsedAttr &AL)
void handleVkExtBuiltinOutputAttr(Decl *D, const ParsedAttr &AL)
void handlePackOffsetAttr(Decl *D, const ParsedAttr &AL)
void handleParamModifierAttr(Decl *D, const ParsedAttr &AL)
void handleRootSignatureAttr(Decl *D, const ParsedAttr &AL)
void handleResourceBindingAttr(Decl *D, const ParsedAttr &AL)
void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL)
void handleVkExtBuiltinInputAttr(Decl *D, const ParsedAttr &AL)
void handleVkPushConstantAttr(Decl *D, const ParsedAttr &AL)
void handleVkBindingAttr(Decl *D, const ParsedAttr &AL)
void handleVkConstantIdAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleRuntimeName(Decl *D, const ParsedAttr &AL)
void handleNSObject(Decl *D, const ParsedAttr &AL)
bool isValidOSObjectOutParameter(const Decl *D)
void handleNSErrorDomain(Decl *D, const ParsedAttr &Attr)
void handleXReturnsXRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleExternallyRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleMethodFamilyAttr(Decl *D, const ParsedAttr &AL)
void handleIndependentClass(Decl *D, const ParsedAttr &AL)
void handleIBOutlet(Decl *D, const ParsedAttr &AL)
void handleReturnsInnerPointerAttr(Decl *D, const ParsedAttr &Attrs)
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
void handleSuppresProtocolAttr(Decl *D, const ParsedAttr &AL)
void handleOwnershipAttr(Decl *D, const ParsedAttr &AL)
void handleBlocksAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeMutableAttr(Decl *D, const ParsedAttr &AL)
Sema::RetainOwnershipKind parsedAttrToRetainOwnershipKind(const ParsedAttr &AL)
void handleRequiresSuperAttr(Decl *D, const ParsedAttr &Attrs)
void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI, Sema::RetainOwnershipKind K, bool IsTemplateInstantiation)
void handleDesignatedInitializer(Decl *D, const ParsedAttr &AL)
void handleBridgeRelatedAttr(Decl *D, const ParsedAttr &AL)
void handleIBOutletCollection(Decl *D, const ParsedAttr &AL)
bool isCFStringType(QualType T)
void handleDirectAttr(Decl *D, const ParsedAttr &AL)
bool isNSStringType(QualType T, bool AllowNSAttributedString=false)
void handleBoxable(Decl *D, const ParsedAttr &AL)
void handleDirectMembersAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeAttr(Decl *D, const ParsedAttr &AL)
void handlePreciseLifetimeAttr(Decl *D, const ParsedAttr &AL)
void handleSubGroupSize(Decl *D, const ParsedAttr &AL)
void handleNoSVMAttr(Decl *D, const ParsedAttr &AL)
void handleAccessAttr(Decl *D, const ParsedAttr &AL)
void handleOMPAssumeAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
bool isAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
void handleKernelEntryPointAttr(Decl *D, const ParsedAttr &AL)
void handleKernelAttr(Decl *D, const ParsedAttr &AL)
void handleBridge(Decl *D, const ParsedAttr &AL)
void handleAsyncAttr(Decl *D, const ParsedAttr &AL)
void handleAsyncName(Decl *D, const ParsedAttr &AL)
void handleNewType(Decl *D, const ParsedAttr &AL)
void handleError(Decl *D, const ParsedAttr &AL)
void AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi)
void handleAsyncError(Decl *D, const ParsedAttr &AL)
void handleName(Decl *D, const ParsedAttr &AL)
void handleAttrAttr(Decl *D, const ParsedAttr &AL)
void handleWebAssemblyImportNameAttr(Decl *D, const ParsedAttr &AL)
void handleWebAssemblyImportModuleAttr(Decl *D, const ParsedAttr &AL)
void handleWebAssemblyExportNameAttr(Decl *D, const ParsedAttr &AL)
void handleForceAlignArgPointerAttr(Decl *D, const ParsedAttr &AL)
void handleAnyInterruptAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
void popWithoutEmitting(DelayedDiagnosticsState state)
Leave a delayed-diagnostic state that was previously pushed.
Sema - This implements semantic analysis and AST building for C.
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
DelayedDiagnosticsState ParsingDeclState
bool isValidPointerAttrType(QualType T, bool RefOkay=false)
Determine if type T is a valid subject for a nonnull and similar attributes.
static std::enable_if_t< std::is_base_of_v< Attr, AttrInfo >, SourceLocation > getAttrLoc(const AttrInfo &AL)
A helper function to provide Attribute Location for the Attr types AND the ParsedAttr.
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII=nullptr)
bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI, unsigned AttrArgNum, const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis=false, bool CanIndexVariadicArguments=false)
Check if IdxExpr is a valid parameter index for a function or instance method D.
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
bool checkSectionName(SourceLocation LiteralLoc, StringRef Str)
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A, bool SkipArgCountCheck=false)
Handles semantic checking for features that are common to all attributes, such as checking whether a ...
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
DLLImportAttr * mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI)
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
void PopParsingDeclaration(ParsingDeclState state, Decl *decl)
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
bool CheckFormatStringsCompatible(FormatStringType FST, const StringLiteral *AuthoritativeFormatString, const StringLiteral *TestedFormatString, const Expr *FunctionCallArg=nullptr)
Verify that two format strings (as understood by attribute(format) and attribute(format_matches) are ...
bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS)
Check whether the given variable declaration has a size that fits within the address space it is decl...
void redelayDiagnostics(sema::DelayedDiagnosticPool &pool)
Given a set of delayed diagnostics, re-emit them as if they had been delayed in the current context i...
PersonalityAttr * mergePersonalityAttr(Decl *D, FunctionDecl *Routine, const AttributeCommonInfo &CI)
AvailabilityAttr * mergeAndInferAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII)
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
DiagnosticsEngine & getDiagnostics() const
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
ASTContext & getASTContext() const
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
void ProcessPragmaWeak(Scope *S, Decl *D)
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI)
Add a no_cluster attribute to a particular declaration.
FPOptions & getCurFPFeatures()
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Expression
An arbitrary expression.
const LangOptions & getLangOpts() const
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
const LangOptions & LangOpts
static const uint64_t MaximumAlignment
CUDAClusterDimsAttr * createClusterDimsAttr(const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
Add a cluster_dims attribute to a particular declaration.
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes, bool OrNull)
Check if applying the specified attribute variant from the "counted by" family of attributes to Field...
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val, unsigned Idx=UINT_MAX, bool StrictlyUnsigned=false)
If Expr is a valid integer constant, get the value of the integer expression and return success or fa...
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnInitPriorityAttr(Decl *D, const Attr *A)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
NamedDecl * DeclClonePragmaWeak(NamedDecl *ND, const IdentifierInfo *II, SourceLocation Loc)
DeclClonePragmaWeak - clone existing decl (maybe definition), #pragma weak needs a non-definition dec...
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
void ActOnCleanupAttr(Decl *D, const Attr *A)
static FormatStringType GetFormatStringType(StringRef FormatFlavor)
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
bool ValidateFormatString(FormatStringType FST, const StringLiteral *Str)
Verify that one format string (as understood by attribute(format)) is self-consistent; for instance,...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
bool checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A)
Recheck instantiated thread-safety attributes that could not be validated on the dependent pattern de...
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks, bool IgnoreArch=false)
Create a CUDALaunchBoundsAttr attribute.
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ AP_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute.
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
@ AP_PragmaClangAttribute_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute that was applied ...
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc, StringRef Platform)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
LifetimeCaptureByAttr * ParseLifetimeCaptureByAttr(const ParsedAttr &AL, StringRef ParamName)
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
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.
Top level wrappers for InstallAPI frontend operations.
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
@ Default
Set to the current date and time.
@ 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.
const FunctionProtoType * T
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.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 int32_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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