62#include "llvm/ADT/APSInt.h"
63#include "llvm/ADT/STLExtras.h"
64#include "llvm/ADT/StringExtras.h"
65#include "llvm/Demangle/Demangle.h"
66#include "llvm/IR/DerivedTypes.h"
67#include "llvm/MC/MCSectionMachO.h"
68#include "llvm/Support/Error.h"
69#include "llvm/Support/ErrorHandling.h"
70#include "llvm/Support/MathExtras.h"
71#include "llvm/Support/raw_ostream.h"
72#include "llvm/TargetParser/Triple.h"
98template <
typename AttrInfo>
100 int &Val,
unsigned Idx =
UINT_MAX) {
105 if (UVal > (uint32_t)std::numeric_limits<int>::max()) {
109 <<
toString(I, 10,
false) << 32 << 0;
118 const Expr *E, StringRef &Str,
124 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
130 Str = Literal->getString();
140 Diag(Loc->
getLoc(), diag::err_attribute_argument_type)
146 *ArgLocation = Loc->
getLoc();
156 if (!Literal || (!Literal->isUnevaluated() && !Literal->isOrdinary())) {
161 Str = Literal->getString();
179 return !Result.empty();
182 bool foundStarOperator = IsOverloadedOperatorPresent(
Record, OO_Star);
183 bool foundArrowOperator = IsOverloadedOperatorPresent(
Record, OO_Arrow);
184 if (foundStarOperator && foundArrowOperator)
191 for (
const auto &BaseSpecifier : CXXRecord->bases()) {
192 if (!foundStarOperator)
193 foundStarOperator = IsOverloadedOperatorPresent(
194 BaseSpecifier.getType()->getAsRecordDecl(), OO_Star);
195 if (!foundArrowOperator)
196 foundArrowOperator = IsOverloadedOperatorPresent(
197 BaseSpecifier.getType()->getAsRecordDecl(), OO_Arrow);
200 if (foundStarOperator && foundArrowOperator)
220 if (!RD->isCompleteDefinition())
227 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_pointer) << AL << QT;
239 return PT->getPointeeType()->getAsRecordDecl();
244template <
typename AttrType>
251 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(RD)) {
253 return !Base->hasAttr<AttrType>();
267 if (!RD->isCompleteDefinition())
285 if (!RD->isCompleteDefinition())
300 return TN->
hasAttr<CapabilityAttr>();
319 if (
const auto *E = dyn_cast<CastExpr>(Ex))
321 else if (
const auto *E = dyn_cast<ParenExpr>(Ex))
323 else if (
const auto *E = dyn_cast<UnaryOperator>(Ex)) {
324 if (E->getOpcode() == UO_LNot || E->getOpcode() == UO_AddrOf ||
325 E->getOpcode() == UO_Deref)
328 }
else if (
const auto *E = dyn_cast<BinaryOperator>(Ex)) {
329 if (E->getOpcode() == BO_LAnd || E->getOpcode() == BO_LOr)
347 bool ParamIdxOk =
false) {
352 const auto *MD = dyn_cast<const CXXMethodDecl>(D);
353 if (MD && !MD->isStatic()) {
359 diag::warn_thread_attribute_not_on_capability_member)
360 << AL << MD->getParent();
362 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_non_static_member)
367 for (
unsigned Idx = Sidx; Idx < AL.
getNumArgs(); ++Idx) {
372 Args.push_back(ArgExp);
376 if (
const auto *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
377 if (StrLit->getLength() == 0 ||
378 (StrLit->isOrdinary() && StrLit->getString() ==
"*")) {
381 Args.push_back(ArgExp);
387 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_ignored) << AL;
388 Args.push_back(ArgExp);
396 if (
const auto *UOp = dyn_cast<UnaryOperator>(ArgExp))
397 if (UOp->getOpcode() == UO_AddrOf)
398 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
399 if (DRE->getDecl()->isCXXInstanceMember())
400 ArgTy = DRE->getDecl()->getType();
406 if (!RD && ParamIdxOk) {
407 const auto *FD = dyn_cast<FunctionDecl>(D);
408 const auto *IL = dyn_cast<IntegerLiteral>(ArgExp);
410 unsigned int NumParams = FD->getNumParams();
411 llvm::APInt ArgValue = IL->getValue();
412 uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
413 uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
414 if (!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
416 diag::err_attribute_argument_out_of_bounds_extra_info)
417 << AL << Idx + 1 << NumParams;
420 ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
429 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_argument_not_lockable)
432 Args.push_back(ArgExp);
444 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_not_on_scoped_lockable_param)
465 unsigned Size = Args.size();
501 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_decl_not_lockable) << AL;
518 Expr **StartArg = &Args[0];
520 AcquiredAfterAttr(S.
Context, AL, StartArg, Args.size()));
528 Expr **StartArg = &Args[0];
530 AcquiredBeforeAttr(S.
Context, AL, StartArg, Args.size()));
547template <
typename AttrInfo>
549 unsigned AttrArgNo) {
550 assert(AI.isArgExpr(AttrArgNo) &&
"Expected expression argument");
551 Expr *AttrArg = AI.getArgAsExpr(AttrArgNo);
560 S.
Diag(SrcLoc, diag::err_attribute_integers_only)
575 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only) << AL;
586 ParamIdx SizeArgNo(SizeArgNoVal, D);
601 AllocSizeAttr(S.
Context, AL, SizeArgNo, NumberArgNo));
610 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
625 unsigned Size = Args.size();
633 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
643 unsigned Size = Args.size();
646 Expr **StartArg = &Args[0];
649 LocksExcludedAttr(S.
Context, AL, StartArg, Size));
655 if (!
Cond->isTypeDependent()) {
666 Msg =
"<no message provided>";
672 S.
Diag(AL.
getLoc(), diag::err_attr_cond_never_constant_expr) << AL;
674 S.
Diag(PDiag.first, PDiag.second);
681 S.
Diag(AL.
getLoc(), diag::ext_clang_enable_if);
690 StringRef NewUserDiagnostic;
702 if (
const auto *RD = dyn_cast<CXXRecordDecl>(PD); RD && RD->isLocalClass()) {
704 diag::warn_attribute_exclude_from_explicit_instantiation_local_class)
709 ExcludeFromExplicitInstantiationAttr(S.
Context, AL));
717 const CXXRecordDecl *ClassType;
719 llvm::SmallPtrSet<const ParmVarDecl *, 16> Parms;
723 ArgumentDependenceChecker(
const FunctionDecl *FD) {
725 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
733 bool referencesArgs(Expr *E) {
739 bool VisitCXXThisExpr(CXXThisExpr *E)
override {
741 "`this` doesn't refer to the enclosing class?");
746 bool VisitDeclRefExpr(DeclRefExpr *DRE)
override {
747 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DRE->
getDecl()))
748 if (Parms.count(PVD)) {
761 if (
const auto *MethodDecl = dyn_cast<CXXMethodDecl>(DeclFD))
762 if (!MethodDecl->isStatic()) {
763 S.
Diag(AL.
getLoc(), diag::err_attribute_no_member_function) << AL;
770 if (
auto *E = dyn_cast<Expr *>(
Union))
771 return E->getBeginLoc();
775 S.
Diag(Loc, diag::err_attribute_argument_n_type) << AL << Index <<
T;
781 auto *F = dyn_cast_if_present<DeclRefExpr>(AL.
getArgAsExpr(0));
784 return dyn_cast_if_present<FunctionDecl>(F->getFoundDecl());
793 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments_for)
800 for (
unsigned I = 1; I < AL.
getNumArgs(); ++I) {
812 if (Index > DeclFD->getNumParams()) {
813 S.
Diag(AL.
getLoc(), diag::err_attribute_bounds_for_function)
814 << AL << Index << DeclFD << DeclFD->getNumParams();
819 QualType T2 = DeclFD->getParamDecl(Index - 1)->getType();
824 << AL << Index << DeclFD << T2 << I << AttrFD << T1;
828 Indices.push_back(Index - 1);
832 S.
Context, AL, AttrFD, Indices.data(), Indices.size()));
836 S.
Diag(AL.
getLoc(), diag::ext_clang_diagnose_if);
843 StringRef DefaultSevStr;
847 DiagnoseIfAttr::DefaultSeverity DefaultSev;
848 if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
850 diag::err_diagnose_if_invalid_diagnostic_type);
854 StringRef WarningGroup;
858 if (WarningGroup.empty() ||
862 diag::err_diagnose_if_unknown_warning)
868 bool ArgDependent =
false;
869 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
870 ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(
Cond);
872 S.
Context, AL,
Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
882 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
892 static constexpr const StringRef kWildcard =
"*";
895 bool HasWildcard =
false;
897 const auto AddBuiltinName = [&Names, &HasWildcard](StringRef Name) {
898 if (Name == kWildcard)
900 Names.push_back(Name);
904 if (
const auto *NBA = D->
getAttr<NoBuiltinAttr>())
905 for (StringRef BuiltinName : NBA->builtinNames())
906 AddBuiltinName(BuiltinName);
910 AddBuiltinName(kWildcard);
912 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
913 StringRef BuiltinName;
919 AddBuiltinName(BuiltinName);
921 S.
Diag(LiteralLoc, diag::warn_attribute_no_builtin_invalid_builtin_name)
922 << BuiltinName << AL;
927 Names.erase(llvm::unique(Names), Names.end());
930 if (HasWildcard && Names.size() > 1)
932 diag::err_attribute_no_builtin_wildcard_or_builtin_name)
935 if (D->
hasAttr<NoBuiltinAttr>())
938 NoBuiltinAttr(S.
Context, AL, Names.data(), Names.size()));
942 if (D->
hasAttr<PassObjectSizeAttr>()) {
943 S.
Diag(D->
getBeginLoc(), diag::err_attribute_only_once_per_parameter) << AL;
966 S.
Diag(D->
getBeginLoc(), diag::err_attribute_pointers_only) << AL << 1;
974 ConsumableAttr::ConsumedState DefaultState;
978 if (!ConsumableAttr::ConvertStrToConsumedState(
980 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
985 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
998 if (!RD->hasAttr<ConsumableAttr>()) {
999 S.
Diag(AL.
getLoc(), diag::warn_attr_on_unconsumable_class) << RD;
1016 for (
unsigned ArgIndex = 0; ArgIndex < AL.
getNumArgs(); ++ArgIndex) {
1017 CallableWhenAttr::ConsumedState CallableState;
1019 StringRef StateString;
1030 if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
1032 S.
Diag(Loc, diag::warn_attribute_type_not_supported) << AL << StateString;
1036 States.push_back(CallableState);
1040 CallableWhenAttr(S.
Context, AL, States.data(), States.size()));
1044 ParamTypestateAttr::ConsumedState ParamState;
1050 if (!ParamTypestateAttr::ConvertStrToConsumedState(StateString,
1052 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1053 << AL << StateString;
1057 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1078 ReturnTypestateAttr::ConsumedState ReturnState;
1082 if (!ReturnTypestateAttr::ConvertStrToConsumedState(
1084 S.
Diag(IL->
getLoc(), diag::warn_attribute_type_not_supported)
1089 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1126 SetTypestateAttr::ConsumedState NewState;
1130 if (!SetTypestateAttr::ConvertStrToConsumedState(Param, NewState)) {
1131 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1136 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1148 TestTypestateAttr::ConsumedState TestState;
1152 if (!TestTypestateAttr::ConvertStrToConsumedState(Param, TestState)) {
1153 S.
Diag(Ident->
getLoc(), diag::warn_attribute_type_not_supported)
1158 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1173 if (
auto *TD = dyn_cast<TagDecl>(D))
1175 else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
1176 bool BitfieldByteAligned = (!FD->
getType()->isDependentType() &&
1182 if (BitfieldByteAligned)
1184 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_for_field_of_type)
1190 if (BitfieldByteAligned)
1191 S.
Diag(AL.
getLoc(), diag::warn_attribute_packed_for_bitfield);
1197 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
1203 assert(CTD &&
"attribute does not appertain to this declaration");
1211 if (!
T.hasQualifiers() &&
T->isTypedefNameType()) {
1214 if (
const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>(
1215 T->getAsCXXRecordDecl())) {
1216 Template = CTSD->getSpecializedTemplate();
1217 }
else if (
const auto *TST =
T->getAs<TemplateSpecializationType>()) {
1218 while (TST && TST->isTypeAlias())
1219 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1221 Template = TST->getTemplateName().getAsTemplateDecl();
1230 S.
Diag(AL.
getLoc(), diag::err_attribute_not_typedef_for_specialization)
1233 S.
Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at)
1242 NoSpecializationsAttr::Create(S.
Context, Message, AL));
1246 if (
T->isDependentType())
1249 if (
T->isReferenceType())
1252 T =
T.getNonReferenceType();
1257 if (
const RecordType *UT =
T->getAsUnionType()) {
1259 if (UD->
hasAttr<TransparentUnionAttr>()) {
1260 for (
const auto *I : UD->
fields()) {
1268 return T->isAnyPointerType() ||
T->isBlockPointerType();
1274 bool isReturnValue =
false) {
1277 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1278 << AL << AttrParmRange << TypeRange;
1280 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1281 << AL << AttrParmRange << TypeRange << 0;
1289 for (
unsigned I = 0; I < AL.
getNumArgs(); ++I) {
1293 D, AL, I + 1, Ex, Idx,
1306 NonNullArgs.push_back(Idx);
1317 I != E && !AnyPointers; ++I) {
1324 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_no_pointers);
1327 ParamIdx *Start = NonNullArgs.data();
1328 unsigned Size = NonNullArgs.size();
1329 llvm::array_pod_sort(Start, Start + Size);
1339 S.
Diag(AL.
getLoc(), diag::warn_attribute_nonnull_parm_no_args)
1370 S.
Diag(AL.
getLoc(), diag::warn_attribute_pointers_only)
1395 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1401 std::optional<llvm::APSInt> I = llvm::APSInt(64);
1404 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1407 Diag(AttrLoc, diag::err_attribute_argument_type)
1412 if (!I->isPowerOf2()) {
1413 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
1419 Diag(CI.
getLoc(), diag::warn_assume_aligned_too_great)
1424 Diag(AttrLoc, diag::err_attribute_argument_n_type)
1438 Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only)
1453 << CI << FuncDecl->getParamDecl(Idx.
getASTIndex())->getSourceRange();
1463 if (AttrName.size() > 4 && AttrName.starts_with(
"__") &&
1464 AttrName.ends_with(
"__")) {
1465 AttrName = AttrName.drop_front(2).drop_back(2);
1481 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1487 OwnershipAttr::OwnershipKind K =
1488 OwnershipAttr(S.
Context, AL,
nullptr,
nullptr, 0).getOwnKind();
1492 case OwnershipAttr::Takes:
1493 case OwnershipAttr::Holds:
1495 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL << 2;
1499 case OwnershipAttr::Returns:
1501 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 2;
1509 if (K == OwnershipAttr::Returns &&
1511 S.
Diag(AL.
getLoc(), diag::err_ownership_takes_return_type) << AL;
1517 StringRef ModuleName =
Module->getName();
1523 for (
unsigned i = 1; i < AL.
getNumArgs(); ++i) {
1533 case OwnershipAttr::Takes:
1534 case OwnershipAttr::Holds:
1535 if (!
T->isAnyPointerType() && !
T->isBlockPointerType())
1538 case OwnershipAttr::Returns:
1539 if (!
T->isIntegerType())
1544 S.
Diag(AL.
getLoc(), diag::err_ownership_type) << AL << Err
1553 if (I->getOwnKind() != K && llvm::is_contained(I->args(), Idx)) {
1554 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1557 I->isRegularKeywordAttribute());
1559 }
else if (K == OwnershipAttr::Returns &&
1560 I->getOwnKind() == OwnershipAttr::Returns) {
1563 if (!llvm::is_contained(I->args(), Idx)) {
1564 S.
Diag(I->getLocation(), diag::err_ownership_returns_index_mismatch)
1565 << I->args_begin()->getSourceIndex();
1567 S.
Diag(AL.
getLoc(), diag::note_ownership_returns_index_mismatch)
1571 }
else if (K == OwnershipAttr::Takes &&
1572 I->getOwnKind() == OwnershipAttr::Takes) {
1573 if (I->getModule()->getName() != ModuleName) {
1574 S.
Diag(I->getLocation(), diag::err_ownership_takes_class_mismatch)
1575 << I->getModule()->getName();
1576 S.
Diag(AL.
getLoc(), diag::note_ownership_takes_class_mismatch)
1583 OwnershipArgs.push_back(Idx);
1586 ParamIdx *Start = OwnershipArgs.data();
1587 unsigned Size = OwnershipArgs.size();
1588 llvm::array_pod_sort(Start, Start + Size);
1596 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
1612 S.
Diag(AL.
getLoc(), diag::err_attribute_weakref_not_global_context)
1657 std::unique_ptr<char, llvm::FreeDeleter> Demangled;
1659 Demangled.reset(llvm::itaniumDemangle(Str,
false));
1670 if (MC->shouldMangleDeclName(ND)) {
1671 llvm::raw_svector_ostream Out(Name);
1675 Name = ND->getIdentifier()->getName();
1691 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 1;
1705 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_darwin);
1713 S.
Diag(AL.
getLoc(), diag::err_alias_not_supported_on_nvptx);
1717 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
1719 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << FD << 0;
1724 if (VD->isThisDeclarationADefinition() && VD->isExternallyVisible()) {
1725 S.
Diag(AL.
getLoc(), diag::err_alias_is_definition) << VD << 0;
1742 if (Model !=
"global-dynamic" && Model !=
"local-dynamic"
1743 && Model !=
"initial-exec" && Model !=
"local-exec") {
1744 S.
Diag(LiteralLoc, diag::err_attr_tlsmodel_arg);
1754 S.
Diag(AL.
getLoc(), diag::warn_attribute_return_pointers_only)
1766 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 0;
1776 if (
auto *DRE = dyn_cast<DeclRefExpr>(DeallocE)) {
1777 DeallocFD = dyn_cast<FunctionDecl>(DRE->
getDecl());
1780 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1784 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(DeallocE)) {
1786 DeallocNI = ULE->getNameInfo();
1788 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function)
1795 S.
Diag(DeallocLoc, diag::err_attribute_malloc_arg_not_function) << 0;
1803 DeallocPtrIdx =
ParamIdx(1, DeallocFD);
1814 diag::err_attribute_malloc_arg_not_function_with_pointer_arg)
1828 diag::err_attribute_malloc_arg_refers_to_non_pointer_type)
1837 S.
Diag(AL.
getLoc(), diag::warn_attribute_form_ignored) << AL;
1839 RestrictAttr(S.
Context, AL, DeallocE, DeallocPtrIdx));
1848 auto emitWarning = [
this, &CI](
unsigned NoteDiagID) {
1849 Diag(CI.
getLoc(), diag::warn_attribute_return_span_only) << CI;
1856 return emitWarning(diag::note_returned_incomplete_type);
1859 return emitWarning(diag::note_returned_not_struct);
1860 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1861 if (CXXRD->getNumBases() > 0) {
1862 return emitWarning(diag::note_type_inherits_from_base);
1866 auto FieldsCount = std::distance(FieldsBegin, RD->
field_end());
1867 if (FieldsCount != 2)
1868 return emitWarning(diag::note_returned_not_two_field_struct) << FieldsCount;
1869 QualType FirstFieldType = FieldsBegin->getType();
1870 QualType SecondFieldType = std::next(FieldsBegin)->getType();
1871 auto validatePointerType = [](
const QualType &
T) {
1873 return T->isPointerType() && !
T->isFunctionPointerType();
1875 auto checkIntegerType = [
this, emitWarning](
const QualType &
T,
1876 const int FieldNo) ->
bool {
1877 const auto *BT = dyn_cast<BuiltinType>(
T.getCanonicalType());
1878 if (!BT || !BT->isInteger())
1879 return emitWarning(diag::note_returned_not_integer_field) << FieldNo;
1881 if (
Context.getTypeSize(BT) < IntSize)
1882 return emitWarning(diag::note_returned_not_wide_enough_field)
1883 << FieldNo << IntSize;
1886 if (validatePointerType(FirstFieldType) &&
1887 validatePointerType(SecondFieldType)) {
1890 }
else if (validatePointerType(FirstFieldType)) {
1892 return checkIntegerType(SecondFieldType, 2);
1893 }
else if (validatePointerType(SecondFieldType)) {
1895 return checkIntegerType(FirstFieldType, 1);
1897 return emitWarning(diag::note_returned_not_span_struct);
1913 if (
const auto *
Other = D->
getAttr<CPUDispatchAttr>()) {
1914 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1915 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1918 }
else if (AL.
getParsedKind() == ParsedAttr::AT_CPUSpecific) {
1922 if (
const auto *
Other = D->
getAttr<CPUSpecificAttr>()) {
1923 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
1924 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
1931 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
1932 if (MD->getParent()->isLambda()) {
1933 S.
Diag(AL.
getLoc(), diag::err_attribute_dll_lambda) << AL;
1944 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
1953 S.
Diag(CPUArg->
getLoc(), diag::err_invalid_cpu_specific_dispatch_value)
1954 << CPUName << (AL.
getKind() == ParsedAttr::AT_CPUDispatch);
1960 return Target.CPUSpecificManglingCharacter(CPUName) ==
1963 S.
Diag(AL.
getLoc(), diag::warn_multiversion_duplicate_entries);
1970 if (AL.
getKind() == ParsedAttr::AT_CPUSpecific)
1972 CPUSpecificAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1975 CPUDispatchAttr(S.
Context, AL, CPUs.data(), CPUs.size()));
1980 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
1991 const auto &
Arch = Triple.getArch();
1992 if (
Arch != llvm::Triple::x86 &&
1993 (
Arch != llvm::Triple::arm &&
Arch != llvm::Triple::thumb)) {
1994 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_on_arch)
1995 << AL << Triple.getArchName();
2002 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
2019 const Stmt *OnlyStmt =
nullptr;
2021 if (
const auto *Compound = dyn_cast<CompoundStmt>(Body)) {
2022 if (Compound->size() != 1)
2024 OnlyStmt = *Compound->body_begin();
2030 if (
const auto *EWC = dyn_cast<ExprWithCleanups>(OnlyStmt)) {
2031 OnlyStmt = EWC->getSubExpr();
2035 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2036 if (MD && MD->isVirtual()) {
2037 const auto *RD = MD->getParent();
2038 return MD->hasAttr<FinalAttr>() || (RD && RD->isEffectivelyFinal());
2046 auto *FD = dyn_cast<FunctionDecl>(D);
2067 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
2081 S.
Diag(Attrs.
getLoc(), diag::warn_attribute_wrong_decl_type)
2107 S.
Diag(Attrs.
getLoc(), diag::warn_nocf_check_attribute_ignored);
2125 Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
2144 ? diag::err_attribute_wrong_decl_type
2145 : diag::warn_attribute_wrong_decl_type)
2181 if (VecReturnAttr *A = D->
getAttr<VecReturnAttr>()) {
2182 S.
Diag(AL.
getLoc(), diag::err_repeat_attribute) << A;
2190 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2195 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_pod_record);
2199 for (
const auto *I : R->fields()) {
2200 if ((count == 1) || !I->getType()->isVectorType()) {
2201 S.
Diag(AL.
getLoc(), diag::err_attribute_vecreturn_only_vector_member);
2217 diag::err_carries_dependency_param_not_function_decl);
2231 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
2246 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
2256 APValue(llvm::APSInt::getUnsigned(priority)));
2264 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
2283template <
typename AttrTy>
2295 VersionTuple Introduced,
2296 VersionTuple Deprecated,
2297 VersionTuple Obsoleted) {
2298 StringRef PlatformName
2299 = AvailabilityAttr::getPrettyPlatformName(Platform->
getName());
2300 if (PlatformName.empty())
2301 PlatformName = Platform->
getName();
2305 if (!Introduced.empty() && !Deprecated.empty() &&
2306 !(Introduced <= Deprecated)) {
2307 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2308 << 1 << PlatformName << Deprecated.getAsString()
2309 << 0 << Introduced.getAsString();
2313 if (!Introduced.empty() && !Obsoleted.empty() &&
2314 !(Introduced <= Obsoleted)) {
2315 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2316 << 2 << PlatformName << Obsoleted.getAsString()
2317 << 0 << Introduced.getAsString();
2321 if (!Deprecated.empty() && !Obsoleted.empty() &&
2322 !(Deprecated <= Obsoleted)) {
2323 S.
Diag(Range.getBegin(), diag::warn_availability_version_ordering)
2324 << 2 << PlatformName << Obsoleted.getAsString()
2325 << 1 << Deprecated.getAsString();
2337 bool BeforeIsOkay) {
2338 if (
X.empty() || Y.empty())
2344 if (BeforeIsOkay &&
X < Y)
2352 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
2353 VersionTuple Obsoleted,
bool IsUnavailable, StringRef Message,
2356 VersionTuple MergedIntroduced = Introduced;
2357 VersionTuple MergedDeprecated = Deprecated;
2358 VersionTuple MergedObsoleted = Obsoleted;
2359 bool FoundAny =
false;
2360 bool OverrideOrImpl =
false;
2364 OverrideOrImpl =
false;
2370 OverrideOrImpl =
true;
2376 for (
unsigned i = 0, e = Attrs.size(); i != e;) {
2377 const auto *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
2384 if (OldPlatform != Platform) {
2390 if (OldEnvironment != Environment) {
2398 if (OldAA->getPriority() < Priority)
2404 if (OldAA->getPriority() > Priority) {
2405 Attrs.erase(Attrs.begin() + i);
2411 VersionTuple OldIntroduced = OldAA->getIntroduced();
2412 VersionTuple OldDeprecated = OldAA->getDeprecated();
2413 VersionTuple OldObsoleted = OldAA->getObsoleted();
2414 bool OldIsUnavailable = OldAA->getUnavailable();
2416 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl) ||
2417 !
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl) ||
2419 !(OldIsUnavailable == IsUnavailable ||
2420 (OverrideOrImpl && !OldIsUnavailable && IsUnavailable))) {
2421 if (OverrideOrImpl) {
2423 VersionTuple FirstVersion;
2424 VersionTuple SecondVersion;
2425 if (!
versionsMatch(OldIntroduced, Introduced, OverrideOrImpl)) {
2427 FirstVersion = OldIntroduced;
2428 SecondVersion = Introduced;
2429 }
else if (!
versionsMatch(Deprecated, OldDeprecated, OverrideOrImpl)) {
2431 FirstVersion = Deprecated;
2432 SecondVersion = OldDeprecated;
2433 }
else if (!
versionsMatch(Obsoleted, OldObsoleted, OverrideOrImpl)) {
2435 FirstVersion = Obsoleted;
2436 SecondVersion = OldObsoleted;
2440 Diag(OldAA->getLocation(),
2441 diag::warn_mismatched_availability_override_unavail)
2442 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2454 Diag(OldAA->getLocation(),
2455 diag::warn_mismatched_availability_override)
2457 << AvailabilityAttr::getPrettyPlatformName(Platform->
getName())
2458 << FirstVersion.getAsString() << SecondVersion.getAsString()
2462 Diag(CI.
getLoc(), diag::note_overridden_method);
2464 Diag(CI.
getLoc(), diag::note_protocol_method);
2466 Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
2467 Diag(CI.
getLoc(), diag::note_previous_attribute);
2470 Attrs.erase(Attrs.begin() + i);
2475 VersionTuple MergedIntroduced2 = MergedIntroduced;
2476 VersionTuple MergedDeprecated2 = MergedDeprecated;
2477 VersionTuple MergedObsoleted2 = MergedObsoleted;
2479 if (MergedIntroduced2.empty())
2480 MergedIntroduced2 = OldIntroduced;
2481 if (MergedDeprecated2.empty())
2482 MergedDeprecated2 = OldDeprecated;
2483 if (MergedObsoleted2.empty())
2484 MergedObsoleted2 = OldObsoleted;
2487 MergedIntroduced2, MergedDeprecated2,
2488 MergedObsoleted2)) {
2489 Attrs.erase(Attrs.begin() + i);
2494 MergedIntroduced = MergedIntroduced2;
2495 MergedDeprecated = MergedDeprecated2;
2496 MergedObsoleted = MergedObsoleted2;
2502 MergedIntroduced == Introduced &&
2503 MergedDeprecated == Deprecated &&
2504 MergedObsoleted == Obsoleted)
2510 MergedDeprecated, MergedObsoleted) &&
2512 auto *Avail = ::new (
Context) AvailabilityAttr(
2513 Context, CI, Platform, Introduced, Deprecated, Obsoleted, IsUnavailable,
2514 Message, IsStrict, Replacement, Priority, Environment);
2525 bool &IsUnavailable,
2526 VersionTuple &Introduced,
2527 VersionTuple &Deprecated,
2528 VersionTuple &Obsolete,
Sema &S) {
2531 if (TT.getOS() != llvm::Triple::XROS)
2535 NewII = &Context.Idents.get(
"xros");
2536 else if (II->
getName() ==
"ios_app_extension")
2537 NewII = &Context.Idents.get(
"xros_app_extension");
2542 auto MakeUnavailable = [&]() {
2543 IsUnavailable =
true;
2545 Introduced = VersionTuple();
2546 Deprecated = VersionTuple();
2547 Obsolete = VersionTuple();
2560 llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::XROS,
2561 llvm::Triple::UnknownEnvironment));
2567 if (!Introduced.empty()) {
2568 auto NewIntroduced = Mapping->mapIntroducedAvailabilityVersion(Introduced);
2569 if (!NewIntroduced) {
2573 Introduced = *NewIntroduced;
2576 if (!Obsolete.empty()) {
2578 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Obsolete);
2583 Obsolete = *NewObsolete;
2586 if (!Deprecated.empty()) {
2587 auto NewDeprecated =
2588 Mapping->mapDeprecatedObsoletedAvailabilityVersion(Deprecated);
2589 Deprecated = NewDeprecated ? *NewDeprecated : VersionTuple();
2608 StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName(II->
getName());
2609 if (PrettyName.empty())
2610 S.
Diag(Platform->
getLoc(), diag::warn_availability_unknown_platform)
2613 auto *ND = dyn_cast<NamedDecl>(D);
2621 const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType(
2622 AvailabilityAttr::canonicalizePlatformName(II->
getName()));
2624 auto reportAndUpdateIfInvalidOS = [&](
auto &InputVersion) ->
void {
2625 const bool IsInValidRange =
2626 llvm::Triple::isValidVersionForOS(PlatformOS, InputVersion);
2628 auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS(
2629 PlatformOS, InputVersion, IsInValidRange);
2630 if (!IsInValidRange) {
2631 S.
Diag(Platform->
getLoc(), diag::warn_availability_invalid_os_version)
2632 << InputVersion.getAsString() << PrettyName;
2634 diag::note_availability_invalid_os_version_adjusted)
2635 << CanonicalVersion.getAsString();
2637 InputVersion = CanonicalVersion;
2640 if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2641 reportAndUpdateIfInvalidOS(Introduced.
Version);
2642 reportAndUpdateIfInvalidOS(Deprecated.
Version);
2643 reportAndUpdateIfInvalidOS(Obsoleted.
Version);
2649 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getMessageExpr()))
2650 Str = SE->getString();
2651 StringRef Replacement;
2652 if (
const auto *SE =
2654 Replacement = SE->getString();
2656 if (II->
isStr(
"swift")) {
2658 (!IsUnavailable && !Deprecated.
isValid())) {
2660 diag::warn_availability_swift_unavailable_deprecated_only);
2665 if (II->
isStr(
"fuchsia")) {
2666 std::optional<unsigned>
Min, Sub;
2668 (Sub = Introduced.
Version.getSubminor())) {
2669 S.
Diag(AL.
getLoc(), diag::warn_availability_fuchsia_unavailable_minor);
2684 if (EnvironmentLoc) {
2687 if (AvailabilityAttr::getEnvironmentType(
2689 llvm::Triple::EnvironmentType::UnknownEnvironment)
2691 diag::warn_availability_unknown_environment)
2695 diag::err_availability_unexpected_parameter)
2696 <<
"environment" << 1;
2702 Obsoleted.
Version, IsUnavailable, Str, IsStrict, Replacement,
2709 bool NewIsUnavailable = IsUnavailable;
2710 VersionTuple NewIntroduced = Introduced.
Version;
2711 VersionTuple NewDeprecated = Deprecated.
Version;
2712 VersionTuple NewObsoleted = Obsoleted.
Version;
2714 NewIntroduced, NewDeprecated,
2717 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2718 NewObsoleted, NewIsUnavailable, Str, IsStrict, Replacement,
2732 else if (II->
getName() ==
"ios_app_extension")
2737 const auto *IOSToWatchOSMapping =
2742 auto adjustWatchOSVersion =
2743 [IOSToWatchOSMapping](VersionTuple Version) -> VersionTuple {
2744 if (Version.empty())
2746 auto MinimumWatchOSVersion = VersionTuple(2, 0);
2748 if (IOSToWatchOSMapping) {
2749 if (
auto MappedVersion = IOSToWatchOSMapping->map(
2750 Version, MinimumWatchOSVersion, std::nullopt)) {
2751 return *MappedVersion;
2755 auto Major = Version.getMajor();
2756 auto NewMajor = Major;
2759 else if (Major < 12)
2760 NewMajor = Major - 7;
2761 if (NewMajor >= 2) {
2762 if (Version.getMinor()) {
2763 if (Version.getSubminor())
2764 return VersionTuple(NewMajor, *Version.getMinor(),
2765 *Version.getSubminor());
2767 return VersionTuple(NewMajor, *Version.getMinor());
2769 return VersionTuple(NewMajor);
2772 return MinimumWatchOSVersion;
2775 auto NewIntroduced = adjustWatchOSVersion(Introduced.
Version);
2776 auto NewDeprecated = adjustWatchOSVersion(Deprecated.
Version);
2777 auto NewObsoleted = adjustWatchOSVersion(Obsoleted.
Version);
2780 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2781 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2793 else if (II->
getName() ==
"ios_app_extension")
2798 const auto *IOSToTvOSMapping =
2803 auto AdjustTvOSVersion =
2804 [IOSToTvOSMapping](VersionTuple Version) -> VersionTuple {
2805 if (Version.empty())
2808 if (IOSToTvOSMapping) {
2809 if (
auto MappedVersion = IOSToTvOSMapping->map(
2810 Version, VersionTuple(0, 0), std::nullopt)) {
2811 return *MappedVersion;
2817 auto NewIntroduced = AdjustTvOSVersion(Introduced.
Version);
2818 auto NewDeprecated = AdjustTvOSVersion(Deprecated.
Version);
2819 auto NewObsoleted = AdjustTvOSVersion(Obsoleted.
Version);
2822 ND, AL, NewII,
true , NewIntroduced, NewDeprecated,
2823 NewObsoleted, IsUnavailable, Str, IsStrict, Replacement,
2830 llvm::Triple::IOS &&
2832 auto GetSDKInfo = [&]() {
2841 else if (II->
getName() ==
"ios_app_extension")
2844 auto MinMacCatalystVersion = [](
const VersionTuple &
V) {
2847 if (
V.getMajor() < 13 ||
2848 (
V.getMajor() == 13 &&
V.getMinor() && *
V.getMinor() < 1))
2849 return VersionTuple(13, 1);
2853 ND, AL, NewII,
true ,
2854 MinMacCatalystVersion(Introduced.
Version),
2855 MinMacCatalystVersion(Deprecated.
Version),
2856 MinMacCatalystVersion(Obsoleted.
Version), IsUnavailable, Str,
2861 }
else if (II->
getName() ==
"macos" && GetSDKInfo() &&
2863 !Obsoleted.
Version.empty())) {
2864 if (
const auto *MacOStoMacCatalystMapping =
2865 GetSDKInfo()->getVersionMapping(
2872 auto RemapMacOSVersion =
2873 [&](
const VersionTuple &
V) -> std::optional<VersionTuple> {
2875 return std::nullopt;
2877 if (
V.getMajor() == 100000)
2878 return VersionTuple(100000);
2880 return MacOStoMacCatalystMapping->map(
V, VersionTuple(13, 1),
2883 std::optional<VersionTuple> NewIntroduced =
2884 RemapMacOSVersion(Introduced.
Version),
2886 RemapMacOSVersion(Deprecated.
Version),
2888 RemapMacOSVersion(Obsoleted.
Version);
2889 if (NewIntroduced || NewDeprecated || NewObsoleted) {
2890 auto VersionOrEmptyVersion =
2891 [](
const std::optional<VersionTuple> &
V) -> VersionTuple {
2892 return V ? *
V : VersionTuple();
2895 ND, AL, NewII,
true ,
2896 VersionOrEmptyVersion(NewIntroduced),
2897 VersionOrEmptyVersion(NewDeprecated),
2898 VersionOrEmptyVersion(NewObsoleted),
false, Str,
2917 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(0)))
2919 StringRef DefinedIn;
2920 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(1)))
2921 DefinedIn = SE->getString();
2922 bool IsGeneratedDeclaration = AL.
getArgAsIdent(2) !=
nullptr;
2924 if (
const auto *SE = dyn_cast_if_present<StringLiteral>(AL.
getArgAsExpr(3)))
2925 USR = SE->getString();
2932 VisibilityAttr::VisibilityType
Value) {
2933 if (VisibilityAttr *
Attr = D->
getAttr<VisibilityAttr>()) {
2935 Diag(Loc, diag::err_mismatched_visibility);
2942 typename T::VisibilityType value) {
2945 typename T::VisibilityType existingValue = existingAttr->getVisibility();
2946 if (existingValue == value)
2948 S.
Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
2949 S.
Diag(CI.
getLoc(), diag::note_previous_attribute);
2957 VisibilityAttr::VisibilityType Vis) {
2958 return ::mergeVisibilityAttr<VisibilityAttr>(*
this, D, CI, Vis);
2963 TypeVisibilityAttr::VisibilityType Vis) {
2964 return ::mergeVisibilityAttr<TypeVisibilityAttr>(*
this, D, CI, Vis);
2968 bool isTypeVisibility) {
2989 VisibilityAttr::VisibilityType
type;
2990 if (!VisibilityAttr::ConvertStrToVisibilityType(TypeStr,
type)) {
2991 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported) << AL
2998 if (
type == VisibilityAttr::Protected &&
3000 S.
Diag(AL.
getLoc(), diag::warn_attribute_protected_visibility);
3001 type = VisibilityAttr::Default;
3005 if (isTypeVisibility) {
3007 D, AL, (TypeVisibilityAttr::VisibilityType)
type);
3016 unsigned sentinel = (
unsigned)SentinelAttr::DefaultSentinel;
3019 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3021 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3026 if (Idx->isSigned() && Idx->isNegative()) {
3027 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_less_than_zero)
3032 sentinel = Idx->getZExtValue();
3035 unsigned nullPos = (
unsigned)SentinelAttr::DefaultNullPos;
3038 std::optional<llvm::APSInt> Idx = llvm::APSInt(32);
3040 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3044 nullPos = Idx->getZExtValue();
3046 if ((Idx->isSigned() && Idx->isNegative()) || nullPos > 1) {
3049 S.
Diag(AL.
getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
3055 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3058 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3063 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3066 }
else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
3067 if (!MD->isVariadic()) {
3068 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
3071 }
else if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
3072 if (!BD->isVariadic()) {
3073 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
3076 }
else if (
const auto *
V = dyn_cast<VarDecl>(D)) {
3085 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_named_arguments);
3090 S.
Diag(AL.
getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
3094 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3100 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3112 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 0;
3115 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
3116 if (MD->getReturnType()->isVoidType()) {
3117 S.
Diag(AL.
getLoc(), diag::warn_attribute_void_function_method) << AL << 1;
3134 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3145 if (LO.CPlusPlus && !LO.CPlusPlus20)
3146 S.
Diag(AL.
getLoc(), diag::ext_cxx20_attr) << AL;
3150 }
else if (LO.CPlusPlus && !LO.CPlusPlus17)
3151 S.
Diag(AL.
getLoc(), diag::ext_cxx17_attr) << AL;
3158 S.
Diag(AL.
getLoc(), diag::warn_unused_result_typedef_unsupported_spelling)
3171 S.
Diag(AL.
getLoc(), diag::warn_attribute_invalid_on_definition)
3178 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
3191template <
class Attribute>
3193 const unsigned Idx) {
3202 std::optional<llvm::APSInt> I = llvm::APSInt(64);
3209 if (!I->isIntN(32)) {
3211 <<
toString(*I, 10,
false) << 32 << 1;
3215 S.
Diag(E->
getExprLoc(), diag::err_attribute_requires_positive_integer)
3223 "Unexpected PerformCopyInitialization() failure.");
3229template <
typename WorkGroupAttr>
3232 for (
unsigned i = 0; i < 3; ++i) {
3239 auto IsZero = [&](
Expr *E) {
3240 if (E->isValueDependent())
3242 std::optional<llvm::APSInt> I = E->getIntegerConstantExpr(S.
Context);
3243 assert(I &&
"Non-integer constant expr");
3247 if (!llvm::all_of(WGSize, IsZero)) {
3248 for (
unsigned i = 0; i < 3; ++i) {
3250 if (IsZero(WGSize[i])) {
3251 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_is_zero)
3262 assert(L &&
"Non-integer constant expr");
3263 std::optional<llvm::APSInt> R = RHS->getIntegerConstantExpr(S.
Context);
3264 assert(L &&
"Non-integer constant expr");
3268 WorkGroupAttr *Existing = D->
getAttr<WorkGroupAttr>();
3270 !llvm::equal(std::initializer_list<Expr *>{Existing->getXDim(),
3271 Existing->getYDim(),
3272 Existing->getZDim()},
3274 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3277 WorkGroupAttr(S.
Context, AL, WGSize[0], WGSize[1], WGSize[2]));
3282 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
3288 assert(ParmTSI &&
"no type source info for attribute argument");
3293 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
3297 if (VecTypeHintAttr *A = D->
getAttr<VecTypeHintAttr>()) {
3299 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3311 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3316 if (SectionAttr *ExistingAttr = D->
getAttr<SectionAttr>()) {
3317 if (ExistingAttr->getName() == Name)
3319 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3321 Diag(CI.
getLoc(), diag::note_previous_attribute);
3328 if (!
Context.getTargetInfo().getTriple().isOSDarwin())
3329 return llvm::Error::success();
3332 StringRef Segment, Section;
3333 unsigned TAA, StubSize;
3335 return llvm::MCSectionMachO::ParseSectionSpecifier(SecName, Segment, Section,
3336 TAA, HasTAA, StubSize);
3341 Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3371 if (Triple.isLoongArch()) {
3372 return Str ==
"normal" || Str ==
"medium" || Str ==
"extreme";
3374 assert(Triple.getArch() == llvm::Triple::x86_64 &&
3375 "only loongarch/x86-64 supported");
3376 return Str ==
"small" || Str ==
"large";
3383 auto IsTripleSupported = [](llvm::Triple &Triple) {
3384 return Triple.getArch() == llvm::Triple::ArchType::x86_64 ||
3385 Triple.isLoongArch();
3395 Triples.push_back(aux->getTriple());
3404 auto SupportedTripleIt = llvm::find_if(Triples, IsTripleSupported);
3405 if (SupportedTripleIt == Triples.end()) {
3406 S.
Diag(LiteralLoc, diag::warn_unknown_attribute_ignored) << AL;
3410 llvm::CodeModel::Model CM;
3411 if (!CodeModelAttr::ConvertStrToModel(Str, CM) ||
3413 S.
Diag(LiteralLoc, diag::err_attr_codemodel_arg) << Str;
3423 StringRef CodeSegName) {
3425 S.
Diag(LiteralLoc, diag::err_attribute_section_invalid_for_target)
3437 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
3441 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3442 if (ExistingAttr->getName() == Name)
3444 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section)
3446 Diag(CI.
getLoc(), diag::note_previous_attribute);
3459 if (
const auto *ExistingAttr = D->
getAttr<CodeSegAttr>()) {
3460 if (!ExistingAttr->isImplicit()) {
3462 ExistingAttr->getName() == Str
3463 ? diag::warn_duplicate_codeseg_attribute
3464 : diag::err_conflicting_codeseg_attribute);
3476 if (AttrStr.contains(
"fpmath="))
3477 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3478 << Unsupported <<
None <<
"fpmath=" <<
Target;
3481 if (!
Context.getTargetInfo().supportsTargetAttributeTune() &&
3482 AttrStr.contains(
"tune="))
3483 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3487 Context.getTargetInfo().parseTargetAttr(AttrStr);
3489 if (!ParsedAttrs.
CPU.empty() &&
3490 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
CPU))
3491 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3494 if (!ParsedAttrs.
Tune.empty() &&
3495 !
Context.getTargetInfo().isValidCPUName(ParsedAttrs.
Tune))
3496 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3499 if (
Context.getTargetInfo().getTriple().isRISCV()) {
3501 return Diag(LiteralLoc, diag::err_duplicate_target_attribute)
3503 for (StringRef CurFeature : ParsedAttrs.
Features) {
3504 if (!CurFeature.starts_with(
'+') && !CurFeature.starts_with(
'-'))
3505 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3510 if (
Context.getTargetInfo().getTriple().isLoongArch()) {
3511 for (StringRef CurFeature : ParsedAttrs.
Features) {
3512 if (CurFeature.starts_with(
"!arch=")) {
3513 StringRef ArchValue = CurFeature.split(
"=").second.trim();
3514 return Diag(LiteralLoc, diag::err_attribute_unsupported)
3515 <<
"target(arch=..)" << ArchValue;
3521 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3525 auto CurFeature = StringRef(
Feature).drop_front();
3526 if (!
Context.getTargetInfo().isValidFeatureName(CurFeature))
3527 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3528 << Unsupported <<
None << CurFeature <<
Target;
3535 if (!
Context.getTargetInfo().validateBranchProtection(
3537 Context.getLangOpts(), DiagMsg)) {
3538 if (DiagMsg.empty())
3539 return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
3540 << Unsupported <<
None <<
"branch-protection" <<
Target;
3541 return Diag(LiteralLoc, diag::err_invalid_branch_protection_spec)
3544 if (!DiagMsg.empty())
3545 Diag(LiteralLoc, diag::warn_unsupported_branch_protection_spec) << DiagMsg;
3565 TargetVersionAttr *NewAttr =
3577 TargetAttr *NewAttr = ::new (S.
Context) TargetAttr(S.
Context, AL, Str);
3584 if (
const auto *
Other = D->
getAttr<TargetClonesAttr>()) {
3585 S.
Diag(AL.
getLoc(), diag::err_disallowed_duplicate_attribute) << AL;
3586 S.
Diag(
Other->getLocation(), diag::note_conflicting_attribute);
3594 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
3595 if (MD->getParent()->isLambda()) {
3605 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
3610 Params.push_back(Param);
3611 Locations.push_back(Loc);
3628 for (
auto &SmallStr : NewParams)
3629 Params.push_back(SmallStr.str());
3631 TargetClonesAttr *NewAttr = ::new (S.
Context)
3632 TargetClonesAttr(S.
Context, AL, Params.data(), Params.size());
3644 MinVectorWidthAttr *Existing = D->
getAttr<MinVectorWidthAttr>();
3645 if (Existing && Existing->getVectorWidth() != VecWidth) {
3646 S.
Diag(AL.
getLoc(), diag::warn_duplicate_attribute) << AL;
3661 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
3663 S.
Diag(Loc, diag::warn_cleanup_ext);
3664 FD = dyn_cast<FunctionDecl>(DRE->
getDecl());
3667 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 1
3671 }
else if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
3672 if (ULE->hasExplicitTemplateArgs())
3673 S.
Diag(Loc, diag::warn_cleanup_ext);
3675 NI = ULE->getNameInfo();
3677 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 2
3684 S.
Diag(Loc, diag::err_attribute_cleanup_arg_not_function) << 0;
3689 S.
Diag(Loc, diag::err_attribute_cleanup_func_must_take_one_arg)
3705 S.
Context, VariableReference, UnaryOperatorKind::UO_AddrOf,
3727 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3732 EnumExtensibilityAttr::Kind ExtensibilityKind;
3734 if (!EnumExtensibilityAttr::ConvertStrToKind(II->
getName(),
3735 ExtensibilityKind)) {
3736 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
3741 EnumExtensibilityAttr(S.
Context, AL, ExtensibilityKind));
3759 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
3769 if (
auto *OMD = dyn_cast<ObjCMethodDecl>(D))
3770 if (
auto *
Interface = OMD->getClassInterface())
3777 S.
Diag(AL.
getLoc(), diag::err_format_attribute_result_not)
3778 << (NotNSStringTy ?
"string type" :
"NSString")
3798 return llvm::StringSwitch<FormatAttrKind>(Format)
3805 .Cases({
"gnu_scanf",
"scanf",
"gnu_printf",
"printf",
"printf0",
3806 "gnu_strfmon",
"strfmon"},
3814 .Cases({
"gcc_diag",
"gcc_cdiag",
"gcc_cxxdiag",
"gcc_tdiag"},
3823 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored) << AL;
3828 S.
Diag(AL.
getLoc(), diag::err_hlsl_init_priority_unsupported);
3833 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
3840 if (!
T->isRecordType()) {
3841 S.
Diag(AL.
getLoc(), diag::err_init_priority_object_attr);
3847 uint32_t prioritynum;
3853 if (prioritynum > 65535) {
3854 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_range)
3862 if (prioritynum < 101)
3863 S.
Diag(AL.
getLoc(), diag::warn_init_priority_reserved)
3869 StringRef NewUserDiagnostic) {
3870 if (
const auto *EA = D->
getAttr<ErrorAttr>()) {
3872 assert((NewAttr ==
"error" || NewAttr ==
"warning") &&
3873 "unexpected normalized full name");
3874 bool Match = (EA->isError() && NewAttr ==
"error") ||
3875 (EA->isWarning() && NewAttr ==
"warning");
3877 Diag(EA->getLocation(), diag::err_attributes_are_not_compatible)
3880 EA->isRegularKeywordAttribute());
3881 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
3884 if (EA->getUserDiagnostic() != NewUserDiagnostic) {
3885 Diag(CI.
getLoc(), diag::warn_duplicate_attribute) << EA;
3886 Diag(EA->getLoc(), diag::note_previous_attribute);
3890 return ::new (
Context) ErrorAttr(
Context, CI, NewUserDiagnostic);
3898 if (F->getType() == Format &&
3899 F->getFormatIdx() == FormatIdx &&
3900 F->getFirstArg() == FirstArg) {
3903 if (F->getLocation().isInvalid())
3909 return ::new (
Context) FormatAttr(
Context, CI, Format, FormatIdx, FirstArg);
3919 if (F->getType() == Format && F->getFormatIdx() == FormatIdx) {
3921 F->getFormatString(), FormatStr))
3926 if (F->getLocation().isInvalid())
3933 FormatMatchesAttr(
Context, CI, Format, FormatIdx, FormatStr);
3951 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
3976 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
3987 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
3995 if (HasImplicitThisParam) {
3998 diag::err_format_attribute_implicit_this_format_string)
4011 S.
Diag(AL.
getLoc(), diag::err_format_attribute_not)
4032 if (FirstArg != 0) {
4036 S.
Diag(AL.
getLoc(), diag::err_format_strftime_third_parameter)
4044 if (FirstArg != Info.
NumArgs + 1) {
4045 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4048 std::to_string(Info.
NumArgs + 1));
4053 S.
Diag(D->
getLocation(), diag::warn_gcc_requires_variadic_function) << AL;
4058 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4065 FormatAttr *NewAttr =
4077 if (
auto *SL = dyn_cast<StringLiteral>(FormatStrExpr)) {
4086 S.
Diag(AL.
getLoc(), diag::err_format_nonliteral)
4094 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_no_callee)
4103 assert(FD &&
"Expected a function declaration!");
4105 llvm::StringMap<int> NameIdxMapping;
4106 NameIdxMapping[
"__"] = -1;
4108 NameIdxMapping[
"this"] = 0;
4112 NameIdxMapping[PVD->getName()] = Idx++;
4114 auto UnknownName = NameIdxMapping.end();
4117 for (
unsigned I = 0, E = AL.
getNumArgs(); I < E; ++I) {
4124 if (It == UnknownName) {
4125 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_argument_unknown)
4131 ArgIdx = It->second;
4138 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4144 if (ArgIdx < -1 || ArgIdx > NumArgs) {
4145 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
4152 llvm_unreachable(
"Unexpected ParsedAttr argument type!");
4155 if (ArgIdx == 0 && !HasImplicitThisParam) {
4156 S.
Diag(AL.
getLoc(), diag::err_callback_implicit_this_not_available)
4163 if (!HasImplicitThisParam && ArgIdx > 0)
4166 EncodingIndices.push_back(ArgIdx);
4169 int CalleeIdx = EncodingIndices.front();
4173 if (CalleeIdx < (
int)HasImplicitThisParam) {
4174 S.
Diag(AL.
getLoc(), diag::err_callback_attribute_invalid_callee)
4181 const Type *CalleeType =
4185 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4190 const Type *CalleeFnType =
4195 const auto *CalleeFnProtoType = dyn_cast<FunctionProtoType>(CalleeFnType);
4196 if (!CalleeFnProtoType) {
4197 S.
Diag(AL.
getLoc(), diag::err_callback_callee_no_function_type)
4202 if (CalleeFnProtoType->getNumParams() != EncodingIndices.size() - 1) {
4203 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_arg_count_for_func)
4204 << AL <<
QualType{CalleeFnProtoType, 0}
4205 << CalleeFnProtoType->getNumParams()
4206 << (
unsigned)(EncodingIndices.size() - 1);
4210 if (CalleeFnProtoType->isVariadic()) {
4216 if (D->
hasAttr<CallbackAttr>()) {
4222 S.
Context, AL, EncodingIndices.data(), EncodingIndices.size()));
4226 StringRef ParamName) {
4229 Diag(AL.
getLoc(), diag::err_capture_by_attribute_no_entity)
4238 bool IsValid =
true;
4239 for (
unsigned I = 0; I < N; ++I) {
4242 Diag(E->
getExprLoc(), diag::err_capture_by_attribute_argument_unknown)
4250 Diag(IdLoc->
getLoc(), diag::err_capture_by_references_itself)
4256 ParamLocs[I] = IdLoc->
getLoc();
4262 LifetimeCaptureByAttr::Create(
Context, FakeParamIndices.data(), N, AL);
4263 CapturedBy->setArgs(ParamIdents, ParamLocs);
4270 if (D->
hasAttr<LifetimeCaptureByAttr>()) {
4271 S.
Diag(AL.
getLoc(), diag::err_capture_by_attribute_multiple)
4275 auto *PVD = dyn_cast<ParmVarDecl>(D);
4286 if (
auto *A = PVD->getAttr<LifetimeCaptureByAttr>())
4288 if (HasImplicitThisParam) {
4296 if (
auto *A = ATL.
getAttrAs<LifetimeCaptureByAttr>())
4297 Attrs.push_back(
const_cast<LifetimeCaptureByAttr *
>(A));
4302 llvm::StringMap<int> NameIdxMapping = {
4303 {
"global", LifetimeCaptureByAttr::Global},
4304 {
"unknown", LifetimeCaptureByAttr::Unknown}};
4306 if (HasImplicitThisParam) {
4307 NameIdxMapping[
"this"] = 0;
4311 NameIdxMapping[PVD->getName()] = Idx++;
4312 auto DisallowReservedParams = [&](StringRef Reserved) {
4314 if (PVD->getName() == Reserved)
4315 Diag(PVD->getLocation(), diag::err_capture_by_param_uses_reserved_name)
4316 << (PVD->getName() ==
"unknown");
4318 for (
auto *CapturedBy : Attrs) {
4319 const auto &Entities = CapturedBy->getArgIdents();
4320 for (
size_t I = 0; I < Entities.size(); ++I) {
4321 StringRef Name = Entities[I]->getName();
4322 auto It = NameIdxMapping.find(Name);
4323 if (It == NameIdxMapping.end()) {
4324 auto Loc = CapturedBy->getArgLocs()[I];
4325 if (!HasImplicitThisParam && Name ==
"this")
4326 Diag(Loc, diag::err_capture_by_implicit_this_not_available) << Loc;
4328 Diag(Loc, diag::err_capture_by_attribute_argument_unknown)
4329 << Entities[I] << Loc;
4332 if (Name ==
"unknown" || Name ==
"global")
4333 DisallowReservedParams(Name);
4334 CapturedBy->setParamIdx(I, It->second);
4343 return T.isFunctionPointerType() ||
T.isBlockPointerType();
4352 S.
Diag(AL.
getLoc(), diag::err_called_once_attribute_wrong_type);
4362 const auto *TD = dyn_cast<TypedefNameDecl>(D);
4363 if (TD && TD->getUnderlyingType()->isUnionType())
4364 RD = TD->getUnderlyingType()->getAsRecordDecl();
4366 RD = dyn_cast<RecordDecl>(D);
4369 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
4377 diag::warn_transparent_union_attribute_not_definition);
4383 if (Field == FieldEnd) {
4384 S.
Diag(AL.
getLoc(), diag::warn_transparent_union_attribute_zero_fields);
4392 diag::warn_transparent_union_attribute_floating)
4401 for (; Field != FieldEnd; ++Field) {
4402 QualType FieldType = Field->getType();
4416 S.
Diag(Field->getLocation(),
4417 diag::warn_transparent_union_attribute_field_size_align)
4418 << isSize << *Field << FieldBits;
4419 unsigned FirstBits = isSize ? FirstSize : FirstAlign;
4421 diag::note_transparent_union_first_field_size_align)
4422 << isSize << FirstBits;
4445 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4446 T = TD->getUnderlyingType();
4447 else if (
const auto *VD = dyn_cast<ValueDecl>(D))
4450 llvm_unreachable(
"Unknown decl type for align_value");
4452 if (!
T->isDependentType() && !
T->isAnyPointerType() &&
4453 !
T->isReferenceType() && !
T->isMemberPointerType()) {
4454 Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only)
4460 llvm::APSInt Alignment;
4462 E, &Alignment, diag::err_align_value_attribute_argument_not_int);
4466 if (!Alignment.isPowerOf2()) {
4467 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4489 diag::err_pack_expansion_without_parameter_packs);
4504 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
4516 diag::err_pack_expansion_without_parameter_packs);
4543 const AlignedAttr &
Attr,
4548 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
4551 if (VD->isExceptionVariable())
4553 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
4554 if (FD->isBitField())
4556 }
else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4557 if (ED->getLangOpts().CPlusPlus)
4560 return S.
Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
4565 if (DiagKind != -1) {
4566 return S.
Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
4567 << &
Attr << DiagKind;
4573 bool IsPackExpansion) {
4574 AlignedAttr TmpAttr(
Context, CI,
true, E);
4578 if (TmpAttr.isAlignas() &&
4586 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4587 if (!TND->getUnderlyingType()->isDependentType()) {
4588 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4595 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
true, E);
4596 AA->setPackExpansion(IsPackExpansion);
4602 llvm::APSInt Alignment;
4604 E, &Alignment, diag::err_aligned_attribute_argument_not_int);
4609 if (
Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
4612 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
4617 uint64_t AlignVal = Alignment.getZExtValue();
4623 if (!(TmpAttr.isAlignas() && !Alignment)) {
4624 if (!llvm::isPowerOf2_64(AlignVal)) {
4625 Diag(AttrLoc, diag::err_alignment_not_power_of_two)
4631 const auto *VD = dyn_cast<VarDecl>(D);
4633 unsigned MaxTLSAlign =
4634 Context.toCharUnitsFromBits(
Context.getTargetInfo().getMaxTLSAlign())
4636 if (MaxTLSAlign && AlignVal > MaxTLSAlign &&
4638 Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum)
4639 << (
unsigned)AlignVal << VD << MaxTLSAlign;
4646 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4647 const Type *Ty = VD->getType().getTypePtr();
4649 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4650 << VD->getType() << 16;
4656 AA->setPackExpansion(IsPackExpansion);
4657 AA->setCachedAlignmentValue(
4658 static_cast<unsigned>(AlignVal *
Context.getCharWidth()));
4664 AlignedAttr TmpAttr(
Context, CI,
false, TS);
4668 if (TmpAttr.isAlignas() &&
4676 if (
const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
4677 if (!TND->getUnderlyingType()->isDependentType()) {
4678 Diag(AttrLoc, diag::err_alignment_dependent_typedef_name)
4684 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4685 AA->setPackExpansion(IsPackExpansion);
4690 const auto *VD = dyn_cast<VarDecl>(D);
4691 unsigned AlignVal = TmpAttr.getAlignment(
Context);
4694 if (VD &&
Context.getTargetInfo().getTriple().isOSAIX()) {
4695 const Type *Ty = VD->getType().getTypePtr();
4697 Context.toCharUnitsFromBits(AlignVal).getQuantity() < 16) {
4698 Diag(VD->getLocation(), diag::warn_aligned_attr_underaligned)
4699 << VD->getType() << 16;
4704 AlignedAttr *AA = ::new (
Context) AlignedAttr(
Context, CI,
false, TS);
4705 AA->setPackExpansion(IsPackExpansion);
4706 AA->setCachedAlignmentValue(AlignVal);
4711 assert(D->
hasAttrs() &&
"no attributes on decl");
4714 if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
4715 UnderlyingTy = DiagTy = VD->getType();
4718 if (
const auto *ED = dyn_cast<EnumDecl>(D))
4719 UnderlyingTy = ED->getIntegerType();
4728 AlignedAttr *AlignasAttr =
nullptr;
4729 AlignedAttr *LastAlignedAttr =
nullptr;
4732 if (I->isAlignmentDependent())
4736 Align = std::max(Align, I->getAlignment(
Context));
4737 LastAlignedAttr = I;
4741 Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
4742 << LastAlignedAttr << DiagTy;
4743 }
else if (AlignasAttr && Align) {
4746 if (NaturalAlign > RequestedAlign)
4747 Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
4774 Diag(Range.getBegin(), diag::err_mismatched_ms_inheritance)
4783 bool &IntegerMode,
bool &ComplexMode,
4786 ComplexMode =
false;
4788 switch (Str.size()) {
4808 DestWidth = Str[1] ==
'I' ? 0 : 128;
4816 DestWidth = Str[1] ==
'I' ? 0 : 128;
4819 if (Str[1] ==
'F') {
4820 IntegerMode =
false;
4821 }
else if (Str[1] ==
'C') {
4822 IntegerMode =
false;
4824 }
else if (Str[1] !=
'I') {
4833 else if (Str ==
"byte")
4837 if (Str ==
"pointer")
4841 if (Str ==
"unwind_word")
4857 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
4869 StringRef Str = Name->
getName();
4873 unsigned DestWidth = 0;
4874 bool IntegerMode =
true;
4875 bool ComplexMode =
false;
4877 llvm::APInt VectorSize(64, 0);
4878 if (Str.size() >= 4 && Str[0] ==
'V') {
4880 size_t StrSize = Str.size();
4881 size_t VectorStringLength = 0;
4882 while ((VectorStringLength + 1) < StrSize &&
4883 isdigit(Str[VectorStringLength + 1]))
4884 ++VectorStringLength;
4885 if (VectorStringLength &&
4886 !Str.substr(1, VectorStringLength).getAsInteger(10, VectorSize) &&
4887 VectorSize.isPowerOf2()) {
4889 IntegerMode, ComplexMode, ExplicitType);
4891 if (!InInstantiation)
4892 Diag(AttrLoc, diag::warn_vector_mode_deprecated);
4907 Diag(AttrLoc, diag::err_machine_mode) << 0 << Name;
4912 if (
const auto *TD = dyn_cast<TypedefNameDecl>(D))
4913 OldTy = TD->getUnderlyingType();
4914 else if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
4917 OldTy = ED->getIntegerType();
4932 OldElemTy = VT->getElementType();
4938 VectorSize.getBoolValue()) {
4939 Diag(AttrLoc, diag::err_enum_mode_vector_type) << Name << CI.
getRange();
4947 !IntegralOrAnyEnumType)
4948 Diag(AttrLoc, diag::err_mode_not_primitive);
4949 else if (IntegerMode) {
4950 if (!IntegralOrAnyEnumType)
4951 Diag(AttrLoc, diag::err_mode_wrong_type);
4952 }
else if (ComplexMode) {
4954 Diag(AttrLoc, diag::err_mode_wrong_type);
4957 Diag(AttrLoc, diag::err_mode_wrong_type);
4963 NewElemTy =
Context.getIntTypeForBitwidth(DestWidth,
4966 NewElemTy =
Context.getRealTypeForBitwidth(DestWidth, ExplicitType);
4968 if (NewElemTy.
isNull()) {
4970 if (!(DestWidth == 128 &&
4972 Diag(AttrLoc, diag::err_machine_mode) << 1 << Name;
4977 NewElemTy =
Context.getComplexType(NewElemTy);
4981 if (VectorSize.getBoolValue()) {
4982 NewTy =
Context.getVectorType(NewTy, VectorSize.getZExtValue(),
4987 Diag(AttrLoc, diag::err_complex_mode_vector_type);
4990 unsigned NumElements =
Context.getTypeSize(OldElemTy) *
4991 OldVT->getNumElements() /
4992 Context.getTypeSize(NewElemTy);
4994 Context.getVectorType(NewElemTy, NumElements, OldVT->getVectorKind());
4998 Diag(AttrLoc, diag::err_mode_wrong_type);
5003 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
5004 TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
5005 else if (
auto *ED = dyn_cast<EnumDecl>(D))
5006 ED->setIntegerType(NewTy);
5034 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5035 Diag(CI.
getLoc(), diag::warn_attribute_ignored) << Ident;
5036 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5040 if (D->
hasAttr<AlwaysInlineAttr>())
5048 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5051 if (VD->getKind() != Decl::Var) {
5052 Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5059 if (VD->hasLocalStorage()) {
5060 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5067InternalLinkageAttr *
5069 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5072 if (VD->getKind() != Decl::Var) {
5073 Diag(AL.getLocation(), diag::warn_attribute_wrong_decl_type)
5074 << &AL << AL.isRegularKeywordAttribute()
5080 if (VD->hasLocalStorage()) {
5081 Diag(VD->getLocation(), diag::warn_internal_linkage_local_storage);
5090 if (OptimizeNoneAttr *Optnone = D->
getAttr<OptimizeNoneAttr>()) {
5091 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'minsize'";
5092 Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
5096 if (D->
hasAttr<MinSizeAttr>())
5104 if (AlwaysInlineAttr *Inline = D->
getAttr<AlwaysInlineAttr>()) {
5105 Diag(Inline->getLocation(), diag::warn_attribute_ignored) << Inline;
5106 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5109 if (MinSizeAttr *MinSize = D->
getAttr<MinSizeAttr>()) {
5110 Diag(MinSize->getLocation(), diag::warn_attribute_ignored) << MinSize;
5111 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
5115 if (D->
hasAttr<OptimizeNoneAttr>())
5122 if (AlwaysInlineAttr *Inline =
5139 if (VD->hasLocalStorage()) {
5140 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5145 if (
auto *A = D->
getAttr<CUDAConstantAttr>()) {
5146 if (!A->isImplicit())
5157 if (!S.
getLangOpts().GPURelocatableDeviceCode && VD->hasExternalStorage() &&
5159 S.
Diag(AL.
getLoc(), diag::err_cuda_extern_shared) << VD;
5162 if (S.
getLangOpts().CUDA && VD->hasLocalStorage() &&
5181 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FD)) {
5182 if (Method->isInstance()) {
5183 S.
Diag(Method->getBeginLoc(), diag::err_kern_is_nonstatic_method)
5187 S.
Diag(Method->getBeginLoc(), diag::warn_kern_is_method) << Method;
5193 if (AL.
getKind() == ParsedAttr::AT_DeviceKernel)
5206 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5207 if (VD->hasLocalStorage()) {
5208 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5213 if (
auto *A = D->
getAttr<CUDADeviceAttr>()) {
5214 if (!A->isImplicit())
5222 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
5223 if (VD->hasLocalStorage()) {
5224 S.
Diag(AL.
getLoc(), diag::err_cuda_nonstatic_constdev);
5228 if (!D->
hasAttr<HIPManagedAttr>())
5230 if (!D->
hasAttr<CUDADeviceAttr>())
5245 if (!Fn->isInlineSpecified()) {
5246 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
5251 S.
Diag(AL.
getLoc(), diag::warn_gnu_inline_cplusplus_without_extern);
5268 S.
Diag(AL.
getLoc(), diag::warn_attribute_wrong_decl_type)
5274 case ParsedAttr::AT_FastCall:
5277 case ParsedAttr::AT_StdCall:
5280 case ParsedAttr::AT_ThisCall:
5283 case ParsedAttr::AT_CDecl:
5286 case ParsedAttr::AT_Pascal:
5289 case ParsedAttr::AT_SwiftCall:
5292 case ParsedAttr::AT_SwiftAsyncCall:
5295 case ParsedAttr::AT_VectorCall:
5298 case ParsedAttr::AT_MSABI:
5301 case ParsedAttr::AT_SysVABI:
5304 case ParsedAttr::AT_RegCall:
5307 case ParsedAttr::AT_Pcs: {
5308 PcsAttr::PCSType PCS;
5311 PCS = PcsAttr::AAPCS;
5314 PCS = PcsAttr::AAPCS_VFP;
5317 llvm_unreachable(
"unexpected calling convention in pcs attribute");
5323 case ParsedAttr::AT_AArch64VectorPcs:
5326 case ParsedAttr::AT_AArch64SVEPcs:
5329 case ParsedAttr::AT_DeviceKernel: {
5331 assert(D->
hasAttr<DeviceKernelAttr>() &&
"Expected attribute");
5334 case ParsedAttr::AT_IntelOclBicc:
5337 case ParsedAttr::AT_PreserveMost:
5340 case ParsedAttr::AT_PreserveAll:
5343 case ParsedAttr::AT_M68kRTD:
5346 case ParsedAttr::AT_PreserveNone:
5349 case ParsedAttr::AT_RISCVVectorCC:
5352 case ParsedAttr::AT_RISCVVLSCC: {
5359 S.
Diag(AL.
getLoc(), diag::err_argument_invalid_range)
5364 S.
Diag(AL.
getLoc(), diag::err_argument_not_power_of_2);
5372 llvm_unreachable(
"unexpected attribute kind");
5377 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
5383 S.
Diag(AL.
getLoc(), diag::err_hidden_device_kernel) << FD;
5387 if (Triple.isNVPTX()) {
5391 if (!LangOpts.OpenCLCPlusPlus && (!FD || IsFunctionTemplate)) {
5392 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type_str)
5400 bool TargetDeviceEnvironment = Triple.isGPU() || Triple.isSPIR() ||
5402 if (!TargetDeviceEnvironment) {
5403 S.
Diag(AL.
getLoc(), diag::warn_cconv_unsupported)
5421 std::vector<StringRef> DiagnosticIdentifiers;
5422 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
5428 DiagnosticIdentifiers.push_back(RuleName);
5431 SuppressAttr(S.
Context, AL, DiagnosticIdentifiers.data(),
5432 DiagnosticIdentifiers.size()));
5441 unsigned SelectIdx = ~0
U;
5447 if (SelectIdx != ~0
U) {
5448 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_argument)
5460 if (AL.
getKind() == ParsedAttr::AT_Owner) {
5463 if (
const auto *OAttr = D->
getAttr<OwnerAttr>()) {
5464 const Type *ExistingDerefType = OAttr->getDerefTypeLoc()
5465 ? OAttr->getDerefType().getTypePtr()
5468 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5471 OAttr->isRegularKeywordAttribute());
5472 S.
Diag(OAttr->getLocation(), diag::note_conflicting_attribute);
5477 Redecl->addAttr(::new (S.
Context) OwnerAttr(S.
Context, AL, DerefTypeLoc));
5482 if (
const auto *PAttr = D->
getAttr<PointerAttr>()) {
5483 const Type *ExistingDerefType = PAttr->getDerefTypeLoc()
5484 ? PAttr->getDerefType().getTypePtr()
5487 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
5490 PAttr->isRegularKeywordAttribute());
5491 S.
Diag(PAttr->getLocation(), diag::note_conflicting_attribute);
5496 Redecl->addAttr(::new (S.
Context)
5497 PointerAttr(S.
Context, AL, DerefTypeLoc));
5505 if (!D->
hasAttr<RandomizeLayoutAttr>())
5513 if (!D->
hasAttr<NoRandomizeLayoutAttr>())
5528 if (Attrs.
getKind() == ParsedAttr::AT_RISCVVLSCC) {
5536 unsigned ReqArgs = Attrs.
getKind() == ParsedAttr::AT_Pcs ? 1 : 0;
5543 bool IsTargetDefaultMSABI =
5544 Context.getTargetInfo().getTriple().isOSWindows() ||
5545 Context.getTargetInfo().getTriple().isUEFI();
5548 case ParsedAttr::AT_CDecl:
5551 case ParsedAttr::AT_FastCall:
5554 case ParsedAttr::AT_StdCall:
5557 case ParsedAttr::AT_ThisCall:
5560 case ParsedAttr::AT_Pascal:
5563 case ParsedAttr::AT_SwiftCall:
5566 case ParsedAttr::AT_SwiftAsyncCall:
5569 case ParsedAttr::AT_VectorCall:
5572 case ParsedAttr::AT_AArch64VectorPcs:
5575 case ParsedAttr::AT_AArch64SVEPcs:
5578 case ParsedAttr::AT_RegCall:
5581 case ParsedAttr::AT_MSABI:
5584 case ParsedAttr::AT_SysVABI:
5587 case ParsedAttr::AT_Pcs: {
5593 if (StrRef ==
"aapcs") {
5596 }
else if (StrRef ==
"aapcs-vfp") {
5605 case ParsedAttr::AT_IntelOclBicc:
5608 case ParsedAttr::AT_PreserveMost:
5611 case ParsedAttr::AT_PreserveAll:
5614 case ParsedAttr::AT_M68kRTD:
5617 case ParsedAttr::AT_PreserveNone:
5620 case ParsedAttr::AT_RISCVVectorCC:
5623 case ParsedAttr::AT_RISCVVLSCC: {
5626 unsigned ABIVLen = 128;
5632 if (Attrs.
getNumArgs() && (ABIVLen < 32 || ABIVLen > 65536)) {
5634 Diag(Attrs.
getLoc(), diag::err_argument_invalid_range)
5635 << ABIVLen << 32 << 65536;
5638 if (!llvm::isPowerOf2_64(ABIVLen)) {
5640 Diag(Attrs.
getLoc(), diag::err_argument_not_power_of_2);
5644 llvm::Log2_64(ABIVLen) - 5);
5647 case ParsedAttr::AT_DeviceKernel: {
5652 default: llvm_unreachable(
"unexpected attribute kind");
5657 auto *Aux =
Context.getAuxTargetInfo();
5665 bool CheckHost =
false, CheckDevice =
false;
5666 switch (CudaTarget) {
5679 llvm_unreachable(
"unexpected cuda target");
5681 auto *HostTI =
LangOpts.CUDAIsDevice ? Aux : &TI;
5682 auto *DeviceTI =
LangOpts.CUDAIsDevice ? &TI : Aux;
5683 if (CheckHost && HostTI)
5686 A = DeviceTI->checkCallingConvention(CC);
5695 A = Aux->checkCallingConvention(CC);
5713 Diag(Attrs.
getLoc(), diag::error_cconv_unsupported)
5718 Diag(Attrs.
getLoc(), diag::warn_cconv_unsupported)
5723 bool IsCXXMethod =
false, IsVariadic =
false;
5728 CC =
Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod);
5753 if (
Context.getTargetInfo().getRegParmMax() == 0) {
5754 Diag(AL.
getLoc(), diag::err_attribute_regparm_wrong_platform)
5761 if (numParams >
Context.getTargetInfo().getRegParmMax()) {
5762 Diag(AL.
getLoc(), diag::err_attribute_regparm_invalid_number)
5774 llvm_unreachable(
"getOffloadArch is only valid for NVPTX triple");
5784 const CUDALaunchBoundsAttr &AL,
5785 const unsigned Idx) {
5794 std::optional<llvm::APSInt> I = llvm::APSInt(64);
5801 if (!I->isIntN(32)) {
5803 <<
toString(*I, 10,
false) << 32 << 1;
5807 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
5815 "Unexpected PerformCopyInitialization() failure.");
5820CUDALaunchBoundsAttr *
5822 Expr *MinBlocks,
Expr *MaxBlocks) {
5823 CUDALaunchBoundsAttr TmpAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5841 MaxBlocks =
nullptr;
5850 CUDALaunchBoundsAttr(
Context, CI, MaxThreads, MinBlocks, MaxBlocks);
5869static std::pair<Expr *, int>
5871 const unsigned Idx) {
5887 if (!I->isIntN(4)) {
5889 <<
toString(*I, 10,
false) << 4 << 1;
5893 S.
Diag(E->
getExprLoc(), diag::warn_attribute_argument_n_negative)
5903 CUDAClusterDimsAttr TmpAttr(
Context, CI,
X, Y, Z);
5909 if (!NewX || (Y && !NewY) || (Z && !NewZ))
5912 int FlatDim = ValX * ValY * ValZ;
5913 const llvm::Triple TT =
5914 (!
Context.getLangOpts().CUDAIsDevice &&
Context.getAuxTargetInfo())
5915 ?
Context.getAuxTargetInfo()->getTriple()
5916 :
Context.getTargetInfo().getTriple();
5920 else if (TT.isAMDGPU())
5927 if (FlatDim > MaxDim) {
5928 Diag(CI.
getLoc(), diag::err_cluster_dims_too_large) << MaxDim << FlatDim;
5932 return CUDAClusterDimsAttr::Create(
Context, NewX, NewY, NewZ, CI);
5951 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
5970 S.
Diag(AL.
getLoc(), diag::err_cluster_attr_not_supported) << AL;
5980 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6002 unsigned ArgumentIdxAST = ArgumentIdx.
getASTIndex();
6005 S.
Diag(AL.
getLoc(), diag::err_attribute_pointers_only) << AL << 0;
6010 TypeTagIdx, IsPointer));
6016 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6025 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_decl_type)
6033 assert(MatchingCTypeLoc &&
"no type source info for attribute argument");
6056 S.
Diag(AL.
getLoc(), diag::err_aix_attr_unsupported) << AL;
6059 uint32_t Count = 0, Offset = 0;
6067 if (Count < Offset) {
6068 S.
Diag(S.
getAttrLoc(AL), diag::err_attribute_argument_out_of_range)
6079 diag::err_attribute_patchable_function_entry_invalid_section)
6083 if (Section.empty()) {
6085 diag::err_attribute_patchable_function_entry_invalid_section)
6086 <<
"section must not be empty";
6096 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
6114 (!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSPIRV)) {
6115 S.
Diag(AL.
getLoc(), diag::err_attribute_builtin_alias) << AL;
6126 if (
auto *CRD = dyn_cast<CXXRecordDecl>(D);
6127 !CRD || !(CRD->isClass() || CRD->isStruct())) {
6138 S.
Diag(AL.
getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
6144 assert(ParmTSI &&
"no type source info for attribute argument");
6146 diag::err_incomplete_type);
6156 StringRef UuidAsWritten,
MSGuidDecl *GuidDecl) {
6157 if (
const auto *UA = D->
getAttr<UuidAttr>()) {
6160 if (!UA->getGuid().empty()) {
6161 Diag(UA->getLocation(), diag::err_mismatched_uuid);
6167 return ::new (
Context) UuidAttr(
Context, CI, UuidAsWritten, GuidDecl);
6172 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6177 StringRef OrigStrRef;
6184 StringRef StrRef = OrigStrRef;
6185 if (StrRef.size() == 38 && StrRef.front() ==
'{' && StrRef.back() ==
'}')
6186 StrRef = StrRef.drop_front().drop_back();
6189 if (StrRef.size() != 36) {
6190 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6194 for (
unsigned i = 0; i < 36; ++i) {
6195 if (i == 8 || i == 13 || i == 18 || i == 23) {
6196 if (StrRef[i] !=
'-') {
6197 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6201 S.
Diag(LiteralLoc, diag::err_attribute_uuid_malformed_guid);
6208 StrRef.substr(0, 8).getAsInteger(16, Parsed.
Part1);
6209 StrRef.substr(9, 4).getAsInteger(16, Parsed.
Part2);
6210 StrRef.substr(14, 4).getAsInteger(16, Parsed.
Part3);
6211 for (
unsigned i = 0; i != 8; ++i)
6212 StrRef.substr(19 + 2 * i + (i >= 2 ? 1 : 0), 2)
6223 S.
Diag(AL.
getLoc(), diag::warn_atl_uuid_deprecated);
6232 S.
Diag(AL.
getLoc(), diag::err_attribute_not_supported_in_lang)
6247 S.
Diag(AL.
getLoc(), diag::err_thread_unsupported);
6251 S.
Diag(AL.
getLoc(), diag::err_declspec_thread_on_thread_variable);
6254 if (VD->hasLocalStorage()) {
6255 S.
Diag(AL.
getLoc(), diag::err_thread_non_global) <<
"__declspec(thread)";
6263 S.
Diag(AL.
getLoc(), diag::warn_unknown_attribute_ignored)
6269 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6273 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6274 if (!S.
getLangOpts().CPlusPlus20 && MD->isVirtual()) {
6275 S.
Diag(AL.
getLoc(), diag::err_ms_constexpr_cannot_be_applied)
6285 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6286 << AL <<
First << 0;
6287 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6290 if (
const auto *Preexisting = D->
getAttr<MSStructAttr>()) {
6291 if (Preexisting->isImplicit())
6300 if (
First->isImplicit()) {
6303 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
6304 << AL <<
First << 0;
6305 S.
Diag(
First->getLocation(), diag::note_conflicting_attribute);
6315 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6319 Tags.push_back(Tag);
6322 if (
const auto *NS = dyn_cast<NamespaceDecl>(D)) {
6323 if (!NS->isInline()) {
6324 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
6327 if (NS->isAnonymousNamespace()) {
6328 S.
Diag(AL.
getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
6332 Tags.push_back(NS->getName());
6338 Tags.erase(llvm::unique(Tags), Tags.end());
6341 AbiTagAttr(S.
Context, AL, Tags.data(), Tags.size()));
6346 if (I->getBTFDeclTag() == Tag)
6365 return ::new (
Context) BTFDeclTagAttr(
Context, AL, AL.getBTFDeclTag());
6371 case llvm::Triple::msp430:
6374 case llvm::Triple::mipsel:
6375 case llvm::Triple::mips:
6378 case llvm::Triple::m68k:
6381 case llvm::Triple::x86:
6382 case llvm::Triple::x86_64:
6385 case llvm::Triple::avr:
6388 case llvm::Triple::riscv32:
6389 case llvm::Triple::riscv64:
6406 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_out_of_bounds)
6421 if (D->
hasAttr<DLLExportAttr>()) {
6422 Diag(CI.
getLoc(), diag::warn_attribute_ignored) <<
"'dllimport'";
6426 if (D->
hasAttr<DLLImportAttr>())
6434 if (DLLImportAttr *Import = D->
getAttr<DLLImportAttr>()) {
6435 Diag(Import->getLocation(), diag::warn_attribute_ignored) << Import;
6439 if (D->
hasAttr<DLLExportAttr>())
6452 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
6462 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
6464 MD->getParent()->isLambda()) {
6470 Attr *NewAttr = A.
getKind() == ParsedAttr::AT_DLLExport
6481 if (MSInheritanceAttr *IA = D->
getAttr<MSInheritanceAttr>()) {
6482 if (IA->getInheritanceModel() == Model)
6484 Diag(IA->getLocation(), diag::err_mismatched_ms_inheritance)
6486 Diag(CI.
getLoc(), diag::note_previous_ms_inheritance);
6491 if (RD->hasDefinition()) {
6498 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6502 if (RD->getDescribedClassTemplate()) {
6503 Diag(CI.
getLoc(), diag::warn_ignored_ms_inheritance)
6521 StringRef N(
"mutex");
6523 if (AL.
getKind() == ParsedAttr::AT_Capability &&
6536 if (!D->
hasAttr<CapabilityAttr>()) {
6537 S.
Diag(AL.
getLoc(), diag::warn_thread_attribute_requires_preceded)
6538 << AL << cast<NamedDecl>(D) <<
"'capability'";
6551 AssertCapabilityAttr(S.
Context, AL, Args.data(), Args.size()));
6556 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6580 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6593 if (
const auto *ParmDecl = dyn_cast<ParmVarDecl>(D);
6606 RequiresCapabilityAttr *RCA = ::new (S.
Context)
6607 RequiresCapabilityAttr(S.
Context, AL, Args.data(), Args.size());
6613 if (
const auto *NSD = dyn_cast<NamespaceDecl>(D)) {
6614 if (NSD->isAnonymousNamespace()) {
6615 S.
Diag(AL.
getLoc(), diag::warn_deprecated_anonymous_namespace);
6629 StringRef Str, Replacement;
6642 S.
Diag(AL.
getLoc(), diag::ext_cxx14_attr) << AL;
6648 if (
const auto *S = dyn_cast<VarDecl>(D))
6649 return S->hasGlobalStorage();
6654 return Sanitizer ==
"address" || Sanitizer ==
"hwaddress" ||
6655 Sanitizer ==
"memtag";
6662 std::vector<StringRef> Sanitizers;
6664 for (
unsigned I = 0, E = AL.
getNumArgs(); I != E; ++I) {
6665 StringRef SanitizerName;
6673 SanitizerName !=
"coverage")
6674 S.
Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName;
6676 S.
Diag(D->
getLocation(), diag::warn_attribute_type_not_supported_global)
6677 << AL << SanitizerName;
6678 Sanitizers.push_back(SanitizerName);
6682 Sanitizers.size()));
6695 unsigned TranslatedSpellingIndex = 0;
6697 TranslatedSpellingIndex = 1;
6706 StringRef SanitizerName =
"address";
6709 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6713 StringRef SanitizerName =
"thread";
6716 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6720 StringRef SanitizerName =
"memory";
6723 NoSanitizeAttr(S.
Context, Info, &SanitizerName, 1));
6738 ZeroCallUsedRegsAttr::ZeroCallUsedRegsKind Kind;
6739 if (!ZeroCallUsedRegsAttr::ConvertStrToZeroCallUsedRegsKind(KindStr, Kind)) {
6740 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6745 D->
dropAttr<ZeroCallUsedRegsAttr>();
6750 auto *FD = dyn_cast<FieldDecl>(D);
6760 case ParsedAttr::AT_CountedBy:
6761 CountInBytes =
false;
6764 case ParsedAttr::AT_CountedByOrNull:
6765 CountInBytes =
false;
6768 case ParsedAttr::AT_SizedBy:
6769 CountInBytes =
true;
6772 case ParsedAttr::AT_SizedByOrNull:
6773 CountInBytes =
true;
6777 llvm_unreachable(
"unexpected counted_by family attribute");
6784 FD->
getType(), CountExpr, CountInBytes, OrNull);
6795 FunctionReturnThunksAttr::Kind Kind;
6796 if (!FunctionReturnThunksAttr::ConvertStrToKind(KindStr, Kind)) {
6797 S.
Diag(LiteralLoc, diag::warn_attribute_type_not_supported)
6804 D->
dropAttr<FunctionReturnThunksAttr>();
6805 D->
addAttr(FunctionReturnThunksAttr::Create(S.
Context, Kind, AL));
6815 auto *VDecl = dyn_cast<VarDecl>(D);
6816 if (VDecl && !VDecl->isFunctionPointerType()) {
6817 S.
Diag(AL.
getLoc(), diag::warn_attribute_ignored_non_function_pointer)
6831 << (A.
getKind() == ParsedAttr::AT_AlwaysDestroy);
6835 if (A.
getKind() == ParsedAttr::AT_AlwaysDestroy)
6843 "uninitialized is only valid on automatic duration variables");
6854 bool IsKernReturnT =
false;
6856 IsKernReturnT = (TT->getDecl()->getName() ==
"kern_return_t");
6861 diag::warn_mig_server_routine_does_not_return_kern_return_t);
6871 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6874 S.
Diag(AL.
getLoc(), diag::warn_declspec_allocator_nonpointer)
6887 if (
const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
6888 if (PVD->getType()->isIntegerType()) {
6889 S.
Diag(AL.
getLoc(), diag::err_attribute_output_parameter)
6900template<
typename Attr>
6908template<
typename Attr>
6917 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
6922 CFGuardAttr::GuardArg Arg;
6924 if (!CFGuardAttr::ConvertStrToGuardArg(II->
getName(), Arg)) {
6925 S.
Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported) << AL << II;
6933template <
typename AttrTy>
6936 auto I = llvm::find_if(Attrs,
6937 [Name](
const AttrTy *A) {
6938 return A->getTCBName() == Name;
6940 return I == Attrs.end() ?
nullptr : *I;
6943template <
typename AttrTy,
typename ConflictingAttrTy>
6950 if (
const ConflictingAttrTy *ConflictingAttr =
6954 S.
Diag(AL.
getLoc(), diag::err_tcb_conflicting_attributes)
6968template <
typename AttrTy,
typename ConflictingAttrTy>
6971 StringRef TCBName = AL.getTCBName();
6972 if (
const ConflictingAttrTy *ConflictingAttr =
6974 S.
Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes)
6975 << ConflictingAttr->getAttrName()->getName()
6976 << AL.getAttrName()->getName() << TCBName;
6979 S.
Diag(AL.getLoc(), diag::note_conflicting_attribute);
6987 return ::new(Context) AttrTy(Context, AL, AL.getTCBName());
6996 Decl *D,
const EnforceTCBLeafAttr &AL) {
7006 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7011 S.
Diag(AL.
getLoc(), diag::err_attribute_too_few_arguments) << AL;
7016 if (D->
getAttr<VTablePointerAuthenticationAttr>()) {
7017 S.
Diag(AL.
getLoc(), diag::err_duplicated_vtable_pointer_auth) <<
Decl;
7021 auto KeyType = VTablePointerAuthenticationAttr::VPtrAuthKeyType::DefaultKey;
7024 if (!VTablePointerAuthenticationAttr::ConvertStrToVPtrAuthKeyType(
7026 S.
Diag(IL->
getLoc(), diag::err_invalid_authentication_key)
7030 if (KeyType == VTablePointerAuthenticationAttr::DefaultKey &&
7032 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 0;
7036 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7041 auto AddressDiversityMode = VTablePointerAuthenticationAttr::
7042 AddressDiscriminationMode::DefaultAddressDiscrimination;
7046 if (!VTablePointerAuthenticationAttr::
7047 ConvertStrToAddressDiscriminationMode(
7049 S.
Diag(IL->
getLoc(), diag::err_invalid_address_discrimination)
7053 if (AddressDiversityMode ==
7054 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination &&
7056 S.
Diag(IL->
getLoc(), diag::err_no_default_vtable_pointer_auth) << 1;
7060 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7065 auto ED = VTablePointerAuthenticationAttr::ExtraDiscrimination::
7066 DefaultExtraDiscrimination;
7070 if (!VTablePointerAuthenticationAttr::ConvertStrToExtraDiscrimination(
7072 S.
Diag(IL->
getLoc(), diag::err_invalid_extra_discrimination)
7076 if (ED == VTablePointerAuthenticationAttr::DefaultExtraDiscrimination &&
7078 S.
Diag(AL.
getLoc(), diag::err_no_default_vtable_pointer_auth) << 2;
7082 S.
Diag(AL.
getLoc(), diag::err_attribute_argument_type)
7087 uint32_t CustomDiscriminationValue = 0;
7088 if (ED == VTablePointerAuthenticationAttr::CustomDiscrimination) {
7090 S.
Diag(AL.
getLoc(), diag::err_missing_custom_discrimination) << AL << 4;
7095 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 4;
7100 CustomDiscriminationValue)) {
7101 S.
Diag(AL.
getLoc(), diag::err_invalid_custom_discrimination);
7104 }
else if (NumArgs > 3) {
7105 S.
Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 3;
7110 S.
Context, AL, KeyType, AddressDiversityMode, ED,
7111 CustomDiscriminationValue));
7118 return Existing->getModularImplFn() == ModularImplFn &&
7119 Existing->getImplName() == ImplName &&
7120 Existing->aspects_size() == Aspects.size() &&
7121 llvm::equal(Existing->aspects(), Aspects);
7127 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7129 Diag(Existing->getLocation(), diag::err_duplicate_attribute) << *Existing;
7130 Diag(CI.
getLoc(), diag::note_conflicting_attribute);
7134 return ::new (
Context) ModularFormatAttr(
Context, CI, ModularImplFn, ImplName,
7135 Aspects.data(), Aspects.size());
7144 llvm::DenseSet<StringRef> SeenAspects;
7145 for (
unsigned I = 2, E = AL.
getNumArgs(); I != E; ++I) {
7149 if (!SeenAspects.insert(Aspect).second) {
7151 diag::err_modular_format_duplicate_aspect)
7156 Aspects.push_back(Aspect);
7162 llvm::sort(Aspects);
7165 if (
const auto *Existing = D->
getAttr<ModularFormatAttr>()) {
7167 S.
Diag(AL.
getLoc(), diag::err_duplicate_attribute) << *Existing;
7168 S.
Diag(Existing->getLoc(), diag::note_conflicting_attribute);
7175 S.
Context, AL, ModularImplFn, ImplName, Aspects.data(), Aspects.size()));
7191 for (
size_t I = 0; I < std::min(AL.
getNumArgs(), AttrNumArgs); ++I) {
7192 bool IsLastAttrArg = I == (AttrNumArgs - 1);
7195 if (IsLastAttrArg && AttrHasVariadicArg)
7203 return !(IsLastAttrArg && ArgMemberCanHoldExpr);
7239 S.
Diag(AL.
getLoc(), diag::err_keyword_not_supported_on_target)
7242 S.
Diag(AL.
getLoc(), diag::warn_unhandled_ms_attribute_ignored)
7257 if (MustDelayArgs) {
7267 assert(AL.
isTypeAttr() &&
"Non-type attribute not handled");
7293 S.
Diag(AL.
getLoc(), diag::warn_type_attribute_deprecated_on_decl)
7302 if (AL.
getKind() == ParsedAttr::AT_Regparm) {
7315 if (AL.
getKind() == ParsedAttr::AT_VectorSize) {
7325 if (AL.
getKind() == ParsedAttr::AT_NoDeref) {
7336 S.
Diag(AL.
getLoc(), diag::err_attribute_invalid_on_decl)
7339 case ParsedAttr::AT_Interrupt:
7342 case ParsedAttr::AT_ARMInterruptSaveFP:
7345 case ParsedAttr::AT_X86ForceAlignArgPointer:
7348 case ParsedAttr::AT_ReadOnlyPlacement:
7351 case ParsedAttr::AT_DLLExport:
7352 case ParsedAttr::AT_DLLImport:
7355 case ParsedAttr::AT_AMDGPUFlatWorkGroupSize:
7358 case ParsedAttr::AT_AMDGPUWavesPerEU:
7361 case ParsedAttr::AT_AMDGPUNumSGPR:
7364 case ParsedAttr::AT_AMDGPUNumVGPR:
7367 case ParsedAttr::AT_AMDGPUMaxNumWorkGroups:
7370 case ParsedAttr::AT_AVRSignal:
7373 case ParsedAttr::AT_BPFPreserveAccessIndex:
7376 case ParsedAttr::AT_BPFPreserveStaticOffset:
7379 case ParsedAttr::AT_BTFDeclTag:
7382 case ParsedAttr::AT_WebAssemblyExportName:
7385 case ParsedAttr::AT_WebAssemblyImportModule:
7388 case ParsedAttr::AT_WebAssemblyImportName:
7391 case ParsedAttr::AT_IBOutlet:
7394 case ParsedAttr::AT_IBOutletCollection:
7397 case ParsedAttr::AT_IFunc:
7400 case ParsedAttr::AT_Alias:
7403 case ParsedAttr::AT_Aligned:
7406 case ParsedAttr::AT_AlignValue:
7409 case ParsedAttr::AT_AllocSize:
7412 case ParsedAttr::AT_AlwaysInline:
7415 case ParsedAttr::AT_AnalyzerNoReturn:
7418 case ParsedAttr::AT_TLSModel:
7421 case ParsedAttr::AT_Annotate:
7424 case ParsedAttr::AT_Availability:
7427 case ParsedAttr::AT_CarriesDependency:
7430 case ParsedAttr::AT_CPUDispatch:
7431 case ParsedAttr::AT_CPUSpecific:
7434 case ParsedAttr::AT_Common:
7437 case ParsedAttr::AT_CUDAConstant:
7440 case ParsedAttr::AT_PassObjectSize:
7443 case ParsedAttr::AT_Constructor:
7446 case ParsedAttr::AT_Deprecated:
7449 case ParsedAttr::AT_Destructor:
7452 case ParsedAttr::AT_EnableIf:
7455 case ParsedAttr::AT_Error:
7458 case ParsedAttr::AT_ExcludeFromExplicitInstantiation:
7461 case ParsedAttr::AT_DiagnoseIf:
7464 case ParsedAttr::AT_DiagnoseAsBuiltin:
7467 case ParsedAttr::AT_NoBuiltin:
7470 case ParsedAttr::AT_CFIUncheckedCallee:
7473 case ParsedAttr::AT_ExtVectorType:
7476 case ParsedAttr::AT_ExternalSourceSymbol:
7479 case ParsedAttr::AT_MinSize:
7482 case ParsedAttr::AT_OptimizeNone:
7485 case ParsedAttr::AT_EnumExtensibility:
7488 case ParsedAttr::AT_SYCLKernel:
7491 case ParsedAttr::AT_SYCLExternal:
7494 case ParsedAttr::AT_SYCLKernelEntryPoint:
7497 case ParsedAttr::AT_SYCLSpecialClass:
7500 case ParsedAttr::AT_Format:
7503 case ParsedAttr::AT_FormatMatches:
7506 case ParsedAttr::AT_FormatArg:
7509 case ParsedAttr::AT_Callback:
7512 case ParsedAttr::AT_LifetimeCaptureBy:
7515 case ParsedAttr::AT_CalledOnce:
7518 case ParsedAttr::AT_CUDAGlobal:
7521 case ParsedAttr::AT_CUDADevice:
7524 case ParsedAttr::AT_CUDAGridConstant:
7527 case ParsedAttr::AT_HIPManaged:
7530 case ParsedAttr::AT_GNUInline:
7533 case ParsedAttr::AT_CUDALaunchBounds:
7536 case ParsedAttr::AT_CUDAClusterDims:
7539 case ParsedAttr::AT_CUDANoCluster:
7542 case ParsedAttr::AT_Restrict:
7545 case ParsedAttr::AT_MallocSpan:
7548 case ParsedAttr::AT_Mode:
7551 case ParsedAttr::AT_NonString:
7554 case ParsedAttr::AT_NonNull:
7555 if (
auto *PVD = dyn_cast<ParmVarDecl>(D))
7560 case ParsedAttr::AT_ReturnsNonNull:
7563 case ParsedAttr::AT_NoEscape:
7566 case ParsedAttr::AT_MaybeUndef:
7569 case ParsedAttr::AT_AssumeAligned:
7572 case ParsedAttr::AT_AllocAlign:
7575 case ParsedAttr::AT_Ownership:
7578 case ParsedAttr::AT_Naked:
7581 case ParsedAttr::AT_NoReturn:
7584 case ParsedAttr::AT_CXX11NoReturn:
7587 case ParsedAttr::AT_AnyX86NoCfCheck:
7590 case ParsedAttr::AT_NoThrow:
7594 case ParsedAttr::AT_CUDAShared:
7597 case ParsedAttr::AT_VecReturn:
7600 case ParsedAttr::AT_ObjCOwnership:
7603 case ParsedAttr::AT_ObjCPreciseLifetime:
7606 case ParsedAttr::AT_ObjCReturnsInnerPointer:
7609 case ParsedAttr::AT_ObjCRequiresSuper:
7612 case ParsedAttr::AT_ObjCBridge:
7615 case ParsedAttr::AT_ObjCBridgeMutable:
7618 case ParsedAttr::AT_ObjCBridgeRelated:
7621 case ParsedAttr::AT_ObjCDesignatedInitializer:
7624 case ParsedAttr::AT_ObjCRuntimeName:
7627 case ParsedAttr::AT_ObjCBoxable:
7630 case ParsedAttr::AT_NSErrorDomain:
7633 case ParsedAttr::AT_CFConsumed:
7634 case ParsedAttr::AT_NSConsumed:
7635 case ParsedAttr::AT_OSConsumed:
7640 case ParsedAttr::AT_OSReturnsRetainedOnZero:
7643 diag::warn_ns_attribute_wrong_parameter_type,
7646 case ParsedAttr::AT_OSReturnsRetainedOnNonZero:
7649 diag::warn_ns_attribute_wrong_parameter_type,
7652 case ParsedAttr::AT_NSReturnsAutoreleased:
7653 case ParsedAttr::AT_NSReturnsNotRetained:
7654 case ParsedAttr::AT_NSReturnsRetained:
7655 case ParsedAttr::AT_CFReturnsNotRetained:
7656 case ParsedAttr::AT_CFReturnsRetained:
7657 case ParsedAttr::AT_OSReturnsNotRetained:
7658 case ParsedAttr::AT_OSReturnsRetained:
7661 case ParsedAttr::AT_WorkGroupSizeHint:
7664 case ParsedAttr::AT_ReqdWorkGroupSize:
7667 case ParsedAttr::AT_OpenCLIntelReqdSubGroupSize:
7670 case ParsedAttr::AT_VecTypeHint:
7673 case ParsedAttr::AT_InitPriority:
7676 case ParsedAttr::AT_Packed:
7679 case ParsedAttr::AT_PreferredName:
7682 case ParsedAttr::AT_NoSpecializations:
7685 case ParsedAttr::AT_Section:
7688 case ParsedAttr::AT_CodeModel:
7691 case ParsedAttr::AT_RandomizeLayout:
7694 case ParsedAttr::AT_NoRandomizeLayout:
7697 case ParsedAttr::AT_CodeSeg:
7700 case ParsedAttr::AT_Target:
7703 case ParsedAttr::AT_TargetVersion:
7706 case ParsedAttr::AT_TargetClones:
7709 case ParsedAttr::AT_MinVectorWidth:
7712 case ParsedAttr::AT_Unavailable:
7715 case ParsedAttr::AT_OMPAssume:
7718 case ParsedAttr::AT_ObjCDirect:
7721 case ParsedAttr::AT_ObjCDirectMembers:
7725 case ParsedAttr::AT_ObjCExplicitProtocolImpl:
7728 case ParsedAttr::AT_Unused:
7731 case ParsedAttr::AT_Visibility:
7734 case ParsedAttr::AT_TypeVisibility:
7737 case ParsedAttr::AT_WarnUnusedResult:
7740 case ParsedAttr::AT_WeakRef:
7743 case ParsedAttr::AT_WeakImport:
7746 case ParsedAttr::AT_TransparentUnion:
7749 case ParsedAttr::AT_ObjCMethodFamily:
7752 case ParsedAttr::AT_ObjCNSObject:
7755 case ParsedAttr::AT_ObjCIndependentClass:
7758 case ParsedAttr::AT_Blocks:
7761 case ParsedAttr::AT_Sentinel:
7764 case ParsedAttr::AT_Cleanup:
7767 case ParsedAttr::AT_NoDebug:
7770 case ParsedAttr::AT_CmseNSEntry:
7773 case ParsedAttr::AT_StdCall:
7774 case ParsedAttr::AT_CDecl:
7775 case ParsedAttr::AT_FastCall:
7776 case ParsedAttr::AT_ThisCall:
7777 case ParsedAttr::AT_Pascal:
7778 case ParsedAttr::AT_RegCall:
7779 case ParsedAttr::AT_SwiftCall:
7780 case ParsedAttr::AT_SwiftAsyncCall:
7781 case ParsedAttr::AT_VectorCall:
7782 case ParsedAttr::AT_MSABI:
7783 case ParsedAttr::AT_SysVABI:
7784 case ParsedAttr::AT_Pcs:
7785 case ParsedAttr::AT_IntelOclBicc:
7786 case ParsedAttr::AT_PreserveMost:
7787 case ParsedAttr::AT_PreserveAll:
7788 case ParsedAttr::AT_AArch64VectorPcs:
7789 case ParsedAttr::AT_AArch64SVEPcs:
7790 case ParsedAttr::AT_M68kRTD:
7791 case ParsedAttr::AT_PreserveNone:
7792 case ParsedAttr::AT_RISCVVectorCC:
7793 case ParsedAttr::AT_RISCVVLSCC:
7796 case ParsedAttr::AT_DeviceKernel:
7799 case ParsedAttr::AT_Suppress:
7802 case ParsedAttr::AT_Owner:
7803 case ParsedAttr::AT_Pointer:
7806 case ParsedAttr::AT_OpenCLAccess:
7809 case ParsedAttr::AT_OpenCLNoSVM:
7812 case ParsedAttr::AT_SwiftContext:
7815 case ParsedAttr::AT_SwiftAsyncContext:
7818 case ParsedAttr::AT_SwiftErrorResult:
7821 case ParsedAttr::AT_SwiftIndirectResult:
7824 case ParsedAttr::AT_InternalLinkage:
7827 case ParsedAttr::AT_ZeroCallUsedRegs:
7830 case ParsedAttr::AT_FunctionReturnThunks:
7833 case ParsedAttr::AT_NoMerge:
7836 case ParsedAttr::AT_NoUniqueAddress:
7840 case ParsedAttr::AT_AvailableOnlyInDefaultEvalMethod:
7844 case ParsedAttr::AT_CountedBy:
7845 case ParsedAttr::AT_CountedByOrNull:
7846 case ParsedAttr::AT_SizedBy:
7847 case ParsedAttr::AT_SizedByOrNull:
7852 case ParsedAttr::AT_LayoutVersion:
7855 case ParsedAttr::AT_Uuid:
7858 case ParsedAttr::AT_MSInheritance:
7861 case ParsedAttr::AT_Thread:
7864 case ParsedAttr::AT_MSConstexpr:
7867 case ParsedAttr::AT_HybridPatchable:
7872 case ParsedAttr::AT_RootSignature:
7875 case ParsedAttr::AT_HLSLNumThreads:
7878 case ParsedAttr::AT_HLSLWaveSize:
7881 case ParsedAttr::AT_HLSLVkExtBuiltinInput:
7884 case ParsedAttr::AT_HLSLVkPushConstant:
7887 case ParsedAttr::AT_HLSLVkConstantId:
7890 case ParsedAttr::AT_HLSLVkBinding:
7893 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
7896 case ParsedAttr::AT_HLSLPackOffset:
7899 case ParsedAttr::AT_HLSLShader:
7902 case ParsedAttr::AT_HLSLResourceBinding:
7905 case ParsedAttr::AT_HLSLParamModifier:
7908 case ParsedAttr::AT_HLSLUnparsedSemantic:
7911 case ParsedAttr::AT_HLSLVkLocation:
7915 case ParsedAttr::AT_AbiTag:
7918 case ParsedAttr::AT_CFGuard:
7923 case ParsedAttr::AT_PtGuardedVar:
7926 case ParsedAttr::AT_NoSanitize:
7929 case ParsedAttr::AT_NoSanitizeAddress:
7932 case ParsedAttr::AT_NoSanitizeThread:
7935 case ParsedAttr::AT_NoSanitizeMemory:
7938 case ParsedAttr::AT_GuardedBy:
7941 case ParsedAttr::AT_PtGuardedBy:
7944 case ParsedAttr::AT_LockReturned:
7947 case ParsedAttr::AT_LocksExcluded:
7950 case ParsedAttr::AT_AcquiredBefore:
7953 case ParsedAttr::AT_AcquiredAfter:
7958 case ParsedAttr::AT_Capability:
7959 case ParsedAttr::AT_Lockable:
7962 case ParsedAttr::AT_ReentrantCapability:
7965 case ParsedAttr::AT_RequiresCapability:
7969 case ParsedAttr::AT_AssertCapability:
7972 case ParsedAttr::AT_AcquireCapability:
7975 case ParsedAttr::AT_ReleaseCapability:
7978 case ParsedAttr::AT_TryAcquireCapability:
7983 case ParsedAttr::AT_Consumable:
7986 case ParsedAttr::AT_CallableWhen:
7989 case ParsedAttr::AT_ParamTypestate:
7992 case ParsedAttr::AT_ReturnTypestate:
7995 case ParsedAttr::AT_SetTypestate:
7998 case ParsedAttr::AT_TestTypestate:
8003 case ParsedAttr::AT_ArgumentWithTypeTag:
8006 case ParsedAttr::AT_TypeTagForDatatype:
8011 case ParsedAttr::AT_SwiftAsyncName:
8014 case ParsedAttr::AT_SwiftAttr:
8017 case ParsedAttr::AT_SwiftBridge:
8020 case ParsedAttr::AT_SwiftError:
8023 case ParsedAttr::AT_SwiftName:
8026 case ParsedAttr::AT_SwiftNewType:
8029 case ParsedAttr::AT_SwiftAsync:
8032 case ParsedAttr::AT_SwiftAsyncError:
8037 case ParsedAttr::AT_XRayLogArgs:
8041 case ParsedAttr::AT_PatchableFunctionEntry:
8045 case ParsedAttr::AT_AlwaysDestroy:
8046 case ParsedAttr::AT_NoDestroy:
8050 case ParsedAttr::AT_Uninitialized:
8054 case ParsedAttr::AT_ObjCExternallyRetained:
8058 case ParsedAttr::AT_MIGServerRoutine:
8062 case ParsedAttr::AT_MSAllocator:
8066 case ParsedAttr::AT_ArmBuiltinAlias:
8070 case ParsedAttr::AT_ArmLocallyStreaming:
8074 case ParsedAttr::AT_ArmNew:
8078 case ParsedAttr::AT_AcquireHandle:
8082 case ParsedAttr::AT_ReleaseHandle:
8086 case ParsedAttr::AT_UnsafeBufferUsage:
8090 case ParsedAttr::AT_UseHandle:
8094 case ParsedAttr::AT_EnforceTCB:
8098 case ParsedAttr::AT_EnforceTCBLeaf:
8102 case ParsedAttr::AT_BuiltinAlias:
8106 case ParsedAttr::AT_PreferredType:
8110 case ParsedAttr::AT_UsingIfExists:
8114 case ParsedAttr::AT_TypeNullable:
8118 case ParsedAttr::AT_VTablePointerAuthentication:
8122 case ParsedAttr::AT_ModularFormat:
8126 case ParsedAttr::AT_MSStruct:
8130 case ParsedAttr::AT_GCCStruct:
8138 return D->
hasAttr<DeviceKernelAttr>() ||
8146 if (AttrList.
empty())
8157 Diag(AttrList.
begin()->getLoc(), diag::err_attribute_weakref_without_alias)
8167 if (!(D->
hasAttr<DeviceKernelAttr>() ||
8168 (D->
hasAttr<CUDAGlobalAttr>() &&
8169 Context.getTargetInfo().getTriple().isSPIRV()))) {
8171 if (
const auto *A = D->
getAttr<ReqdWorkGroupSizeAttr>()) {
8176 }
else if (
const auto *A = D->
getAttr<WorkGroupSizeHintAttr>()) {
8179 }
else if (
const auto *A = D->
getAttr<VecTypeHintAttr>()) {
8182 }
else if (
const auto *A = D->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
8188 if (
const auto *A = D->
getAttr<AMDGPUFlatWorkGroupSizeAttr>()) {
8192 }
else if (
const auto *A = D->
getAttr<AMDGPUWavesPerEUAttr>()) {
8196 }
else if (
const auto *A = D->
getAttr<AMDGPUNumSGPRAttr>()) {
8200 }
else if (
const auto *A = D->
getAttr<AMDGPUNumVGPRAttr>()) {
8217 if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
8218 bool HasHost = Guide->hasAttr<CUDAHostAttr>();
8219 bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
8220 bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
8222 if (HasGlobal || HasHost != HasDevice) {
8223 Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
8224 Guide->setInvalidDecl();
8225 }
else if (HasHost && HasDevice) {
8226 Diag(Guide->getLocation(),
8227 diag::warn_deduction_guide_target_attr_deprecated);
8233 (D->
hasAttr<ConstructorAttr>() || D->
hasAttr<DestructorAttr>()) &&
8236 << (D->
hasAttr<ConstructorAttr>() ?
"constructors" :
"destructors");
8245 if (D->
hasAttr<ObjCDesignatedInitializerAttr>() &&
8248 D->
dropAttr<ObjCDesignatedInitializerAttr>();
8255 if (AL.getKind() == ParsedAttr::AT_TransparentUnion) {
8262 if (D && D->
hasAttr<BPFPreserveAccessIndexAttr>())
8269 if (AL.getKind() == ParsedAttr::AT_Annotate) {
8273 Diag(AL.getLoc(), diag::err_only_annotate_after_access_spec);
8285 if (AL.isUsedAsTypeAttr() || AL.isInvalid())
8293 S.
Diag(AL.getLoc(), diag::warn_attribute_not_on_decl) << AL
8310 std::optional<StringRef> CorrectedScopeName =
8312 if (CorrectedScopeName) {
8313 ScopeName = *CorrectedScopeName;
8319 if (CorrectedAttrName) {
8320 AttrName = *CorrectedAttrName;
8323 if (CorrectedScopeName || CorrectedAttrName) {
8324 std::string CorrectedFullName =
8328 diag::warn_unknown_attribute_ignored_suggestion);
8330 D << AL << CorrectedFullName;
8335 if (CorrectedScopeName) {
8339 if (CorrectedAttrName) {
8344 Diag(NR.
getBegin(), diag::warn_unknown_attribute_ignored) << AL << NR;
8352 if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
8374 for (
const auto &AI : FT->param_types()) {
8376 Param->setScopeInfo(0, Params.size());
8377 Params.push_back(Param);
8379 NewFD->setParams(Params);
8381 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
8383 VD->getInnerLocStart(), VD->getLocation(), II,
8384 VD->getType(), VD->getTypeSourceInfo(),
8385 VD->getStorageClass());
8386 if (VD->getQualifier())
8387 cast<VarDecl>(NewD)->setQualifierInfo(VD->getQualifierLoc());
8420 if (
auto *VD = dyn_cast<VarDecl>(D))
8421 if (VD->isExternC())
8423 if (
auto *FD = dyn_cast<FunctionDecl>(D))
8431 auto &WeakInfos = I->second;
8432 for (
const auto &W : WeakInfos)
8434 std::remove_reference_t<
decltype(WeakInfos)> EmptyWeakInfos;
8435 WeakInfos.swap(EmptyWeakInfos);
8447 auto ProcessAttributesWithSliding =
8455 if ((AL.isStandardAttributeSyntax() || AL.isAlignas()) &&
8456 AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
8461 AL.diagnoseAppertainsTo(*
this, D);
8476 .WithIncludeCXX11Attributes(
false)
8477 .WithIgnoreTypeAttributes(
true));
8486 .WithIncludeCXX11Attributes(
false)
8487 .WithIgnoreTypeAttributes(
true));
8505 UnavailableAttr::ImplicitReason &reason) {
8519 if (
diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_disabled ||
8520 diag.getForbiddenTypeDiagnostic() == diag::err_arc_weak_no_runtime) {
8521 reason = UnavailableAttr::IR_ForbiddenWeak;
8530 reason = UnavailableAttr::IR_ARCForbiddenType;
8540 auto Reason = UnavailableAttr::IR_None;
8542 assert(Reason &&
"didn't set reason?");
8547 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
8550 if (FD->
hasAttr<UnavailableAttr>() &&
8552 diag::err_arc_array_param_no_ownership) {
8583 bool AnyAccessFailures =
false;
8591 switch (
diag.Kind) {
8595 if (!
decl->isInvalidDecl())
8607 AnyAccessFailures =
true;
8620 assert(curPool &&
"re-emitting in undelayed context not supported");
8621 curPool->
steal(pool);
8638 QualType ParamTy = FD->getParamDecl(0)->getType();
8640 FD->getParamDecl(0)->getLocation(), ParamTy, Ty))) {
8641 this->
Diag(Attr->getArgLoc(),
8642 diag::err_attribute_cleanup_func_arg_incompatible_type)
8643 << NI.
getName() << ParamTy << Ty;
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 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.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array 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.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
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 ...
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.
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.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
const FunctionProtoType * T
bool isFunctionOrMethodVariadic(const Decl *D)
@ Template
We are parsing a template declaration.
bool isFuncOrMethodForAttrSubject(const Decl *D)
isFuncOrMethodForAttrSubject - Return true if the given decl has function type (function or function-...
OffloadArch StringToOffloadArch(llvm::StringRef S)
LLVM_READONLY bool isHexDigit(unsigned char c)
Return true if this character is an ASCII hex digit: [0-9a-fA-F].
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
const char * OffloadArchToString(OffloadArch A)
void handleSimpleAttribute(SemaBase &S, Decl *D, const AttributeCommonInfo &CI)
Applies the given attribute to the Decl without performing any additional semantic checking.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool hasImplicitObjectParameter(const Decl *D)
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Generic
not a target-specific vector type
U cast(CodeGen::Address addr)
SourceRange getFunctionOrMethodParamRange(const Decl *D, unsigned Idx)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
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