63#include "llvm/ADT/APSInt.h"
64#include "llvm/ADT/STLExtras.h"
65#include "llvm/ADT/StringExtras.h"
66#include "llvm/Demangle/Demangle.h"
67#include "llvm/IR/DerivedTypes.h"
68#include "llvm/MC/MCSectionMachO.h"
69#include "llvm/Support/Error.h"
70#include "llvm/Support/ErrorHandling.h"
71#include "llvm/Support/MathExtras.h"
72#include "llvm/Support/raw_ostream.h"
73#include "llvm/TargetParser/Triple.h"
99template <
typename AttrInfo>
101 int &Val,
unsigned Idx =
UINT_MAX) {
106 if (UVal > (uint32_t)std::numeric_limits<int>::max()) {
110 <<
toString(I, 10,
false) << 32 << 0;
119 const Expr *E, StringRef &Str,
125 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
131 Str = Literal->getString();
141 Diag(Loc->
getLoc(), diag::err_attribute_argument_type)
147 *ArgLocation = Loc->
getLoc();
157 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
162 Str = Literal->getString();
180 return !Result.empty();
183 bool foundStarOperator = IsOverloadedOperatorPresent(
Record, OO_Star);
184 bool foundArrowOperator = IsOverloadedOperatorPresent(
Record, OO_Arrow);
185 if (foundStarOperator && foundArrowOperator)
192 for (
const auto &BaseSpecifier : CXXRecord->bases()) {
193 if (!foundStarOperator)
194 foundStarOperator = IsOverloadedOperatorPresent(
195 BaseSpecifier.getType()->getAsRecordDecl(), OO_Star);
196 if (!foundArrowOperator)
197 foundArrowOperator = IsOverloadedOperatorPresent(
198 BaseSpecifier.getType()->getAsRecordDecl(), OO_Arrow);
201 if (foundStarOperator && foundArrowOperator)
221 if (!RD->isCompleteDefinition())
228 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_pointer) << AL << QT;
240 return PT->getPointeeType()->getAsRecordDecl();
245template <
typename AttrType>
252 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(RD)) {
254 return !Base->hasAttr<AttrType>();
268 if (!RD->isCompleteDefinition())
286 if (!RD->isCompleteDefinition())
301 return TN->
hasAttr<CapabilityAttr>();
320 if (
const auto *E = dyn_cast<CastExpr>(Ex))
322 else if (
const auto *E = dyn_cast<ParenExpr>(Ex))
324 else if (
const auto *E = dyn_cast<UnaryOperator>(Ex)) {
325 if (E->getOpcode() == UO_LNot || E->getOpcode() == UO_AddrOf ||
326 E->getOpcode() == UO_Deref)
329 }
else if (
const auto *E = dyn_cast<BinaryOperator>(Ex)) {
330 if (E->getOpcode() == BO_LAnd || E->getOpcode() == BO_LOr)
348 bool ParamIdxOk =
false) {
353 const auto *MD = dyn_cast<const CXXMethodDecl>(D);
354 if (MD && !MD->isStatic()) {
360 diag::warn_thread_attribute_not_on_capability_member)
361 << AL << MD->getParent();
363 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_non_static_member)
368 for (
unsigned Idx = Sidx; Idx < AL.
getNumArgs(); ++Idx) {
373 Args.push_back(ArgExp);
377 if (
const auto *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
378 if (StrLit->getLength() == 0 ||
379 (StrLit->isOrdinary() && StrLit->getString() ==
"*")) {
382 Args.push_back(ArgExp);
388 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_ignored) << AL;
389 Args.push_back(ArgExp);
397 if (
const auto *UOp = dyn_cast<UnaryOperator>(ArgExp))
398 if (UOp->getOpcode() == UO_AddrOf)
399 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
400 if (DRE->getDecl()->isCXXInstanceMember())
401 ArgTy = DRE->getDecl()->getType();
407 if (!RD && ParamIdxOk) {
408 const auto *FD = dyn_cast<FunctionDecl>(D);
409 const auto *IL = dyn_cast<IntegerLiteral>(ArgExp);
411 unsigned int NumParams = FD->getNumParams();
412 llvm::APInt ArgValue = IL->getValue();
413 uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
414 uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
415 if (!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
417 diag::err_attribute_argument_out_of_bounds_extra_info)
418 << AL << Idx + 1 << NumParams;
421 ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
430 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_argument_not_lockable)
433 Args.push_back(ArgExp);
445 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
466 unsigned Size = Args.size();
502 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
519 Expr **StartArg = &Args[0];
521 AcquiredAfterAttr(S.
Context, AL, StartArg, Args.size()));
529 Expr **StartArg = &Args[0];
531 AcquiredBeforeAttr(S.
Context, AL, StartArg, Args.size()));
548template <
typename AttrInfo>
550 unsigned AttrArgNo) {
551 assert(AI.isArgExpr(AttrArgNo) &&
"Expected expression argument");
552 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
561 S.
Diag(SrcLoc, diag::err_attribute_integers_only)
576 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only) << AL;
587 ParamIdx SizeArgNo(SizeArgNoVal, D);
602 AllocSizeAttr(S.
Context, AL, SizeArgNo, NumberArgNo));
611 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
626 unsigned Size = Args.size();
634 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
644 unsigned Size = Args.size();
647 Expr **StartArg = &Args[0];
650 LocksExcludedAttr(S.
Context, AL, StartArg, Size));
656 if (!
Cond->isTypeDependent()) {
667 Msg =
"<no message provided>";
673 S.
Diag(AL.
getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
675 S.
Diag(PDiag.first, PDiag.second);
682 S.
Diag(AL.
getLoc(), diag::ext_clang_enable_if);
691 StringRef NewUserDiagnostic;
703 if (
const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
705 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
712 if (RD->isTemplated()) {
714 diag::warn_dllattr_ignored_exclusion_takes_precedence)
716 D->
dropAttrs<DLLExportAttr, DLLImportAttr>();
718 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_in_non_template) << AL;
722 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_on_non_member) << AL;
728 ExcludeFromExplicitInstantiationAttr(S.
Context, AL));
736 const CXXRecordDecl *ClassType;
738 llvm::SmallPtrSet<const ParmVarDecl *, 16> Parms;
742 ArgumentDependenceChecker(
const FunctionDecl *FD) {
744 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
752 bool referencesArgs(Expr *E) {
758 bool VisitCXXThisExpr(CXXThisExpr *E)
override {
760 "`this` doesn't refer to the enclosing class?");
765 bool VisitDeclRefExpr(DeclRefExpr *DRE)
override {
766 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DRE->
getDecl()))
767 if (Parms.count(PVD)) {
780 if (
const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
781 if (!MethodDecl->isStatic()) {
782 S.
Diag(AL.
getLoc(), diag::err_attribute_no_member_function) << AL;
789 if (
auto *E = dyn_cast<Expr *>(
Union))
790 return E->getBeginLoc();
794 S.
Diag(Loc, diag::err_attribute_argument_n_type) << AL << Index << T;
800 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.
getArgAsExpr(0));
803 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
812 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments_for)
819 for (
unsigned I = 1; I < AL.
getNumArgs(); ++I) {
831 if (Index > DeclFD->getNumParams()) {
832 S.
Diag(AL.
getLoc(), diag::err_attribute_bounds_for_function)
833 << AL << Index << DeclFD << DeclFD->getNumParams();
838 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
843 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
847 Indices.push_back(Index - 1);
851 S.
Context, AL, AttrFD, Indices.data(), Indices.size()));
855 S.
Diag(AL.
getLoc(), diag::ext_clang_diagnose_if);
862 StringRef DefaultSevStr;
866 DiagnoseIfAttr::DefaultSeverity DefaultSev;
867 if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
869 diag::err_diagnose_if_invalid_diagnostic_type);
873 StringRef WarningGroup;
877 if (WarningGroup.empty() ||
881 diag::err_diagnose_if_unknown_warning)
887 bool ArgDependent =
false;
888 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
889 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(
Cond);
891 S.
Context, AL,
Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
901 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
911 static constexpr const StringRef kWildcard =
"*";
914 bool HasWildcard =
false;
916 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
917 if (Name == kWildcard)
919 Names.push_back(Name);
923 if (
const auto *NBA = D->
getAttr<NoBuiltinAttr>())
924 for (StringRef BuiltinName : NBA->builtinNames())
925 AddBuiltinName(BuiltinName);
929 AddBuiltinName(kWildcard);
931 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
932 StringRef BuiltinName;
938 AddBuiltinName(BuiltinName);
940 S.
Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
941 << BuiltinName << AL;
946 Names.erase(llvm::unique(Names), Names.end());
949 if (HasWildcard && Names.size() > 1)
951 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
954 if (D->
hasAttr<NoBuiltinAttr>())
957 NoBuiltinAttr(S.
Context, AL, Names.data(), Names.size()));
961 if (D->
hasAttr<PassObjectSizeAttr>()) {
962 S.
Diag(D->
getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
985 S.
Diag(D->
getBeginLoc(), diag::err_attribute_pointers_only) << AL << 1;
993 ConsumableAttr::ConsumedState DefaultState;
997 if (!ConsumableAttr::ConvertStrToConsumedState(
999 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1004 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1017 if (!RD->hasAttr<ConsumableAttr>()) {
1018 S.
Diag(AL.
getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1035 for (
unsigned ArgIndex = 0; ArgIndex < AL.
getNumArgs(); ++ArgIndex) {
1036 CallableWhenAttr::ConsumedState CallableState;
1038 StringRef StateString;
1049 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1051 S.
Diag(Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1055 States.push_back(CallableState);
1059 CallableWhenAttr(S.
Context, AL, States.data(), States.size()));
1063 ParamTypestateAttr::ConsumedState ParamState;
1069 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1071 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1072 << AL << StateString;
1076 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1097 ReturnTypestateAttr::ConsumedState ReturnState;
1101 if (!ReturnTypestateAttr::ConvertStrToConsumedState(
1103 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1108 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1145 SetTypestateAttr::ConsumedState NewState;
1149 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1150 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1155 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1167 TestTypestateAttr::ConsumedState TestState;
1171 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1172 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1177 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1192 if (
auto *TD = dyn_cast<TagDecl>(D))
1194 else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
1195 bool BitfieldByteAligned = (!FD->
getType()->isDependentType() &&
1201 if (BitfieldByteAligned)
1203 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1209 if (BitfieldByteAligned)
1210 S.
Diag(AL.
getLoc(), diag::warn_attribute_packed_for_bitfield);
1216 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
1222 assert(CTD &&
"attribute does not appertain to this declaration");
1230 if (!T.hasQualifiers() && T->isTypedefNameType()) {
1233 if (
const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1234 T->getAsCXXRecordDecl())) {
1235 Template = CTSD->getSpecializedTemplate();
1236 }
else if (
const auto *TST = T->getAs<TemplateSpecializationType>()) {
1237 while (TST && TST->isTypeAlias())
1238 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1240 Template = TST->getTemplateName().getAsTemplateDecl();
1249 S.
Diag(AL.
getLoc(), diag::err_attribute_not_typedef_for_specialization)
1252 S.
Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1261 NoSpecializationsAttr::Create(S.
Context, Message, AL));
1265 if (T->isDependentType())
1268 if (T->isReferenceType())
1271 T = T.getNonReferenceType();
1276 if (
const RecordType *UT = T->getAsUnionType()) {
1278 if (UD->
hasAttr<TransparentUnionAttr>()) {
1279 for (
const auto *I : UD->
fields()) {
1287 return T->isAnyPointerType() || T->isBlockPointerType();
1293 bool isReturnValue =
false) {
1296 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1297 << AL << AttrParmRange << TypeRange;
1299 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1300 << AL << AttrParmRange << TypeRange << 0;
1308 for (
unsigned I = 0; I < AL.
getNumArgs(); ++I) {
1312 D, AL, I + 1, Ex, Idx,
1325 NonNullArgs.push_back(Idx);
1336 I != E && !AnyPointers; ++I) {
1343 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_no_pointers);
1346 ParamIdx *Start = NonNullArgs.data();
1347 unsigned Size = NonNullArgs.size();
1348 llvm::array_pod_sort(Start, Start + Size);
1358 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1389 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1414 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1420 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1423 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1426 Diag(AttrLoc, diag::err_attribute_argument_type)
1431 if (!I->isPowerOf2()) {
1432 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1438 Diag(CI.
getLoc(), diag::warn_assume_aligned_too_great)
1443 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1457 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1472 << CI << FuncDecl->getParamDecl(Idx.
getASTIndex())->getSourceRange();
1482 if (AttrName.size() > 4 && AttrName.starts_with(
"__") &&
1483 AttrName.ends_with(
"__")) {
1484 AttrName = AttrName.drop_front(2).drop_back(2);
1500 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1506 OwnershipAttr::OwnershipKind K =
1507 OwnershipAttr(S.
Context, AL,
nullptr,
nullptr, 0).getOwnKind();
1511 case OwnershipAttr::Takes:
1512 case OwnershipAttr::Holds:
1514 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1518 case OwnershipAttr::Returns:
1520 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 2;
1528 if (K == OwnershipAttr::Returns &&
1530 S.
Diag(AL.
getLoc(), diag::err_ownership_takes_return_type) << AL;
1536 StringRef ModuleName =
Module->getName();
1542 for (
unsigned i = 1; i < AL.
getNumArgs(); ++i) {
1552 case OwnershipAttr::Takes:
1553 case OwnershipAttr::Holds:
1554 if (!T->isAnyPointerType() && !T->isBlockPointerType())
1557 case OwnershipAttr::Returns:
1558 if (!T->isIntegerType())
1563 S.
Diag(AL.
getLoc(), diag::err_ownership_type) << AL << Err
1572 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1573 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1576 I->isRegularKeywordAttribute());
1578 }
else if (K == OwnershipAttr::Returns &&
1579 I->getOwnKind() == OwnershipAttr::Returns) {
1582 if (!llvm::is_contained(I->args(), Idx)) {
1583 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1584 << I->args_begin()->getSourceIndex();
1586 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1590 }
else if (K == OwnershipAttr::Takes &&
1591 I->getOwnKind() == OwnershipAttr::Takes) {
1592 if (I->getModule()->getName() != ModuleName) {
1593 S.
Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1594 << I->getModule()->getName();
1595 S.
Diag(AL.
getLoc(), diag::note_ownership_takes_class_mismatch)
1602 OwnershipArgs.push_back(Idx);
1605 ParamIdx *Start = OwnershipArgs.data();
1606 unsigned Size = OwnershipArgs.size();
1607 llvm::array_pod_sort(Start, Start + Size);
1615 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1631 S.
Diag(AL.
getLoc(), diag::err_attribute_weakref_not_global_context)
1676 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1678 Demangled.reset(llvm::itaniumDemangle(Str,
false));
1689 if (MC->shouldMangleDeclName(ND)) {
1690 llvm::raw_svector_ostream Out(Name);
1694 Name = ND->getIdentifier()->getName();
1710 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 1;
1724 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_darwin);
1732 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_nvptx);
1736 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
1738 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 0;
1743 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1744 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << VD << 0;
1761 if (Model !=
"global-dynamic" && Model !=
"local-dynamic"
1762 && Model !=
"initial-exec" && Model !=
"local-exec") {
1763 S.
Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1773 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1785 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
1795 if (
auto *DRE = dyn_cast<DeclRefExpr>(DeallocE)) {
1796 DeallocFD = dyn_cast<FunctionDecl>(DRE->
getDecl());
1799 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1803 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(DeallocE)) {
1805 DeallocNI = ULE->getNameInfo();
1807 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1814 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function) << 0;
1822 DeallocPtrIdx =
ParamIdx(1, DeallocFD);
1833 diag::err_attribute_malloc_arg_not_function_with_pointer_arg)
1847 diag::err_attribute_malloc_arg_refers_to_non_pointer_type)
1856 S.
Diag(AL.
getLoc(), diag::warn_attribute_form_ignored) << AL;
1858 RestrictAttr(S.
Context, AL, DeallocE, DeallocPtrIdx));
1867 auto emitWarning = [
this, &CI](
unsigned NoteDiagID) {
1868 Diag(CI.
getLoc(), diag::warn_attribute_return_span_only) << CI;
1875 return emitWarning(diag::note_returned_incomplete_type);
1878 return emitWarning(diag::note_returned_not_struct);
1879 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1880 if (CXXRD->getNumBases() > 0) {
1881 return emitWarning(diag::note_type_inherits_from_base);
1885 auto FieldsCount = std::distance(FieldsBegin, RD->
field_end());
1886 if (FieldsCount != 2)
1887 return emitWarning(diag::note_returned_not_two_field_struct) << FieldsCount;
1888 QualType FirstFieldType = FieldsBegin->getType();
1889 QualType SecondFieldType = std::next(FieldsBegin)->getType();
1890 auto validatePointerType = [](
const QualType &T) {
1892 return T->isPointerType() && !T->isFunctionPointerType();
1894 auto checkIntegerType = [
this, emitWarning](
const QualType &T,
1895 const int FieldNo) ->
bool {
1896 const auto *BT = dyn_cast<BuiltinType>(T.getCanonicalType());
1897 if (!BT || !BT->isInteger())
1898 return emitWarning(diag::note_returned_not_integer_field) << FieldNo;
1900 if (
Context.getTypeSize(BT) < IntSize)
1901 return emitWarning(diag::note_returned_not_wide_enough_field)
1902 << FieldNo << IntSize;
1905 if (validatePointerType(FirstFieldType) &&
1906 validatePointerType(SecondFieldType)) {
1909 }
else if (validatePointerType(FirstFieldType)) {
1911 return checkIntegerType(SecondFieldType, 2);
1912 }
else if (validatePointerType(SecondFieldType)) {
1914 return checkIntegerType(FirstFieldType, 1);
1916 return emitWarning(diag::note_returned_not_span_struct);
1932 if (
const auto *
Other = D->
getAttr<CPUDispatchAttr>()) {
1933 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1934 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1937 }
else if (AL.
getParsedKind() == ParsedAttr::AT_CPUSpecific) {
1941 if (
const auto *
Other = D->
getAttr<CPUSpecificAttr>()) {
1942 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1943 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1950 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
1951 if (MD->getParent()->isLambda()) {
1952 S.
Diag(AL.
getLoc(), diag::err_attribute_dll_lambda) << AL;
1963 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1972 S.
Diag(CPUArg->
getLoc(), diag::err_invalid_cpu_specific_dispatch_value)
1973 << CPUName << (AL.
getKind() == ParsedAttr::AT_CPUDispatch);
1979 return Target.CPUSpecificManglingCharacter(CPUName) ==
1982 S.
Diag(AL.
getLoc(), diag::warn_multiversion_duplicate_entries);
1989 if (AL.
getKind() == ParsedAttr::AT_CPUSpecific)
1991 CPUSpecificAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1994 CPUDispatchAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1999 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
2010 const auto &
Arch = Triple.getArch();
2011 if (
Arch != llvm::Triple::x86 &&
2012 (
Arch != llvm::Triple::arm &&
Arch != llvm::Triple::thumb)) {
2013 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_on_arch)
2014 << AL << Triple.getArchName();
2021 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
2038 const Stmt *OnlyStmt =
nullptr;
2040 if (
const auto *Compound = dyn_cast<CompoundStmt>(Body)) {
2041 if (Compound->size() != 1)
2043 OnlyStmt = *Compound->body_begin();
2049 if (
const auto *EWC = dyn_cast<ExprWithCleanups>(OnlyStmt)) {
2050 OnlyStmt = EWC->getSubExpr();
2054 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2055 if (MD && MD->isVirtual()) {
2056 const auto *RD = MD->getParent();
2057 return MD->hasAttr<FinalAttr>() || (RD && RD->isEffectivelyFinal());
2065 auto *FD = dyn_cast<FunctionDecl>(D);
2086 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2100 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
2126 S.
Diag(Attrs.
getLoc(), diag::warn_nocf_check_attribute_ignored);
2144 Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
2163 ? diag::err_attribute_wrong_decl_type
2164 : diag::warn_attribute_wrong_decl_type)
2200 if (VecReturnAttr *A = D->
getAttr<VecReturnAttr>()) {
2201 S.
Diag(AL.
getLoc(), diag::err_repeat_attribute) << A;
2209 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2214 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2218 for (
const auto *I : R->fields()) {
2219 if ((count == 1) || !I->getType()->isVectorType()) {
2220 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2236 diag::err_carries_dependency_param_not_function_decl);
2250 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2265 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2275 APValue(llvm::APSInt::getUnsigned(priority)));
2283 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
2302template <
typename AttrTy>
2314 VersionTuple Introduced,
2315 VersionTuple Deprecated,
2316 VersionTuple Obsoleted) {
2317 StringRef PlatformName
2318 = AvailabilityAttr::getPrettyPlatformName(Platform->
getName());
2319 if (PlatformName.empty())
2320 PlatformName = Platform->
getName();
2324 if (!Introduced.empty() && !Deprecated.empty() &&
2325 !(Introduced <= Deprecated)) {
2326 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2327 << 1 << PlatformName << Deprecated.getAsString()
2328 << 0 << Introduced.getAsString();
2332 if (!Introduced.empty() && !Obsoleted.empty() &&
2333 !(Introduced <= Obsoleted)) {
2334 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2335 << 2 << PlatformName << Obsoleted.getAsString()
2336 << 0 << Introduced.getAsString();
2340 if (!Deprecated.empty() && !Obsoleted.empty() &&
2341 !(Deprecated <= Obsoleted)) {
2342 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2343 << 2 << PlatformName << Obsoleted.getAsString()
2344 << 1 << Deprecated.getAsString();
2356 bool BeforeIsOkay) {
2357 if (
X.empty() || Y.empty())
2363 if (BeforeIsOkay &&
X < Y)
2371 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2372 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2375 VersionTuple MergedIntroduced = Introduced;
2376 VersionTuple MergedDeprecated = Deprecated;
2377 VersionTuple MergedObsoleted = Obsoleted;
2378 bool FoundAny =
false;
2379 bool OverrideOrImpl =
false;
2383 OverrideOrImpl =
false;
2389 OverrideOrImpl =
true;
2395 for (
unsigned i = 0, e = Attrs.size(); i != e;) {
2396 const auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2403 if (OldPlatform != Platform) {
2409 if (OldEnvironment != Environment) {
2417 if (OldAA->getPriority() < Priority)
2423 if (OldAA->getPriority() > Priority) {
2424 Attrs.erase(Attrs.begin() + i);
2430 VersionTuple OldIntroduced = OldAA->getIntroduced();
2431 VersionTuple OldDeprecated = OldAA->getDeprecated();
2432 VersionTuple OldObsoleted = OldAA->getObsoleted();
2433 bool OldIsUnavailable = OldAA->getUnavailable();
2435 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2436 !
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2438 !(OldIsUnavailable == IsUnavailable ||
2439 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2440 if (OverrideOrImpl) {
2442 VersionTuple FirstVersion;
2443 VersionTuple SecondVersion;
2444 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2446 FirstVersion = OldIntroduced;
2447 SecondVersion = Introduced;
2448 }
else if (!
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2450 FirstVersion = Deprecated;
2451 SecondVersion = OldDeprecated;
2452 }
else if (!
versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2454 FirstVersion = Obsoleted;
2455 SecondVersion = OldObsoleted;
2459 Diag(OldAA->getLocation(),
2460 diag::warn_mismatched_availability_override_unavail)
2461 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2473 Diag(OldAA->getLocation(),
2474 diag::warn_mismatched_availability_override)
2476 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2477 << FirstVersion.getAsString() << SecondVersion.getAsString()
2481 Diag(CI.
getLoc(), diag::note_overridden_method);
2483 Diag(CI.
getLoc(), diag::note_protocol_method);
2485 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2486 Diag(CI.
getLoc(), diag::note_previous_attribute);
2489 Attrs.erase(Attrs.begin() + i);
2494 VersionTuple MergedIntroduced2 = MergedIntroduced;
2495 VersionTuple MergedDeprecated2 = MergedDeprecated;
2496 VersionTuple MergedObsoleted2 = MergedObsoleted;
2498 if (MergedIntroduced2.empty())
2499 MergedIntroduced2 = OldIntroduced;
2500 if (MergedDeprecated2.empty())
2501 MergedDeprecated2 = OldDeprecated;
2502 if (MergedObsoleted2.empty())
2503 MergedObsoleted2 = OldObsoleted;
2506 MergedIntroduced2, MergedDeprecated2,
2507 MergedObsoleted2)) {
2508 Attrs.erase(Attrs.begin() + i);
2513 MergedIntroduced = MergedIntroduced2;
2514 MergedDeprecated = MergedDeprecated2;
2515 MergedObsoleted = MergedObsoleted2;
2521 MergedIntroduced == Introduced &&
2522 MergedDeprecated == Deprecated &&
2523 MergedObsoleted == Obsoleted)
2529 MergedDeprecated, MergedObsoleted) &&
2531 auto *Avail = ::new (
Context) AvailabilityAttr(
2532 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2533 Message, IsStrict, Replacement, Priority, Environment);
2544 bool &IsUnavailable,
2545 VersionTuple &Introduced,
2546 VersionTuple &Deprecated,
2547 VersionTuple &Obsolete,
Sema &S) {
2550 if (TT.getOS() != llvm::Triple::XROS)
2554 NewII = &Context.Idents.get(
"xros");
2555 else if (II->
getName() ==
"ios_app_extension")
2556 NewII = &Context.Idents.get(
"xros_app_extension");
2561 auto MakeUnavailable = [&]() {
2562 IsUnavailable =
true;
2564 Introduced = VersionTuple();
2565 Deprecated = VersionTuple();
2566 Obsolete = VersionTuple();
2579 llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::XROS,
2580 llvm::Triple::UnknownEnvironment));
2586 if (!Introduced.empty()) {
2587 auto NewIntroduced = Mapping->mapIntroducedAvailabilityVersion(Introduced);
2588 if (!NewIntroduced) {
2592 Introduced = *NewIntroduced;
2595 if (!Obsolete.empty()) {
2597 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Obsolete);
2602 Obsolete = *NewObsolete;
2605 if (!Deprecated.empty()) {
2606 auto NewDeprecated =
2607 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Deprecated);
2608 Deprecated = NewDeprecated ? *NewDeprecated : VersionTuple();
2627 StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName(II->
getName());
2628 if (PrettyName.empty())
2629 S.
Diag(Platform->
getLoc(), diag::warn_availability_unknown_platform)
2632 auto *ND = dyn_cast<NamedDecl>(D);
2640 const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType(
2641 AvailabilityAttr::canonicalizePlatformName(II->
getName()));
2643 auto reportAndUpdateIfInvalidOS = [&](
auto &InputVersion) ->
void {
2644 const bool IsInValidRange =
2645 llvm::Triple::isValidVersionForOS(PlatformOS, InputVersion);
2647 auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS(
2648 PlatformOS, InputVersion, IsInValidRange);
2649 if (!IsInValidRange) {
2650 S.
Diag(Platform->
getLoc(), diag::warn_availability_invalid_os_version)
2651 << InputVersion.getAsString() << PrettyName;
2653 diag::note_availability_invalid_os_version_adjusted)
2654 << CanonicalVersion.getAsString();
2656 InputVersion = CanonicalVersion;
2659 if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2660 reportAndUpdateIfInvalidOS(Introduced.
Version);
2661 reportAndUpdateIfInvalidOS(Deprecated.
Version);
2662 reportAndUpdateIfInvalidOS(Obsoleted.
Version);
2668 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getMessageExpr()))
2669 Str = SE->getString();
2670 StringRef Replacement;
2671 if (
const auto *SE =
2673 Replacement = SE->getString();
2675 if (II->
isStr(
"swift")) {
2677 (!IsUnavailable && !Deprecated.
isValid())) {
2679 diag::warn_availability_swift_unavailable_deprecated_only);
2684 if (II->
isStr(
"fuchsia")) {
2685 std::optional<unsigned>
Min, Sub;
2687 (Sub = Introduced.
Version.getSubminor())) {
2688 S.
Diag(AL.
getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2703 if (EnvironmentLoc) {
2706 if (AvailabilityAttr::getEnvironmentType(
2708 llvm::Triple::EnvironmentType::UnknownEnvironment)
2710 diag::warn_availability_unknown_environment)
2714 diag::err_availability_unexpected_parameter)
2715 <<
"environment" << 1;
2721 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2728 bool NewIsUnavailable = IsUnavailable;
2729 VersionTuple NewIntroduced = Introduced.
Version;
2730 VersionTuple NewDeprecated = Deprecated.
Version;
2731 VersionTuple NewObsoleted = Obsoleted.
Version;
2733 NewIntroduced, NewDeprecated,
2736 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2737 NewObsoleted, NewIsUnavailable, Str, IsStrict, Replacement,
2751 else if (II->
getName() ==
"ios_app_extension")
2756 const auto *IOSToWatchOSMapping =
2761 auto adjustWatchOSVersion =
2762 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2763 if (Version.empty())
2765 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2767 if (IOSToWatchOSMapping) {
2768 if (
auto MappedVersion = IOSToWatchOSMapping->map(
2769 Version, MinimumWatchOSVersion, std::nullopt)) {
2770 return *MappedVersion;
2774 auto Major = Version.getMajor();
2775 auto NewMajor = Major;
2778 else if (Major < 12)
2779 NewMajor = Major - 7;
2780 if (NewMajor >= 2) {
2781 if (Version.getMinor()) {
2782 if (Version.getSubminor())
2783 return VersionTuple(NewMajor, *Version.getMinor(),
2784 *Version.getSubminor());
2786 return VersionTuple(NewMajor, *Version.getMinor());
2788 return VersionTuple(NewMajor);
2791 return MinimumWatchOSVersion;
2794 auto NewIntroduced = adjustWatchOSVersion(Introduced.
Version);
2795 auto NewDeprecated = adjustWatchOSVersion(Deprecated.
Version);
2796 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.
Version);
2799 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2800 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2812 else if (II->
getName() ==
"ios_app_extension")
2817 const auto *IOSToTvOSMapping =
2822 auto AdjustTvOSVersion =
2823 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2824 if (Version.empty())
2827 if (IOSToTvOSMapping) {
2828 if (
auto MappedVersion = IOSToTvOSMapping->map(
2829 Version, VersionTuple(0, 0), std::nullopt)) {
2830 return *MappedVersion;
2836 auto NewIntroduced = AdjustTvOSVersion(Introduced.
Version);
2837 auto NewDeprecated = AdjustTvOSVersion(Deprecated.
Version);
2838 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.
Version);
2841 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2842 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2849 llvm::Triple::IOS &&
2851 auto GetSDKInfo = [&]() {
2860 else if (II->
getName() ==
"ios_app_extension")
2863 auto MinMacCatalystVersion = [](
const VersionTuple &
V) {
2866 if (
V.getMajor() < 13 ||
2867 (
V.getMajor() == 13 &&
V.getMinor() && *
V.getMinor() < 1))
2868 return VersionTuple(13, 1);
2872 ND, AL, NewII,
true ,
2873 MinMacCatalystVersion(Introduced.
Version),
2874 MinMacCatalystVersion(Deprecated.
Version),
2875 MinMacCatalystVersion(Obsoleted.
Version), IsUnavailable, Str,
2880 }
else if (II->
getName() ==
"macos" && GetSDKInfo() &&
2882 !Obsoleted.
Version.empty())) {
2883 if (
const auto *MacOStoMacCatalystMapping =
2884 GetSDKInfo()->getVersionMapping(
2891 auto RemapMacOSVersion =
2892 [&](
const VersionTuple &
V) -> std::optional<VersionTuple> {
2894 return std::nullopt;
2896 if (
V.getMajor() == 100000)
2897 return VersionTuple(100000);
2899 return MacOStoMacCatalystMapping->map(
V, VersionTuple(13, 1),
2902 std::optional<VersionTuple> NewIntroduced =
2903 RemapMacOSVersion(Introduced.
Version),
2905 RemapMacOSVersion(Deprecated.
Version),
2907 RemapMacOSVersion(Obsoleted.
Version);
2908 if (NewIntroduced || NewDeprecated || NewObsoleted) {
2909 auto VersionOrEmptyVersion =
2910 [](
const std::optional<VersionTuple> &
V) -> VersionTuple {
2911 return V ? *
V : VersionTuple();
2914 ND, AL, NewII,
true ,
2915 VersionOrEmptyVersion(NewIntroduced),
2916 VersionOrEmptyVersion(NewDeprecated),
2917 VersionOrEmptyVersion(NewObsoleted),
false, Str,
2936 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(0)))
2938 StringRef DefinedIn;
2939 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(1)))
2940 DefinedIn = SE->getString();
2941 bool IsGeneratedDeclaration = AL.
getArgAsIdent(2) !=
nullptr;
2943 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(3)))
2944 USR = SE->getString();
2951 VisibilityAttr::VisibilityType
Value) {
2952 if (VisibilityAttr *
Attr = D->
getAttr<VisibilityAttr>()) {
2954 Diag(Loc, diag::err_mismatched_visibility);
2961 typename T::VisibilityType value) {
2962 T *existingAttr = D->
getAttr<T>();
2964 typename T::VisibilityType existingValue = existingAttr->getVisibility();
2965 if (existingValue == value)
2967 S.
Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
2968 S.
Diag(CI.
getLoc(), diag::note_previous_attribute);
2976 VisibilityAttr::VisibilityType Vis) {
2977 return ::mergeVisibilityAttr<VisibilityAttr>(*
this, D, CI, Vis);
2982 TypeVisibilityAttr::VisibilityType Vis) {
2983 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*
this, D, CI, Vis);
2987 bool isTypeVisibility) {
3008 VisibilityAttr::VisibilityType
type;
3009 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr,
type)) {
3010 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
3017 if (
type == VisibilityAttr::Protected &&
3019 S.
Diag(AL.
getLoc(), diag::warn_attribute_protected_visibility);
3020 type = VisibilityAttr::Default;
3024 if (isTypeVisibility) {
3026 D, AL, (TypeVisibilityAttr::VisibilityType)
type);
3035 unsigned sentinel = (
unsigned)SentinelAttr::DefaultSentinel;
3038 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3040 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3045 if (Idx->isSigned() && Idx->isNegative()) {
3046 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_less_than_zero)
3051 sentinel = Idx->getZExtValue();
3054 unsigned nullPos = (
unsigned)SentinelAttr::DefaultNullPos;
3057 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3059 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3063 nullPos = Idx->getZExtValue();
3065 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
3068 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
3074 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3077 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3082 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3085 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
3086 if (!MD->isVariadic()) {
3087 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3090 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
3091 if (!BD->isVariadic()) {
3092 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
3095 }
else if (
const auto *
V = dyn_cast<VarDecl>(D)) {
3104 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3109 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
3113 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3119 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3131 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
3134 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
3135 if (MD->getReturnType()->isVoidType()) {
3136 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
3153 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3164 if (LO.CPlusPlus && !LO.CPlusPlus20)
3165 S.
Diag(AL.
getLoc(), diag::ext_cxx20_attr) << AL;
3169 }
else if (LO.CPlusPlus && !LO.CPlusPlus17)
3170 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
3177 S.
Diag(AL.
getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
3190 S.
Diag(AL.
getLoc(), diag::warn_attribute_invalid_on_definition)
3197 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3210template <
class Attribute>
3212 const unsigned Idx) {
3221 std::optional<llvm::APSInt> I = llvm::APSInt(64);
3228 if (!I->isIntN(32)) {
3230 <<
toString(*I, 10,
false) << 32 << 1;
3234 S.
Diag(E->
getExprLoc(), diag::err_attribute_requires_positive_integer)
3242 "Unexpected PerformCopyInitialization() failure.");
3248template <
typename WorkGroupAttr>
3251 for (
unsigned i = 0; i < 3; ++i) {
3258 auto IsZero = [&](
Expr *E) {
3259 if (E->isValueDependent())
3261 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.
Context);
3262 assert(I &&
"Non-integer constant expr");
3266 if (!llvm::all_of(WGSize, IsZero)) {
3267 for (
unsigned i = 0; i < 3; ++i) {
3269 if (IsZero(WGSize[i])) {
3270 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_is_zero)
3281 assert(L &&
"Non-integer constant expr");
3282 std::optional<llvm::APSInt> R = RHS->getIntegerConstantExpr(S.
Context);
3283 assert(L &&
"Non-integer constant expr");
3287 WorkGroupAttr *Existing = D->
getAttr<WorkGroupAttr>();
3289 !llvm::equal(std::initializer_list<Expr *>{Existing->getXDim(),
3290 Existing->getYDim(),
3291 Existing->getZDim()},
3293 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3296 WorkGroupAttr(S.
Context, AL, WGSize[0], WGSize[1], WGSize[2]));
3301 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
3307 assert(ParmTSI &&
"no type source info for attribute argument");
3312 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
3316 if (VecTypeHintAttr *A = D->
getAttr<VecTypeHintAttr>()) {
3318 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3330 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3335 if (SectionAttr *ExistingAttr = D->
getAttr<SectionAttr>()) {
3336 if (ExistingAttr->getName() == Name)
3338 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3340 Diag(CI.
getLoc(), diag::note_previous_attribute);
3347 if (!
Context.getTargetInfo().getTriple().isOSDarwin())
3348 return llvm::Error::success();
3351 StringRef Segment, Section;
3352 unsigned TAA, StubSize;
3354 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
3355 TAA, HasTAA, StubSize);
3360 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3390 if (Triple.isLoongArch()) {
3391 return Str ==
"normal" || Str ==
"medium" || Str ==
"extreme";
3393 assert(Triple.getArch() == llvm::Triple::x86_64 &&
3394 "only loongarch/x86-64 supported");
3395 return Str ==
"small" || Str ==
"large";
3402 auto IsTripleSupported = [](llvm::Triple &Triple) {
3403 return Triple.getArch() == llvm::Triple::ArchType::x86_64 ||
3404 Triple.isLoongArch();
3414 Triples.push_back(aux->getTriple());
3423 auto SupportedTripleIt = llvm::find_if(Triples, IsTripleSupported);
3424 if (SupportedTripleIt == Triples.end()) {
3425 S.
Diag(LiteralLoc, diag::warn_unknown_attribute_ignored) << AL;
3429 llvm::CodeModel::Model CM;
3430 if (!CodeModelAttr::ConvertStrToModel(Str, CM) ||
3432 S.
Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
3442 StringRef CodeSegName) {
3444 S.
Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3456 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3460 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3461 if (ExistingAttr->getName() == Name)
3463 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3465 Diag(CI.
getLoc(), diag::note_previous_attribute);
3478 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3479 if (!ExistingAttr->isImplicit()) {
3481 ExistingAttr->getName() == Str
3482 ? diag::warn_duplicate_codeseg_attribute
3483 : diag::err_conflicting_codeseg_attribute);
3495 if (AttrStr.contains(
"fpmath="))
3496 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3497 << Unsupported <<
None <<
"fpmath=" <<
Target;
3500 if (!
Context.getTargetInfo().supportsTargetAttributeTune() &&
3501 AttrStr.contains(
"tune="))
3502 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3506 Context.getTargetInfo().parseTargetAttr(AttrStr);
3508 if (!ParsedAttrs.
CPU.empty() &&
3509 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
CPU))
3510 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3513 if (!ParsedAttrs.
Tune.empty() &&
3514 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
Tune))
3515 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3518 if (
Context.getTargetInfo().getTriple().isRISCV()) {
3520 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3522 for (StringRef CurFeature : ParsedAttrs.
Features) {
3523 if (!CurFeature.starts_with(
'+') && !CurFeature.starts_with(
'-'))
3524 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3529 if (
Context.getTargetInfo().getTriple().isLoongArch()) {
3530 for (StringRef CurFeature : ParsedAttrs.
Features) {
3531 if (CurFeature.starts_with(
"!arch=")) {
3532 StringRef ArchValue = CurFeature.split(
"=").second.trim();
3533 return Diag(LiteralLoc, diag::err_attribute_unsupported)
3534 <<
"target(arch=..)" << ArchValue;
3540 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3544 auto CurFeature = StringRef(
Feature).drop_front();
3545 if (!
Context.getTargetInfo().isValidFeatureName(CurFeature))
3546 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3547 << Unsupported <<
None << CurFeature <<
Target;
3554 if (!
Context.getTargetInfo().validateBranchProtection(
3556 Context.getLangOpts(), DiagMsg)) {
3557 if (DiagMsg.empty())
3558 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3559 << Unsupported <<
None <<
"branch-protection" <<
Target;
3560 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3563 if (!DiagMsg.empty())
3564 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3584 TargetVersionAttr *NewAttr =
3596 TargetAttr *NewAttr = ::new (S.
Context) TargetAttr(S.
Context, AL, Str);
3603 if (
const auto *
Other = D->
getAttr<TargetClonesAttr>()) {
3604 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3605 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
3613 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
3614 if (MD->getParent()->isLambda()) {
3624 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
3629 Params.push_back(Param);
3630 Locations.push_back(Loc);
3647 for (
auto &SmallStr : NewParams)
3648 Params.push_back(SmallStr.str());
3650 TargetClonesAttr *NewAttr = ::new (S.
Context)
3651 TargetClonesAttr(S.
Context, AL, Params.data(), Params.size());
3663 MinVectorWidthAttr *Existing = D->
getAttr<MinVectorWidthAttr>();
3664 if (Existing && Existing->getVectorWidth() != VecWidth) {
3665 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3680 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
3682 S.
Diag(Loc, diag::warn_cleanup_ext);
3683 FD = dyn_cast<FunctionDecl>(DRE->
getDecl());
3686 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3690 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3691 if (ULE->hasExplicitTemplateArgs())
3692 S.
Diag(Loc, diag::warn_cleanup_ext);
3694 NI = ULE->getNameInfo();
3696 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3703 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3708 S.
Diag(Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3724 S.
Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3746 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3751 EnumExtensibilityAttr::Kind ExtensibilityKind;
3753 if (!EnumExtensibilityAttr::ConvertStrToKind(II->
getName(),
3754 ExtensibilityKind)) {
3755 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3760 EnumExtensibilityAttr(S.
Context, AL, ExtensibilityKind));
3778 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3788 if (
auto *OMD = dyn_cast<ObjCMethodDecl>(D))
3789 if (
auto *
Interface = OMD->getClassInterface())
3796 S.
Diag(AL.
getLoc(), diag::err_format_attribute_result_not)
3797 << (NotNSStringTy ?
"string type" :
"NSString")
3817 return llvm::StringSwitch<FormatAttrKind>(Format)
3824 .Cases({
"gnu_scanf",
"scanf",
"gnu_printf",
"printf",
"printf0",
3825 "gnu_strfmon",
"strfmon"},
3833 .Cases({
"gcc_diag",
"gcc_cdiag",
"gcc_cxxdiag",
"gcc_tdiag"},
3842 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
3847 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
3852 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
3858 uint32_t prioritynum;
3864 if (prioritynum > 65535) {
3865 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_range)
3873 if (prioritynum < 101)
3874 S.
Diag(AL.
getLoc(), diag::warn_init_priority_reserved)
3880 StringRef NewUserDiagnostic) {
3881 if (
const auto *EA = D->
getAttr<ErrorAttr>()) {
3883 assert((NewAttr ==
"error" || NewAttr ==
"warning") &&
3884 "unexpected normalized full name");
3885 bool Match = (EA->isError() && NewAttr ==
"error") ||
3886 (EA->isWarning() && NewAttr ==
"warning");
3888 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
3891 EA->isRegularKeywordAttribute());
3892 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
3895 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
3896 Diag(CI.
getLoc(), diag::warn_duplicate_attribute) << EA;
3897 Diag(EA->getLoc(), diag::note_previous_attribute);
3901 return ::new (
Context) ErrorAttr(
Context, CI, NewUserDiagnostic);
3909 if (F->getType() == Format &&
3910 F->getFormatIdx() == FormatIdx &&
3911 F->getFirstArg() == FirstArg) {
3914 if (F->getLocation().isInvalid())
3920 return ::new (
Context) FormatAttr(
Context, CI, Format, FormatIdx, FirstArg);
3930 if (F->getType() == Format && F->getFormatIdx() == FormatIdx) {
3932 F->getFormatString(), FormatStr))
3937 if (F->getLocation().isInvalid())
3944 FormatMatchesAttr(
Context, CI, Format, FormatIdx, FormatStr);
3962 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3987 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
3998 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4006 if (HasImplicitThisParam) {
4009 diag::err_format_attribute_implicit_this_format_string)
4022 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
4043 if (FirstArg != 0) {
4047 S.
Diag(AL.
getLoc(), diag::err_format_strftime_third_parameter)
4055 if (FirstArg != Info.
NumArgs + 1) {
4056 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4059 std::to_string(Info.
NumArgs + 1));
4064 S.
Diag(D->
getLocation(), diag::warn_gcc_requires_variadic_function) << AL;
4069 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4076 FormatAttr *NewAttr =
4088 if (
auto *SL = dyn_cast<StringLiteral>(FormatStrExpr)) {
4097 S.
Diag(AL.
getLoc(), diag::err_format_nonliteral)
4105 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_no_callee)
4114 assert(FD &&
"Expected a function declaration!");
4116 llvm::StringMap<int> NameIdxMapping;
4117 NameIdxMapping[
"__"] = -1;
4119 NameIdxMapping[
"this"] = 0;
4123 NameIdxMapping[PVD->getName()] = Idx++;
4125 auto UnknownName = NameIdxMapping.end();
4128 for (
unsigned I = 0, E = AL.
getNumArgs(); I < E; ++I) {
4135 if (It == UnknownName) {
4136 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_argument_unknown)
4142 ArgIdx = It->second;
4149 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4155 if (ArgIdx < -1 || ArgIdx > NumArgs) {
4156 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4163 llvm_unreachable(
"Unexpected ParsedAttr argument type!");
4166 if (ArgIdx == 0 && !HasImplicitThisParam) {
4167 S.
Diag(AL.
getLoc(), diag::err_callback_implicit_this_not_available)
4174 if (!HasImplicitThisParam && ArgIdx > 0)
4177 EncodingIndices.push_back(ArgIdx);
4180 int CalleeIdx = EncodingIndices.front();
4184 if (CalleeIdx < (
int)HasImplicitThisParam) {
4185 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_invalid_callee)
4192 const Type *CalleeType =
4196 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4201 const Type *CalleeFnType =
4206 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
4207 if (!CalleeFnProtoType) {
4208 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4213 if (CalleeFnProtoType->getNumParams() != EncodingIndices.size() - 1) {
4214 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_arg_count_for_func)
4215 << AL <<
QualType{CalleeFnProtoType, 0}
4216 << CalleeFnProtoType->getNumParams()
4217 << (
unsigned)(EncodingIndices.size() - 1);
4221 if (CalleeFnProtoType->isVariadic()) {
4227 if (D->
hasAttr<CallbackAttr>()) {
4233 S.
Context, AL, EncodingIndices.data(), EncodingIndices.size()));
4237 StringRef ParamName) {
4240 Diag(AL.
getLoc(), diag::err_capture_by_attribute_no_entity)
4249 bool IsValid =
true;
4250 for (
unsigned I = 0; I < N; ++I) {
4253 Diag(E->
getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
4261 Diag(IdLoc->
getLoc(), diag::err_capture_by_references_itself)
4267 ParamLocs[I] = IdLoc->
getLoc();
4273 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices.data(), N, AL);
4274 CapturedBy->setArgs(ParamIdents, ParamLocs);
4281 if (D->
hasAttr<LifetimeCaptureByAttr>()) {
4282 S.
Diag(AL.
getLoc(), diag::err_capture_by_attribute_multiple)
4286 auto *PVD = dyn_cast<ParmVarDecl>(D);
4297 if (
auto *A = PVD->getAttr<LifetimeCaptureByAttr>())
4299 if (HasImplicitThisParam) {
4307 if (
auto *A = ATL.
getAttrAs<LifetimeCaptureByAttr>())
4308 Attrs.push_back(
const_cast<LifetimeCaptureByAttr *
>(A));
4313 llvm::StringMap<int> NameIdxMapping = {
4314 {
"global", LifetimeCaptureByAttr::Global},
4315 {
"unknown", LifetimeCaptureByAttr::Unknown}};
4317 if (HasImplicitThisParam) {
4318 NameIdxMapping[
"this"] = 0;
4322 NameIdxMapping[PVD->getName()] = Idx++;
4323 auto DisallowReservedParams = [&](StringRef Reserved) {
4325 if (PVD->getName() == Reserved)
4326 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
4327 << (PVD->getName() ==
"unknown");
4329 for (
auto *CapturedBy : Attrs) {
4330 const auto &Entities = CapturedBy->getArgIdents();
4331 for (
size_t I = 0; I < Entities.size(); ++I) {
4332 StringRef Name = Entities[I]->getName();
4333 auto It = NameIdxMapping.find(Name);
4334 if (It == NameIdxMapping.end()) {
4335 auto Loc = CapturedBy->getArgLocs()[I];
4336 if (!HasImplicitThisParam && Name ==
"this")
4337 Diag(Loc, diag::err_capture_by_implicit_this_not_available) << Loc;
4339 Diag(Loc, diag::err_capture_by_attribute_argument_unknown)
4340 << Entities[I] << Loc;
4343 if (Name ==
"unknown" || Name ==
"global")
4344 DisallowReservedParams(Name);
4345 CapturedBy->setParamIdx(I, It->second);
4354 return T.isFunctionPointerType() || T.isBlockPointerType();
4363 S.
Diag(AL.
getLoc(), diag::err_called_once_attribute_wrong_type);
4373 const auto *TD = dyn_cast<TypedefNameDecl>(D);
4374 if (TD && TD->getUnderlyingType()->isUnionType())
4375 RD = TD->getUnderlyingType()->getAsRecordDecl();
4377 RD = dyn_cast<RecordDecl>(D);
4380 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4388 diag::warn_transparent_union_attribute_not_definition);
4394 if (Field == FieldEnd) {
4395 S.
Diag(AL.
getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4403 diag::warn_transparent_union_attribute_floating)
4412 for (; Field != FieldEnd; ++Field) {
4413 QualType FieldType = Field->getType();
4427 S.
Diag(Field->getLocation(),
4428 diag::warn_transparent_union_attribute_field_size_align)
4429 << isSize << *Field << FieldBits;
4430 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4432 diag::note_transparent_union_first_field_size_align)
4433 << isSize << FirstBits;
4456 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4457 T = TD->getUnderlyingType();
4458 else if (
const auto *VD = dyn_cast<ValueDecl>(D))
4461 llvm_unreachable(
"Unknown decl type for align_value");
4463 if (!T->isDependentType() && !T->isAnyPointerType() &&
4464 !T->isReferenceType() && !T->isMemberPointerType()) {
4465 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4471 llvm::APSInt Alignment;
4473 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4477 if (!Alignment.isPowerOf2()) {
4478 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4500 diag::err_pack_expansion_without_parameter_packs);
4515 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4527 diag::err_pack_expansion_without_parameter_packs);
4554 const AlignedAttr &
Attr,
4559 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
4562 if (VD->isExceptionVariable())
4564 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
4565 if (FD->isBitField())
4567 }
else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4568 if (ED->getLangOpts().CPlusPlus)
4571 return S.
Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4576 if (DiagKind != -1) {
4577 return S.
Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4578 << &
Attr << DiagKind;
4584 bool IsPackExpansion) {
4585 AlignedAttr TmpAttr(
Context, CI,
true, E);
4589 if (TmpAttr.isAlignas() &&
4597 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4598 if (!TND->getUnderlyingType()->isDependentType()) {
4599 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4606 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
true, E);
4607 AA->setPackExpansion(IsPackExpansion);
4613 llvm::APSInt Alignment;
4615 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4620 if (
Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
4623 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4628 uint64_t AlignVal = Alignment.getZExtValue();
4634 if (!(TmpAttr.isAlignas() && !Alignment)) {
4635 if (!llvm::isPowerOf2_64(AlignVal)) {
4636 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4642 const auto *VD = dyn_cast<VarDecl>(D);
4644 unsigned MaxTLSAlign =
4645 Context.toCharUnitsFromBits(
Context.getTargetInfo().getMaxTLSAlign())
4647 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4649 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4650 << (
unsigned)AlignVal << VD << MaxTLSAlign;
4657 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4658 const Type *Ty = VD->getType().getTypePtr();
4660 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4661 << VD->getType() << 16;
4667 AA->setPackExpansion(IsPackExpansion);
4668 AA->setCachedAlignmentValue(
4669 static_cast<unsigned>(AlignVal *
Context.getCharWidth()));
4675 AlignedAttr TmpAttr(
Context, CI,
false, TS);
4679 if (TmpAttr.isAlignas() &&
4687 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4688 if (!TND->getUnderlyingType()->isDependentType()) {
4689 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4695 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4696 AA->setPackExpansion(IsPackExpansion);
4701 const auto *VD = dyn_cast<VarDecl>(D);
4702 unsigned AlignVal = TmpAttr.getAlignment(
Context);
4705 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4706 const Type *Ty = VD->getType().getTypePtr();
4708 Context.toCharUnitsFromBits(AlignVal).getQuantity() < 16) {
4709 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4710 << VD->getType() << 16;
4715 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4716 AA->setPackExpansion(IsPackExpansion);
4717 AA->setCachedAlignmentValue(AlignVal);
4722 assert(D->
hasAttrs() &&
"no attributes on decl");
4725 if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
4726 UnderlyingTy = DiagTy = VD->getType();
4729 if (
const auto *ED = dyn_cast<EnumDecl>(D))
4730 UnderlyingTy = ED->getIntegerType();
4739 AlignedAttr *AlignasAttr =
nullptr;
4740 AlignedAttr *LastAlignedAttr =
nullptr;
4743 if (I->isAlignmentDependent())
4747 Align = std::max(Align, I->getAlignment(
Context));
4748 LastAlignedAttr = I;
4752 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4753 << LastAlignedAttr << DiagTy;
4754 }
else if (AlignasAttr && Align) {
4757 if (NaturalAlign > RequestedAlign)
4758 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
4785 Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
4794 bool &IntegerMode,
bool &ComplexMode,
4797 ComplexMode =
false;
4799 switch (Str.size()) {
4819 DestWidth = Str[1] ==
'I' ? 0 : 128;
4827 DestWidth = Str[1] ==
'I' ? 0 : 128;
4830 if (Str[1] ==
'F') {
4831 IntegerMode =
false;
4832 }
else if (Str[1] ==
'C') {
4833 IntegerMode =
false;
4835 }
else if (Str[1] !=
'I') {
4844 else if (Str ==
"byte")
4848 if (Str ==
"pointer")
4852 if (Str ==
"unwind_word")
4868 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
4880 StringRef Str = Name->
getName();
4884 unsigned DestWidth = 0;
4885 bool IntegerMode =
true;
4886 bool ComplexMode =
false;
4888 llvm::APInt VectorSize(64, 0);
4889 if (Str.size() >= 4 && Str[0] ==
'V') {
4891 size_t StrSize = Str.size();
4892 size_t VectorStringLength = 0;
4893 while ((VectorStringLength + 1) < StrSize &&
4894 isdigit(Str[VectorStringLength + 1]))
4895 ++VectorStringLength;
4896 if (VectorStringLength &&
4897 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
4898 VectorSize.isPowerOf2()) {
4900 IntegerMode, ComplexMode, ExplicitType);
4902 if (!InInstantiation)
4903 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
4918 Diag(AttrLoc, diag::err_machine_mode) << 0 << Name;
4923 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4924 OldTy = TD->getUnderlyingType();
4925 else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4928 OldTy = ED->getIntegerType();
4943 OldElemTy = VT->getElementType();
4949 VectorSize.getBoolValue()) {
4950 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.
getRange();
4958 !IntegralOrAnyEnumType)
4959 Diag(AttrLoc, diag::err_mode_not_primitive);
4960 else if (IntegerMode) {
4961 if (!IntegralOrAnyEnumType)
4962 Diag(AttrLoc, diag::err_mode_wrong_type);
4963 }
else if (ComplexMode) {
4965 Diag(AttrLoc, diag::err_mode_wrong_type);
4968 Diag(AttrLoc, diag::err_mode_wrong_type);
4974 NewElemTy =
Context.getIntTypeForBitwidth(DestWidth,
4977 NewElemTy =
Context.getRealTypeForBitwidth(DestWidth, ExplicitType);
4979 if (NewElemTy.
isNull()) {
4981 if (!(DestWidth == 128 &&
4983 Diag(AttrLoc, diag::err_machine_mode) << 1 << Name;
4988 NewElemTy =
Context.getComplexType(NewElemTy);
4992 if (VectorSize.getBoolValue()) {
4993 NewTy =
Context.getVectorType(NewTy, VectorSize.getZExtValue(),
4998 Diag(AttrLoc, diag::err_complex_mode_vector_type);
5001 unsigned NumElements =
Context.getTypeSize(OldElemTy) *
5002 OldVT->getNumElements() /
5003 Context.getTypeSize(NewElemTy);
5005 Context.getVectorType(NewElemTy, NumElements, OldVT->getVectorKind());
5009 Diag(AttrLoc, diag::err_mode_wrong_type);
5014 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
5015 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
5016 else if (
auto *ED = dyn_cast<EnumDecl>(D))
5017 ED->setIntegerType(NewTy);
5045 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5046 Diag(CI.
getLoc(), diag::warn_attribute_ignored) << Ident;
5047 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5051 if (D->
hasAttr<AlwaysInlineAttr>())
5059 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5062 if (VD->getKind() != Decl::Var) {
5063 Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5070 if (VD->hasLocalStorage()) {
5071 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5078InternalLinkageAttr *
5080 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5083 if (VD->getKind() != Decl::Var) {
5084 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
5085 << &AL << AL.isRegularKeywordAttribute()
5091 if (VD->hasLocalStorage()) {
5092 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5101 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5102 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'minsize'";
5103 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5107 if (D->
hasAttr<MinSizeAttr>())
5115 if (AlwaysInlineAttr *Inline = D->
getAttr<AlwaysInlineAttr>()) {
5116 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
5117 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5120 if (MinSizeAttr *MinSize = D->
getAttr<MinSizeAttr>()) {
5121 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
5122 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5126 if (D->
hasAttr<OptimizeNoneAttr>())
5133 if (AlwaysInlineAttr *Inline =
5150 if (VD->hasLocalStorage()) {
5151 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5158 if (
auto *A = D->
getAttr<CUDAConstantAttr>()) {
5159 if (!A->isImplicit())
5170 if (!S.
getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
5172 S.
Diag(AL.
getLoc(), diag::err_cuda_extern_shared) << VD;
5177 if (S.
getLangOpts().CUDA && VD->hasLocalStorage() &&
5196 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
5197 if (Method->isInstance()) {
5198 S.
Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
5202 S.
Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
5208 if (AL.
getKind() == ParsedAttr::AT_DeviceKernel)
5221 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5222 if (VD->hasLocalStorage()) {
5223 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5230 if (
auto *A = D->
getAttr<CUDADeviceAttr>()) {
5231 if (!A->isImplicit())
5239 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5240 if (VD->hasLocalStorage()) {
5241 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5247 if (!D->
hasAttr<HIPManagedAttr>())
5249 if (!D->
hasAttr<CUDADeviceAttr>())
5264 if (!Fn->isInlineSpecified()) {
5265 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
5270 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
5287 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5293 case ParsedAttr::AT_FastCall:
5296 case ParsedAttr::AT_StdCall:
5299 case ParsedAttr::AT_ThisCall:
5302 case ParsedAttr::AT_CDecl:
5305 case ParsedAttr::AT_Pascal:
5308 case ParsedAttr::AT_SwiftCall:
5311 case ParsedAttr::AT_SwiftAsyncCall:
5314 case ParsedAttr::AT_VectorCall:
5317 case ParsedAttr::AT_MSABI:
5320 case ParsedAttr::AT_SysVABI:
5323 case ParsedAttr::AT_RegCall:
5326 case ParsedAttr::AT_Pcs: {
5327 PcsAttr::PCSType PCS;
5330 PCS = PcsAttr::AAPCS;
5333 PCS = PcsAttr::AAPCS_VFP;
5336 llvm_unreachable(
"unexpected calling convention in pcs attribute");
5342 case ParsedAttr::AT_AArch64VectorPcs:
5345 case ParsedAttr::AT_AArch64SVEPcs:
5348 case ParsedAttr::AT_DeviceKernel: {
5350 assert(D->
hasAttr<DeviceKernelAttr>() &&
"Expected attribute");
5353 case ParsedAttr::AT_IntelOclBicc:
5356 case ParsedAttr::AT_PreserveMost:
5359 case ParsedAttr::AT_PreserveAll:
5362 case ParsedAttr::AT_M68kRTD:
5365 case ParsedAttr::AT_PreserveNone:
5368 case ParsedAttr::AT_RISCVVectorCC:
5371 case ParsedAttr::AT_RISCVVLSCC: {
5378 S.
Diag(AL.
getLoc(), diag::err_argument_invalid_range)
5383 S.
Diag(AL.
getLoc(), diag::err_argument_not_power_of_2);
5391 llvm_unreachable(
"unexpected attribute kind");
5396 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
5402 S.
Diag(AL.
getLoc(), diag::err_hidden_device_kernel) << FD;
5406 if (Triple.isNVPTX()) {
5410 if (!LangOpts.OpenCLCPlusPlus && (!FD || IsFunctionTemplate)) {
5411 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type_str)
5419 bool TargetDeviceEnvironment = Triple.isGPU() || Triple.isSPIR() ||
5421 if (!TargetDeviceEnvironment) {
5422 S.
Diag(AL.
getLoc(), diag::warn_cconv_unsupported)
5440 std::vector<StringRef> DiagnosticIdentifiers;
5441 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
5447 DiagnosticIdentifiers.push_back(RuleName);
5450 SuppressAttr(S.
Context, AL, DiagnosticIdentifiers.data(),
5451 DiagnosticIdentifiers.size()));
5460 unsigned SelectIdx = ~0
U;
5466 if (SelectIdx != ~0
U) {
5467 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument)
5479 if (AL.
getKind() == ParsedAttr::AT_Owner) {
5482 if (
const auto *OAttr = D->
getAttr<OwnerAttr>()) {
5483 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5484 ? OAttr->getDerefType().getTypePtr()
5487 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5490 OAttr->isRegularKeywordAttribute());
5491 S.
Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5496 Redecl->addAttr(::new (S.
Context) OwnerAttr(S.
Context, AL, DerefTypeLoc));
5501 if (
const auto *PAttr = D->
getAttr<PointerAttr>()) {
5502 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5503 ? PAttr->getDerefType().getTypePtr()
5506 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5509 PAttr->isRegularKeywordAttribute());
5510 S.
Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5515 Redecl->addAttr(::new (S.
Context)
5516 PointerAttr(S.
Context, AL, DerefTypeLoc));
5524 if (!D->
hasAttr<RandomizeLayoutAttr>())
5532 if (!D->
hasAttr<NoRandomizeLayoutAttr>())
5547 if (Attrs.
getKind() == ParsedAttr::AT_RISCVVLSCC) {
5555 unsigned ReqArgs = Attrs.
getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5562 bool IsTargetDefaultMSABI =
5563 Context.getTargetInfo().getTriple().isOSWindows() ||
5564 Context.getTargetInfo().getTriple().isUEFI();
5567 case ParsedAttr::AT_CDecl:
5570 case ParsedAttr::AT_FastCall:
5573 case ParsedAttr::AT_StdCall:
5576 case ParsedAttr::AT_ThisCall:
5579 case ParsedAttr::AT_Pascal:
5582 case ParsedAttr::AT_SwiftCall:
5585 case ParsedAttr::AT_SwiftAsyncCall:
5588 case ParsedAttr::AT_VectorCall:
5591 case ParsedAttr::AT_AArch64VectorPcs:
5594 case ParsedAttr::AT_AArch64SVEPcs:
5597 case ParsedAttr::AT_RegCall:
5600 case ParsedAttr::AT_MSABI:
5603 case ParsedAttr::AT_SysVABI:
5606 case ParsedAttr::AT_Pcs: {
5612 if (StrRef ==
"aapcs") {
5615 }
else if (StrRef ==
"aapcs-vfp") {
5624 case ParsedAttr::AT_IntelOclBicc:
5627 case ParsedAttr::AT_PreserveMost:
5630 case ParsedAttr::AT_PreserveAll:
5633 case ParsedAttr::AT_M68kRTD:
5636 case ParsedAttr::AT_PreserveNone:
5639 case ParsedAttr::AT_RISCVVectorCC:
5642 case ParsedAttr::AT_RISCVVLSCC: {
5645 unsigned ABIVLen = 128;
5651 if (Attrs.
getNumArgs() && (ABIVLen < 32 || ABIVLen > 65536)) {
5653 Diag(Attrs.
getLoc(), diag::err_argument_invalid_range)
5654 << ABIVLen << 32 << 65536;
5657 if (!llvm::isPowerOf2_64(ABIVLen)) {
5659 Diag(Attrs.
getLoc(), diag::err_argument_not_power_of_2);
5663 llvm::Log2_64(ABIVLen) - 5);
5666 case ParsedAttr::AT_DeviceKernel: {
5671 default: llvm_unreachable(
"unexpected attribute kind");
5676 auto *Aux =
Context.getAuxTargetInfo();
5684 bool CheckHost =
false, CheckDevice =
false;
5685 switch (CudaTarget) {
5698 llvm_unreachable(
"unexpected cuda target");
5700 auto *HostTI =
LangOpts.CUDAIsDevice ? Aux : &TI;
5701 auto *DeviceTI =
LangOpts.CUDAIsDevice ? &TI : Aux;
5702 if (CheckHost && HostTI)
5705 A = DeviceTI->checkCallingConvention(CC);
5714 A = Aux->checkCallingConvention(CC);
5732 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
5737 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
5742 bool IsCXXMethod =
false, IsVariadic =
false;
5747 CC =
Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
5772 if (
Context.getTargetInfo().getRegParmMax() == 0) {
5773 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
5780 if (numParams >
Context.getTargetInfo().getRegParmMax()) {
5781 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
5793 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
5803 const CUDALaunchBoundsAttr &AL,
5804 const unsigned Idx) {
5813 std::optional<llvm::APSInt> I = llvm::APSInt(64);
5820 if (!I->isIntN(32)) {
5822 <<
toString(*I, 10,
false) << 32 << 1;
5826 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
5834 "Unexpected PerformCopyInitialization() failure.");
5839CUDALaunchBoundsAttr *
5841 Expr *MinBlocks,
Expr *MaxBlocks) {
5842 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5860 MaxBlocks =
nullptr;
5869 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5888static std::pair<Expr *, int>
5890 const unsigned Idx) {
5906 if (!I->isIntN(4)) {
5908 <<
toString(*I, 10,
false) << 4 << 1;
5912 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
5922 CUDAClusterDimsAttr TmpAttr(
Context, CI,
X, Y, Z);
5928 if (!NewX || (Y && !NewY) || (Z && !NewZ))
5931 int FlatDim = ValX * ValY * ValZ;
5932 const llvm::Triple TT =
5933 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
5934 ?
Context.getAuxTargetInfo()->getTriple()
5935 :
Context.getTargetInfo().getTriple();
5939 else if (TT.isAMDGPU())
5946 if (FlatDim > MaxDim) {
5947 Diag(CI.
getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
5951 return CUDAClusterDimsAttr::Create(
Context, NewX, NewY, NewZ, CI);
5970 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
5989 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
5999 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6021 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
6024 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
6029 TypeTagIdx, IsPointer));
6035 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6044 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
6052 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
6075 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
6078 uint32_t Count = 0, Offset = 0;
6086 if (Count < Offset) {
6087 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
6098 diag::err_attribute_patchable_function_entry_invalid_section)
6102 if (Section.empty()) {
6104 diag::err_attribute_patchable_function_entry_invalid_section)
6105 <<
"section must not be empty";
6115 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6133 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6134 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
6145 if (
auto *CRD = dyn_cast<CXXRecordDecl>(D);
6146 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6157 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6163 assert(ParmTSI &&
"no type source info for attribute argument");
6165 diag::err_incomplete_type);
6175 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
6176 if (
const auto *UA = D->
getAttr<UuidAttr>()) {
6179 if (!UA->getGuid().empty()) {
6180 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6186 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
6191 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6196 StringRef OrigStrRef;
6203 StringRef StrRef = OrigStrRef;
6204 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
6205 StrRef = StrRef.drop_front().drop_back();
6208 if (StrRef.size() != 36) {
6209 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6213 for (
unsigned i = 0; i < 36; ++i) {
6214 if (i == 8 || i == 13 || i == 18 || i == 23) {
6215 if (StrRef[i] !=
'-') {
6216 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6220 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6227 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
6228 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
6229 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
6230 for (
unsigned i = 0; i != 8; ++i)
6231 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6242 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
6251 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6266 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
6270 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
6273 if (VD->hasLocalStorage()) {
6274 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
6282 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
6288 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6292 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6293 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6294 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6304 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6305 << AL <<
First << 0;
6306 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6309 if (
const auto *Preexisting = D->
getAttr<MSStructAttr>()) {
6310 if (Preexisting->isImplicit())
6319 if (
First->isImplicit()) {
6322 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6323 << AL <<
First << 0;
6324 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6334 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6338 Tags.push_back(Tag);
6341 if (
const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6342 if (!NS->isInline()) {
6343 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6346 if (NS->isAnonymousNamespace()) {
6347 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6351 Tags.push_back(NS->getName());
6357 Tags.erase(llvm::unique(Tags), Tags.end());
6360 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
6365 if (I->getBTFDeclTag() == Tag)
6384 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
6390 case llvm::Triple::msp430:
6393 case llvm::Triple::mipsel:
6394 case llvm::Triple::mips:
6397 case llvm::Triple::m68k:
6400 case llvm::Triple::x86:
6401 case llvm::Triple::x86_64:
6404 case llvm::Triple::avr:
6407 case llvm::Triple::riscv32:
6408 case llvm::Triple::riscv64:
6409 case llvm::Triple::riscv32be:
6410 case llvm::Triple::riscv64be:
6427 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
6442 if (D->
hasAttr<DLLExportAttr>()) {
6443 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
6447 if (D->
hasAttr<DLLImportAttr>())
6455 if (DLLImportAttr *Import = D->
getAttr<DLLImportAttr>()) {
6456 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6460 if (D->
hasAttr<DLLExportAttr>())
6473 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6483 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6485 MD->getParent()->isLambda()) {
6491 if (
auto *EA = D->
getAttr<ExcludeFromExplicitInstantiationAttr>()) {
6493 if (RD->isTemplated()) {
6495 diag::warn_dllattr_ignored_exclusion_takes_precedence)
6499 S.
Diag(EA->getLoc(), diag::warn_attribute_ignored_in_non_template) << EA;
6500 D->
dropAttr<ExcludeFromExplicitInstantiationAttr>();
6502 S.
Diag(EA->getLoc(), diag::warn_attribute_ignored_on_non_member) << EA;
6503 D->
dropAttr<ExcludeFromExplicitInstantiationAttr>();
6507 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
6518 if (MSInheritanceAttr *IA = D->
getAttr<MSInheritanceAttr>()) {
6519 if (IA->getInheritanceModel() == Model)
6521 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6523 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
6528 if (RD->hasDefinition()) {
6535 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6539 if (RD->getDescribedClassTemplate()) {
6540 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6558 StringRef N(
"mutex");
6560 if (AL.
getKind() == ParsedAttr::AT_Capability &&
6573 if (!D->
hasAttr<CapabilityAttr>()) {
6574 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_requires_preceded)
6575 << AL << cast<NamedDecl>(D) <<
"'capability'";
6588 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
6593 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6617 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6630 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6643 RequiresCapabilityAttr *RCA = ::new (S.
Context)
6644 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
6650 if (
const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6651 if (NSD->isAnonymousNamespace()) {
6652 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6666 StringRef Str, Replacement;
6679 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6685 if (
const auto *S = dyn_cast<VarDecl>(D))
6686 return S->hasGlobalStorage();
6691 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6692 Sanitizer ==
"memtag";
6699 std::vector<StringRef> Sanitizers;
6701 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6702 StringRef SanitizerName;
6710 SanitizerName !=
"coverage")
6711 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6713 S.
Diag(D->
getLocation(), diag::warn_attribute_type_not_supported_global)
6714 << AL << SanitizerName;
6715 Sanitizers.push_back(SanitizerName);
6719 Sanitizers.size()));
6732 unsigned TranslatedSpellingIndex = 0;
6734 TranslatedSpellingIndex = 1;
6743 StringRef SanitizerName =
"address";
6746 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6750 StringRef SanitizerName =
"thread";
6753 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6757 StringRef SanitizerName =
"memory";
6760 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6775 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6776 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6777 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6782 D->
dropAttr<ZeroCallUsedRegsAttr>();
6791 auto *FD = dyn_cast<FieldDecl>(D);
6801 case ParsedAttr::AT_CountedBy:
6802 CountInBytes =
false;
6805 case ParsedAttr::AT_CountedByOrNull:
6806 CountInBytes =
false;
6809 case ParsedAttr::AT_SizedBy:
6810 CountInBytes =
true;
6813 case ParsedAttr::AT_SizedByOrNull:
6814 CountInBytes =
true;
6818 llvm_unreachable(
"unexpected counted_by family attribute");
6825 FD->
getType(), CountExpr, CountInBytes, OrNull);
6836 FunctionReturnThunksAttr::Kind Kind;
6837 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
6838 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6845 D->
dropAttr<FunctionReturnThunksAttr>();
6846 D->
addAttr(FunctionReturnThunksAttr::Create(S.
Context, Kind, AL));
6856 auto *VDecl = dyn_cast<VarDecl>(D);
6857 if (VDecl && !VDecl->isFunctionPointerType()) {
6858 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
6872 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
6876 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
6884 "uninitialized is only valid on automatic duration variables");
6895 bool IsKernReturnT =
false;
6896 while (
const auto *TT = T->getAs<
TypedefType>()) {
6897 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
6902 diag::warn_mig_server_routine_does_not_return_kern_return_t);
6912 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6915 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
6928 if (
const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
6929 if (PVD->getType()->isIntegerType()) {
6930 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
6941template<
typename Attr>
6949template<
typename Attr>
6958 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
6963 CFGuardAttr::GuardArg Arg;
6965 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
6966 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
6974template <
typename AttrTy>
6977 auto I = llvm::find_if(Attrs,
6978 [Name](
const AttrTy *A) {
6979 return A->getTCBName() == Name;
6981 return I == Attrs.end() ?
nullptr : *I;
6984template <
typename AttrTy,
typename ConflictingAttrTy>
6991 if (
const ConflictingAttrTy *ConflictingAttr =
6995 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
7009template <
typename AttrTy,
typename ConflictingAttrTy>
7012 StringRef TCBName = AL.getTCBName();
7013 if (
const ConflictingAttrTy *ConflictingAttr =
7015 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
7016 << ConflictingAttr->getAttrName()->getName()
7017 << AL.getAttrName()->getName() << TCBName;
7020 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
7028 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
7037 Decl *D,
const EnforceTCBLeafAttr &AL) {
7047 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7052 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
7057 if (D->
getAttr<VTablePointerAuthenticationAttr>()) {
7058 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
7062 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
7065 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
7067 S.
Diag(IL->
getLoc(), diag::err_invalid_authentication_key)
7071 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
7073 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
7077 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7082 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
7083 AddressDiscriminationMode::DefaultAddressDiscrimination;
7087 if (!VTablePointerAuthenticationAttr::
7088 ConvertStrToAddressDiscriminationMode(
7090 S.
Diag(IL->
getLoc(), diag::err_invalid_address_discrimination)
7094 if (AddressDiversityMode ==
7095 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
7097 S.
Diag(IL->
getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
7101 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7106 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
7107 DefaultExtraDiscrimination;
7111 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
7113 S.
Diag(IL->
getLoc(), diag::err_invalid_extra_discrimination)
7117 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
7119 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
7123 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7128 uint32_t CustomDiscriminationValue = 0;
7129 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
7131 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
7136 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7141 CustomDiscriminationValue)) {
7142 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
7145 }
else if (NumArgs > 3) {
7146 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
7151 S.
Context, AL, KeyType, AddressDiversityMode, ED,
7152 CustomDiscriminationValue));
7159 return Existing->getModularImplFn() == ModularImplFn &&
7160 Existing->getImplName() == ImplName &&
7161 Existing->aspects_size() == Aspects.size() &&
7162 llvm::equal(Existing->aspects(), Aspects);
7168 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7170 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
7171 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
7175 return ::new (
Context) ModularFormatAttr(
Context, CI, ModularImplFn, ImplName,
7176 Aspects.data(), Aspects.size());
7182 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
7190 llvm::DenseSet<StringRef> SeenAspects;
7191 for (
unsigned I = 2, E = AL.
getNumArgs(); I != E; ++I) {
7195 if (!SeenAspects.insert(Aspect).second) {
7197 diag::err_modular_format_duplicate_aspect)
7202 Aspects.push_back(Aspect);
7208 llvm::sort(Aspects);
7211 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7213 S.
Diag(AL.
getLoc(), diag::err_duplicate_attribute) << *Existing;
7214 S.
Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7221 S.
Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7237 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
7238 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7241 if (IsLastAttrArg && AttrHasVariadicArg)
7249 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7285 S.
Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
7288 S.
Diag(AL.
getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7303 if (MustDelayArgs) {
7313 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
7339 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7348 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
7361 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
7371 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
7382 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
7385 case ParsedAttr::AT_Interrupt:
7388 case ParsedAttr::AT_ARMInterruptSaveFP:
7391 case ParsedAttr::AT_X86ForceAlignArgPointer:
7394 case ParsedAttr::AT_ReadOnlyPlacement:
7397 case ParsedAttr::AT_DLLExport:
7398 case ParsedAttr::AT_DLLImport:
7401 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7404 case ParsedAttr::AT_AMDGPUWavesPerEU:
7407 case ParsedAttr::AT_AMDGPUNumSGPR:
7410 case ParsedAttr::AT_AMDGPUNumVGPR:
7413 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7416 case ParsedAttr::AT_AVRSignal:
7419 case ParsedAttr::AT_BPFPreserveAccessIndex:
7422 case ParsedAttr::AT_BPFPreserveStaticOffset:
7425 case ParsedAttr::AT_BTFDeclTag:
7428 case ParsedAttr::AT_WebAssemblyExportName:
7431 case ParsedAttr::AT_WebAssemblyImportModule:
7434 case ParsedAttr::AT_WebAssemblyImportName:
7437 case ParsedAttr::AT_IBOutlet:
7440 case ParsedAttr::AT_IBOutletCollection:
7443 case ParsedAttr::AT_IFunc:
7446 case ParsedAttr::AT_Alias:
7449 case ParsedAttr::AT_Aligned:
7452 case ParsedAttr::AT_AlignValue:
7455 case ParsedAttr::AT_AllocSize:
7458 case ParsedAttr::AT_AlwaysInline:
7461 case ParsedAttr::AT_AnalyzerNoReturn:
7464 case ParsedAttr::AT_TLSModel:
7467 case ParsedAttr::AT_Annotate:
7470 case ParsedAttr::AT_Availability:
7473 case ParsedAttr::AT_CarriesDependency:
7476 case ParsedAttr::AT_CPUDispatch:
7477 case ParsedAttr::AT_CPUSpecific:
7480 case ParsedAttr::AT_Common:
7483 case ParsedAttr::AT_CUDAConstant:
7486 case ParsedAttr::AT_PassObjectSize:
7489 case ParsedAttr::AT_Constructor:
7492 case ParsedAttr::AT_Deprecated:
7495 case ParsedAttr::AT_Destructor:
7498 case ParsedAttr::AT_EnableIf:
7501 case ParsedAttr::AT_Error:
7504 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7507 case ParsedAttr::AT_DiagnoseIf:
7510 case ParsedAttr::AT_DiagnoseAsBuiltin:
7513 case ParsedAttr::AT_NoBuiltin:
7516 case ParsedAttr::AT_CFIUncheckedCallee:
7519 case ParsedAttr::AT_ExtVectorType:
7522 case ParsedAttr::AT_ExternalSourceSymbol:
7525 case ParsedAttr::AT_MinSize:
7528 case ParsedAttr::AT_OptimizeNone:
7531 case ParsedAttr::AT_EnumExtensibility:
7534 case ParsedAttr::AT_SYCLKernel:
7537 case ParsedAttr::AT_SYCLExternal:
7540 case ParsedAttr::AT_SYCLKernelEntryPoint:
7543 case ParsedAttr::AT_SYCLSpecialClass:
7546 case ParsedAttr::AT_Format:
7549 case ParsedAttr::AT_FormatMatches:
7552 case ParsedAttr::AT_FormatArg:
7555 case ParsedAttr::AT_Callback:
7558 case ParsedAttr::AT_LifetimeCaptureBy:
7561 case ParsedAttr::AT_CalledOnce:
7564 case ParsedAttr::AT_CUDAGlobal:
7567 case ParsedAttr::AT_CUDADevice:
7570 case ParsedAttr::AT_CUDAGridConstant:
7573 case ParsedAttr::AT_HIPManaged:
7576 case ParsedAttr::AT_GNUInline:
7579 case ParsedAttr::AT_CUDALaunchBounds:
7582 case ParsedAttr::AT_CUDAClusterDims:
7585 case ParsedAttr::AT_CUDANoCluster:
7588 case ParsedAttr::AT_Restrict:
7591 case ParsedAttr::AT_MallocSpan:
7594 case ParsedAttr::AT_Mode:
7597 case ParsedAttr::AT_NonString:
7600 case ParsedAttr::AT_NonNull:
7601 if (
auto *PVD = dyn_cast<ParmVarDecl>(D))
7606 case ParsedAttr::AT_ReturnsNonNull:
7609 case ParsedAttr::AT_NoEscape:
7612 case ParsedAttr::AT_MaybeUndef:
7615 case ParsedAttr::AT_AssumeAligned:
7618 case ParsedAttr::AT_AllocAlign:
7621 case ParsedAttr::AT_Ownership:
7624 case ParsedAttr::AT_Naked:
7627 case ParsedAttr::AT_NoReturn:
7630 case ParsedAttr::AT_CXX11NoReturn:
7633 case ParsedAttr::AT_AnyX86NoCfCheck:
7636 case ParsedAttr::AT_NoThrow:
7640 case ParsedAttr::AT_CUDAShared:
7643 case ParsedAttr::AT_VecReturn:
7646 case ParsedAttr::AT_ObjCOwnership:
7649 case ParsedAttr::AT_ObjCPreciseLifetime:
7652 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7655 case ParsedAttr::AT_ObjCRequiresSuper:
7658 case ParsedAttr::AT_ObjCBridge:
7661 case ParsedAttr::AT_ObjCBridgeMutable:
7664 case ParsedAttr::AT_ObjCBridgeRelated:
7667 case ParsedAttr::AT_ObjCDesignatedInitializer:
7670 case ParsedAttr::AT_ObjCRuntimeName:
7673 case ParsedAttr::AT_ObjCBoxable:
7676 case ParsedAttr::AT_NSErrorDomain:
7679 case ParsedAttr::AT_CFConsumed:
7680 case ParsedAttr::AT_NSConsumed:
7681 case ParsedAttr::AT_OSConsumed:
7686 case ParsedAttr::AT_OSReturnsRetainedOnZero:
7689 diag::warn_ns_attribute_wrong_parameter_type,
7692 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
7695 diag::warn_ns_attribute_wrong_parameter_type,
7698 case ParsedAttr::AT_NSReturnsAutoreleased:
7699 case ParsedAttr::AT_NSReturnsNotRetained:
7700 case ParsedAttr::AT_NSReturnsRetained:
7701 case ParsedAttr::AT_CFReturnsNotRetained:
7702 case ParsedAttr::AT_CFReturnsRetained:
7703 case ParsedAttr::AT_OSReturnsNotRetained:
7704 case ParsedAttr::AT_OSReturnsRetained:
7707 case ParsedAttr::AT_WorkGroupSizeHint:
7710 case ParsedAttr::AT_ReqdWorkGroupSize:
7713 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
7716 case ParsedAttr::AT_VecTypeHint:
7719 case ParsedAttr::AT_InitPriority:
7722 case ParsedAttr::AT_Packed:
7725 case ParsedAttr::AT_PreferredName:
7728 case ParsedAttr::AT_NoSpecializations:
7731 case ParsedAttr::AT_Section:
7734 case ParsedAttr::AT_CodeModel:
7737 case ParsedAttr::AT_RandomizeLayout:
7740 case ParsedAttr::AT_NoRandomizeLayout:
7743 case ParsedAttr::AT_CodeSeg:
7746 case ParsedAttr::AT_Target:
7749 case ParsedAttr::AT_TargetVersion:
7752 case ParsedAttr::AT_TargetClones:
7755 case ParsedAttr::AT_MinVectorWidth:
7758 case ParsedAttr::AT_Unavailable:
7761 case ParsedAttr::AT_OMPAssume:
7764 case ParsedAttr::AT_ObjCDirect:
7767 case ParsedAttr::AT_ObjCDirectMembers:
7771 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
7774 case ParsedAttr::AT_Unused:
7777 case ParsedAttr::AT_Visibility:
7780 case ParsedAttr::AT_TypeVisibility:
7783 case ParsedAttr::AT_WarnUnusedResult:
7786 case ParsedAttr::AT_WeakRef:
7789 case ParsedAttr::AT_WeakImport:
7792 case ParsedAttr::AT_TransparentUnion:
7795 case ParsedAttr::AT_ObjCMethodFamily:
7798 case ParsedAttr::AT_ObjCNSObject:
7801 case ParsedAttr::AT_ObjCIndependentClass:
7804 case ParsedAttr::AT_Blocks:
7807 case ParsedAttr::AT_Sentinel:
7810 case ParsedAttr::AT_Cleanup:
7813 case ParsedAttr::AT_NoDebug:
7816 case ParsedAttr::AT_CmseNSEntry:
7819 case ParsedAttr::AT_StdCall:
7820 case ParsedAttr::AT_CDecl:
7821 case ParsedAttr::AT_FastCall:
7822 case ParsedAttr::AT_ThisCall:
7823 case ParsedAttr::AT_Pascal:
7824 case ParsedAttr::AT_RegCall:
7825 case ParsedAttr::AT_SwiftCall:
7826 case ParsedAttr::AT_SwiftAsyncCall:
7827 case ParsedAttr::AT_VectorCall:
7828 case ParsedAttr::AT_MSABI:
7829 case ParsedAttr::AT_SysVABI:
7830 case ParsedAttr::AT_Pcs:
7831 case ParsedAttr::AT_IntelOclBicc:
7832 case ParsedAttr::AT_PreserveMost:
7833 case ParsedAttr::AT_PreserveAll:
7834 case ParsedAttr::AT_AArch64VectorPcs:
7835 case ParsedAttr::AT_AArch64SVEPcs:
7836 case ParsedAttr::AT_M68kRTD:
7837 case ParsedAttr::AT_PreserveNone:
7838 case ParsedAttr::AT_RISCVVectorCC:
7839 case ParsedAttr::AT_RISCVVLSCC:
7842 case ParsedAttr::AT_DeviceKernel:
7845 case ParsedAttr::AT_Suppress:
7848 case ParsedAttr::AT_Owner:
7849 case ParsedAttr::AT_Pointer:
7852 case ParsedAttr::AT_OpenCLAccess:
7855 case ParsedAttr::AT_OpenCLNoSVM:
7858 case ParsedAttr::AT_SwiftContext:
7861 case ParsedAttr::AT_SwiftAsyncContext:
7864 case ParsedAttr::AT_SwiftErrorResult:
7867 case ParsedAttr::AT_SwiftIndirectResult:
7870 case ParsedAttr::AT_InternalLinkage:
7873 case ParsedAttr::AT_ZeroCallUsedRegs:
7876 case ParsedAttr::AT_FunctionReturnThunks:
7879 case ParsedAttr::AT_NoMerge:
7882 case ParsedAttr::AT_NoUniqueAddress:
7886 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
7890 case ParsedAttr::AT_CountedBy:
7891 case ParsedAttr::AT_CountedByOrNull:
7892 case ParsedAttr::AT_SizedBy:
7893 case ParsedAttr::AT_SizedByOrNull:
7897 case ParsedAttr::AT_NoFieldProtection:
7902 case ParsedAttr::AT_LayoutVersion:
7905 case ParsedAttr::AT_Uuid:
7908 case ParsedAttr::AT_MSInheritance:
7911 case ParsedAttr::AT_Thread:
7914 case ParsedAttr::AT_MSConstexpr:
7917 case ParsedAttr::AT_HybridPatchable:
7922 case ParsedAttr::AT_RootSignature:
7925 case ParsedAttr::AT_HLSLNumThreads:
7928 case ParsedAttr::AT_HLSLWaveSize:
7931 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
7934 case ParsedAttr::AT_HLSLVkPushConstant:
7937 case ParsedAttr::AT_HLSLVkConstantId:
7940 case ParsedAttr::AT_HLSLVkBinding:
7943 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
7946 case ParsedAttr::AT_HLSLPackOffset:
7949 case ParsedAttr::AT_HLSLShader:
7952 case ParsedAttr::AT_HLSLResourceBinding:
7955 case ParsedAttr::AT_HLSLParamModifier:
7958 case ParsedAttr::AT_HLSLUnparsedSemantic:
7961 case ParsedAttr::AT_HLSLVkLocation:
7965 case ParsedAttr::AT_AbiTag:
7968 case ParsedAttr::AT_CFGuard:
7973 case ParsedAttr::AT_PtGuardedVar:
7976 case ParsedAttr::AT_NoSanitize:
7979 case ParsedAttr::AT_NoSanitizeAddress:
7982 case ParsedAttr::AT_NoSanitizeThread:
7985 case ParsedAttr::AT_NoSanitizeMemory:
7988 case ParsedAttr::AT_GuardedBy:
7991 case ParsedAttr::AT_PtGuardedBy:
7994 case ParsedAttr::AT_LockReturned:
7997 case ParsedAttr::AT_LocksExcluded:
8000 case ParsedAttr::AT_AcquiredBefore:
8003 case ParsedAttr::AT_AcquiredAfter:
8008 case ParsedAttr::AT_Capability:
8009 case ParsedAttr::AT_Lockable:
8012 case ParsedAttr::AT_ReentrantCapability:
8015 case ParsedAttr::AT_RequiresCapability:
8019 case ParsedAttr::AT_AssertCapability:
8022 case ParsedAttr::AT_AcquireCapability:
8025 case ParsedAttr::AT_ReleaseCapability:
8028 case ParsedAttr::AT_TryAcquireCapability:
8033 case ParsedAttr::AT_Consumable:
8036 case ParsedAttr::AT_CallableWhen:
8039 case ParsedAttr::AT_ParamTypestate:
8042 case ParsedAttr::AT_ReturnTypestate:
8045 case ParsedAttr::AT_SetTypestate:
8048 case ParsedAttr::AT_TestTypestate:
8053 case ParsedAttr::AT_ArgumentWithTypeTag:
8056 case ParsedAttr::AT_TypeTagForDatatype:
8061 case ParsedAttr::AT_SwiftAsyncName:
8064 case ParsedAttr::AT_SwiftAttr:
8067 case ParsedAttr::AT_SwiftBridge:
8070 case ParsedAttr::AT_SwiftError:
8073 case ParsedAttr::AT_SwiftName:
8076 case ParsedAttr::AT_SwiftNewType:
8079 case ParsedAttr::AT_SwiftAsync:
8082 case ParsedAttr::AT_SwiftAsyncError:
8087 case ParsedAttr::AT_XRayLogArgs:
8091 case ParsedAttr::AT_PatchableFunctionEntry:
8095 case ParsedAttr::AT_AlwaysDestroy:
8096 case ParsedAttr::AT_NoDestroy:
8100 case ParsedAttr::AT_Uninitialized:
8104 case ParsedAttr::AT_ObjCExternallyRetained:
8108 case ParsedAttr::AT_MIGServerRoutine:
8112 case ParsedAttr::AT_MSAllocator:
8116 case ParsedAttr::AT_ArmBuiltinAlias:
8120 case ParsedAttr::AT_ArmLocallyStreaming:
8124 case ParsedAttr::AT_ArmNew:
8128 case ParsedAttr::AT_AcquireHandle:
8132 case ParsedAttr::AT_ReleaseHandle:
8136 case ParsedAttr::AT_UnsafeBufferUsage:
8140 case ParsedAttr::AT_UseHandle:
8144 case ParsedAttr::AT_EnforceTCB:
8148 case ParsedAttr::AT_EnforceTCBLeaf:
8152 case ParsedAttr::AT_BuiltinAlias:
8156 case ParsedAttr::AT_PreferredType:
8160 case ParsedAttr::AT_UsingIfExists:
8164 case ParsedAttr::AT_TypeNullable:
8168 case ParsedAttr::AT_VTablePointerAuthentication:
8172 case ParsedAttr::AT_ModularFormat:
8176 case ParsedAttr::AT_MSStruct:
8180 case ParsedAttr::AT_GCCStruct:
8184 case ParsedAttr::AT_PointerFieldProtection:
8187 diag::err_attribute_pointer_field_protection_experimental)
8196 return D->
hasAttr<DeviceKernelAttr>() ||
8204 if (AttrList.
empty())
8215 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8225 if (!(D->
hasAttr<DeviceKernelAttr>() ||
8226 (D->
hasAttr<CUDAGlobalAttr>() &&
8227 Context.getTargetInfo().getTriple().isSPIRV()))) {
8229 if (
const auto *A = D->
getAttr<ReqdWorkGroupSizeAttr>()) {
8234 }
else if (
const auto *A = D->
getAttr<WorkGroupSizeHintAttr>()) {
8237 }
else if (
const auto *A = D->
getAttr<VecTypeHintAttr>()) {
8240 }
else if (
const auto *A = D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8246 if (
const auto *A = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8250 }
else if (
const auto *A = D->
getAttr<AMDGPUWavesPerEUAttr>()) {
8254 }
else if (
const auto *A = D->
getAttr<AMDGPUNumSGPRAttr>()) {
8258 }
else if (
const auto *A = D->
getAttr<AMDGPUNumVGPRAttr>()) {
8275 if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8276 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8277 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8278 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8280 if (HasGlobal || HasHost != HasDevice) {
8281 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8282 Guide->setInvalidDecl();
8283 }
else if (HasHost && HasDevice) {
8284 Diag(Guide->getLocation(),
8285 diag::warn_deduction_guide_target_attr_deprecated);
8291 (D->
hasAttr<ConstructorAttr>() || D->
hasAttr<DestructorAttr>()) &&
8294 << (D->
hasAttr<ConstructorAttr>() ?
"constructors" :
"destructors");
8303 if (D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
8306 D->
dropAttr<ObjCDesignatedInitializerAttr>();
8313 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8320 if (D && D->
hasAttr<BPFPreserveAccessIndexAttr>())
8327 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8331 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8343 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8351 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8368 std::optional<StringRef> CorrectedScopeName =
8370 if (CorrectedScopeName) {
8371 ScopeName = *CorrectedScopeName;
8377 if (CorrectedAttrName) {
8378 AttrName = *CorrectedAttrName;
8381 if (CorrectedScopeName || CorrectedAttrName) {
8382 std::string CorrectedFullName =
8386 diag::warn_unknown_attribute_ignored_suggestion);
8388 D << AL << CorrectedFullName;
8393 if (CorrectedScopeName) {
8397 if (CorrectedAttrName) {
8402 Diag(NR.
getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8410 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
8432 for (
const auto &AI : FT->param_types()) {
8434 Param->setScopeInfo(0, Params.size());
8435 Params.push_back(Param);
8437 NewFD->setParams(Params);
8439 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
8441 VD->getInnerLocStart(), VD->getLocation(), II,
8442 VD->getType(), VD->getTypeSourceInfo(),
8443 VD->getStorageClass());
8444 if (VD->getQualifier())
8445 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8478 if (
auto *VD = dyn_cast<VarDecl>(D))
8479 if (VD->isExternC())
8481 if (
auto *FD = dyn_cast<FunctionDecl>(D))
8489 auto &WeakInfos = I->second;
8490 for (
const auto &W : WeakInfos)
8492 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
8493 WeakInfos.swap(EmptyWeakInfos);
8505 auto ProcessAttributesWithSliding =
8513 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8514 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8519 AL.diagnoseAppertainsTo(*
this, D);
8534 .WithIncludeCXX11Attributes(
false)
8535 .WithIgnoreTypeAttributes(
true));
8544 .WithIncludeCXX11Attributes(
false)
8545 .WithIgnoreTypeAttributes(
true));
8563 UnavailableAttr::ImplicitReason &reason) {
8577 if (
diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8578 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8579 reason = UnavailableAttr::IR_ForbiddenWeak;
8588 reason = UnavailableAttr::IR_ARCForbiddenType;
8598 auto Reason = UnavailableAttr::IR_None;
8600 assert(Reason &&
"didn't set reason?");
8605 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
8608 if (FD->
hasAttr<UnavailableAttr>() &&
8610 diag::err_arc_array_param_no_ownership) {
8641 bool AnyAccessFailures =
false;
8649 switch (
diag.Kind) {
8653 if (!
decl->isInvalidDecl())
8665 AnyAccessFailures =
true;
8678 assert(curPool &&
"re-emitting in undelayed context not supported");
8679 curPool->
steal(pool);
8696 QualType ParamTy = FD->getParamDecl(0)->getType();
8698 FD->getParamDecl(0)->getLocation(), ParamTy, Ty))) {
8699 this->
Diag(Attr->getArgLoc(),
8700 diag::err_attribute_cleanup_func_arg_incompatible_type)
8701 << NI.
getName() << ParamTy << Ty;
8709 if (this->
Context.getAsArrayType(T))
8710 T = this->
Context.getBaseElementType(T);
8711 if (!T->isRecordType()) {
8712 this->
Diag(A->
getLoc(), diag::err_init_priority_object_attr);
Defines the clang::ASTContext interface.
static SmallString< 64 > normalizeName(StringRef AttrName, StringRef ScopeName, AttributeCommonInfo::Syntax SyntaxUsed)
static OffloadArch getOffloadArch(CodeGenModule &CGM)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis functions specific to AVR.
This file declares semantic analysis functions specific to BPF.
This file declares semantic analysis for CUDA constructs.
static void handleCleanupAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWeakImportAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkGuardedByAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, Expr *&Arg)
static void handleCodeSegAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static const RecordDecl * getRecordDecl(QualType QT)
Checks that the passed in QualType either is of RecordType or points to RecordType.
static void handlePatchableFunctionEntryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCountedByAttrField(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFormatAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUninitializedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRequiresCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeviceKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleBTFDeclTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleOptimizeNoneAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnableIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSectionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleStandardNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleMIGServerRoutineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleZeroCallUsedRegsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDiagnoseAsBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnumExtensibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static T * mergeVisibilityAttr(Sema &S, Decl *D, const AttributeCommonInfo &CI, typename T::VisibilityType value)
static void handleFormatMatchesAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLayoutVersion(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkForConsumableClass(Sema &S, const CXXMethodDecl *MD, const ParsedAttr &AL)
static void handleDLLAttr(Sema &S, Decl *D, const ParsedAttr &A)
static void handleConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool modularFormatAttrsEquiv(const ModularFormatAttr *Existing, const IdentifierInfo *ModularImplFn, StringRef ImplName, ArrayRef< StringRef > Aspects)
static void handleAlignValueAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static Expr * makeAttributeArgExpr(Sema &S, Expr *E, const Attribute &Attr, const unsigned Idx)
static void handleLifetimeCaptureByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoCfCheckAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleMallocSpanAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSpecializations(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsSmartPointer(Sema &S, const RecordDecl *Record)
static void handleReturnsNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void checkUnusedDeclAttributes(Sema &S, const ParsedAttributesView &A)
checkUnusedDeclAttributes - Check a list of attributes to see if it contains any decl attributes that...
static void handleGNUInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWorkGroupSize(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleBuiltinAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTransparentUnionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVTablePointerAuthentication(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoPFPAttrField(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleEnforceTCBAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void checkAttrArgsAreCapabilityObjs(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args, unsigned Sidx=0, bool ParamIdxOk=false)
Checks that all attribute arguments, starting from Sidx, resolve to a capability object.
static void handleErrorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkCodeSegName(Sema &S, SourceLocation LiteralLoc, StringRef CodeSegName)
static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTryAcquireCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleModularFormat(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGridConstantAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSetTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFormatArgAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((format_arg((idx)))) attribute based on https://gcc.gnu.org/onlinedocs/gcc/Common-Fu...
static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL, const Sema::ProcessDeclAttributeOptions &Options)
ProcessDeclAttribute - Apply the specific attribute to the specified decl if the attribute applies to...
static void handleTargetAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleXRayLogArgsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePassObjectSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoMergeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleManagedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSStructAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonStringAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleParamTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUnsafeBufferUsage(Sema &S, Decl *D, const ParsedAttr &AL)
static bool attrNonNullArgCheck(Sema &S, QualType T, const ParsedAttr &AL, SourceRange AttrParmRange, SourceRange TypeRange, bool isReturnValue=false)
static void handleAcquireCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCPUSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePackedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleIFuncAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAbiTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAttrWithMessage(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWeakRefAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExtVectorTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isValidCodeModelAttr(llvm::Triple &Triple, StringRef Str)
static void handleCalledOnceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle 'called_once' attribute.
static void handleLockReturnedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkFunctionConditionAttr(Sema &S, Decl *D, const ParsedAttr &AL, Expr *&Cond, StringRef &Msg)
static void handleAcquiredAfterAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleExternalSourceSymbolAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D, const ParsedAttr &AL)
static bool checkParamIsIntegerType(Sema &S, const Decl *D, const AttrInfo &AI, unsigned AttrArgNo)
Checks to be sure that the given parameter number is in bounds, and is an integral type.
static bool checkFunParamsAreScopedLockable(Sema &S, const ParmVarDecl *ParamDecl, const ParsedAttr &AL)
static bool checkRecordTypeForCapability(Sema &S, QualType Ty)
static void handleArgumentWithTypeTagAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkAcquireOrderAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleLocksExcludedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSAllocatorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static AttrTy * mergeEnforceTCBAttrImpl(Sema &S, Decl *D, const AttrTy &AL)
static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAllocSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleConsumableAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSanitizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReturnTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isKernelDecl(Decl *D)
static void handleAllocAlignAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePreferredTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeviceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePtGuardedByAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAlwaysInlineAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAssertCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVisibilityAttr(Sema &S, Decl *D, const ParsedAttr &AL, bool isTypeVisibility)
static void handleAnnotateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static FormatAttrKind getFormatAttrKind(StringRef Format)
getFormatAttrKind - Map from format attribute names to supported format types.
static void handleNullableTypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUuidAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAcquireHandleAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoSanitizeAddressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSConstexprAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCommonAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTestTypestateAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool shouldInferAvailabilityAttribute(const ParsedAttr &AL, IdentifierInfo *&II, bool &IsUnavailable, VersionTuple &Introduced, VersionTuple &Deprecated, VersionTuple &Obsolete, Sema &S)
Returns true if the given availability attribute should be inferred, and adjusts the value of the att...
static bool checkTryLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void parseModeAttrArg(Sema &S, StringRef Str, unsigned &DestWidth, bool &IntegerMode, bool &ComplexMode, FloatModeKind &ExplicitType)
parseModeAttrArg - Parses attribute mode string and returns parsed type attribute.
static void handleExcludeFromExplicitInstantiationAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCFIUncheckedCalleeAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static void handleLaunchBoundsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDependencyAttr(Sema &S, Scope *Scope, Decl *D, const ParsedAttr &AL)
static void handleNoBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleGCCStructAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoUniqueAddressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool validateAlignasAppliedType(Sema &S, Decl *D, const AlignedAttr &Attr, SourceLocation AttrLoc)
Perform checking of type validity.
static void handleNakedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleFunctionReturnThunksAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
static void handleGlobalAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSentinelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCodeModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCallableWhenAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool hasBTFDeclTagAttr(Decl *D, StringRef Tag)
static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &DD, Decl *D)
Handle a delayed forbidden-type diagnostic.
static void handleNoClusterAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkLockFunAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, SmallVectorImpl< Expr * > &Args)
static void handleAssumeAlignedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSharedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMSInheritanceAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleVecTypeHint(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRestrictAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinVectorWidthAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static Expr * makeLaunchBoundsArgExpr(Sema &S, Expr *E, const CUDALaunchBoundsAttr &AL, const unsigned Idx)
static void handleDeclspecThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleInterruptAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCallbackAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((callback(CalleeIdx, PayloadIdx0, ...))) attributes.
static AttributeCommonInfo getNoSanitizeAttrInfo(const ParsedAttr &NoSanitizeSpecificAttr)
static void handleInitPriorityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
Handle attribute((init_priority(priority))) attributes based on http://gcc.gnu.org/onlinedocs/gcc/C_0...
static void handlePtGuardedVarAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkRecordDeclForAttr(const RecordDecl *RD)
static void handleNoSanitizeThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A)
static bool isKnownToAlwaysThrow(const FunctionDecl *FD)
static void handleTypeTagForDatatypeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void markUsedForAliasOrIfunc(Sema &S, Decl *D, const ParsedAttr &AL, StringRef Str)
static bool isCapabilityExpr(Sema &S, const Expr *Ex)
static void handleNoDebugAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleSuppressAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &Attrs)
static std::pair< Expr *, int > makeClusterDimsArgExpr(Sema &S, Expr *E, const CUDAClusterDimsAttr &AL, const unsigned Idx)
static void handleNoSanitizeMemoryAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static const AttrTy * findEnforceTCBAttrByName(Decl *D, StringRef Name)
static void handleNoEscapeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAvailableOnlyInDefaultEvalMethod(Sema &S, Decl *D, const ParsedAttr &AL)
static bool MustDelayAttributeArguments(const ParsedAttr &AL)
static void handleNoRandomizeLayoutAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleTargetVersionAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleWarnUnusedResult(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkRecordTypeForScopedCapability(Sema &S, QualType Ty)
static bool isIntOrBool(Expr *Exp)
Check if the passed-in expression is of type int or bool.
static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y, bool BeforeIsOkay)
Check whether the two versions match.
static bool isSanitizerAttributeAllowedOnGlobals(StringRef Sanitizer)
static void handleClusterDimsAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool handleFormatAttrCommon(Sema &S, Decl *D, const ParsedAttr &AL, FormatAttrCommon *Info)
Handle attribute((format(type,idx,firstarg))) attributes based on https://gcc.gnu....
static void handleCallConvAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleMinSizeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static ExprResult sharedGetConstructorDestructorAttrExpr(Sema &S, const ParsedAttr &AL)
static void handleOwnershipAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkTypedefTypeForCapability(QualType Ty)
static void handleAcquiredBeforeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReleaseCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool typeHasCapability(Sema &S, QualType Ty)
static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isFunctionLike(const Type &T)
static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleCFGuardAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleReentrantCapabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool threadSafetyCheckIsPointer(Sema &S, const Decl *D, const ParsedAttr &AL)
Check if passed in Decl is a pointer type.
static bool isForbiddenTypeAllowed(Sema &S, Decl *D, const DelayedDiagnostic &diag, UnavailableAttr::ImplicitReason &reason)
Is the given declaration allowed to use a forbidden type?
static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleModeAttr(Sema &S, Decl *D, const ParsedAttr &AL)
handleModeAttr - This attribute modifies the width of a decl with primitive type.
static bool checkAvailabilityAttr(Sema &S, SourceRange Range, const IdentifierInfo *Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted)
static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL)
static bool checkPositiveIntArgument(Sema &S, const AttrInfo &AI, const Expr *Expr, int &Val, unsigned Idx=UINT_MAX)
Wrapper around checkUInt32Argument, with an extra check to be sure that the result will fit into a re...
static void handleVecReturnAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static bool isGlobalVar(const Decl *D)
static void handleTLSModelAttr(Sema &S, Decl *D, const ParsedAttr &AL)
static void handleAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis functions specific to M68k.
This file declares semantic analysis functions specific to MIPS.
This file declares semantic analysis functions specific to MSP430.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis routines for OpenCL.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
This file declares semantic analysis functions specific to X86.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
SourceManager & getSourceManager()
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
DeclarationNameTable DeclarationNames
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
const TargetInfo * getAuxTargetInfo() const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const TargetInfo & getTargetInfo() const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents an access specifier followed by colon ':'.
Attr - This represents one attribute.
SourceLocation getScopeLoc() const
bool isMicrosoftAttribute() const
bool isClangScope() const
void setAttributeSpellingListIndex(unsigned V)
std::string getNormalizedFullName() const
Gets the normalized full name, which consists of both scope and name and with surrounding underscores...
bool isCXX11Attribute() const
bool isDeclspecAttribute() const
SourceRange getRange() const
bool isC23Attribute() const
unsigned getAttributeSpellingListIndex() const
const IdentifierInfo * getScopeName() const
bool isExplicitScope() const
StringRef getNormalizedAttrName(StringRef ScopeName) const
std::optional< StringRef > tryGetCorrectedAttrName(StringRef ScopeName, StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts) const
bool isGNUAttribute() const
bool isRegularKeywordAttribute() const
SourceRange getNormalizedRange() const
std::optional< StringRef > tryGetCorrectedScopeName(StringRef ScopeName) const
SourceLocation getLoc() const
const IdentifierInfo * getAttrName() const
StringRef getNormalizedScopeName() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
Kind getParsedKind() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
This class is used for builtin types like 'int'.
static bool isBuiltinFunc(llvm::StringRef Name)
Returns true if this is a libc/libm function without the '__builtin_' prefix.
Represents a static or instance method of a struct/union/class.
QualType getFunctionObjectParameterType() const
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
bool hasDefinition() const
MSInheritanceModel calculateInheritanceModel() const
Calculate what the inheritance model would be for this class.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The information about the darwin SDK that was used during this compilation.
const RelatedTargetVersionMapping * getVersionMapping(OSEnvPair Kind) const
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
A reference to a declared variable, function, enum, etc.
DeclarationNameInfo getNameInfo() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
ParsedAttributes & getAttributes()
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
ASTContext & getASTContext() const LLVM_READONLY
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool canBeWeakImported(bool &IsDefinition) const
Determines whether this symbol can be weak-imported, e.g., whether it would be well-formed to add the...
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
The name of a declaration.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
const ParsedAttributes & getAttributes() const
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
const ParsedAttributesView & getDeclarationAttributes() const
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
static bool isPotentialConstantExprUnevaluated(Expr *E, const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExprUnevaluated - Return true if this expression might be usable in a constant exp...
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
bool isConstexprSpecified() const
bool isExternC() const
Determines whether this function is a function with external, C linkage.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
A simple pair of identifier info and location.
SourceLocation getLoc() const
IdentifierInfo * getIdentifierInfo() const
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isCompatibleWithMSVC() const
bool isTargetDevice() const
True when compiling for an offloading target device.
void push_back(const T &LocalValue)
Represents the results of name lookup.
Describes a module or submodule.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
bool isExternallyVisible() const
A C++ nested-name-specifier augmented with source location information.
ObjCMethodDecl - Represents an instance or class method declaration.
Represents one property declaration in an Objective-C interface.
void * getAsOpaquePtr() const
static OpaquePtr getFromOpaquePtr(void *P)
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
bool isValid() const
Is this parameter index valid?
unsigned getSourceIndex() const
Get the parameter index as it would normally be encoded for attributes at the source level of represe...
unsigned getASTIndex() const
Get the parameter index as it would normally be encoded at the AST level of representation: zero-orig...
Represents a parameter to a function.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
ParsedAttr - Represents a syntactic attribute.
bool isPackExpansion() const
const AvailabilityChange & getAvailabilityDeprecated() const
unsigned getSemanticSpelling() const
If the parsed attribute has a semantic equivalent, and it would have a semantic Spelling enumeration ...
bool existsInTarget(const TargetInfo &Target) const
bool checkExactlyNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has exactly as many args as Num.
IdentifierLoc * getArgAsIdent(unsigned Arg) const
bool hasParsedType() const
const AvailabilityChange & getAvailabilityIntroduced() const
void setInvalid(bool b=true) const
bool hasVariadicArg() const
const ParsedAttrInfo & getInfo() const
void handleAttrWithDelayedArgs(Sema &S, Decl *D) const
const Expr * getReplacementExpr() const
bool hasProcessingCache() const
SourceLocation getUnavailableLoc() const
unsigned getProcessingCache() const
const IdentifierLoc * getEnvironment() const
bool acceptsExprPack() const
const Expr * getMessageExpr() const
const ParsedType & getMatchingCType() const
const ParsedType & getTypeArg() const
SourceLocation getStrictLoc() const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool isArgIdent(unsigned Arg) const
Expr * getArgAsExpr(unsigned Arg) const
bool getMustBeNull() const
bool checkAtLeastNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at least as many args as Num.
bool isUsedAsTypeAttr() const
unsigned getNumArgMembers() const
bool isPragmaClangAttribute() const
True if the attribute is specified using 'pragma clang attribute'.
bool slidesFromDeclToDeclSpecLegacyBehavior() const
Returns whether a [[]] attribute, if specified ahead of a declaration, should be applied to the decl-...
AttributeCommonInfo::Kind getKind() const
void setProcessingCache(unsigned value) const
bool isParamExpr(size_t N) const
bool isArgExpr(unsigned Arg) const
bool getLayoutCompatible() const
ArgsUnion getArg(unsigned Arg) const
getArg - Return the specified argument.
SourceLocation getEllipsisLoc() const
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
const AvailabilityChange & getAvailabilityObsoleted() const
void addAtEnd(ParsedAttr *newAttr)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
IdentifierTable & getIdentifierTable()
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
const Type * getTypePtrOrNull() const
Represents a struct/union/class.
field_iterator field_end() const
field_range fields() const
specific_decl_iterator< FieldDecl > field_iterator
RecordDecl * getDefinitionOrSelf() const
field_iterator field_begin() const
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
unsigned getFlags() const
getFlags - Return the flags for this scope.
@ FunctionDeclarationScope
This is a scope that corresponds to the parameters within a function prototype for a function declara...
void handleAMDGPUMaxNumWorkGroupsAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUFlatWorkGroupSizeAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumSGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUNumVGPRAttr(Decl *D, const ParsedAttr &AL)
void handleAMDGPUWavesPerEUAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptSaveFPAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleBuiltinAliasAttr(Decl *D, const ParsedAttr &AL)
void handleNewAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
bool SveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool MveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetClonesAttr(SmallVectorImpl< StringRef > &Params, SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams)
bool CdeAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
void handleSignalAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handlePreserveAIRecord(RecordDecl *RD)
void handlePreserveAccessIndexAttr(Decl *D, const ParsedAttr &AL)
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
SemaDiagnosticBuilder DiagIfHostCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as host cod...
void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL)
void handleVkLocationAttr(Decl *D, const ParsedAttr &AL)
void handleSemanticAttr(Decl *D, const ParsedAttr &AL)
void handleShaderAttr(Decl *D, const ParsedAttr &AL)
void handlePackOffsetAttr(Decl *D, const ParsedAttr &AL)
void handleParamModifierAttr(Decl *D, const ParsedAttr &AL)
void handleRootSignatureAttr(Decl *D, const ParsedAttr &AL)
void handleResourceBindingAttr(Decl *D, const ParsedAttr &AL)
void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL)
void handleVkExtBuiltinInputAttr(Decl *D, const ParsedAttr &AL)
void handleVkPushConstantAttr(Decl *D, const ParsedAttr &AL)
void handleVkBindingAttr(Decl *D, const ParsedAttr &AL)
void handleVkConstantIdAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
void handleRuntimeName(Decl *D, const ParsedAttr &AL)
void handleNSObject(Decl *D, const ParsedAttr &AL)
bool isValidOSObjectOutParameter(const Decl *D)
void handleNSErrorDomain(Decl *D, const ParsedAttr &Attr)
void handleXReturnsXRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleExternallyRetainedAttr(Decl *D, const ParsedAttr &AL)
void handleMethodFamilyAttr(Decl *D, const ParsedAttr &AL)
void handleIndependentClass(Decl *D, const ParsedAttr &AL)
void handleIBOutlet(Decl *D, const ParsedAttr &AL)
void handleReturnsInnerPointerAttr(Decl *D, const ParsedAttr &Attrs)
void handleSuppresProtocolAttr(Decl *D, const ParsedAttr &AL)
void handleOwnershipAttr(Decl *D, const ParsedAttr &AL)
void handleBlocksAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeMutableAttr(Decl *D, const ParsedAttr &AL)
Sema::RetainOwnershipKind parsedAttrToRetainOwnershipKind(const ParsedAttr &AL)
void handleRequiresSuperAttr(Decl *D, const ParsedAttr &Attrs)
void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI, Sema::RetainOwnershipKind K, bool IsTemplateInstantiation)
void handleDesignatedInitializer(Decl *D, const ParsedAttr &AL)
void handleBridgeRelatedAttr(Decl *D, const ParsedAttr &AL)
void handleIBOutletCollection(Decl *D, const ParsedAttr &AL)
bool isCFStringType(QualType T)
void handleDirectAttr(Decl *D, const ParsedAttr &AL)
bool isNSStringType(QualType T, bool AllowNSAttributedString=false)
void handleBoxable(Decl *D, const ParsedAttr &AL)
void handleDirectMembersAttr(Decl *D, const ParsedAttr &AL)
void handleBridgeAttr(Decl *D, const ParsedAttr &AL)
void handlePreciseLifetimeAttr(Decl *D, const ParsedAttr &AL)
void handleSubGroupSize(Decl *D, const ParsedAttr &AL)
void handleNoSVMAttr(Decl *D, const ParsedAttr &AL)
void handleAccessAttr(Decl *D, const ParsedAttr &AL)
void handleOMPAssumeAttr(Decl *D, const ParsedAttr &AL)
bool 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.
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...
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
DiagnosticsEngine & getDiagnostics() const
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
ASTContext & getASTContext() const
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
void ProcessPragmaWeak(Scope *S, Decl *D)
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI)
Add a no_cluster attribute to a particular declaration.
FPOptions & getCurFPFeatures()
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Expression
An arbitrary expression.
const LangOptions & getLangOpts() const
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
const LangOptions & LangOpts
static const uint64_t MaximumAlignment
CUDAClusterDimsAttr * createClusterDimsAttr(const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
Add a cluster_dims attribute to a particular declaration.
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes, bool OrNull)
Check if applying the specified attribute variant from the "counted by" family of attributes to Field...
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val, unsigned Idx=UINT_MAX, bool StrictlyUnsigned=false)
If Expr is a valid integer constant, get the value of the integer expression and return success or fa...
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnInitPriorityAttr(Decl *D, const Attr *A)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
NamedDecl * DeclClonePragmaWeak(NamedDecl *ND, const IdentifierInfo *II, SourceLocation Loc)
DeclClonePragmaWeak - clone existing decl (maybe definition), #pragma weak needs a non-definition dec...
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
void ActOnCleanupAttr(Decl *D, const Attr *A)
static FormatStringType GetFormatStringType(StringRef FormatFlavor)
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
bool ValidateFormatString(FormatStringType FST, const StringLiteral *Str)
Verify that one format string (as understood by attribute(format)) is self-consistent; for instance,...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc, StringRef Platform)
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
Create an CUDALaunchBoundsAttr attribute.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
LifetimeCaptureByAttr * ParseLifetimeCaptureByAttr(const ParsedAttr &AL, StringRef ParamName)
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
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)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
bool isBeingDefined() const
Return true if this decl is currently being defined.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
bool isTLSSupported() const
Whether the target supports thread-local storage.
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this target.
virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const
virtual bool hasProtectedVisibility() const
Does this target support "protected" visibility?
virtual unsigned getUnwindWordWidth() const
unsigned getCharWidth() const
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
const llvm::VersionTuple & getSDKVersion() const
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Base wrapper for a particular "section" of type source info.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
bool isBlockPointerType() const
bool isBooleanType() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isVectorType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isFloatingType() const
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
Base class for declarations which introduce a typedef-name.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
@ TLS_None
Not a TLS variable.
Represents a GCC generic vector type.
Captures information about a #pragma weak directive.
const IdentifierInfo * getAlias() const
SourceLocation getLocation() const
A collection of diagnostics which were delayed.
const DelayedDiagnosticPool * getParent() const
void steal(DelayedDiagnosticPool &pool)
Steal the diagnostics from the given pool.
pool_iterator pool_end() const
SmallVectorImpl< DelayedDiagnostic >::const_iterator pool_iterator
pool_iterator pool_begin() const
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
QualType getForbiddenTypeOperand() const
unsigned getForbiddenTypeDiagnostic() const
The diagnostic ID to emit.
unsigned getForbiddenTypeArgument() const
Defines the clang::TargetInfo interface.
Enums for the diagnostics of target, target_version and target_clones.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
bool isa(CodeGen::Address addr)
@ ExpectedFunctionMethodOrBlock
@ ExpectedTypeOrNamespace
@ ExpectedVariableFieldOrTag
@ ExpectedVariableOrField
@ ExpectedFunctionOrMethod
@ ExpectedFunctionOrClassOrEnum
@ ExpectedVariableOrFunction
@ ExpectedFunctionVariableOrClass
@ ExpectedNonMemberFunction
void handleSimpleAttributeOrDiagnose(SemaBase &S, Decl *D, const AttributeCommonInfo &CI, bool PassesCheck, unsigned DiagID, DiagnosticArgs &&...ExtraArgs)
Add an attribute AttrType to declaration D, provided that PassesCheck is true.
bool hasDeclarator(const Decl *D)
Return true if the given decl has a declarator that should have been processed by Sema::GetTypeForDec...
QualType getFunctionOrMethodResultType(const Decl *D)
@ OK_Ordinary
An ordinary object is located at an address in memory.
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
CudaVersion ToCudaVersion(llvm::VersionTuple)
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool checkAttrMutualExclusion(SemaBase &S, Decl *D, const ParsedAttr &AL)
Diagnose mutually exclusive attributes when present on a given declaration.
void inferNoReturnAttr(Sema &S, Decl *D)
SourceRange getFunctionOrMethodResultSourceRange(const Decl *D)
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
QualType getFunctionOrMethodParamType(const Decl *D, unsigned Idx)
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Language
The language for the input, used to select and validate the language standard and possible actions.
AttributeArgumentNType
These constants match the enumerated choices of err_attribute_argument_n_type and err_attribute_argum...
@ AANT_ArgumentIntegerConstant
@ AANT_ArgumentBuiltinFunction
@ AANT_ArgumentIdentifier
@ SD_Automatic
Automatic storage duration (most local variables).
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
bool isFunctionOrMethodVariadic(const Decl *D)
@ Template
We are parsing a template declaration.
bool isFuncOrMethodForAttrSubject(const Decl *D)
isFuncOrMethodForAttrSubject - Return true if the given decl has function type (function or function-...
OffloadArch StringToOffloadArch(llvm::StringRef S)
LLVM_READONLY bool isHexDigit(unsigned char c)
Return true if this character is an ASCII hex digit: [0-9a-fA-F].
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const char * OffloadArchToString(OffloadArch A)
void handleSimpleAttribute(SemaBase &S, Decl *D, const AttributeCommonInfo &CI)
Applies the given attribute to the Decl without performing any additional semantic checking.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool hasImplicitObjectParameter(const Decl *D)
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Generic
not a target-specific vector type
U cast(CodeGen::Address addr)
SourceRange getFunctionOrMethodParamRange(const Decl *D, unsigned Idx)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
Represents information about a change in availability for an entity, which is part of the encoding of...
VersionTuple Version
The version number at which the change occurred.
bool isValid() const
Determine whether this availability change is valid.
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