32 : S(S), SlotLabel(SlotLabel), ShouldAct(ShouldAct) {
67 }
else if (IsPackSet) {
69 RD->
addAttr(MaxFieldAlignmentAttr::CreateImplicit(
82 if (AlignPackedInclude.CurrentPragmaLocation !=
85 if (AlignPackedInclude.HasNonDefaultValue)
86 AlignPackedInclude.ShouldWarnOnInclude =
true;
98 RD->
addAttr(MSVtorDispAttr::CreateImplicit(
102template <
typename Attribute>
105 if (
Record->hasAttr<OwnerAttr>() ||
Record->hasAttr<PointerAttr>())
109 Redecl->addAttr(Attribute::CreateImplicit(
Context,
nullptr));
114 if (!UnderlyingRecord)
121 static const llvm::StringSet<> Containers{
137 "unordered_multiset",
138 "unordered_multimap",
141 static const llvm::StringSet<> Iterators{
"iterator",
"const_iterator",
143 "const_reverse_iterator"};
145 if (
Parent->isInStdNamespace() && Iterators.count(ND->
getName()) &&
146 Containers.count(
Parent->getName()))
147 addGslOwnerPointerAttributeIfNotExisting<PointerAttr>(
Context,
158 dyn_cast<TemplateSpecializationType>(Canonical.
getTypePtr())) {
160 RD = dyn_cast_or_null<CXXRecordDecl>(
161 TST->getTemplateName().getAsTemplateDecl()->getTemplatedDecl());
169 static const llvm::StringSet<> StdOwners{
189 "unordered_multiset",
190 "unordered_multimap",
193 static const llvm::StringSet<> StdPointers{
200 if (!
Record->getIdentifier())
204 if (
Record->isInStdNamespace()) {
205 if (
Record->hasAttr<OwnerAttr>() ||
Record->hasAttr<PointerAttr>())
208 if (StdOwners.count(
Record->getName()))
209 addGslOwnerPointerAttributeIfNotExisting<OwnerAttr>(
Context,
Record);
210 else if (StdPointers.count(
Record->getName()))
211 addGslOwnerPointerAttributeIfNotExisting<PointerAttr>(
Context,
Record);
231 case Builtin::BIaddressof:
232 case Builtin::BI__addressof:
233 case Builtin::BI__builtin_addressof:
234 case Builtin::BIas_const:
235 case Builtin::BIforward:
236 case Builtin::BIforward_like:
237 case Builtin::BImove:
238 case Builtin::BImove_if_noexcept:
240 !
P->hasAttr<LifetimeBoundAttr>())
249 if (
auto *CMD = dyn_cast<CXXMethodDecl>(FD)) {
250 const auto *CRD = CMD->getParent();
251 if (!CRD->isInStdNamespace() || !CRD->getIdentifier())
254 if (isa<CXXConstructorDecl>(CMD)) {
255 auto *Param = CMD->getParamDecl(0);
256 if (Param->hasAttr<LifetimeBoundAttr>())
258 if (CRD->getName() ==
"basic_string_view" &&
259 Param->getType()->isPointerType()) {
265 }
else if (CRD->getName() ==
"span") {
269 if (LRT && LRT->getPointeeType().IgnoreParens()->isArrayType())
278 auto *MD = dyn_cast_if_present<CXXMethodDecl>(FD);
279 if (!MD || !MD->getParent()->isInStdNamespace())
284 if (PVD->hasAttr<LifetimeCaptureByAttr>())
291 if (PVD->getType()->isReferenceType() &&
293 int CaptureByThis[] = {LifetimeCaptureByAttr::This};
295 LifetimeCaptureByAttr::CreateImplicit(
Context, CaptureByThis, 1));
300 if (!MD->getIdentifier()) {
301 static const llvm::StringSet<> MapLikeContainer{
305 "unordered_multimap",
310 if (MD->getOverloadedOperator() == OO_Subscript &&
311 MapLikeContainer.contains(MD->getParent()->getName()))
315 static const llvm::StringSet<> CapturingMethods{
316 "insert",
"insert_or_assign",
"push",
"push_front",
"push_back"};
317 if (!CapturingMethods.contains(MD->getName()))
323 static const llvm::StringSet<>
Nullable{
324 "auto_ptr",
"shared_ptr",
"unique_ptr",
"exception_ptr",
325 "coroutine_handle",
"function",
"move_only_function",
329 !CRD->
hasAttr<TypeNullableAttr>())
331 Redecl->addAttr(TypeNullableAttr::CreateImplicit(
Context));
361 Diag(PragmaLoc, diag::err_pragma_options_align_mac68k_target_unsupported);
376 Diag(PragmaLoc, diag::warn_pragma_options_align_reset_failed)
415 llvm_unreachable(
"invalid clang section kind");
424 Diag(PragmaLoc, diag::err_pragma_section_invalid_for_target)
439 StringRef SlotLabel,
Expr *Alignment) {
442 if (IsXLPragma && !SlotLabel.empty()) {
443 Diag(PragmaLoc, diag::err_pragma_pack_identifer_not_supported);
450 unsigned AlignmentVal = 0;
454 std::optional<llvm::APSInt> Val;
460 !(*Val == 0 || Val->isPowerOf2()) || Val->getZExtValue() > 16) {
461 Diag(PragmaLoc, diag::warn_pragma_pack_invalid_alignment);
465 if (IsXLPragma && *Val == 0) {
467 Diag(PragmaLoc, diag::err_pragma_pack_invalid_alignment);
471 AlignmentVal = (
unsigned)Val->getZExtValue();
481 Diag(PragmaLoc, diag::warn_pragma_pack_show) <<
"mac68k";
483 Diag(PragmaLoc, diag::warn_pragma_pack_show) << AlignmentVal;
489 if (Alignment && !SlotLabel.empty())
490 Diag(PragmaLoc, diag::warn_pragma_pack_pop_identifier_and_alignment);
493 "Empty pack stack can only be at Native alignment mode.");
494 Diag(PragmaLoc, diag::warn_pragma_pop_failed) <<
"pack" <<
"stack empty";
506 for (
unsigned Idx = 0; Idx < Args.size(); Idx++) {
507 Expr *&
E = Args.begin()[Idx];
508 assert(
E &&
"error are handled before");
516 clang::CK_ArrayToPointerDecay)
521 clang::CK_FunctionToPointerDecay,
E,
nullptr,
525 clang::CK_LValueToRValue,
E,
nullptr,
537 if (!
Result || !Notes.empty()) {
540 for (
auto &
Note : Notes)
559 bool HasNonDefaultValue =
566 HasNonDefaultValue,
false});
579 Diag(IncludeLoc, diag::warn_pragma_pack_non_default_at_include);
584 Diag(IncludeLoc, diag::warn_pragma_pack_modified_after_include);
592 bool IsInnermost =
true;
597 for (
const auto &StackSlot : llvm::reverse(
AlignPackStack.Stack)) {
598 Diag(StackSlot.PragmaPushLocation, diag::warn_pragma_pack_no_pop_eof);
604 diag::note_pragma_pack_pop_instead_reset);
641 llvm_unreachable(
"invalid pragma eval_method kind");
653 Diag(
Loc, diag::err_setting_eval_method_used_in_unsafe_context) << 0 << 0;
655 Diag(
Loc, diag::err_setting_eval_method_used_in_unsafe_context) << 0 << 1;
657 Diag(
Loc, diag::err_setting_eval_method_used_in_unsafe_context) << 0 << 2;
671 Diag(
Loc, diag::err_pragma_fc_pp_scope);
676 llvm_unreachable(
"invalid pragma float_control kind");
683 Diag(
Loc, diag::err_pragma_fc_noprecise_requires_noexcept);
685 Diag(
Loc, diag::err_pragma_fc_noprecise_requires_nofenv);
692 Diag(
Loc, diag::err_pragma_fc_except_requires_precise);
706 Diag(
Loc, diag::warn_pragma_pop_failed) <<
"float_control"
728 Diag(PragmaLoc, diag::warn_pragma_pop_failed) <<
"vtordisp"
736 llvm::StringRef StackSlotLabel,
737 AlignPackInfo
Value) {
739 CurrentValue = DefaultValue;
740 CurrentPragmaLocation = PragmaLocation;
744 Stack.emplace_back(Slot(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
747 if (!StackSlotLabel.empty()) {
749 auto I = llvm::find_if(llvm::reverse(Stack), [&](
const Slot &x) {
750 return x.StackSlotLabel == StackSlotLabel;
753 if (I != Stack.rend()) {
754 CurrentValue = I->Value;
755 CurrentPragmaLocation = I->PragmaLocation;
756 Stack.erase(std::prev(I.base()), Stack.end());
758 }
else if (
Value.IsXLStack() &&
Value.IsAlignAttr() &&
759 CurrentValue.IsPackAttr()) {
762 auto I = llvm::find_if(llvm::reverse(Stack), [&](
const Slot &x) {
763 return x.Value.IsAlignAttr();
766 if (I != Stack.rend()) {
767 Stack.erase(std::prev(I.base()), Stack.end());
769 CurrentValue = DefaultValue;
770 CurrentPragmaLocation = PragmaLocation;
772 CurrentValue = Stack.back().Value;
773 CurrentPragmaLocation = Stack.back().PragmaLocation;
777 }
else if (!Stack.empty()) {
780 if (
Value.IsXLStack() &&
Value.IsPackAttr() && CurrentValue.IsAlignAttr())
784 CurrentValue = Stack.back().Value;
785 CurrentPragmaLocation = Stack.back().PragmaLocation;
790 CurrentValue =
Value;
791 CurrentPragmaLocation = PragmaLocation;
800 PragmaLocation = A->getLocation();
802 SectionName,
Decl, PragmaLocation, SectionFlags);
806 const auto &Section = SectionIt->second;
807 if (Section.SectionFlags == SectionFlags ||
813 Diag(Section.
Decl->getLocation(), diag::note_declared_at)
814 << Section.
Decl->getName();
816 Diag(PragmaLocation, diag::note_pragma_entered_here);
817 if (Section.PragmaSectionLocation.isValid())
818 Diag(Section.PragmaSectionLocation, diag::note_pragma_entered_here);
827 const auto &Section = SectionIt->second;
828 if (Section.SectionFlags == SectionFlags)
831 Diag(PragmaSectionLocation, diag::err_section_conflict)
832 <<
"this" << Section;
834 Diag(Section.Decl->getLocation(), diag::note_declared_at)
835 << Section.Decl->getName();
836 if (Section.PragmaSectionLocation.isValid())
837 Diag(Section.PragmaSectionLocation, diag::note_pragma_entered_here);
849 llvm::StringRef StackSlotLabel,
851 llvm::StringRef PragmaName) {
853 llvm::StringSwitch<PragmaStack<StringLiteral *> *>(PragmaName)
858 if (Action &
PSK_Pop && Stack->Stack.empty())
859 Diag(PragmaLocation, diag::warn_pragma_pop_failed) << PragmaName
865 if (SegmentName->
getString() ==
".drectve" &&
867 Diag(PragmaLocation, diag::warn_attribute_section_drectve) << PragmaName;
870 Stack->Act(PragmaLocation, Action, StackSlotLabel, SegmentName);
878 Diag(PragmaLocation, diag::warn_pragma_pop_failed) <<
"strict_gs_check"
901 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
904 Diag(PragmaLocation, diag::err_pragma_expected_file_scope) <<
"alloc_text";
922 Diag(
Loc, diag::err_pragma_alloc_text_not_function);
927 Diag(
Loc, diag::err_pragma_alloc_text_c_linkage);
942 if (Lookup.
empty()) {
943 Diag(PragmaLoc, diag::warn_pragma_unused_undeclared_var)
950 Diag(PragmaLoc, diag::warn_pragma_unused_expected_var_arg)
957 Diag(PragmaLoc, diag::warn_used_but_marked_unused) << Name;
960 UnusedAttr::GNU_unused));
965std::optional<attr::SubjectMatchRule>
967 using namespace attr;
971#define ATTR_MATCH_RULE(Value, Spelling, IsAbstract)
972#define ATTR_MATCH_SUB_RULE(Value, Spelling, IsAbstract, Parent, IsNegated) \
975#include "clang/Basic/AttrSubMatchRulesList.inc"
980 using namespace attr;
984#define ATTR_MATCH_RULE(Value, Spelling, IsAbstract)
985#define ATTR_MATCH_SUB_RULE(Value, Spelling, IsAbstract, Parent, IsNegated) \
988#include "clang/Basic/AttrSubMatchRulesList.inc"
1007 llvm::raw_string_ostream
OS(
Result);
1008 for (
const auto &I : llvm::enumerate(Rules)) {
1010 OS << (I.index() == Rules.size() - 1 ?
", and " :
", ");
1025 StrictSubjectMatchRuleSet;
1029 if (StrictSubjectMatchRuleSet.empty()) {
1036 llvm::SmallDenseMap<int, std::pair<int, SourceRange>, 2>
1037 RulesToFirstSpecifiedNegatedSubRule;
1038 for (
const auto &Rule : Rules) {
1040 std::optional<attr::SubjectMatchRule> ParentRule =
1041 getParentAttrMatcherRule(MatchRule);
1044 auto It = Rules.find(*ParentRule);
1045 if (It != Rules.end()) {
1047 Diag(Rule.second.getBegin(),
1048 diag::err_pragma_attribute_matcher_subrule_contradicts_rule)
1052 replacementRangeForListElement(*
this, Rule.second));
1057 if (isNegatedAttrMatcherSubRule(MatchRule))
1058 RulesToFirstSpecifiedNegatedSubRule.insert(
1059 std::make_pair(*ParentRule, Rule));
1061 bool IgnoreNegatedSubRules =
false;
1062 for (
const auto &Rule : Rules) {
1064 std::optional<attr::SubjectMatchRule> ParentRule =
1065 getParentAttrMatcherRule(MatchRule);
1068 auto It = RulesToFirstSpecifiedNegatedSubRule.find(*ParentRule);
1069 if (It != RulesToFirstSpecifiedNegatedSubRule.end() &&
1070 It->second != Rule) {
1073 It->second.second.getBegin(),
1075 err_pragma_attribute_matcher_negated_subrule_contradicts_subrule)
1080 replacementRangeForListElement(*
this, It->second.second));
1082 IgnoreNegatedSubRules =
true;
1083 RulesToFirstSpecifiedNegatedSubRule.erase(It);
1087 if (!IgnoreNegatedSubRules) {
1088 for (
const auto &Rule : Rules)
1091 for (
const auto &Rule : Rules) {
1103 for (
const auto &StrictRule : StrictSubjectMatchRuleSet) {
1105 if (Rules.erase(StrictRule.first)) {
1108 if (StrictRule.second)
1109 SubjectMatchRules.push_back(StrictRule.first);
1113 auto RulesToCheck = Rules;
1114 for (
const auto &Rule : RulesToCheck) {
1116 if (
auto ParentRule = getParentAttrMatcherRule(MatchRule)) {
1117 if (llvm::any_of(StrictSubjectMatchRuleSet,
1118 [ParentRule](
const auto &StrictRule) {
1119 return StrictRule.first == *ParentRule &&
1122 SubjectMatchRules.push_back(MatchRule);
1123 Rules.erase(MatchRule);
1129 if (!Rules.empty()) {
1131 Diag(PragmaLoc, diag::err_pragma_attribute_invalid_matchers)
1134 for (
const auto &Rule : Rules) {
1137 replacementRangeForListElement(*
this, Rule.second));
1139 Diagnostic << attrMatcherRuleListToString(ExtraRules);
1143 Diag(PragmaLoc, diag::err_pragma_attr_attr_no_push);
1148 {PragmaLoc, &Attribute, std::move(SubjectMatchRules),
false});
1161 Diag(PragmaLoc, diag::err_pragma_attribute_stack_mismatch) << 1;
1174 if (!Entry.IsUsed) {
1175 assert(Entry.Attribute &&
"Expected an attribute");
1176 Diag(Entry.Attribute->getLoc(), diag::warn_pragma_attribute_unused)
1177 << *Entry.Attribute;
1178 Diag(PragmaLoc, diag::note_pragma_attribute_region_ends_here);
1187 Diag(PragmaLoc, diag::err_pragma_attribute_stack_mismatch)
1188 << 0 << Namespace->getName();
1190 Diag(PragmaLoc, diag::err_pragma_attribute_stack_mismatch) << 1;
1197 if (
const auto *
P = dyn_cast<ParmVarDecl>(
D))
1198 if (
P->getType()->isVoidType())
1202 for (
auto &Entry : Group.Entries) {
1204 assert(Attribute &&
"Expected an attribute");
1206 "expected #pragma clang attribute");
1209 bool Applies =
false;
1210 for (
const auto &Rule : Entry.MatchRules) {
1218 Entry.IsUsed =
true;
1232 PDiag(diag::note_pragma_attribute_applied_decl_here));
1238 "expected a valid source location");
1240 diag::warn_excess_precision_not_supported)
1241 <<
static_cast<bool>(
Num);
1260 Diag(
Loc, diag::err_pragma_expected_file_scope) <<
"optimize";
1270 Diag(
Loc, diag::err_pragma_expected_file_scope) <<
"function";
1288 StringRef Name = FD->
getName();
1293 std::tie(Section,
Loc) = It->second;
1295 if (!FD->
hasAttr<SectionAttr>())
1310 if (FD->
hasAttr<MinSizeAttr>() || FD->
hasAttr<AlwaysInlineAttr>())
1315 if (!FD->
hasAttr<OptimizeNoneAttr>())
1317 if (!FD->
hasAttr<NoInlineAttr>())
1330typedef std::vector<std::pair<unsigned, SourceLocation> >
VisStack;
1342 unsigned rawType = Stack->back().first;
1345 VisibilityAttr::VisibilityType
type
1346 = (VisibilityAttr::VisibilityType) rawType;
1363 Stack->push_back(std::make_pair(
type, loc));
1370 VisibilityAttr::VisibilityType
T;
1371 if (!VisibilityAttr::ConvertStrToVisibilityType(VisType->
getName(),
T)) {
1372 Diag(PragmaLoc, diag::warn_attribute_unknown_visibility) << VisType;
1416 Diag(
Loc, diag::err_setting_eval_method_used_in_unsafe_context)
1423 NewFPFeatures.setAllowFPReassociateOverride(IsEnabled);
1426 NewFPFeatures.setAllowReciprocalOverride(IsEnabled);
1429 llvm_unreachable(
"unhandled value changing pragma fp");
1438 NewFPFeatures.setConstRoundingModeOverride(FPR);
1446 NewFPFeatures.setSpecifiedExceptionModeOverride(FPE);
1459 Diag(
Loc, diag::err_pragma_fenv_requires_precise);
1461 NewFPFeatures.setAllowFEnvAccessOverride(IsEnabled);
1462 NewFPFeatures.setRoundingMathOverride(IsEnabled);
1470 NewFPFeatures.setComplexRangeOverride(
Range);
1491 Diag(EndLoc, diag::err_pragma_pop_visibility_mismatch);
1498 const std::pair<unsigned, SourceLocation> *Back = &Stack->back();
1500 if (StartsWithPragma && IsNamespaceEnd) {
1501 Diag(Back->second, diag::err_pragma_push_visibility_mismatch);
1502 Diag(EndLoc, diag::note_surrounding_namespace_ends_here);
1507 Back = &Stack->back();
1509 }
while (StartsWithPragma);
1510 }
else if (!StartsWithPragma && !IsNamespaceEnd) {
1511 Diag(EndLoc, diag::err_pragma_pop_visibility_mismatch);
1512 Diag(Back->second, diag::note_surrounding_namespace_starts_here);
1522template <
typename Ty>
1525 bool SkipArgCountCheck) {
1551 if (!SkipArgCountCheck) {
1571 bool SkipArgCountCheck) {
1572 return ::checkCommonAttributeFeatures(*
this,
D, A, SkipArgCountCheck);
1575 bool SkipArgCountCheck) {
1576 return ::checkCommonAttributeFeatures(*
this, S, A, SkipArgCountCheck);
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
llvm::MachO::Record Record
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.
std::vector< std::pair< unsigned, SourceLocation > > VisStack
static void PushPragmaVisibility(Sema &S, unsigned type, SourceLocation loc)
static void addGslOwnerPointerAttributeIfNotExisting(ASTContext &Context, CXXRecordDecl *Record)
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
llvm::StringMap< SectionInfo > SectionInfos
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const TargetInfo & getTargetInfo() const
Attr - This represents one attribute.
Represents a C++ struct/union/class.
Represents a character-granular source range.
static CharSourceRange getCharRange(SourceRange R)
static CharSourceRange getTokenRange(SourceRange R)
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
bool isFileContext() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
Decl - This represents one declaration (or definition), e.g.
bool isInStdNamespace() const
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
Represents difference between two FPOptions values.
void setAllowFPContractAcrossStatement()
void setFPPreciseEnabled(bool Value)
void setAllowFPContractWithinStatement()
FPOptions applyOverrides(FPOptions Base)
void setDisallowFPContract()
LangOptions::FPExceptionModeKind getExceptionMode() const
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
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.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
QualType getReturnType() const
bool isDeleted() const
Whether this function has been deleted.
bool isDefaulted() const
Whether this function is defaulted.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
An lvalue reference type, per C++11 [dcl.ref].
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Extended
Use extended type for fp arithmetic.
@ FEM_Double
Use the type double for fp arithmetic.
@ FEM_UnsetOnCommandLine
Used only for FE option processing; this is only used to indicate that the user did not specify an ex...
@ FEM_Source
Use the declared type for fp arithmetic.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
PragmaMSPointersToMembersKind
FPExceptionModeKind
Possible floating point exception behavior.
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
static SourceLocation findLocationAfterToken(SourceLocation loc, tok::TokenKind TKind, const SourceManager &SM, const LangOptions &LangOpts, bool SkipTrailingWhitespaceAndNewLine)
Checks that the given token is the first token that occurs after the given location (this excludes co...
Represents the results of name lookup.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
This represents a decl that may have a name.
@ VisibilityForValue
Do an LV computation for, ultimately, a non-type declaration.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
std::optional< Visibility > getExplicitVisibility(ExplicitVisibilityKind kind) const
If visibility was explicitly specified for this declaration, return that visibility.
Represents a parameter to a function.
ParsedAttr - Represents a syntactic attribute.
bool hasCustomParsing() const
bool appliesToDecl(const Decl *D, attr::SubjectMatchRule MatchRule) const
unsigned getMinArgs() const
bool checkExactlyNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has exactly as many args as Num.
bool hasVariadicArg() const
bool diagnoseMutualExclusion(class Sema &S, const Decl *D) const
bool diagnoseAppertainsTo(class Sema &S, const Decl *D) const
bool checkAtLeastNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at least as many args as Num.
unsigned getMaxArgs() const
bool isPragmaClangAttribute() const
True if the attribute is specified using '#pragma clang attribute'.
AttributeCommonInfo::Kind getKind() const
void getMatchRules(const LangOptions &LangOpts, SmallVectorImpl< std::pair< attr::SubjectMatchRule, bool > > &MatchRules) const
bool diagnoseLangOpts(class Sema &S) const
void setIsPragmaClangAttribute()
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
void addAtEnd(ParsedAttr *newAttr)
static PragmaDetectMismatchDecl * Create(const ASTContext &C, TranslationUnitDecl *DC, SourceLocation Loc, StringRef Name, StringRef Value)
SourceLocation getLastFPEvalPragmaLocation() const
void setCurrentFPEvalMethod(SourceLocation PragmaLoc, LangOptions::FPEvalMethodKind Val)
A (possibly-)qualified type.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
Represents a struct/union/class.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Scope - A scope is a transient data structure that is used while parsing the program.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
unsigned getPackNumber() const
Mode getAlignMode() const
~PragmaStackSentinelRAII()
PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct)
Sema - This implements semantic analysis and AST building for C.
void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn)
#pragma optimize("[optimization-list]", on | off).
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
void ActOnPragmaAttributeEmptyPush(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
void ActOnPragmaAttributePop(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Called on well-formed '#pragma clang attribute pop'.
void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name, StringRef Value)
ActOnPragmaDetectMismatch - Call on well-formed #pragma detect_mismatch.
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the #pragma attribute stack.
void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode)
Called to set constant rounding mode for floating point operations.
PragmaClangSection PragmaClangRodataSection
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 ...
void AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD, SourceLocation Loc)
Adds the 'optnone' attribute to the function declaration if there are no conflicts; Loc represents th...
SourceLocation LocationOfExcessPrecisionNotSatisfied
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
PragmaStack< FPOptionsOverride > FpPragmaStack
PragmaStack< StringLiteral * > CodeSegStack
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
void ActOnPragmaMSComment(SourceLocation CommentLoc, PragmaMSCommentKind Kind, StringRef Arg)
ActOnPragmaMSComment - Called on well formed #pragma comment(kind, "arg").
SmallVector< AlignPackIncludeState, 8 > AlignPackIncludeStack
void AddAlignmentAttributesForRecord(RecordDecl *RD)
AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...
FPOptionsOverride CurFPFeatureOverrides()
void ActOnPragmaMSSeg(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, StringLiteral *SegmentName, llvm::StringRef PragmaName)
Called on well formed #pragma bss_seg/data_seg/const_seg/code_seg.
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action, PragmaFloatControlKind Value)
ActOnPragmaFloatControl - Call on well-formed #pragma float_control.
void ActOnPragmaMSPointersToMembers(LangOptions::PragmaMSPointersToMembersKind Kind, SourceLocation PragmaLoc)
ActOnPragmaMSPointersToMembers - called on well formed #pragma pointers_to_members(representation met...
void DiagnosePrecisionLossInComplexDivision()
void ActOnPragmaUnused(const Token &Identifier, Scope *curScope, SourceLocation PragmaLoc)
ActOnPragmaUnused - Called on well-formed '#pragma unused'.
void ActOnPragmaMSAllocText(SourceLocation PragmaLocation, StringRef Section, const SmallVector< std::tuple< IdentifierInfo *, SourceLocation > > &Functions)
Called on well-formed #pragma alloc_text().
PragmaStack< bool > StrictGuardStackCheckStack
void ActOnPragmaAttributeAttribute(ParsedAttr &Attribute, SourceLocation PragmaLoc, attr::ParsedSubjectMatchRuleSet Rules)
PragmaStack< StringLiteral * > ConstSegStack
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
void ActOnPragmaCXLimitedRange(SourceLocation Loc, LangOptions::ComplexRangeKind Range)
ActOnPragmaCXLimitedRange - Called on well formed #pragma STDC CX_LIMITED_RANGE.
void ActOnPragmaFPExceptions(SourceLocation Loc, LangOptions::FPExceptionModeKind)
Called on well formed '#pragma clang fp' that has option 'exceptions'.
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
void ActOnPragmaFPEvalMethod(SourceLocation Loc, LangOptions::FPEvalMethodKind Value)
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
void setExceptionMode(SourceLocation Loc, LangOptions::FPExceptionModeKind)
Called to set exception behavior for floating point operations.
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
const LangOptions & getLangOpts() const
SourceLocation CurInitSegLoc
void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, SourceLocation PragmaLoc, MSVtorDispMode Value)
Called on well formed #pragma vtordisp().
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:::lifetimebound]] attr for std:: functions and methods.
bool MSPragmaOptimizeIsOn
The "on" or "off" argument passed by #pragma optimize, that denotes whether the optimizations in the ...
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
const LangOptions & LangOpts
PragmaClangSection PragmaClangRelroSection
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
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...
void AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based n...
PragmaStack< AlignPackInfo > AlignPackStack
PragmaStack< StringLiteral * > BSSSegStack
llvm::StringMap< std::tuple< StringRef, SourceLocation > > FunctionToSectionMap
Sections used with #pragma alloc_text.
llvm::SmallSetVector< StringRef, 4 > MSFunctionNoBuiltins
Set of no-builtin functions listed by #pragma function.
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
llvm::function_ref< void(SourceLocation, PartialDiagnostic)> InstantiationContextDiagFuncRef
StringLiteral * CurInitSeg
Last section used with #pragma init_seg.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnPragmaMSFunction(SourceLocation Loc, const llvm::SmallVectorImpl< StringRef > &NoBuiltins)
Call on well formed #pragma function.
void ActOnPragmaMSStruct(PragmaMSStructKind Kind)
ActOnPragmaMSStruct - Called on well formed #pragma ms_struct [on|off].
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation, StringLiteral *SegmentName)
Called on well-formed #pragma init_seg().
SourceManager & getSourceManager() const
void PrintPragmaAttributeInstantiationPoint()
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
PragmaClangSection PragmaClangTextSection
void ActOnPragmaFPValueChangingOption(SourceLocation Loc, PragmaFPKind Kind, bool IsEnabled)
Called on well formed #pragma clang fp reassociate or #pragma clang fp reciprocal.
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
PragmaClangSection PragmaClangDataSection
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
PragmaStack< MSVtorDispMode > VtorDispStack
Whether to insert vtordisps prior to virtual bases in the Microsoft C++ ABI.
void AddMsStructLayoutForRecord(RecordDecl *RD)
AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
PragmaAlignPackDiagnoseKind
@ NonDefaultStateAtInclude
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC #pragma optimize in scope,...
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
SourceManager & SourceMgr
void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, StringRef SlotLabel, Expr *Alignment)
ActOnPragmaPack - Called on well formed #pragma pack(...).
void DiagnoseUnterminatedPragmaAlignPack()
PragmaStack< StringLiteral * > DataSegStack
void ActOnPragmaVisibility(const IdentifierInfo *VisType, SourceLocation PragmaLoc)
ActOnPragmaVisibility - Called on well formed #pragma GCC visibility... .
SourceLocation OptimizeOffPragmaLocation
This represents the last location of a "#pragma clang optimize off" directive if such a directive has...
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
void ActOnPragmaMSStrictGuardStackCheck(SourceLocation PragmaLocation, PragmaMsStackAction Action, bool Value)
ActOnPragmaMSStrictGuardStackCheck - Called on well formed #pragma strict_gs_check.
PragmaClangSection PragmaClangBSSSection
void ActOnPragmaFPContract(SourceLocation Loc, LangOptions::FPModeKind FPC)
ActOnPragmaFPContract - Called on well formed #pragma {STDC,OPENCL} FP_CONTRACT and #pragma clang fp ...
void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc)
Called on well formed #pragma clang optimize.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled)
ActOnPragmaFenvAccess - Called on well formed #pragma STDC FENV_ACCESS.
void AddSectionMSAllocText(FunctionDecl *FD)
Only called on function definitions; if there is a #pragma alloc_text that decides which code section...
void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags, StringLiteral *SegmentName)
Called on well formed #pragma section().
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
StringRef getString() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
bool hasAlignMac68kSupport() const
Check whether this target support '#pragma options align=mac68k'.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isFunctionType() const
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
Represents a variable declaration or definition.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
SubjectMatchRule
A list of all the recognized kinds of attributes.
const char * getSubjectMatchRuleSpelling(SubjectMatchRule Rule)
bool isGLSPointerType(QualType QT)
The JSON file list parser is used to communicate input to InstallAPI.
@ Nullable
Values of this type can be null.
@ AANT_ArgumentConstantExpr
@ Result
The result type of a method or function.
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
PragmaClangSectionKind
pragma clang section kind
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
const FunctionProtoType * T
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
AlignPackInfo CurrentValue
SourceLocation CurrentPragmaLocation
This an attribute introduced by #pragma clang attribute.
SourceLocation PragmaLocation
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
SmallVector< Slot, 2 > Stack
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)