14#ifndef LLVM_CLANG_LEX_PREPROCESSOR_H
15#define LLVM_CLANG_LEX_PREPROCESSOR_H
36#include "llvm/ADT/APSInt.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/DenseMap.h"
39#include "llvm/ADT/FoldingSet.h"
40#include "llvm/ADT/FunctionExtras.h"
41#include "llvm/ADT/PointerUnion.h"
42#include "llvm/ADT/STLExtras.h"
43#include "llvm/ADT/SmallPtrSet.h"
44#include "llvm/ADT/SmallVector.h"
45#include "llvm/ADT/StringRef.h"
46#include "llvm/ADT/TinyPtrVector.h"
47#include "llvm/ADT/iterator_range.h"
48#include "llvm/Support/Allocator.h"
49#include "llvm/Support/Casting.h"
50#include "llvm/Support/Registry.h"
51#include "llvm/Support/TrailingObjects.h"
100 assert(Kind != tok::raw_identifier &&
"Raw identifiers are not supported.");
101 assert(Kind != tok::identifier &&
102 "Identifiers should be created by TokenValue(IdentifierInfo *)");
110 return Tok.getKind() == Kind &&
111 (!II || II ==
Tok.getIdentifierInfo());
140class ModuleNameLoc final
141 : llvm::TrailingObjects<ModuleNameLoc, IdentifierLoc> {
142 friend TrailingObjects;
143 unsigned NumIdentifierLocs;
144 unsigned numTrailingObjects(OverloadToken<IdentifierLoc>)
const {
148 ModuleNameLoc(
ModuleIdPath Path) : NumIdentifierLocs(Path.size()) {
149 (void)llvm::copy(Path, getTrailingObjectsNonStrict<IdentifierLoc>());
156 return {getTrailingObjectsNonStrict<IdentifierLoc>(),
165 return Last.getLoc().getLocWithOffset(
166 Last.getIdentifierInfo()->getLength());
184 llvm::unique_function<void(
const clang::Token &)> OnToken;
198 std::unique_ptr<ScratchBuffer> ScratchBuf;
207 llvm::BumpPtrAllocator BP;
264 uint32_t CounterValue = 0;
268 MaxAllowedIncludeStackDepth = 200
272 bool KeepComments : 1;
273 bool KeepMacroComments : 1;
274 bool SuppressIncludeNotFoundError : 1;
277 bool InMacroArgs : 1;
280 bool OwnsHeaderSearch : 1;
283 bool DisableMacroExpansion : 1;
287 bool MacroExpansionInDirectivesOverride : 1;
289 class ResetMacroExpansionHelper;
292 mutable bool ReadMacrosFromExternalSource : 1;
295 bool PragmasEnabled : 1;
298 bool PreprocessedOutput : 1;
301 bool ParsingIfOrElifDirective;
304 bool InMacroArgPreExpansion;
322 std::unique_ptr<Builtin::Context> BuiltinInfo;
326 std::unique_ptr<PragmaNamespace> PragmaHandlers;
330 std::unique_ptr<PragmaNamespace> PragmaHandlersBackup;
334 std::vector<CommentHandler *> CommentHandlers;
340 bool IncrementalProcessing =
false;
358 const FileEntry *CodeCompletionFile =
nullptr;
361 unsigned CodeCompletionOffset = 0;
381 llvm::DenseMap<FileID, SmallVector<const char *>> CheckPoints;
382 unsigned CheckPointCounter = 0;
385 bool IsAtImport =
false;
388 bool LastTokenWasAt =
false;
391 bool ImportingCXXNamedModules =
false;
394 Token LastExportKeyword;
405 class StdCXXImportSeq {
410 AfterTopLevelTokenSeq = -1,
415 StdCXXImportSeq(State S) : S(S) {}
418 void handleOpenBracket() {
419 S =
static_cast<State
>(std::max<int>(S, 0) + 1);
422 void handleCloseBracket() {
423 S =
static_cast<State
>(std::max<int>(S, 1) - 1);
426 void handleCloseBrace() {
427 handleCloseBracket();
428 if (S == AtTopLevel && !AfterHeaderName)
429 S = AfterTopLevelTokenSeq;
434 S = AfterTopLevelTokenSeq;
435 AfterHeaderName =
false;
440 void handleExport() {
441 if (S == AfterTopLevelTokenSeq)
447 void handleImport() {
448 if (S == AfterTopLevelTokenSeq || S == AfterExport)
456 void handleHeaderName() {
457 if (S == AfterImportSeq)
458 AfterHeaderName =
true;
468 bool atTopLevel() {
return S <= 0; }
469 bool afterImportSeq() {
return S == AfterImportSeq; }
470 bool afterTopLevelSeq() {
return S == AfterTopLevelTokenSeq; }
477 bool AfterHeaderName =
false;
481 StdCXXImportSeq StdCXXImportSeqState = StdCXXImportSeq::AfterTopLevelTokenSeq;
486 enum GMFState :
int {
489 BeforeGMFIntroducer = -1,
490 GMFAbsentOrEnded = -2,
493 TrackGMF(GMFState S) : S(S) {}
504 void handleExport() {
506 S = GMFAbsentOrEnded;
510 void handleImport(
bool AfterTopLevelTokenSeq) {
512 if (AfterTopLevelTokenSeq && S == BeforeGMFIntroducer)
513 S = GMFAbsentOrEnded;
517 void handleModule(
bool AfterTopLevelTokenSeq) {
521 if (AfterTopLevelTokenSeq && S == BeforeGMFIntroducer)
524 S = GMFAbsentOrEnded;
531 S = GMFAbsentOrEnded;
534 bool inGMF() {
return S == GMFActive; }
542 TrackGMF TrackGMFState = TrackGMF::BeforeGMFIntroducer;
578 class ModuleDeclSeq {
579 enum ModuleDeclState :
int {
583 ImplementationCandidate,
584 NamedModuleInterface,
585 NamedModuleImplementation,
589 ModuleDeclSeq() =
default;
591 void handleExport() {
592 if (State == NotAModuleDecl)
594 else if (!isNamedModule())
598 void handleModule() {
599 if (State == FoundExport)
600 State = InterfaceCandidate;
601 else if (State == NotAModuleDecl)
602 State = ImplementationCandidate;
603 else if (!isNamedModule())
607 void handleModuleName(ModuleNameLoc *NameLoc) {
608 if (isModuleCandidate() && NameLoc)
609 Name += NameLoc->str();
610 else if (!isNamedModule())
615 if (isModuleCandidate())
617 else if (!isNamedModule())
622 if (!Name.empty() && isModuleCandidate()) {
623 if (State == InterfaceCandidate)
624 State = NamedModuleInterface;
625 else if (State == ImplementationCandidate)
626 State = NamedModuleImplementation;
628 llvm_unreachable(
"Unimaged ModuleDeclState.");
629 }
else if (!isNamedModule())
634 if (!isNamedModule())
638 bool isModuleCandidate()
const {
639 return State == InterfaceCandidate || State == ImplementationCandidate;
642 bool isNamedModule()
const {
643 return State == NamedModuleInterface ||
644 State == NamedModuleImplementation;
647 bool isNamedInterface()
const {
return State == NamedModuleInterface; }
649 bool isImplementationUnit()
const {
650 return State == NamedModuleImplementation && !getName().contains(
':');
653 bool isNotAModuleDecl()
const {
return State == NotAModuleDecl; }
655 StringRef getName()
const {
656 assert(isNamedModule() &&
"Can't get name from a non named module");
660 StringRef getPrimaryName()
const {
661 assert(isNamedModule() &&
"Can't get name from a non named module");
662 return getName().split(
':').first;
667 State = NotAModuleDecl;
671 ModuleDeclState State = NotAModuleDecl;
675 ModuleDeclSeq ModuleDeclState;
679 IdentifierLoc PragmaARCCFCodeAuditedInfo;
683 SourceLocation PragmaAssumeNonNullLoc;
691 SourceLocation PreambleRecordedPragmaAssumeNonNullLoc;
694 bool CodeCompletionReached =
false;
698 IdentifierInfo *CodeCompletionII =
nullptr;
701 SourceRange CodeCompletionTokenRange;
713 std::pair<int, bool> SkipMainFilePreamble;
717 bool HasReachedMaxIncludeDepth =
false;
725 unsigned LexLevel = 0;
728 unsigned TokenCount = 0;
731 bool PreprocessToken =
false;
735 unsigned MaxTokens = 0;
736 SourceLocation MaxTokensOverrideLoc;
760 class PreambleConditionalStackStore {
768 PreambleConditionalStackStore() =
default;
770 void startRecording() { ConditionalStackState = Recording; }
771 void startReplaying() { ConditionalStackState = Replaying; }
772 bool isRecording()
const {
return ConditionalStackState == Recording; }
773 bool isReplaying()
const {
return ConditionalStackState == Replaying; }
775 ArrayRef<PPConditionalInfo> getStack()
const {
776 return ConditionalStack;
779 void doneReplaying() {
780 ConditionalStack.clear();
781 ConditionalStackState = Off;
784 void setStack(ArrayRef<PPConditionalInfo>
s) {
785 if (!isRecording() && !isReplaying())
787 ConditionalStack.clear();
788 ConditionalStack.append(
s.begin(),
s.end());
793 bool reachedEOFWhileSkipping()
const {
return SkipInfo.has_value(); }
795 void clearSkipInfo() { SkipInfo.reset(); }
797 std::optional<PreambleSkipInfo> SkipInfo;
800 SmallVector<PPConditionalInfo, 4> ConditionalStack;
801 State ConditionalStackState = Off;
802 } PreambleConditionalStack;
808 std::unique_ptr<Lexer> CurLexer;
814 SmallVector<std::unique_ptr<Lexer>, 2> PendingDestroyLexers;
820 PreprocessorLexer *CurPPLexer =
nullptr;
832 std::unique_ptr<TokenLexer> CurTokenLexer;
836 LexerCallback CurLexerCallback = &CLK_Lexer;
840 Module *CurLexerSubmodule =
nullptr;
845 struct IncludeStackInfo {
846 LexerCallback CurLexerCallback;
848 std::unique_ptr<Lexer> TheLexer;
849 PreprocessorLexer *ThePPLexer;
850 std::unique_ptr<TokenLexer> TheTokenLexer;
855 IncludeStackInfo(LexerCallback CurLexerCallback,
Module *TheSubmodule,
856 std::unique_ptr<Lexer> &&TheLexer,
857 PreprocessorLexer *ThePPLexer,
858 std::unique_ptr<TokenLexer> &&TheTokenLexer,
860 : CurLexerCallback(std::move(CurLexerCallback)),
861 TheSubmodule(std::move(TheSubmodule)), TheLexer(std::move(TheLexer)),
862 ThePPLexer(std::move(ThePPLexer)),
863 TheTokenLexer(std::move(TheTokenLexer)),
864 TheDirLookup(std::move(TheDirLookup)) {}
866 std::vector<IncludeStackInfo> IncludeMacroStack;
870 std::unique_ptr<PPCallbacks> Callbacks;
872 struct MacroExpandsInfo {
877 MacroExpandsInfo(Token Tok, MacroDefinition MD, SourceRange Range)
878 : Tok(Tok), MD(MD), Range(Range) {}
880 SmallVector<MacroExpandsInfo, 2> DelayedMacroExpandsCallbacks;
883 struct ModuleMacroInfo {
888 llvm::TinyPtrVector<ModuleMacro *> ActiveModuleMacros;
892 unsigned ActiveModuleMacrosGeneration = 0;
895 bool IsAmbiguous =
false;
898 llvm::TinyPtrVector<ModuleMacro *> OverriddenMacros;
900 ModuleMacroInfo(MacroDirective *MD) : MD(MD) {}
905 mutable llvm::PointerUnion<MacroDirective *, ModuleMacroInfo *> State;
908 const IdentifierInfo *II)
const {
909 if (II->isOutOfDate())
910 PP.updateOutOfDateIdentifier(*II);
913 if (!II->hasMacroDefinition() ||
914 (!PP.getLangOpts().Modules &&
915 !PP.getLangOpts().ModulesLocalVisibility) ||
916 !PP.CurSubmoduleState->VisibleModules.getGeneration())
919 auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State);
921 Info =
new (PP.getPreprocessorAllocator())
926 if (PP.CurSubmoduleState->VisibleModules.getGeneration() !=
927 Info->ActiveModuleMacrosGeneration)
928 PP.updateModuleMacroInfo(II, *Info);
933 MacroState() : MacroState(
nullptr) {}
934 MacroState(MacroDirective *MD) : State(MD) {}
936 MacroState(MacroState &&O) noexcept : State(O.State) {
937 O.State = (MacroDirective *)
nullptr;
940 MacroState &operator=(MacroState &&O)
noexcept {
942 O.State = (MacroDirective *)
nullptr;
948 if (
auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
949 Info->~ModuleMacroInfo();
952 MacroDirective *getLatest()
const {
953 if (
auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
958 void setLatest(MacroDirective *MD) {
959 if (
auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
965 bool isAmbiguous(
Preprocessor &PP,
const IdentifierInfo *II)
const {
966 auto *Info = getModuleInfo(PP, II);
967 return Info ? Info->IsAmbiguous :
false;
970 ArrayRef<ModuleMacro *>
971 getActiveModuleMacros(
Preprocessor &PP,
const IdentifierInfo *II)
const {
972 if (
auto *Info = getModuleInfo(PP, II))
973 return Info->ActiveModuleMacros;
977 MacroDirective::DefInfo findDirectiveAtLoc(SourceLocation Loc,
978 SourceManager &SourceMgr)
const {
980 if (
auto *Latest = getLatest())
981 return Latest->findDirectiveAtLoc(Loc, SourceMgr);
985 void overrideActiveModuleMacros(
Preprocessor &PP, IdentifierInfo *II) {
986 if (
auto *Info = getModuleInfo(PP, II)) {
987 Info->OverriddenMacros.insert(Info->OverriddenMacros.end(),
988 Info->ActiveModuleMacros.begin(),
989 Info->ActiveModuleMacros.end());
990 Info->ActiveModuleMacros.clear();
991 Info->IsAmbiguous =
false;
995 ArrayRef<ModuleMacro*> getOverriddenMacros()
const {
996 if (
auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
997 return Info->OverriddenMacros;
1002 ArrayRef<ModuleMacro *> Overrides) {
1003 auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State);
1005 if (Overrides.empty())
1007 Info =
new (PP.getPreprocessorAllocator())
1011 Info->OverriddenMacros.clear();
1012 Info->OverriddenMacros.insert(Info->OverriddenMacros.end(),
1013 Overrides.begin(), Overrides.end());
1014 Info->ActiveModuleMacrosGeneration = 0;
1023 using MacroMap = llvm::DenseMap<const IdentifierInfo *, MacroState>;
1025 struct SubmoduleState;
1028 struct BuildingSubmoduleInfo {
1033 SourceLocation ImportLoc;
1039 SubmoduleState *OuterSubmoduleState;
1042 unsigned OuterPendingModuleMacroNames;
1044 BuildingSubmoduleInfo(
Module *M, SourceLocation ImportLoc,
bool IsPragma,
1045 SubmoduleState *OuterSubmoduleState,
1046 unsigned OuterPendingModuleMacroNames)
1047 : M(M), ImportLoc(ImportLoc), IsPragma(IsPragma),
1048 OuterSubmoduleState(OuterSubmoduleState),
1049 OuterPendingModuleMacroNames(OuterPendingModuleMacroNames) {}
1051 SmallVector<BuildingSubmoduleInfo, 8> BuildingSubmoduleStack;
1054 struct SubmoduleState {
1059 VisibleModuleSet VisibleModules;
1064 std::map<Module *, SubmoduleState> Submodules;
1067 SubmoduleState NullSubmoduleState;
1071 SubmoduleState *CurSubmoduleState;
1078 llvm::SmallSetVector<Module *, 2> AffectingClangModules;
1081 llvm::FoldingSet<ModuleMacro> ModuleMacros;
1084 llvm::SmallVector<IdentifierInfo *, 32> PendingModuleMacroNames;
1088 llvm::DenseMap<const IdentifierInfo *, llvm::TinyPtrVector<ModuleMacro *>>
1099 using WarnUnusedMacroLocsTy = llvm::SmallDenseSet<SourceLocation, 32>;
1100 WarnUnusedMacroLocsTy WarnUnusedMacroLocs;
1106 using MsgLocationPair = std::pair<std::string, SourceLocation>;
1108 struct MacroAnnotationInfo {
1109 SourceLocation Location;
1110 std::string Message;
1113 struct MacroAnnotations {
1114 std::optional<MacroAnnotationInfo> DeprecationInfo;
1115 std::optional<MacroAnnotationInfo> RestrictExpansionInfo;
1116 std::optional<SourceLocation> FinalAnnotationLoc;
1120 llvm::DenseMap<const IdentifierInfo *, MacroAnnotations> AnnotationInfos;
1128 llvm::DenseMap<IdentifierInfo *, std::vector<MacroInfo *>>
1129 PragmaPushMacroInfo;
1132 unsigned NumDirectives = 0;
1133 unsigned NumDefined = 0;
1134 unsigned NumUndefined = 0;
1135 unsigned NumPragma = 0;
1137 unsigned NumElse = 0;
1138 unsigned NumEndif = 0;
1139 unsigned NumEnteredSourceFiles = 0;
1140 unsigned MaxIncludeStackDepth = 0;
1141 unsigned NumMacroExpanded = 0;
1142 unsigned NumFnMacroExpanded = 0;
1143 unsigned NumBuiltinMacroExpanded = 0;
1144 unsigned NumFastMacroExpanded = 0;
1145 unsigned NumTokenPaste = 0;
1146 unsigned NumFastTokenPaste = 0;
1147 unsigned NumSkipped = 0;
1151 std::string Predefines;
1154 FileID PredefinesFileID;
1157 FileID PCHThroughHeaderFileID;
1160 bool SkippingUntilPragmaHdrStop =
false;
1163 bool SkippingUntilPCHThroughHeader =
false;
1166 bool MainFileIsPreprocessedModuleFile =
false;
1170 enum { TokenLexerCacheSize = 8 };
1171 unsigned NumCachedTokenLexers;
1172 std::unique_ptr<TokenLexer> TokenLexerCache[TokenLexerCacheSize];
1180 SmallVector<Token, 16> MacroExpandedTokens;
1181 std::vector<std::pair<TokenLexer *, size_t>> MacroExpandingLexersStack;
1188 PreprocessingRecord *Record =
nullptr;
1191 using CachedTokensTy = SmallVector<Token, 1>;
1195 CachedTokensTy CachedTokens;
1202 CachedTokensTy::size_type CachedLexPos = 0;
1209 std::vector<CachedTokensTy::size_type> BacktrackPositions;
1213 std::vector<std::pair<CachedTokensTy, CachedTokensTy::size_type>>
1214 UnannotatedBacktrackTokens;
1220 bool SkippingExcludedConditionalBlock =
false;
1226 llvm::DenseMap<const char *, unsigned> RecordedSkippedRanges;
1228 void updateOutOfDateIdentifier(
const IdentifierInfo &II)
const;
1231 Preprocessor(
const PreprocessorOptions &PPOpts, DiagnosticsEngine &diags,
1232 const LangOptions &LangOpts, SourceManager &
SM,
1233 HeaderSearch &Headers, ModuleLoader &TheModuleLoader,
1234 IdentifierInfoLookup *IILookup =
nullptr,
1235 bool OwnsHeaderSearch =
false,
1247 const TargetInfo *AuxTarget =
nullptr);
1280 ExternalSource = Source;
1284 return ExternalSource;
1291 return TheModuleLoader.HadFatalFailure;
1297 return NumDirectives;
1302 return ParsingIfOrElifDirective;
1307 this->KeepComments = KeepComments | KeepMacroComments;
1308 this->KeepMacroComments = KeepMacroComments;
1317 SuppressIncludeNotFoundError = Suppress;
1321 return SuppressIncludeNotFoundError;
1327 PreprocessedOutput = IsPreprocessedOutput;
1336 return CurPPLexer == L;
1366 C = std::make_unique<PPChainedCallbacks>(std::move(
C),
1367 std::move(Callbacks));
1368 Callbacks = std::move(
C);
1381 MaxTokensOverrideLoc = Loc;
1390 OnToken = std::move(F);
1394 GetDependencyDirectives = &Get;
1413 auto I = Submodules.find(M);
1414 if (I == Submodules.end())
1416 auto J = I->second.Macros.find(II);
1417 if (J == I->second.Macros.end())
1419 auto *MD = J->second.getLatest();
1420 return MD && MD->isDefined();
1427 MacroState &S = CurSubmoduleState->Macros[II];
1428 auto *MD = S.getLatest();
1429 while (isa_and_nonnull<VisibilityMacroDirective>(MD))
1430 MD = MD->getPrevious();
1432 S.getActiveModuleMacros(*
this, II),
1433 S.isAmbiguous(*
this, II));
1441 MacroState &S = CurSubmoduleState->Macros[II];
1443 if (
auto *MD = S.getLatest())
1447 S.getActiveModuleMacros(*
this, II),
1448 S.isAmbiguous(*
this, II));
1458 if (!MD || MD->getDefinition().isUndefined())
1472 return MD.getMacroInfo();
1509 updateOutOfDateIdentifier(*II);
1510 auto I = LeafModuleMacros.find(II);
1511 if (I != LeafModuleMacros.end())
1518 return BuildingSubmoduleStack;
1530 llvm::iterator_range<macro_iterator>
1531 macros(
bool IncludeExternalMacros =
true)
const {
1534 return llvm::make_range(begin, end);
1542 if (!BuildingSubmoduleStack.empty()) {
1543 if (M != BuildingSubmoduleStack.back().M)
1544 BuildingSubmoduleStack.back().M->AffectingClangModules.insert(M);
1546 AffectingClangModules.insert(M);
1553 return AffectingClangModules;
1559 HeaderInfo.getFileInfo(
File).IsLocallyIncluded =
true;
1560 return IncludedFiles.insert(
File).second;
1565 HeaderInfo.getFileInfo(
File);
1566 return IncludedFiles.count(
File);
1592 return &Identifiers.get(Name);
1632 CodeComplete = &Handler;
1637 return CodeComplete;
1642 CodeComplete =
nullptr;
1655 CodeCompletionII = Filter;
1662 CodeCompletionTokenRange = {Start, End};
1665 return CodeCompletionTokenRange;
1670 if (CodeCompletionII)
1671 return CodeCompletionII->getName();
1745 void EnterTokenStream(
const Token *Toks,
unsigned NumToks,
1746 bool DisableMacroExpansion,
bool OwnsTokens,
1751 bool DisableMacroExpansion,
bool IsReinject) {
1752 EnterTokenStream(Toks.release(), NumToks, DisableMacroExpansion,
true,
1758 EnterTokenStream(Toks.data(), Toks.size(), DisableMacroExpansion,
false,
1786 std::pair<CachedTokensTy::size_type, bool> LastBacktrackPos();
1788 CachedTokensTy PopUnannotatedBacktrackTokens();
1805 return !UnannotatedBacktrackTokens.empty();
1823 return MainFileIsPreprocessedModuleFile;
1830 MainFileIsPreprocessedModuleFile =
true;
1836 bool AllowMacroExpansion,
bool IsPartition);
1840 bool AllowMacroExpansion,
bool IsPartition);
1855 assert(FirstPPTokenLoc.isValid() &&
1856 "Did not see the first pp-token in the main file");
1857 return FirstPPTokenLoc;
1862 bool StopUntilEOD =
false);
1864 bool StopUntilEOD =
false);
1867 bool IncludeExports =
true);
1870 return CurSubmoduleState->VisibleModules.getImportLoc(M);
1877 const char *DiagnosticTag,
bool AllowMacroExpansion) {
1878 if (AllowMacroExpansion)
1883 AllowMacroExpansion);
1889 const char *DiagnosticTag,
1890 bool AllowMacroExpansion);
1900 while (
Result.getKind() == tok::comment);
1906 bool OldVal = DisableMacroExpansion;
1907 DisableMacroExpansion =
true;
1912 DisableMacroExpansion = OldVal;
1920 while (
Result.getKind() == tok::comment);
1930 DisableMacroExpansion =
true;
1931 MacroExpansionInDirectivesOverride =
true;
1935 DisableMacroExpansion = MacroExpansionInDirectivesOverride =
false;
1946 assert(LexLevel == 0 &&
"cannot use lookahead while lexing");
1947 if (CachedLexPos + N < CachedTokens.size())
1948 return CachedTokens[CachedLexPos+N];
1950 return PeekAhead(N+1);
1960 "Should only be called when tokens are cached for backtracking");
1961 assert(
signed(CachedLexPos) -
signed(N) >=
1962 signed(LastBacktrackPos().first) &&
1963 "Should revert tokens up to the last backtrack position, not more");
1964 assert(
signed(CachedLexPos) -
signed(N) >= 0 &&
1965 "Corrupted backtrack positions ?");
1979 auto TokCopy = std::make_unique<Token[]>(1);
1981 EnterTokenStream(std::move(TokCopy), 1,
true, IsReinject);
1983 EnterCachingLexMode();
1984 assert(IsReinject &&
"new tokens in the middle of cached stream");
1985 CachedTokens.insert(CachedTokens.begin()+CachedLexPos,
Tok);
1998 assert(
Tok.isAnnotation() &&
"Expected annotation token");
2000 AnnotatePreviousCachedTokens(
Tok);
2006 assert(CachedLexPos != 0);
2007 return CachedTokens[CachedLexPos-1].getLastLoc();
2030 assert(
Tok.isAnnotation() &&
"Expected annotation token");
2032 CachedTokens[CachedLexPos-1] =
Tok;
2037 void *AnnotationVal);
2042 return CurLexerCallback != CLK_Lexer;
2048 assert(
Tok.getIdentifierInfo() &&
"Expected identifier token");
2050 CachedTokens[CachedLexPos-1] =
Tok;
2062 IncrementalProcessing = value;
2096 return CodeCompletionFileLoc;
2106 CodeCompletionReached =
true;
2116 return PragmaARCCFCodeAuditedInfo;
2131 return PragmaAssumeNonNullLoc;
2137 PragmaAssumeNonNullLoc = Loc;
2146 return PreambleRecordedPragmaAssumeNonNullLoc;
2152 PreambleRecordedPragmaAssumeNonNullLoc = Loc;
2166 SkipMainFilePreamble.first = Bytes;
2167 SkipMainFilePreamble.second = StartOfLine;
2174 return Diags->Report(Loc, DiagID);
2178 return Diags->Report(
Tok.getLocation(), DiagID);
2190 bool *invalid =
nullptr)
const {
2219 bool *
Invalid =
nullptr)
const {
2229 bool *
Invalid =
nullptr)
const;
2234 bool IgnoreWhiteSpace =
false) {
2242 bool *
Invalid =
nullptr)
const {
2243 assert((
Tok.is(tok::numeric_constant) ||
Tok.is(tok::binary_data)) &&
2244 Tok.getLength() == 1 &&
"Called on unsupported token");
2245 assert(!
Tok.needsCleaning() &&
"Token can't need cleaning with length 1");
2248 if (
const char *D =
Tok.getLiteralData())
2249 return (
Tok.getKind() == tok::binary_data) ? *D : *D -
'0';
2251 assert(
Tok.is(tok::numeric_constant) &&
"binary data with no data");
2254 return *SourceMgr.getCharacterData(
Tok.getLocation(),
Invalid) -
'0';
2332 unsigned Char)
const {
2342 ++NumFastTokenPaste;
2366 llvm::DenseMap<IdentifierInfo*,unsigned> PoisonReasons;
2380 if(II->isPoisoned()) {
2390 static_assert(
sizeof...(Ts) > 0,
2391 "requires at least one tok::TokenKind specified");
2392 auto NextTokOpt = peekNextPPToken();
2393 return NextTokOpt.has_value() ? NextTokOpt->is(Ks...) :
false;
2400 std::optional<Token> peekNextPPToken()
const;
2406 *Ident___exception_code,
2407 *Ident_GetExceptionCode;
2410 *Ident___exception_info,
2411 *Ident_GetExceptionInfo;
2414 *Ident___abnormal_termination,
2415 *Ident_AbnormalTermination;
2417 const char *getCurLexerEndPos();
2418 void diagnoseMissingHeaderInUmbrellaDir(
const Module &Mod);
2489 "FPEvalMethod should be set either from command line or from the "
2491 return CurrentFPEvalMethod;
2495 return TUFPEvalMethod;
2499 return LastFPEvalPragmaLocation;
2505 "FPEvalMethod should never be set to FEM_UnsetOnCommandLine");
2508 LastFPEvalPragmaLocation = PragmaLoc;
2509 CurrentFPEvalMethod = Val;
2510 TUFPEvalMethod = Val;
2515 "TUPEvalMethod should never be set to FEM_UnsetOnCommandLine");
2516 TUFPEvalMethod = Val;
2533 return ModuleDeclState.isNamedInterface();
2544 return ModuleDeclState.isImplementationUnit();
2550 "Import C++ named modules are only valid for C++20 modules");
2551 return ImportingCXXNamedModules;
2578 bool *IsFrameworkFound,
bool SkipCache =
false,
2579 bool OpenFile =
true,
bool CacheFailures =
true);
2599 bool *ShadowFlag =
nullptr);
2605 friend void TokenLexer::ExpandFunctionArguments();
2607 void PushIncludeMacroStack() {
2608 assert(CurLexerCallback != CLK_CachingLexer &&
2609 "cannot push a caching lexer");
2610 IncludeMacroStack.emplace_back(CurLexerCallback, CurLexerSubmodule,
2611 std::move(CurLexer), CurPPLexer,
2612 std::move(CurTokenLexer), CurDirLookup);
2613 CurPPLexer =
nullptr;
2616 void PopIncludeMacroStack() {
2618 PendingDestroyLexers.push_back(std::move(CurLexer));
2619 CurLexer = std::move(IncludeMacroStack.back().TheLexer);
2620 CurPPLexer = IncludeMacroStack.back().ThePPLexer;
2621 CurTokenLexer = std::move(IncludeMacroStack.back().TheTokenLexer);
2622 CurDirLookup = IncludeMacroStack.back().TheDirLookup;
2623 CurLexerSubmodule = IncludeMacroStack.back().TheSubmodule;
2624 CurLexerCallback = IncludeMacroStack.back().CurLexerCallback;
2625 IncludeMacroStack.pop_back();
2628 void PropagateLineStartLeadingSpaceInfo(Token &Result);
2632 bool needModuleMacros()
const;
2636 void updateModuleMacroInfo(
const IdentifierInfo *II, ModuleMacroInfo &Info);
2638 DefMacroDirective *AllocateDefMacroDirective(MacroInfo *MI,
2639 SourceLocation Loc);
2640 UndefMacroDirective *AllocateUndefMacroDirective(SourceLocation UndefLoc);
2641 VisibilityMacroDirective *AllocateVisibilityMacroDirective(SourceLocation Loc,
2655 bool *ShadowFlag =
nullptr);
2666 MacroInfo *ReadOptionalMacroParameterListAndBody(
2667 const Token &MacroNameTok,
bool ImmediatelyAfterHeaderGuard);
2673 bool ReadMacroParameterList(MacroInfo *MI, Token& LastTok);
2680 void SuggestTypoedDirective(
const Token &
Tok, StringRef
Directive)
const;
2690 void SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
2691 SourceLocation IfTokenLoc,
2692 bool FoundNonSkipPortion,
bool FoundElse,
2693 SourceLocation ElseLoc = SourceLocation());
2697 struct DirectiveEvalResult {
2699 std::optional<llvm::APSInt>
Value;
2705 bool IncludedUndefinedIds;
2708 SourceRange ExprRange;
2715 DirectiveEvalResult EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro,
2716 bool CheckForEoD =
true);
2724 DirectiveEvalResult EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro,
2726 bool &EvaluatedDefined,
2727 bool CheckForEoD =
true);
2738 bool EvaluateHasInclude(Token &
Tok, IdentifierInfo *II);
2743 bool EvaluateHasIncludeNext(Token &
Tok, IdentifierInfo *II);
2746 std::pair<ConstSearchDirIterator, const FileEntry *>
2747 getIncludeNextStart(
const Token &IncludeNextTok)
const;
2751 void RegisterBuiltinPragmas();
2755 IdentifierInfo *RegisterBuiltinMacro(
const char *Name) {
2761 MI->setIsBuiltinMacro();
2767 void RegisterBuiltinMacros();
2772 bool HandleMacroExpandedIdentifier(Token &Identifier,
const MacroDefinition &MD);
2779 Token *cacheMacroExpandedTokens(TokenLexer *tokLexer,
2780 ArrayRef<Token> tokens);
2782 void removeCachedMacroExpandedTokensOfLastLexer();
2786 MacroArgs *ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI,
2787 SourceLocation &MacroEnd);
2791 void ExpandBuiltinMacro(Token &
Tok);
2796 void Handle_Pragma(Token &
Tok);
2800 void HandleMicrosoft__pragma(Token &
Tok);
2807 void setPredefinesFileID(FileID FID) {
2808 assert(PredefinesFileID.isInvalid() &&
"PredefinesFileID already set!");
2809 PredefinesFileID = FID;
2813 void setPCHThroughHeaderFileID(FileID FID);
2817 static bool IsFileLexer(
const Lexer* L,
const PreprocessorLexer* P) {
2818 return L ? !L->isPragmaLexer() : P !=
nullptr;
2821 static bool IsFileLexer(
const IncludeStackInfo& I) {
2822 return IsFileLexer(I.TheLexer.get(), I.ThePPLexer);
2825 bool IsFileLexer()
const {
2826 return IsFileLexer(CurLexer.get(), CurPPLexer);
2831 std::optional<CXXStandardLibraryVersionInfo> CXXStandardLibraryVersion;
2840 void CachingLex(Token &
Result);
2842 bool InCachingLexMode()
const {
2845 return !CurPPLexer && !CurTokenLexer && !IncludeMacroStack.empty();
2848 void EnterCachingLexMode();
2849 void EnterCachingLexModeUnchecked();
2851 void ExitCachingLexMode() {
2852 if (InCachingLexMode())
2856 const Token &PeekAhead(
unsigned N);
2857 void AnnotatePreviousCachedTokens(
const Token &
Tok);
2863 void HandleLineDirective();
2864 void HandleDigitDirective(Token &
Tok);
2865 void HandleUserDiagnosticDirective(Token &
Tok,
bool isWarning);
2866 void HandleIdentSCCSDirective(Token &
Tok);
2867 void HandleMacroPublicDirective(Token &
Tok);
2868 void HandleMacroPrivateDirective();
2872 struct ImportAction {
2878 SkippedModuleImport,
2881 Module *ModuleForHeader =
nullptr;
2883 ImportAction(ActionKind AK,
Module *Mod =
nullptr)
2884 : Kind(AK), ModuleForHeader(Mod) {
2885 assert((AK == None || Mod || AK == Failure) &&
2886 "no module for module action");
2892 SourceLocation FilenameLoc, CharSourceRange FilenameRange,
2893 const Token &FilenameTok,
bool &IsFrameworkFound,
bool IsImportDecl,
2895 const FileEntry *LookupFromFile, StringRef &LookupFilename,
2896 SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath,
2897 ModuleMap::KnownHeader &SuggestedModule,
bool isAngled);
2899 void HandleEmbedDirective(SourceLocation HashLoc, Token &
Tok);
2900 void HandleEmbedDirectiveImpl(SourceLocation HashLoc,
2901 const LexEmbedParametersResult &Params,
2902 StringRef BinaryContents, StringRef
FileName);
2905 void HandleIncludeDirective(SourceLocation HashLoc, Token &
Tok,
2907 const FileEntry *LookupFromFile =
nullptr);
2909 HandleHeaderIncludeOrImport(SourceLocation HashLoc, Token &IncludeTok,
2910 Token &FilenameTok, SourceLocation EndLoc,
2912 const FileEntry *LookupFromFile =
nullptr);
2913 void HandleIncludeNextDirective(SourceLocation HashLoc, Token &
Tok);
2914 void HandleIncludeMacrosDirective(SourceLocation HashLoc, Token &
Tok);
2915 void HandleImportDirective(SourceLocation HashLoc, Token &
Tok);
2916 void HandleMicrosoftImportDirective(Token &
Tok);
2923 const TargetInfo &TargetInfo,
2924 const Module &M, DiagnosticsEngine &Diags);
2947 SourceLocation MLoc);
2950 return PreambleConditionalStack.isRecording();
2954 return PreambleConditionalStack.hasRecordedPreamble();
2958 return PreambleConditionalStack.getStack();
2962 PreambleConditionalStack.setStack(
s);
2967 PreambleConditionalStack.startReplaying();
2968 PreambleConditionalStack.setStack(
s);
2969 PreambleConditionalStack.SkipInfo = SkipInfo;
2973 return PreambleConditionalStack.SkipInfo;
2979 void replayPreambleConditionalStack();
2982 void HandleDefineDirective(
Token &
Tok,
bool ImmediatelyAfterHeaderGuard);
2983 void HandleUndefDirective();
2987 bool isIfndef,
bool ReadAnyTokensBeforeDirective);
2988 void HandleIfDirective(
Token &IfToken,
const Token &HashToken,
2989 bool ReadAnyTokensBeforeDirective);
2990 void HandleEndifDirective(
Token &EndifToken);
2992 void HandleElifFamilyDirective(
Token &ElifToken,
const Token &HashToken,
3021 AnnotationInfos[II].DeprecationInfo =
3022 MacroAnnotationInfo{AnnotationLoc, std::move(Msg)};
3027 AnnotationInfos[II].RestrictExpansionInfo =
3028 MacroAnnotationInfo{AnnotationLoc, std::move(Msg)};
3032 AnnotationInfos[II].FinalAnnotationLoc = AnnotationLoc;
3036 return AnnotationInfos.find(II)->second;
3040 bool IsIfnDef =
false)
const {
3043 emitMacroDeprecationWarning(Identifier);
3046 !SourceMgr.isInMainFile(Identifier.
getLocation()))
3047 emitRestrictExpansionWarning(Identifier);
3051 emitRestrictInfNaNWarning(Identifier, 0);
3053 emitRestrictInfNaNWarning(Identifier, 1);
3067 void emitMacroDeprecationWarning(
const Token &Identifier)
const;
3068 void emitRestrictExpansionWarning(
const Token &Identifier)
const;
3069 void emitFinalMacroWarning(
const Token &Identifier,
bool IsUndef)
const;
3070 void emitRestrictInfNaNWarning(
const Token &Identifier,
3071 unsigned DiagSelection)
const;
3076 bool InSafeBufferOptOutRegion =
false;
3083 using SafeBufferOptOutRegionsTy =
3088 SafeBufferOptOutRegionsTy SafeBufferOptOutMap;
3099 SafeBufferOptOutRegionsTy &
3107 const SafeBufferOptOutRegionsTy *
3115 return &Iter->getSecond();
3117 } LoadedSafeBufferOptOutMap;
3122 bool isSafeBufferOptOut(
const SourceManager&SourceMgr,
const SourceLocation &Loc)
const;
3135 const SourceLocation &Loc);
3158 const SmallVectorImpl<SourceLocation> &SrcLocSeqs);
3168 return P.CurLexer->Lex(
Result);
3171 return P.CurTokenLexer->Lex(
Result);
3178 return P.CurLexer->LexDependencyDirectiveToken(
Result);
3181 return P.LexAfterModuleImport(
Result);
3219extern template class CLANG_TEMPLATE_ABI Registry<clang::PragmaHandler>;
Defines the Diagnostic-related interfaces.
Defines the Diagnostic IDs-related interfaces.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines the PPCallbacks interface.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines the clang::TokenKind enum and support functions.
VerifyDiagnosticConsumer::Directive Directive
__device__ __2f16 float __ockl_bool s
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Callback handler that receives notifications when performing code completion within the preprocessor.
A directive for a defined macro or a macro imported from a module.
Functor that returns the dependency directives for a given file.
A little helper class used to produce diagnostics.
Concrete class used by the front-end to report problems and issues.
void setSuppressAllDiagnostics(bool Val)
Suppress all diagnostics, to silence the front end when we know that we don't want any more diagnosti...
A reference to a DirectoryEntry that includes the name of the directory as it was accessed by the Fil...
Cached information about one directory (either on disk or in the virtual file system).
Abstract base class that describes a handler that will receive source ranges for empty lines encounte...
virtual void HandleEmptyline(SourceRange Range)=0
virtual ~EmptylineHandler()
Abstract interface for external sources of preprocessor information.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Cached information about one file (either on disk or in the virtual file system).
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
One of these records is kept for each identifier that is lexed.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
bool hasMacroDefinition() const
Return true if this identifier is #defined to some other value.
bool isDeprecatedMacro() const
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
StringRef getName() const
Return the actual identifier string.
bool isRestrictExpansion() const
A simple pair of identifier info and location.
Implements an efficient mapping from strings to IdentifierInfo nodes.
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_UnsetOnCommandLine
Used only for FE option processing; this is only used to indicate that the user did not specify an ex...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static StringRef getImmediateMacroName(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts)
Retrieve the name of the immediate macro expansion.
static bool isAtStartOfMacroExpansion(SourceLocation loc, const SourceManager &SM, const LangOptions &LangOpts, SourceLocation *MacroBegin=nullptr)
Returns true if the given MacroID location points at the first token of the macro expansion.
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
static bool isAtEndOfMacroExpansion(SourceLocation loc, const SourceManager &SM, const LangOptions &LangOpts, SourceLocation *MacroEnd=nullptr)
Returns true if the given MacroID location points at the last token of the macro expansion.
static unsigned getSpelling(const Token &Tok, const char *&Buffer, const SourceManager &SourceMgr, const LangOptions &LangOpts, bool *Invalid=nullptr)
getSpelling - This method is used to get the spelling of a token into a preallocated buffer,...
static bool getRawToken(SourceLocation Loc, Token &Result, const SourceManager &SM, const LangOptions &LangOpts, bool IgnoreWhiteSpace=false)
Relex the token at the specified location.
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset, const SourceManager &SM, const LangOptions &LangOpts)
Computes the source location just past the end of the token at this source location.
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
A description of the current definition of a macro.
const DefMacroDirective * getDirective() const
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
Encapsulates the data about a macro definition (e.g.
SourceLocation getDefinitionLoc() const
Return the location that the macro was defined at.
Abstract interface for a module loader.
static std::string getFlatNameFromPath(ModuleIdPath Path)
Represents a macro directive exported by a module.
unsigned getNumIdentifierLocs() const
SourceLocation getBeginLoc() const
SourceLocation getEndLoc() const
SourceRange getRange() const
ModuleIdPath getModuleIdPath() const
Describes a module or submodule.
bool isModuleMapModule() const
Consider the following code:
This interface provides a way to observe the actions of the preprocessor as it does its thing.
PragmaHandler - Instances of this interface defined to handle the various pragmas that the language f...
PragmaNamespace - This PragmaHandler subdivides the namespace of pragmas, allowing hierarchical pragm...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
SourceLocation getLastFPEvalPragmaLocation() const
bool isMacroDefined(const IdentifierInfo *II)
MacroDirective * getLocalMacroDirective(const IdentifierInfo *II) const
Given an identifier, return its latest non-imported MacroDirective if it is #define'd and not #undef'...
bool markIncluded(FileEntryRef File)
Mark the file as included.
void HandlePragmaPushMacro(Token &Tok)
Handle #pragma push_macro.
void FinalizeForModelFile()
Cleanup after model file parsing.
bool FinishLexStringLiteral(Token &Result, std::string &String, const char *DiagnosticTag, bool AllowMacroExpansion)
Complete the lexing of a string literal where the first token has already been lexed (see LexStringLi...
void HandlePragmaPoison()
HandlePragmaPoison - Handle #pragma GCC poison. PoisonTok is the 'poison'.
void setCodeCompletionHandler(CodeCompletionHandler &Handler)
Set the code completion handler to the given object.
void dumpMacroInfo(const IdentifierInfo *II)
void HandlePragmaSystemHeader(Token &SysHeaderTok)
HandlePragmaSystemHeader - Implement #pragma GCC system_header.
bool creatingPCHWithThroughHeader()
True if creating a PCH with a through header.
void DumpToken(const Token &Tok, bool DumpFlags=false) const
Print the token to stderr, used for debugging.
void MaybeHandlePoisonedIdentifier(Token &Identifier)
ModuleMacro * addModuleMacro(Module *Mod, IdentifierInfo *II, MacroInfo *Macro, ArrayRef< ModuleMacro * > Overrides, bool &IsNew)
Register an exported macro for a module and identifier.
void setLoadedMacroDirective(IdentifierInfo *II, MacroDirective *ED, MacroDirective *MD)
Set a MacroDirective that was loaded from a PCH file.
MacroDefinition getMacroDefinitionAtLoc(const IdentifierInfo *II, SourceLocation Loc)
void EnterModuleSuffixTokenStream(ArrayRef< Token > Toks)
void markClangModuleAsAffecting(Module *M)
Mark the given clang module as affecting the current clang module or translation unit.
void setPragmaARCCFCodeAuditedInfo(IdentifierInfo *Ident, SourceLocation Loc)
Set the location of the currently-active #pragma clang arc_cf_code_audited begin.
void HandlePragmaModuleBuild(Token &Tok)
void InitializeForModelFile()
Initialize the preprocessor to parse a model file.
SourceLocation getCodeCompletionLoc() const
Returns the location of the code-completion point.
ArrayRef< ModuleMacro * > getLeafModuleMacros(const IdentifierInfo *II) const
Get the list of leaf (non-overridden) module macros for a name.
bool isIncrementalProcessingEnabled() const
Returns true if incremental processing is enabled.
void EnterToken(const Token &Tok, bool IsReinject)
Enters a token in the token stream to be lexed next.
void IgnorePragmas()
Install empty handlers for all pragmas (making them ignored).
void HandleCXXImportDirective(Token Import)
HandleCXXImportDirective - Handle the C++ modules import directives.
DefMacroDirective * appendDefMacroDirective(IdentifierInfo *II, MacroInfo *MI)
PPCallbacks * getPPCallbacks() const
bool isInNamedInterfaceUnit() const
If we are proprocessing a named interface unit.
ArrayRef< PPConditionalInfo > getPreambleConditionalStack() const
void setPreambleRecordedPragmaAssumeNonNullLoc(SourceLocation Loc)
Record the location of the unterminated #pragma clang assume_nonnull begin in the preamble.
SourceRange DiscardUntilEndOfDirective(SmallVectorImpl< Token > *DiscardedToks=nullptr)
Read and discard all tokens remaining on the current line until the tok::eod token is found.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
ArrayRef< BuildingSubmoduleInfo > getBuildingSubmodules() const
Get the list of submodules that we're currently building.
SourceLocation getCodeCompletionFileLoc() const
Returns the start location of the file of code-completion point.
DiagnosticBuilder Diag(const Token &Tok, unsigned DiagID) const
SourceRange getCodeCompletionTokenRange() const
SourceLocation getModuleImportLoc(Module *M) const
void overrideMaxTokens(unsigned Value, SourceLocation Loc)
void setCodeCompletionTokenRange(const SourceLocation Start, const SourceLocation End)
Set the code completion token range for detecting replacement range later on.
bool isRecordingPreamble() const
void HandleSkippedDirectiveWhileUsingPCH(Token &Result, SourceLocation HashLoc)
Process directives while skipping until the through header or pragma hdrstop is found.
void setRecordedPreambleConditionalStack(ArrayRef< PPConditionalInfo > s)
void enableIncrementalProcessing(bool value=true)
Enables the incremental processing.
bool LexAfterModuleImport(Token &Result)
Lex a token following the 'import' contextual keyword.
void TypoCorrectToken(const Token &Tok)
Update the current token to represent the provided identifier, in order to cache an action performed ...
bool GetSuppressIncludeNotFoundError()
bool isMacroDefinedInLocalModule(const IdentifierInfo *II, Module *M)
Determine whether II is defined as a macro within the module M, if that is a module that we've alread...
void setPragmaAssumeNonNullLoc(SourceLocation Loc)
Set the location of the currently-active #pragma clang assume_nonnull begin.
bool isInPrimaryFile() const
Return true if we're in the top-level file, not in a #include.
macro_iterator macro_begin(bool IncludeExternalMacros=true) const
void CreateString(StringRef Str, Token &Tok, SourceLocation ExpansionLocStart=SourceLocation(), SourceLocation ExpansionLocEnd=SourceLocation())
Plop the specified string into a scratch buffer and set the specified token's location and length to ...
void markMacroAsUsed(MacroInfo *MI)
A macro is used, update information about macros that need unused warnings.
LangOptions::FPEvalMethodKind getCurrentFPEvalMethod() const
void EnterSubmodule(Module *M, SourceLocation ImportLoc, bool ForPragma)
bool isSafeBufferOptOut(const SourceManager &SourceMgr, const SourceLocation &Loc) const
void addMacroDeprecationMsg(const IdentifierInfo *II, std::string Msg, SourceLocation AnnotationLoc)
const char * getCheckPoint(FileID FID, const char *Start) const
Returns a pointer into the given file's buffer that's guaranteed to be between tokens.
void addRestrictExpansionMsg(const IdentifierInfo *II, std::string Msg, SourceLocation AnnotationLoc)
IdentifierInfo * LookUpIdentifierInfo(Token &Identifier) const
Given a tok::raw_identifier token, look up the identifier information for the token and install it in...
MacroDirective * getLocalMacroDirectiveHistory(const IdentifierInfo *II) const
Given an identifier, return the latest non-imported macro directive for that identifier.
void setPreprocessedOutput(bool IsPreprocessedOutput)
Sets whether the preprocessor is responsible for producing output or if it is producing tokens to be ...
void addFinalLoc(const IdentifierInfo *II, SourceLocation AnnotationLoc)
bool IsPreviousCachedToken(const Token &Tok) const
Whether Tok is the most recent token (CachedLexPos - 1) in CachedTokens.
bool SawDateOrTime() const
Returns true if the preprocessor has seen a use of DATE or TIME in the file so far.
const TargetInfo * getAuxTargetInfo() const
void CommitBacktrackedTokens()
Disable the last EnableBacktrackAtThisPos call.
void DumpMacro(const MacroInfo &MI) const
bool HandleEndOfTokenLexer(Token &Result)
Callback invoked when the current TokenLexer hits the end of its token stream.
void setDiagnostics(DiagnosticsEngine &D)
IncludedFilesSet & getIncludedFiles()
Get the set of included files.
void setCodeCompletionReached()
Note that we hit the code-completion point.
bool SetCodeCompletionPoint(FileEntryRef File, unsigned Line, unsigned Column)
Specify the point at which code-completion will be performed.
void AnnotateCachedTokens(const Token &Tok)
We notify the Preprocessor that if it is caching tokens (because backtrack is enabled) it should repl...
bool isPreprocessedOutput() const
Returns true if the preprocessor is responsible for generating output, false if it is producing token...
StringRef getNamedModuleName() const
Get the named module name we're preprocessing.
bool mightHavePendingAnnotationTokens()
Determine whether it's possible for a future call to Lex to produce an annotation token created by a ...
void Lex(Token &Result)
Lex the next token for this preprocessor.
void EnterTokenStream(ArrayRef< Token > Toks, bool DisableMacroExpansion, bool IsReinject)
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
bool EnterSourceFile(FileID FID, ConstSearchDirIterator Dir, SourceLocation Loc, bool IsFirstIncludeOfFile=true)
Add a source file to the top of the include stack and start lexing tokens from it instead of the curr...
bool isParsingIfOrElifDirective() const
True if we are currently preprocessing a if or elif directive.
unsigned getNumDirectives() const
Retrieve the number of Directives that have been processed by the Preprocessor.
bool isInImplementationUnit() const
If we are implementing an implementation module unit.
void addCommentHandler(CommentHandler *Handler)
Add the specified comment handler to the preprocessor.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
void LexNonComment(Token &Result)
Lex a token.
void removeCommentHandler(CommentHandler *Handler)
Remove the specified comment handler.
PreprocessorLexer * getCurrentLexer() const
Return the current lexer being lexed from.
bool LexOnOffSwitch(tok::OnOffSwitch &Result)
Lex an on-off-switch (C99 6.10.6p2) and verify that it is followed by EOD.
StringRef getCodeCompletionFilter()
Get the code completion token for filtering purposes.
void setMainFileDir(DirectoryEntryRef Dir)
Set the directory in which the main file should be considered to have been found, if it is not a real...
const IdentifierTable & getIdentifierTable() const
void HandlePragmaDependency(Token &DependencyTok)
HandlePragmaDependency - Handle #pragma GCC dependency "foo" blah.
void HandlePoisonedIdentifier(Token &Identifier)
Display reason for poisoned identifier.
void Backtrack()
Make Preprocessor re-lex the tokens that were lexed since EnableBacktrackAtThisPos() was previously c...
bool isCurrentLexer(const PreprocessorLexer *L) const
Return true if we are lexing directly from the specified lexer.
bool HandleIdentifier(Token &Identifier)
Callback invoked when the lexer reads an identifier and has filled in the tokens IdentifierInfo membe...
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
bool enterOrExitSafeBufferOptOutRegion(bool isEnter, const SourceLocation &Loc)
Alter the state of whether this PP currently is in a "-Wunsafe-buffer-usage" opt-out region.
void IncrementPasteCounter(bool isFast)
Increment the counters for the number of token paste operations performed.
IdentifierLoc getPragmaARCCFCodeAuditedInfo() const
The location of the currently-active #pragma clang arc_cf_code_audited begin.
void EnterMainSourceFile()
Enter the specified FileID as the main source file, which implicitly adds the builtin defines etc.
void setReplayablePreambleConditionalStack(ArrayRef< PPConditionalInfo > s, std::optional< PreambleSkipInfo > SkipInfo)
const Token & LookAhead(unsigned N)
Peeks ahead N tokens and returns that token without consuming any tokens.
friend class VAOptDefinitionContext
const MacroAnnotations & getMacroAnnotations(const IdentifierInfo *II) const
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
uint8_t getSpellingOfSingleCharacterNumericConstant(const Token &Tok, bool *Invalid=nullptr) const
Given a Token Tok that is a numeric constant with length 1, return the value of constant as an unsign...
macro_iterator macro_end(bool IncludeExternalMacros=true) const
SourceManager & getSourceManager() const
bool isBacktrackEnabled() const
True if EnableBacktrackAtThisPos() was called and caching of tokens is on.
MacroDefinition getMacroDefinition(const IdentifierInfo *II)
bool CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef, bool *ShadowFlag=nullptr)
std::optional< PreambleSkipInfo > getPreambleSkipInfo() const
void setPreprocessToken(bool Preprocess)
bool isPreprocessedModuleFile() const
Whether the main file is preprocessed module file.
void SetPoisonReason(IdentifierInfo *II, unsigned DiagID)
Specifies the reason for poisoning an identifier.
void HandlePragmaOnce(Token &OnceTok)
HandlePragmaOnce - Handle #pragma once. OnceTok is the 'once'.
SourceLocation CheckEndOfDirective(StringRef DirType, bool EnableMacros=false, SmallVectorImpl< Token > *ExtraToks=nullptr)
Ensure that the next token is a tok::eod token.
EmptylineHandler * getEmptylineHandler() const
bool getCommentRetentionState() const
bool isMacroDefined(StringRef Id)
static bool checkModuleIsAvailable(const LangOptions &LangOpts, const TargetInfo &TargetInfo, const Module &M, DiagnosticsEngine &Diags)
Check that the given module is available, producing a diagnostic if not.
Module * getCurrentModuleImplementation()
Retrieves the module whose implementation we're current compiling, if any.
void SetMacroExpansionOnlyInDirectives()
Disables macro expansion everywhere except for preprocessor directives.
bool hasRecordedPreamble() const
SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Char) const
Given a location that specifies the start of a token, return a new location that specifies a characte...
SourceLocation getPragmaAssumeNonNullLoc() const
The location of the currently-active #pragma clang assume_nonnull begin.
MacroMap::const_iterator macro_iterator
void createPreprocessingRecord()
Create a new preprocessing record, which will keep track of all macro expansions, macro definitions,...
SourceLocation SplitToken(SourceLocation TokLoc, unsigned Length)
Split the first Length characters out of the token starting at TokLoc and return a location pointing ...
bool isUnannotatedBacktrackEnabled() const
True if EnableBacktrackAtThisPos() was called and caching of unannotated tokens is on.
void EnterTokenStream(std::unique_ptr< Token[]> Toks, unsigned NumToks, bool DisableMacroExpansion, bool IsReinject)
void RevertCachedTokens(unsigned N)
When backtracking is enabled and tokens are cached, this allows to revert a specific number of tokens...
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
std::optional< std::uint64_t > getStdLibCxxVersion()
void RemovePragmaHandler(PragmaHandler *Handler)
bool isPPInSafeBufferOptOutRegion()
unsigned getTokenCount() const
Get the number of tokens processed so far.
OptionalFileEntryRef LookupEmbedFile(StringRef Filename, bool isAngled, bool OpenFile)
Given a "Filename" or <Filename> reference, look up the indicated embed resource.
unsigned getMaxTokens() const
Get the max number of tokens before issuing a -Wmax-tokens warning.
SourceLocation getMaxTokensOverrideLoc() const
void makeModuleVisible(Module *M, SourceLocation Loc, bool IncludeExports=true)
bool hadModuleLoaderFatalFailure() const
static void processPathToFileName(SmallVectorImpl< char > &FileName, const PresumedLoc &PLoc, const LangOptions &LangOpts, const TargetInfo &TI)
void setCurrentFPEvalMethod(SourceLocation PragmaLoc, LangOptions::FPEvalMethodKind Val)
bool HandleModuleContextualKeyword(Token &Result)
Callback invoked when the lexer sees one of export, import or module token at the start of a line.
const TargetInfo & getTargetInfo() const
FileManager & getFileManager() const
bool LexHeaderName(Token &Result, bool AllowMacroExpansion=true)
Lex a token, forming a header-name token if possible.
std::string getSpelling(const Token &Tok, bool *Invalid=nullptr) const
Return the 'spelling' of the Tok token.
bool isPCHThroughHeader(const FileEntry *FE)
Returns true if the FileEntry is the PCH through header.
void DumpLocation(SourceLocation Loc) const
friend class VariadicMacroScopeGuard
Module * getCurrentLexerSubmodule() const
Return the submodule owning the file being lexed.
bool parseSimpleIntegerLiteral(Token &Tok, uint64_t &Value)
Parses a simple integer literal to get its numeric value.
MacroInfo * AllocateMacroInfo(SourceLocation L)
Allocate a new MacroInfo object with the provided SourceLocation.
void setDependencyDirectivesGetter(DependencyDirectivesGetter &Get)
void LexUnexpandedToken(Token &Result)
Just like Lex, but disables macro expansion of identifier tokens.
StringRef getImmediateMacroName(SourceLocation Loc)
Retrieve the name of the immediate macro expansion.
bool creatingPCHWithPragmaHdrStop()
True if creating a PCH with a pragma hdrstop.
bool alreadyIncluded(FileEntryRef File) const
Return true if this header has already been included.
llvm::iterator_range< macro_iterator > macros(bool IncludeExternalMacros=true) const
void Initialize(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize the preprocessor using information about the target.
FileID getPredefinesFileID() const
Returns the FileID for the preprocessor predefines.
void LexUnexpandedNonComment(Token &Result)
Like LexNonComment, but this disables macro expansion of identifier tokens.
void AddPragmaHandler(StringRef Namespace, PragmaHandler *Handler)
Add the specified pragma handler to this preprocessor.
llvm::BumpPtrAllocator & getPreprocessorAllocator()
ModuleMacro * getModuleMacro(Module *Mod, const IdentifierInfo *II)
StringRef getSpelling(SourceLocation loc, SmallVectorImpl< char > &buffer, bool *invalid=nullptr) const
Return the 'spelling' of the token at the given location; does not go up to the spelling location or ...
bool HandleComment(Token &result, SourceRange Comment)
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
bool GetIncludeFilenameSpelling(SourceLocation Loc, StringRef &Buffer)
Turn the specified lexer token into a fully checked and spelled filename, e.g.
PreprocessorLexer * getCurrentFileLexer() const
Return the current file lexer being lexed from.
HeaderSearch & getHeaderSearchInfo() const
void emitMacroExpansionWarnings(const Token &Identifier, bool IsIfnDef=false) const
bool setDeserializedSafeBufferOptOutMap(const SmallVectorImpl< SourceLocation > &SrcLocSeqs)
void HandlePragmaPopMacro(Token &Tok)
Handle #pragma pop_macro.
void ReplaceLastTokenWithAnnotation(const Token &Tok)
Replace the last token with an annotation token.
ExternalPreprocessorSource * getExternalSource() const
bool NeedsStdLibCxxWorkaroundBefore(std::uint64_t FixedVersion)
Module * LeaveSubmodule(bool ForPragma)
const std::string & getPredefines() const
Get the predefines for this processor.
void HandleDirective(Token &Result)
Callback invoked when the lexer sees a # token at the start of a line.
SmallVector< SourceLocation, 64 > serializeSafeBufferOptOutMap() const
CodeCompletionHandler * getCodeCompletionHandler() const
Retrieve the current code-completion handler.
void recomputeCurLexerKind()
Recompute the current lexer kind based on the CurLexer/ CurTokenLexer pointers.
void EnterAnnotationToken(SourceRange Range, tok::TokenKind Kind, void *AnnotationVal)
Enter an annotation token into the token stream.
void setTokenWatcher(llvm::unique_function< void(const clang::Token &)> F)
Register a function that would be called on each token in the final expanded token stream.
MacroInfo * getMacroInfo(const IdentifierInfo *II)
void setPredefines(std::string P)
Set the predefines for this Preprocessor.
OptionalFileEntryRef LookupFile(SourceLocation FilenameLoc, StringRef Filename, bool isAngled, ConstSearchDirIterator FromDir, const FileEntry *FromFile, ConstSearchDirIterator *CurDir, SmallVectorImpl< char > *SearchPath, SmallVectorImpl< char > *RelativePath, ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool *IsFrameworkFound, bool SkipCache=false, bool OpenFile=true, bool CacheFailures=true)
Given a "foo" or <foo> reference, look up the indicated file.
IdentifierTable & getIdentifierTable()
bool LexModuleNameContinue(Token &Tok, SourceLocation UseLoc, SmallVectorImpl< Token > &Suffix, SmallVectorImpl< IdentifierLoc > &Path, bool AllowMacroExpansion, bool IsPartition)
Builtin::Context & getBuiltinInfo()
void setSkipMainFilePreamble(unsigned Bytes, bool StartOfLine)
Instruct the preprocessor to skip part of the main source file.
const PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
void ReplacePreviousCachedToken(ArrayRef< Token > NewToks)
Replace token in CachedLexPos - 1 in CachedTokens by the tokens in NewToks.
LangOptions::FPEvalMethodKind getTUFPEvalMethod() const
const LangOptions & getLangOpts() const
bool isImportingCXXNamedModules() const
If we're importing a standard C++20 Named Modules.
void setTUFPEvalMethod(LangOptions::FPEvalMethodKind Val)
void CodeCompleteIncludedFile(llvm::StringRef Dir, bool IsAngled)
Hook used by the lexer to invoke the "included file" code completion point.
void SetSuppressIncludeNotFoundError(bool Suppress)
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
llvm::DenseMap< FileID, SafeBufferOptOutRegionsTy > LoadedRegions
bool isInNamedModule() const
If we are preprocessing a named module.
void EnableBacktrackAtThisPos(bool Unannotated=false)
From the point that this method is called, and until CommitBacktrackedTokens() or Backtrack() is call...
void RemoveTopOfLexerStack()
Pop the current lexer/macro exp off the top of the lexer stack.
void PoisonSEHIdentifiers(bool Poison=true)
bool isAtStartOfMacroExpansion(SourceLocation loc, SourceLocation *MacroBegin=nullptr) const
Returns true if the given MacroID location points at the first token of the macro expansion.
size_t getTotalMemory() const
void setCounterValue(uint32_t V)
void setExternalSource(ExternalPreprocessorSource *Source)
void clearCodeCompletionHandler()
Clear out the code completion handler.
void AddPragmaHandler(PragmaHandler *Handler)
OptionalFileEntryRef getHeaderToIncludeForDiagnostics(SourceLocation IncLoc, SourceLocation MLoc)
We want to produce a diagnostic at location IncLoc concerning an unreachable effect at location MLoc ...
bool isCodeCompletionReached() const
Returns true if code-completion is enabled and we have hit the code-completion point.
IdentifierInfo * ParsePragmaPushOrPopMacro(Token &Tok)
ParsePragmaPushOrPopMacro - Handle parsing of pragma push_macro/pop_macro.
void LexTokensUntilEOF(std::vector< Token > *Tokens=nullptr)
Lex all tokens for this preprocessor until (and excluding) end of file.
bool getRawToken(SourceLocation Loc, Token &Result, bool IgnoreWhiteSpace=false)
Relex the token at the specified location.
bool isNextPPTokenOneOf(Ts... Ks) const
isNextPPTokenOneOf - Check whether the next pp-token is one of the specificed token kind.
bool usingPCHWithPragmaHdrStop()
True if using a PCH with a pragma hdrstop.
void CodeCompleteNaturalLanguage()
Hook used by the lexer to invoke the "natural language" code completion point.
void EndSourceFile()
Inform the preprocessor callbacks that processing is complete.
bool HandleEndOfFile(Token &Result, bool isEndOfMacro=false)
Callback invoked when the lexer hits the end of the current file.
void setPragmasEnabled(bool Enabled)
DefMacroDirective * appendDefMacroDirective(IdentifierInfo *II, MacroInfo *MI, SourceLocation Loc)
void SetCommentRetentionState(bool KeepComments, bool KeepMacroComments)
Control whether the preprocessor retains comments in output.
bool isAtEndOfMacroExpansion(SourceLocation loc, SourceLocation *MacroEnd=nullptr) const
Returns true if the given MacroID location points at the last token of the macro expansion.
SourceLocation getMainFileFirstPPTokenLoc() const
Get the start location of the first pp-token in main file.
void HandlePragmaMark(Token &MarkTok)
void CollectPPImportSuffix(SmallVectorImpl< Token > &Toks, bool StopUntilEOD=false)
Collect the tokens of a C++20 pp-import-suffix.
bool getPragmasEnabled() const
void HandlePragmaHdrstop(Token &Tok)
void SetEnableMacroExpansion()
PreprocessingRecord * getPreprocessingRecord() const
Retrieve the preprocessing record, or NULL if there is no preprocessing record.
void setEmptylineHandler(EmptylineHandler *Handler)
Set empty line handler.
DiagnosticsEngine & getDiagnostics() const
void HandleCXXModuleDirective(Token Module)
HandleCXXModuleDirective - Handle C++ module declaration directives.
SourceLocation getLastCachedTokenLocation() const
Get the location of the last cached token, suitable for setting the end location of an annotation tok...
bool hasSeenNoTrivialPPDirective() const
Whether we've seen pp-directives which may have changed the preprocessing state.
llvm::DenseSet< const FileEntry * > IncludedFilesSet
unsigned getSpelling(const Token &Tok, const char *&Buffer, bool *Invalid=nullptr) const
Get the spelling of a token into a preallocated buffer, instead of as an std::string.
SelectorTable & getSelectorTable()
void RemovePragmaHandler(StringRef Namespace, PragmaHandler *Handler)
Remove the specific pragma handler from this preprocessor.
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
const llvm::SmallSetVector< Module *, 2 > & getAffectingClangModules() const
Get the set of top-level clang modules that affected preprocessing, but were not imported.
std::optional< LexEmbedParametersResult > LexEmbedParameters(Token &Current, bool ForHasEmbed)
Lex the parameters for an embed directive, returns nullopt on error.
const IncludedFilesSet & getIncludedFiles() const
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
void HandlePragmaIncludeAlias(Token &Tok)
Module * getModuleForLocation(SourceLocation Loc, bool AllowTextual)
Find the module that owns the source or header file that Loc points to.
uint32_t getCounterValue() const
void setCodeCompletionIdentifierInfo(IdentifierInfo *Filter)
Set the code completion token for filtering purposes.
bool HandleModuleName(StringRef DirType, SourceLocation UseLoc, Token &Tok, SmallVectorImpl< IdentifierLoc > &Path, SmallVectorImpl< Token > &DirToks, bool AllowMacroExpansion, bool IsPartition)
SourceLocation getPreambleRecordedPragmaAssumeNonNullLoc() const
Get the location of the recorded unterminated #pragma clang assume_nonnull begin in the preamble,...
void EnterMacro(Token &Tok, SourceLocation ILEnd, MacroInfo *Macro, MacroArgs *Args)
Add a Macro to the top of the include stack and start lexing tokens from it instead of the current bu...
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
void SkipTokensWhileUsingPCH()
Skip tokens until after the include of the through header or until after a pragma hdrstop.
bool usingPCHWithThroughHeader()
True if using a PCH with a through header.
bool CollectPPImportSuffixAndEnterStream(SmallVectorImpl< Token > &Toks, bool StopUntilEOD=false)
void markMainFileAsPreprocessedModuleFile()
Mark the main file as a preprocessed module file, then the 'module' and 'import' directive recognitio...
bool LexStringLiteral(Token &Result, std::string &String, const char *DiagnosticTag, bool AllowMacroExpansion)
Lex a string literal, which may be the concatenation of multiple string literals and may even come fr...
void HandleMicrosoftCommentPaste(Token &Tok)
When the macro expander pastes together a comment (/##/) in Microsoft mode, this method handles updat...
Preprocessor(const PreprocessorOptions &PPOpts, DiagnosticsEngine &diags, const LangOptions &LangOpts, SourceManager &SM, HeaderSearch &Headers, ModuleLoader &TheModuleLoader, IdentifierInfoLookup *IILookup=nullptr, bool OwnsHeaderSearch=false, TranslationUnitKind TUKind=TU_Complete)
void appendMacroDirective(IdentifierInfo *II, MacroDirective *MD)
Add a directive to the macro directive history for this identifier.
Represents an unpacked "presumed" location which can be presented to the user.
ScratchBuffer - This class exposes a simple interface for the dynamic construction of tokens.
This table allows us to fully hide how we implement multi-keyword caching.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
Exposes information about the current target.
TokenValue(IdentifierInfo *II)
TokenValue(tok::TokenKind Kind)
bool operator==(const Token &Tok) const
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.
Public enums and private classes that are part of the SourceManager implementation.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
OnOffSwitch
Defines the possible values of an on-off-switch (C99 6.10.6p2).
bool isLiteral(TokenKind K)
Return true if this is a "literal" kind, like a numeric constant, string, etc.
PPKeywordKind
Provides a namespace for preprocessor keywords which start with a '#' at the beginning of the line.
bool isAnnotation(TokenKind K)
Return true if this is any of tok::annot_* kinds.
The JSON file list parser is used to communicate input to InstallAPI.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
llvm::Registry< PragmaHandler > PragmaHandlerRegistry
Registry of pragma handlers added by plugins.
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
@ Conditional
A conditional (?:) operator.
detail::SearchDirIteratorImpl< true > ConstSearchDirIterator
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
MacroUse
Context in which macro name is used.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Result
The result type of a method or function.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Complete
The translation unit is a complete translation unit.
CustomizableOptional< DirectoryEntryRef > OptionalDirectoryEntryRef
U cast(CodeGen::Address addr)
Diagnostic wrappers for TextAPI types for error reporting.
Helper class to shuttle information about embed directives from the preprocessor to the parser throug...
Describes how and where the pragma was introduced.
SourceLocation IfTokenLoc
SourceLocation HashTokenLoc
PreambleSkipInfo(SourceLocation HashTokenLoc, SourceLocation IfTokenLoc, bool FoundNonSkipPortion, bool FoundElse, SourceLocation ElseLoc)