14#ifndef LLVM_CLANG_LEX_PREPROCESSOR_H
15#define LLVM_CLANG_LEX_PREPROCESSOR_H
37#include "llvm/ADT/APSInt.h"
38#include "llvm/ADT/ArrayRef.h"
39#include "llvm/ADT/DenseMap.h"
40#include "llvm/ADT/FoldingSet.h"
41#include "llvm/ADT/FunctionExtras.h"
42#include "llvm/ADT/PointerUnion.h"
43#include "llvm/ADT/STLExtras.h"
44#include "llvm/ADT/SmallPtrSet.h"
45#include "llvm/ADT/SmallVector.h"
46#include "llvm/ADT/StringRef.h"
47#include "llvm/ADT/TinyPtrVector.h"
48#include "llvm/ADT/iterator_range.h"
49#include "llvm/Support/Allocator.h"
50#include "llvm/Support/Casting.h"
51#include "llvm/Support/Registry.h"
52#include "llvm/Support/TrailingObjects.h"
101 assert(Kind != tok::raw_identifier &&
"Raw identifiers are not supported.");
102 assert(Kind != tok::identifier &&
103 "Identifiers should be created by TokenValue(IdentifierInfo *)");
111 return Tok.getKind() == Kind &&
112 (!II || II ==
Tok.getIdentifierInfo());
141class ModuleNameLoc final
142 : llvm::TrailingObjects<ModuleNameLoc, IdentifierLoc> {
143 friend TrailingObjects;
144 unsigned NumIdentifierLocs;
145 unsigned numTrailingObjects(OverloadToken<IdentifierLoc>)
const {
149 ModuleNameLoc(
ModuleIdPath Path) : NumIdentifierLocs(Path.size()) {
150 (void)llvm::copy(Path, getTrailingObjectsNonStrict<IdentifierLoc>());
157 return {getTrailingObjectsNonStrict<IdentifierLoc>(),
166 return Last.getLoc().getLocWithOffset(
167 Last.getIdentifierInfo()->getLength());
185 llvm::unique_function<void(
const clang::Token &)> OnToken;
199 std::unique_ptr<ScratchBuffer> ScratchBuf;
209 llvm::BumpPtrAllocator BP;
270 MaxAllowedIncludeStackDepth = 200
274 bool KeepComments : 1;
275 bool KeepMacroComments : 1;
276 bool SuppressIncludeNotFoundError : 1;
279 bool InMacroArgs : 1;
282 bool OwnsHeaderSearch : 1;
285 bool DisableMacroExpansion : 1;
289 bool MacroExpansionInDirectivesOverride : 1;
291 class ResetMacroExpansionHelper;
294 mutable bool ReadMacrosFromExternalSource : 1;
297 bool PragmasEnabled : 1;
300 bool PreprocessedOutput : 1;
303 bool ParsingIfOrElifDirective;
306 bool InMacroArgPreExpansion;
324 std::unique_ptr<Builtin::Context> BuiltinInfo;
328 std::unique_ptr<PragmaNamespace> PragmaHandlers;
332 std::unique_ptr<PragmaNamespace> PragmaHandlersBackup;
336 std::vector<CommentHandler *> CommentHandlers;
342 bool IncrementalProcessing =
false;
360 const FileEntry *CodeCompletionFile =
nullptr;
363 unsigned CodeCompletionOffset = 0;
383 llvm::DenseMap<FileID, SmallVector<const char *>> CheckPoints;
384 unsigned CheckPointCounter = 0;
387 bool RecordCheckPoints =
false;
390 bool ImportingCXXNamedModules =
false;
393 Token LastExportKeyword;
404 class StdCXXImportSeq {
409 AfterTopLevelTokenSeq = -1,
414 StdCXXImportSeq(State S) : S(S) {}
417 void handleOpenBracket() {
418 S =
static_cast<State
>(std::max<int>(S, 0) + 1);
421 void handleCloseBracket() {
422 S =
static_cast<State
>(std::max<int>(S, 1) - 1);
425 void handleCloseBrace() {
426 handleCloseBracket();
427 if (S == AtTopLevel && !AfterHeaderName)
428 S = AfterTopLevelTokenSeq;
433 S = AfterTopLevelTokenSeq;
434 AfterHeaderName =
false;
439 void handleExport() {
440 if (S == AfterTopLevelTokenSeq)
446 void handleImport() {
447 if (S == AfterTopLevelTokenSeq || S == AfterExport)
455 void handleHeaderName() {
456 if (S == AfterImportSeq)
457 AfterHeaderName =
true;
467 bool atTopLevel() {
return S <= 0; }
468 bool afterImportSeq() {
return S == AfterImportSeq; }
469 bool afterTopLevelSeq() {
return S == AfterTopLevelTokenSeq; }
476 bool AfterHeaderName =
false;
480 StdCXXImportSeq StdCXXImportSeqState = StdCXXImportSeq::AfterTopLevelTokenSeq;
485 enum GMFState :
int {
488 BeforeGMFIntroducer = -1,
489 GMFAbsentOrEnded = -2,
492 TrackGMF(GMFState S) : S(S) {}
503 void handleExport() {
505 S = GMFAbsentOrEnded;
509 void handleImport(
bool AfterTopLevelTokenSeq) {
511 if (AfterTopLevelTokenSeq && S == BeforeGMFIntroducer)
512 S = GMFAbsentOrEnded;
516 void handleModule(
bool AfterTopLevelTokenSeq) {
520 if (AfterTopLevelTokenSeq && S == BeforeGMFIntroducer)
523 S = GMFAbsentOrEnded;
530 S = GMFAbsentOrEnded;
533 bool inGMF() {
return S == GMFActive; }
541 TrackGMF TrackGMFState = TrackGMF::BeforeGMFIntroducer;
577 class ModuleDeclSeq {
578 enum ModuleDeclState :
int {
582 ImplementationCandidate,
583 NamedModuleInterface,
584 NamedModuleImplementation,
588 ModuleDeclSeq() =
default;
590 void handleExport() {
591 if (State == NotAModuleDecl)
593 else if (!isNamedModule())
597 void handleModule() {
598 if (State == FoundExport)
599 State = InterfaceCandidate;
600 else if (State == NotAModuleDecl)
601 State = ImplementationCandidate;
602 else if (!isNamedModule())
606 void handleModuleName(ModuleNameLoc *NameLoc) {
607 if (isModuleCandidate() && NameLoc)
608 Name += NameLoc->str();
609 else if (!isNamedModule())
614 if (isModuleCandidate())
616 else if (!isNamedModule())
621 if (!Name.empty() && isModuleCandidate()) {
622 if (State == InterfaceCandidate)
623 State = NamedModuleInterface;
624 else if (State == ImplementationCandidate)
625 State = NamedModuleImplementation;
627 llvm_unreachable(
"Unimaged ModuleDeclState.");
628 }
else if (!isNamedModule())
633 if (!isNamedModule())
637 bool isModuleCandidate()
const {
638 return State == InterfaceCandidate || State == ImplementationCandidate;
641 bool isNamedModule()
const {
642 return State == NamedModuleInterface ||
643 State == NamedModuleImplementation;
646 bool isNamedInterface()
const {
return State == NamedModuleInterface; }
648 bool isImplementationUnit()
const {
649 return State == NamedModuleImplementation && !getName().contains(
':');
652 bool isNotAModuleDecl()
const {
return State == NotAModuleDecl; }
654 StringRef getName()
const {
655 assert(isNamedModule() &&
"Can't get name from a non named module");
659 StringRef getPrimaryName()
const {
660 assert(isNamedModule() &&
"Can't get name from a non named module");
661 return getName().split(
':').first;
666 State = NotAModuleDecl;
670 ModuleDeclState State = NotAModuleDecl;
674 ModuleDeclSeq ModuleDeclState;
678 IdentifierLoc PragmaARCCFCodeAuditedInfo;
682 SourceLocation PragmaAssumeNonNullLoc;
690 SourceLocation PreambleRecordedPragmaAssumeNonNullLoc;
693 bool CodeCompletionReached =
false;
697 IdentifierInfo *CodeCompletionII =
nullptr;
700 SourceRange CodeCompletionTokenRange;
712 std::pair<int, bool> SkipMainFilePreamble;
716 bool HasReachedMaxIncludeDepth =
false;
724 unsigned LexLevel = 0;
727 unsigned TokenCount = 0;
730 bool PreprocessToken =
false;
734 unsigned MaxTokens = 0;
735 SourceLocation MaxTokensOverrideLoc;
759 class PreambleConditionalStackStore {
767 PreambleConditionalStackStore() =
default;
769 void startRecording() { ConditionalStackState = Recording; }
770 void startReplaying() { ConditionalStackState = Replaying; }
771 bool isRecording()
const {
return ConditionalStackState == Recording; }
772 bool isReplaying()
const {
return ConditionalStackState == Replaying; }
774 ArrayRef<PPConditionalInfo> getStack()
const {
775 return ConditionalStack;
778 void doneReplaying() {
779 ConditionalStack.clear();
780 ConditionalStackState = Off;
783 void setStack(ArrayRef<PPConditionalInfo> s) {
784 if (!isRecording() && !isReplaying())
786 ConditionalStack.clear();
787 ConditionalStack.append(s.begin(), s.end());
792 bool reachedEOFWhileSkipping()
const {
return SkipInfo.has_value(); }
794 void clearSkipInfo() { SkipInfo.reset(); }
796 std::optional<PreambleSkipInfo> SkipInfo;
799 SmallVector<PPConditionalInfo, 4> ConditionalStack;
800 State ConditionalStackState = Off;
801 } PreambleConditionalStack;
807 std::unique_ptr<Lexer> CurLexer;
813 SmallVector<std::unique_ptr<Lexer>, 2> PendingDestroyLexers;
819 PreprocessorLexer *CurPPLexer =
nullptr;
831 std::unique_ptr<TokenLexer> CurTokenLexer;
835 LexerCallback CurLexerCallback = &CLK_Lexer;
839 Module *CurLexerSubmodule =
nullptr;
844 struct IncludeStackInfo {
845 LexerCallback CurLexerCallback;
847 std::unique_ptr<Lexer> TheLexer;
848 PreprocessorLexer *ThePPLexer;
849 std::unique_ptr<TokenLexer> TheTokenLexer;
854 IncludeStackInfo(LexerCallback CurLexerCallback,
Module *TheSubmodule,
855 std::unique_ptr<Lexer> &&TheLexer,
856 PreprocessorLexer *ThePPLexer,
857 std::unique_ptr<TokenLexer> &&TheTokenLexer,
859 : CurLexerCallback(std::move(CurLexerCallback)),
860 TheSubmodule(std::move(TheSubmodule)), TheLexer(std::move(TheLexer)),
861 ThePPLexer(std::move(ThePPLexer)),
862 TheTokenLexer(std::move(TheTokenLexer)),
863 TheDirLookup(std::move(TheDirLookup)) {}
865 std::vector<IncludeStackInfo> IncludeMacroStack;
869 std::unique_ptr<PPCallbacks> Callbacks;
871 struct MacroExpandsInfo {
876 MacroExpandsInfo(Token Tok, MacroDefinition MD, SourceRange Range)
877 : Tok(Tok), MD(MD), Range(Range) {}
879 SmallVector<MacroExpandsInfo, 2> DelayedMacroExpandsCallbacks;
882 struct FullModuleMacroInfo {
887 llvm::TinyPtrVector<ModuleMacro *> ActiveModuleMacros;
891 unsigned ActiveModuleMacrosGeneration = 0;
894 bool IsAmbiguous =
false;
897 llvm::TinyPtrVector<ModuleMacro *> OverriddenMacros;
899 FullModuleMacroInfo(MacroDirective *MD) : MD(MD) {}
904 mutable llvm::PointerUnion<MacroDirective *, FullModuleMacroInfo *> State;
906 FullModuleMacroInfo *getFullModuleInfo(
Preprocessor &PP,
907 const IdentifierInfo *II)
const {
908 if (II->isOutOfDate())
909 PP.updateOutOfDateIdentifier(*II);
912 if (!II->hasMacroDefinition() ||
913 (!PP.getLangOpts().Modules &&
914 !PP.getLangOpts().ModulesLocalVisibility) ||
915 !PP.CurSubmoduleState->VisibleModules.getGeneration())
918 auto *Info = dyn_cast_if_present<FullModuleMacroInfo *>(State);
920 Info =
new (PP.getPreprocessorAllocator())
925 if (PP.CurSubmoduleState->VisibleModules.getGeneration() !=
926 Info->ActiveModuleMacrosGeneration)
927 PP.updateModuleMacroInfo(II, *Info);
932 MacroState() : MacroState(
nullptr) {}
933 MacroState(MacroDirective *MD) : State(MD) {}
935 MacroState(MacroState &&O) noexcept : State(O.State) {
936 O.State = (MacroDirective *)
nullptr;
939 MacroState &operator=(MacroState &&O)
noexcept {
941 O.State = (MacroDirective *)
nullptr;
947 if (
auto *Info = dyn_cast_if_present<FullModuleMacroInfo *>(State))
948 Info->~FullModuleMacroInfo();
951 MacroDirective *getLatest()
const {
952 if (
auto *Info = dyn_cast_if_present<FullModuleMacroInfo *>(State))
957 void setLatest(MacroDirective *MD) {
958 if (
auto *Info = dyn_cast_if_present<FullModuleMacroInfo *>(State))
965 const IdentifierInfo *II)
const {
966 if (
auto *Info = getFullModuleInfo(PP, II))
967 return ModuleMacroInfo{Info->ActiveModuleMacros, Info->IsAmbiguous};
971 MacroDirective::DefInfo findDirectiveAtLoc(SourceLocation Loc,
972 SourceManager &SourceMgr)
const {
974 if (
auto *Latest = getLatest())
975 return Latest->findDirectiveAtLoc(Loc, SourceMgr);
979 void overrideActiveModuleMacros(
Preprocessor &PP, IdentifierInfo *II) {
980 if (
auto *Info = getFullModuleInfo(PP, II)) {
981 Info->OverriddenMacros.insert(Info->OverriddenMacros.end(),
982 Info->ActiveModuleMacros.begin(),
983 Info->ActiveModuleMacros.end());
984 Info->ActiveModuleMacros.clear();
985 Info->IsAmbiguous =
false;
989 ArrayRef<ModuleMacro*> getOverriddenMacros()
const {
990 if (
auto *Info = dyn_cast_if_present<FullModuleMacroInfo *>(State))
991 return Info->OverriddenMacros;
996 ArrayRef<ModuleMacro *> Overrides) {
997 auto *Info = dyn_cast_if_present<FullModuleMacroInfo *>(State);
999 if (Overrides.empty())
1001 Info =
new (PP.getPreprocessorAllocator())
1005 Info->OverriddenMacros.clear();
1006 Info->OverriddenMacros.insert(Info->OverriddenMacros.end(),
1007 Overrides.begin(), Overrides.end());
1008 Info->ActiveModuleMacrosGeneration = 0;
1017 using MacroMap = llvm::DenseMap<const IdentifierInfo *, MacroState>;
1019 struct SubmoduleState;
1022 struct BuildingSubmoduleInfo {
1027 SourceLocation ImportLoc;
1033 SubmoduleState *OuterSubmoduleState;
1036 unsigned OuterPendingModuleMacroNames;
1038 BuildingSubmoduleInfo(
Module *M, SourceLocation ImportLoc,
bool IsPragma,
1039 SubmoduleState *OuterSubmoduleState,
1040 unsigned OuterPendingModuleMacroNames)
1041 : M(M), ImportLoc(ImportLoc), IsPragma(IsPragma),
1042 OuterSubmoduleState(OuterSubmoduleState),
1043 OuterPendingModuleMacroNames(OuterPendingModuleMacroNames) {}
1045 SmallVector<BuildingSubmoduleInfo, 8> BuildingSubmoduleStack;
1048 struct SubmoduleState {
1053 VisibleModuleSet VisibleModules;
1058 std::map<Module *, SubmoduleState> Submodules;
1061 SubmoduleState NullSubmoduleState;
1065 SubmoduleState *CurSubmoduleState;
1072 llvm::SmallSetVector<Module *, 2> AffectingClangModules;
1075 llvm::FoldingSet<ModuleMacro> ModuleMacros;
1078 llvm::SmallVector<IdentifierInfo *, 32> PendingModuleMacroNames;
1082 llvm::DenseMap<const IdentifierInfo *, llvm::TinyPtrVector<ModuleMacro *>>
1093 using WarnUnusedMacroLocsTy = llvm::SmallDenseSet<SourceLocation, 32>;
1094 WarnUnusedMacroLocsTy WarnUnusedMacroLocs;
1100 using MsgLocationPair = std::pair<std::string, SourceLocation>;
1102 struct MacroAnnotationInfo {
1103 SourceLocation Location;
1104 std::string Message;
1107 struct MacroAnnotations {
1108 std::optional<MacroAnnotationInfo> DeprecationInfo;
1109 std::optional<MacroAnnotationInfo> RestrictExpansionInfo;
1110 std::optional<SourceLocation> FinalAnnotationLoc;
1114 llvm::DenseMap<const IdentifierInfo *, MacroAnnotations> AnnotationInfos;
1122 llvm::DenseMap<IdentifierInfo *, std::vector<MacroInfo *>>
1123 PragmaPushMacroInfo;
1126 unsigned NumDirectives = 0;
1127 unsigned NumDefined = 0;
1128 unsigned NumUndefined = 0;
1129 unsigned NumPragma = 0;
1131 unsigned NumElse = 0;
1132 unsigned NumEndif = 0;
1133 unsigned NumEnteredSourceFiles = 0;
1134 unsigned MaxIncludeStackDepth = 0;
1135 unsigned NumMacroExpanded = 0;
1136 unsigned NumFnMacroExpanded = 0;
1137 unsigned NumBuiltinMacroExpanded = 0;
1138 unsigned NumFastMacroExpanded = 0;
1139 unsigned NumTokenPaste = 0;
1140 unsigned NumFastTokenPaste = 0;
1141 unsigned NumSkipped = 0;
1145 std::string Predefines;
1148 FileID PredefinesFileID;
1151 FileID PCHThroughHeaderFileID;
1154 bool SkippingUntilPragmaHdrStop =
false;
1157 bool SkippingUntilPCHThroughHeader =
false;
1160 bool MainFileIsPreprocessedModuleFile =
false;
1164 enum { TokenLexerCacheSize = 8 };
1165 unsigned NumCachedTokenLexers;
1166 std::unique_ptr<TokenLexer> TokenLexerCache[TokenLexerCacheSize];
1174 SmallVector<Token, 16> MacroExpandedTokens;
1175 std::vector<std::pair<TokenLexer *, size_t>> MacroExpandingLexersStack;
1182 PreprocessingRecord *Record =
nullptr;
1185 using CachedTokensTy = SmallVector<Token, 1>;
1189 CachedTokensTy CachedTokens;
1196 CachedTokensTy::size_type CachedLexPos = 0;
1203 std::vector<CachedTokensTy::size_type> BacktrackPositions;
1207 std::vector<std::pair<CachedTokensTy, CachedTokensTy::size_type>>
1208 UnannotatedBacktrackTokens;
1214 bool SkippingExcludedConditionalBlock =
false;
1220 llvm::DenseMap<const char *, unsigned> RecordedSkippedRanges;
1222 void updateOutOfDateIdentifier(
const IdentifierInfo &II)
const;
1225 Preprocessor(
const PreprocessorOptions &PPOpts, DiagnosticsEngine &diags,
1226 const LangOptions &LangOpts, SourceManager &
SM,
1227 HeaderSearch &Headers, ModuleLoader &TheModuleLoader,
1228 IdentifierInfoLookup *IILookup =
nullptr,
1229 bool OwnsHeaderSearch =
false,
1241 const TargetInfo *AuxTarget =
nullptr);
1275 ExternalSource = Source;
1279 return ExternalSource;
1286 return TheModuleLoader.HadFatalFailure;
1292 return NumDirectives;
1297 return ParsingIfOrElifDirective;
1302 this->KeepComments = KeepComments | KeepMacroComments;
1303 this->KeepMacroComments = KeepMacroComments;
1312 SuppressIncludeNotFoundError = Suppress;
1316 return SuppressIncludeNotFoundError;
1322 PreprocessedOutput = IsPreprocessedOutput;
1331 return CurPPLexer == L;
1361 C = std::make_unique<PPChainedCallbacks>(std::move(
C),
1362 std::move(Callbacks));
1363 Callbacks = std::move(
C);
1376 MaxTokensOverrideLoc = Loc;
1385 OnToken = std::move(F);
1389 GetDependencyDirectives = &Get;
1408 auto I = Submodules.find(M);
1409 if (I == Submodules.end())
1411 auto J = I->second.Macros.find(II);
1412 if (J == I->second.Macros.end())
1414 auto *MD = J->second.getLatest();
1415 return MD && MD->isDefined();
1422 MacroState &S = CurSubmoduleState->Macros[II];
1423 auto *MD = S.getLatest();
1424 while (isa_and_nonnull<VisibilityMacroDirective>(MD))
1425 MD = MD->getPrevious();
1427 S.getModuleInfo(*
this, II));
1435 MacroState &S = CurSubmoduleState->Macros[II];
1437 if (
auto *MD = S.getLatest())
1450 if (!MD || MD->getDefinition().isUndefined())
1464 return MD.getMacroInfo();
1501 updateOutOfDateIdentifier(*II);
1502 auto I = LeafModuleMacros.find(II);
1503 if (I != LeafModuleMacros.end())
1510 return BuildingSubmoduleStack;
1519 llvm::iterator_range<macro_iterator>
1520 macros(
bool IncludeExternalMacros =
true)
const;
1527 if (!BuildingSubmoduleStack.empty()) {
1528 if (M != BuildingSubmoduleStack.back().M)
1529 BuildingSubmoduleStack.back().M->AffectingClangModules.push_back(M);
1531 AffectingClangModules.insert(M);
1538 return AffectingClangModules;
1544 HeaderInfo.getFileInfo(
File).IsLocallyIncluded =
true;
1545 return IncludedFiles.insert(
File).second;
1550 HeaderInfo.getFileInfo(
File);
1551 return IncludedFiles.count(
File);
1577 return &Identifiers.get(Name);
1617 CodeComplete = &Handler;
1622 return CodeComplete;
1627 CodeComplete =
nullptr;
1640 CodeCompletionII = Filter;
1647 CodeCompletionTokenRange = {Start, End};
1650 return CodeCompletionTokenRange;
1655 if (CodeCompletionII)
1656 return CodeCompletionII->getName();
1730 void EnterTokenStream(
const Token *Toks,
unsigned NumToks,
1731 bool DisableMacroExpansion,
bool OwnsTokens,
1736 bool DisableMacroExpansion,
bool IsReinject) {
1737 EnterTokenStream(Toks.release(), NumToks, DisableMacroExpansion,
true,
1743 EnterTokenStream(Toks.data(), Toks.size(), DisableMacroExpansion,
false,
1771 std::pair<CachedTokensTy::size_type, bool> LastBacktrackPos();
1773 CachedTokensTy PopUnannotatedBacktrackTokens();
1790 return !UnannotatedBacktrackTokens.empty();
1808 return MainFileIsPreprocessedModuleFile;
1815 MainFileIsPreprocessedModuleFile =
true;
1821 bool AllowMacroExpansion,
bool IsPartition);
1825 bool AllowMacroExpansion,
bool IsPartition);
1840 assert(FirstPPTokenLoc.isValid() &&
1841 "Did not see the first pp-token in the main file");
1842 return FirstPPTokenLoc;
1846 bool StopUntilEOD =
false);
1848 bool StopUntilEOD =
false);
1851 bool IncludeExports =
true);
1854 return CurSubmoduleState->VisibleModules.getImportLoc(M);
1861 const char *DiagnosticTag,
bool AllowMacroExpansion) {
1862 if (AllowMacroExpansion)
1867 AllowMacroExpansion);
1873 const char *DiagnosticTag,
1874 bool AllowMacroExpansion);
1884 while (
Result.getKind() == tok::comment);
1890 bool OldVal = DisableMacroExpansion;
1891 DisableMacroExpansion =
true;
1896 DisableMacroExpansion = OldVal;
1904 while (
Result.getKind() == tok::comment);
1914 DisableMacroExpansion =
true;
1915 MacroExpansionInDirectivesOverride =
true;
1919 DisableMacroExpansion = MacroExpansionInDirectivesOverride =
false;
1930 assert(LexLevel == 0 &&
"cannot use lookahead while lexing");
1931 if (CachedLexPos + N < CachedTokens.size())
1932 return CachedTokens[CachedLexPos+N];
1934 return PeekAhead(N+1);
1944 "Should only be called when tokens are cached for backtracking");
1945 assert(
signed(CachedLexPos) -
signed(N) >=
1946 signed(LastBacktrackPos().first) &&
1947 "Should revert tokens up to the last backtrack position, not more");
1948 assert(
signed(CachedLexPos) -
signed(N) >= 0 &&
1949 "Corrupted backtrack positions ?");
1963 auto TokCopy = std::make_unique<Token[]>(1);
1965 EnterTokenStream(std::move(TokCopy), 1,
true, IsReinject);
1967 EnterCachingLexMode();
1968 assert(IsReinject &&
"new tokens in the middle of cached stream");
1969 CachedTokens.insert(CachedTokens.begin()+CachedLexPos,
Tok);
1982 assert(
Tok.isAnnotation() &&
"Expected annotation token");
1984 AnnotatePreviousCachedTokens(
Tok);
1990 assert(CachedLexPos != 0);
1991 return CachedTokens[CachedLexPos-1].getLastLoc();
2014 assert(
Tok.isAnnotation() &&
"Expected annotation token");
2016 CachedTokens[CachedLexPos-1] =
Tok;
2021 void *AnnotationVal);
2026 return CurLexerCallback != CLK_Lexer;
2032 assert(
Tok.getIdentifierInfo() &&
"Expected identifier token");
2034 CachedTokens[CachedLexPos-1] =
Tok;
2046 IncrementalProcessing = value;
2080 return CodeCompletionFileLoc;
2090 CodeCompletionReached =
true;
2100 return PragmaARCCFCodeAuditedInfo;
2115 return PragmaAssumeNonNullLoc;
2121 PragmaAssumeNonNullLoc = Loc;
2130 return PreambleRecordedPragmaAssumeNonNullLoc;
2136 PreambleRecordedPragmaAssumeNonNullLoc = Loc;
2150 SkipMainFilePreamble.first = Bytes;
2151 SkipMainFilePreamble.second = StartOfLine;
2158 return Diags->Report(Loc, DiagID);
2162 return Diags->Report(
Tok.getLocation(), DiagID);
2174 bool *invalid =
nullptr)
const {
2203 bool *
Invalid =
nullptr)
const {
2213 bool *
Invalid =
nullptr)
const;
2218 bool IgnoreWhiteSpace =
false) {
2226 bool *
Invalid =
nullptr)
const {
2227 assert((
Tok.is(tok::numeric_constant) ||
Tok.is(tok::binary_data)) &&
2228 Tok.getLength() == 1 &&
"Called on unsupported token");
2229 assert(!
Tok.needsCleaning() &&
"Token can't need cleaning with length 1");
2232 if (
const char *D =
Tok.getLiteralData())
2233 return (
Tok.getKind() == tok::binary_data) ? *D : *D -
'0';
2235 assert(
Tok.is(tok::numeric_constant) &&
"binary data with no data");
2238 return *SourceMgr.getCharacterData(
Tok.getLocation(),
Invalid) -
'0';
2316 unsigned Char)
const {
2326 ++NumFastTokenPaste;
2350 llvm::DenseMap<IdentifierInfo*,unsigned> PoisonReasons;
2364 if(II->isPoisoned()) {
2374 static_assert(
sizeof...(Ts) > 0,
2375 "requires at least one tok::TokenKind specified");
2376 auto NextTokOpt = peekNextPPToken();
2377 return NextTokOpt.has_value() ? NextTokOpt->is(Ks...) :
false;
2384 std::optional<Token> peekNextPPToken()
const;
2390 *Ident___exception_code,
2391 *Ident_GetExceptionCode;
2394 *Ident___exception_info,
2395 *Ident_GetExceptionInfo;
2398 *Ident___abnormal_termination,
2399 *Ident_AbnormalTermination;
2401 const char *getCurLexerEndPos();
2402 void diagnoseMissingHeaderInUmbrellaDir(
const Module &Mod);
2473 "FPEvalMethod should be set either from command line or from the "
2475 return CurrentFPEvalMethod;
2479 return TUFPEvalMethod;
2483 return LastFPEvalPragmaLocation;
2489 "FPEvalMethod should never be set to FEM_UnsetOnCommandLine");
2492 LastFPEvalPragmaLocation = PragmaLoc;
2493 CurrentFPEvalMethod = Val;
2494 TUFPEvalMethod = Val;
2499 "TUPEvalMethod should never be set to FEM_UnsetOnCommandLine");
2500 TUFPEvalMethod = Val;
2517 return ModuleDeclState.isNamedInterface();
2528 return ModuleDeclState.isImplementationUnit();
2534 "Import C++ named modules are only valid for C++20 modules");
2535 return ImportingCXXNamedModules;
2562 bool *IsFrameworkFound,
bool SkipCache =
false,
2563 bool OpenFile =
true,
bool CacheFailures =
true);
2583 bool *ShadowFlag =
nullptr);
2589 friend void TokenLexer::ExpandFunctionArguments();
2591 void PushIncludeMacroStack() {
2592 assert(CurLexerCallback != CLK_CachingLexer &&
2593 "cannot push a caching lexer");
2594 IncludeMacroStack.emplace_back(CurLexerCallback, CurLexerSubmodule,
2595 std::move(CurLexer), CurPPLexer,
2596 std::move(CurTokenLexer), CurDirLookup);
2597 CurPPLexer =
nullptr;
2600 void PopIncludeMacroStack() {
2602 PendingDestroyLexers.push_back(std::move(CurLexer));
2603 CurLexer = std::move(IncludeMacroStack.back().TheLexer);
2604 CurPPLexer = IncludeMacroStack.back().ThePPLexer;
2605 CurTokenLexer = std::move(IncludeMacroStack.back().TheTokenLexer);
2606 CurDirLookup = IncludeMacroStack.back().TheDirLookup;
2607 CurLexerSubmodule = IncludeMacroStack.back().TheSubmodule;
2608 CurLexerCallback = IncludeMacroStack.back().CurLexerCallback;
2609 IncludeMacroStack.pop_back();
2612 void PropagateLineStartLeadingSpaceInfo(Token &
Result);
2616 bool needModuleMacros()
const;
2620 void updateModuleMacroInfo(
const IdentifierInfo *II,
2621 FullModuleMacroInfo &Info);
2623 DefMacroDirective *AllocateDefMacroDirective(MacroInfo *MI,
2624 SourceLocation Loc);
2625 UndefMacroDirective *AllocateUndefMacroDirective(SourceLocation UndefLoc);
2626 VisibilityMacroDirective *AllocateVisibilityMacroDirective(SourceLocation Loc,
2640 bool *ShadowFlag =
nullptr);
2651 MacroInfo *ReadOptionalMacroParameterListAndBody(
2652 const Token &MacroNameTok,
bool ImmediatelyAfterHeaderGuard);
2658 bool ReadMacroParameterList(MacroInfo *MI, Token& LastTok);
2665 void SuggestTypoedDirective(
const Token &
Tok, StringRef
Directive)
const;
2675 void SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
2676 SourceLocation IfTokenLoc,
2677 bool FoundNonSkipPortion,
bool FoundElse,
2678 SourceLocation ElseLoc = SourceLocation());
2682 struct DirectiveEvalResult {
2684 std::optional<llvm::APSInt>
Value;
2690 bool IncludedUndefinedIds;
2693 SourceRange ExprRange;
2700 DirectiveEvalResult EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro,
2701 bool CheckForEoD =
true);
2709 DirectiveEvalResult EvaluateDirectiveExpression(IdentifierInfo *&IfNDefMacro,
2711 bool &EvaluatedDefined,
2712 bool CheckForEoD =
true);
2723 bool EvaluateHasInclude(Token &
Tok, IdentifierInfo *II);
2728 bool EvaluateHasIncludeNext(Token &
Tok, IdentifierInfo *II);
2731 std::pair<ConstSearchDirIterator, const FileEntry *>
2732 getIncludeNextStart(
const Token &IncludeNextTok)
const;
2736 void RegisterBuiltinPragmas();
2740 IdentifierInfo *RegisterBuiltinMacro(
const char *Name) {
2746 MI->setIsBuiltinMacro();
2752 void RegisterBuiltinMacros();
2757 bool HandleMacroExpandedIdentifier(Token &Identifier,
const MacroDefinition &MD);
2764 Token *cacheMacroExpandedTokens(TokenLexer *tokLexer,
2765 ArrayRef<Token> tokens);
2767 void removeCachedMacroExpandedTokensOfLastLexer();
2771 MacroArgs *ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI,
2772 SourceLocation &MacroEnd);
2776 void ExpandBuiltinMacro(Token &
Tok);
2781 void Handle_Pragma(Token &
Tok);
2785 void HandleMicrosoft__pragma(Token &
Tok);
2789 void EnterSourceFileWithLexer(std::unique_ptr<Lexer> TheLexer,
2793 void setPredefinesFileID(FileID FID) {
2794 assert(PredefinesFileID.isInvalid() &&
"PredefinesFileID already set!");
2795 PredefinesFileID = FID;
2799 void setPCHThroughHeaderFileID(FileID FID);
2803 static bool IsFileLexer(
const Lexer* L,
const PreprocessorLexer* P) {
2804 return L ? !L->isPragmaLexer() : P !=
nullptr;
2807 static bool IsFileLexer(
const IncludeStackInfo& I) {
2808 return IsFileLexer(I.TheLexer.get(), I.ThePPLexer);
2811 bool IsFileLexer()
const {
2812 return IsFileLexer(CurLexer.get(), CurPPLexer);
2817 std::optional<CXXStandardLibraryVersionInfo> CXXStandardLibraryVersion;
2826 void CachingLex(Token &
Result);
2828 bool InCachingLexMode()
const {
return CurLexerCallback == CLK_CachingLexer; }
2830 void EnterCachingLexMode();
2831 void EnterCachingLexModeUnchecked();
2833 void ExitCachingLexMode() {
2834 if (InCachingLexMode())
2838 const Token &PeekAhead(
unsigned N);
2839 void AnnotatePreviousCachedTokens(
const Token &
Tok);
2845 void HandleLineDirective();
2846 void HandleDigitDirective(Token &
Tok);
2847 void HandleUserDiagnosticDirective(Token &
Tok,
bool isWarning);
2848 void HandleIdentSCCSDirective(Token &
Tok);
2849 void HandleMacroPublicDirective(Token &
Tok);
2850 void HandleMacroPrivateDirective();
2854 struct ImportAction {
2860 SkippedModuleImport,
2863 Module *ModuleForHeader =
nullptr;
2865 ImportAction(ActionKind AK,
Module *Mod =
nullptr)
2866 : Kind(AK), ModuleForHeader(Mod) {
2867 assert((AK == None || Mod || AK == Failure) &&
2868 "no module for module action");
2874 SourceLocation FilenameLoc, CharSourceRange FilenameRange,
2875 const Token &FilenameTok,
bool &IsFrameworkFound,
bool IsImportDecl,
2877 const FileEntry *LookupFromFile, StringRef &LookupFilename,
2878 SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath,
2879 ModuleMap::KnownHeader &SuggestedModule,
bool isAngled);
2881 void HandleEmbedDirective(SourceLocation HashLoc, Token &
Tok);
2882 void HandleEmbedDirectiveImpl(SourceLocation HashLoc,
2883 const LexEmbedParametersResult &Params,
2884 StringRef BinaryContents, StringRef
FileName);
2887 void HandleIncludeDirective(SourceLocation HashLoc, Token &
Tok,
2889 const FileEntry *LookupFromFile =
nullptr);
2891 HandleHeaderIncludeOrImport(SourceLocation HashLoc, Token &IncludeTok,
2892 Token &FilenameTok, SourceLocation EndLoc,
2894 const FileEntry *LookupFromFile =
nullptr);
2895 void HandleIncludeNextDirective(SourceLocation HashLoc, Token &
Tok);
2896 void HandleIncludeMacrosDirective(SourceLocation HashLoc, Token &
Tok);
2897 void HandleImportDirective(SourceLocation HashLoc, Token &
Tok);
2898 void HandleMicrosoftImportDirective(Token &
Tok);
2899 void HandleObjCImportDirective(Token &AtTok, Token &ImportTok);
2906 const TargetInfo &TargetInfo,
2907 const Module &M, DiagnosticsEngine &Diags);
2930 SourceLocation MLoc);
2933 return PreambleConditionalStack.isRecording();
2937 return PreambleConditionalStack.hasRecordedPreamble();
2941 return PreambleConditionalStack.getStack();
2945 PreambleConditionalStack.setStack(s);
2950 PreambleConditionalStack.startReplaying();
2951 PreambleConditionalStack.setStack(s);
2952 PreambleConditionalStack.SkipInfo = SkipInfo;
2956 return PreambleConditionalStack.SkipInfo;
2962 void replayPreambleConditionalStack();
2965 void HandleDefineDirective(
Token &
Tok,
bool ImmediatelyAfterHeaderGuard);
2966 void HandleUndefDirective();
2970 bool isIfndef,
bool ReadAnyTokensBeforeDirective);
2971 void HandleIfDirective(
Token &IfToken,
const Token &HashToken,
2972 bool ReadAnyTokensBeforeDirective);
2973 void HandleEndifDirective(
Token &EndifToken);
2975 void HandleElifFamilyDirective(
Token &ElifToken,
const Token &HashToken,
3004 AnnotationInfos[II].DeprecationInfo =
3005 MacroAnnotationInfo{AnnotationLoc, std::move(Msg)};
3010 AnnotationInfos[II].RestrictExpansionInfo =
3011 MacroAnnotationInfo{AnnotationLoc, std::move(Msg)};
3015 AnnotationInfos[II].FinalAnnotationLoc = AnnotationLoc;
3019 return AnnotationInfos.find(II)->second;
3023 bool IsIfnDef =
false)
const {
3026 emitMacroDeprecationWarning(Identifier);
3029 !SourceMgr.isInMainFile(Identifier.
getLocation()))
3030 emitRestrictExpansionWarning(Identifier);
3034 emitRestrictInfNaNWarning(Identifier, 0);
3036 emitRestrictInfNaNWarning(Identifier, 1);
3050 void emitMacroDeprecationWarning(
const Token &Identifier)
const;
3051 void emitRestrictExpansionWarning(
const Token &Identifier)
const;
3052 void emitFinalMacroWarning(
const Token &Identifier,
bool IsUndef)
const;
3053 void emitRestrictInfNaNWarning(
const Token &Identifier,
3054 unsigned DiagSelection)
const;
3059 bool InSafeBufferOptOutRegion =
false;
3066 using SafeBufferOptOutRegionsTy =
3071 SafeBufferOptOutRegionsTy SafeBufferOptOutMap;
3082 SafeBufferOptOutRegionsTy &
3090 const SafeBufferOptOutRegionsTy *
3098 return &Iter->getSecond();
3100 } LoadedSafeBufferOptOutMap;
3105 bool isSafeBufferOptOut(
const SourceManager&SourceMgr,
const SourceLocation &Loc)
const;
3118 const SourceLocation &Loc);
3141 const SmallVectorImpl<SourceLocation> &SrcLocSeqs);
3151 return P.CurLexer->Lex(
Result);
3154 return P.CurTokenLexer->Lex(
Result);
3161 return P.CurLexer->LexDependencyDirectiveToken(
Result);
3199extern 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.
Result
Implement __builtin_bit_cast and related operations.
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
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.
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.
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)
llvm::iterator_range< macro_iterator > macros(bool IncludeExternalMacros=true) const
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...
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.
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)
TextEncoding & getTextEncoding()
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.
@ Off
Never emit colors regardless of the output stream.
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.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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)