56#include "llvm/ADT/APInt.h"
57#include "llvm/ADT/ArrayRef.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/STLExtras.h"
60#include "llvm/ADT/ScopeExit.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/ADT/StringRef.h"
63#include "llvm/Support/Capacity.h"
64#include "llvm/Support/ErrorHandling.h"
65#include "llvm/Support/FormatVariadic.h"
66#include "llvm/Support/MemoryBuffer.h"
67#include "llvm/Support/MemoryBufferRef.h"
68#include "llvm/Support/SaveAndRestore.h"
69#include "llvm/Support/raw_ostream.h"
93 : PPOpts(PPOpts), Diags(&diags), LangOpts(opts),
94 FileMgr(Headers.getFileMgr()), SourceMgr(
SM),
95 ScratchBuf(new
ScratchBuffer(SourceMgr)), HeaderInfo(Headers),
96 TheModuleLoader(TheModuleLoader), ExternalSource(
nullptr),
100 Identifiers(IILookup), PragmaHandlers(new
PragmaNamespace(StringRef())),
102 CurSubmoduleState(&NullSubmoduleState) {
103 OwnsHeaderSearch = OwnsHeaders;
109 KeepComments =
false;
110 KeepMacroComments =
false;
111 SuppressIncludeNotFoundError =
false;
114 DisableMacroExpansion =
false;
115 MacroExpansionInDirectivesOverride =
false;
118 InMacroArgPreExpansion =
false;
119 NumCachedTokenLexers = 0;
120 PragmasEnabled =
true;
121 ParsingIfOrElifDirective =
false;
122 PreprocessedOutput =
false;
125 ReadMacrosFromExternalSource =
false;
127 LastExportKeyword.startToken();
129 BuiltinInfo = std::make_unique<Builtin::Context>();
139 RegisterBuiltinPragmas();
142 RegisterBuiltinMacros();
144 if(LangOpts.Borland) {
155 Ident__exception_info = Ident__exception_code =
nullptr;
156 Ident__abnormal_termination = Ident___exception_info =
nullptr;
157 Ident___exception_code = Ident___abnormal_termination =
nullptr;
158 Ident_GetExceptionInfo = Ident_GetExceptionCode =
nullptr;
159 Ident_AbnormalTermination =
nullptr;
164 IncrementalProcessing = LangOpts.IncrementalExtensions;
168 SkippingUntilPragmaHdrStop =
true;
172 !this->PPOpts.ImplicitPCHInclude.empty())
173 SkippingUntilPCHThroughHeader =
true;
176 PreambleConditionalStack.startRecording();
178 MaxTokens = LangOpts.MaxTokens;
184 IncludeMacroStack.clear();
189 std::fill(TokenLexerCache, TokenLexerCache + NumCachedTokenLexers,
nullptr);
190 CurTokenLexer.reset();
193 for (
MacroArgs *ArgList = MacroArgCache; ArgList;)
194 ArgList = ArgList->deallocate();
197 if (OwnsHeaderSearch)
203 assert((!this->Target || this->Target == &Target) &&
204 "Invalid override of target information");
205 this->Target = &Target;
207 assert((!this->AuxTarget || this->AuxTarget == AuxTarget) &&
208 "Invalid override of aux target information.");
209 this->AuxTarget = AuxTarget;
212 BuiltinInfo->InitializeTarget(Target, AuxTarget);
213 HeaderInfo.setTarget(Target);
216 Identifiers.AddKeywords(LangOpts);
230 NumEnteredSourceFiles = 0;
233 PragmaHandlersBackup = std::move(PragmaHandlers);
234 PragmaHandlers = std::make_unique<PragmaNamespace>(StringRef());
235 RegisterBuiltinPragmas();
238 PredefinesFileID =
FileID();
242 NumEnteredSourceFiles = 1;
244 PragmaHandlers = std::move(PragmaHandlersBackup);
248 std::string TokenStr;
249 llvm::raw_string_ostream OS(TokenStr);
256 if (!
Tok.isAnnotation()) {
265 llvm::errs() << llvm::formatv(
"{0,-48} ", OS.str());
267 if (!DumpFlags)
return;
269 auto Loc =
Tok.getLocation();
270 llvm::errs() <<
"Loc=<";
283 if (Loc.isFileID()) {
287 int LineWidth = llvm::utostr(PLoc.
getLine()).size();
292 const int ReservedSpace = 6;
294 int LeftSpace = ReservedSpace - LineWidth -
ColumnWidth;
295 int Padding = std::max<int>(0, LeftSpace);
297 llvm::errs().indent(Padding);
301 if (
Tok.isAtStartOfLine())
302 llvm::errs() <<
" [StartOfLine]";
303 if (
Tok.hasLeadingSpace())
304 llvm::errs() <<
" [LeadingSpace]";
305 if (
Tok.isExpandDisabled())
306 llvm::errs() <<
" [ExpandDisabled]";
307 if (
Tok.needsCleaning()) {
308 const char *Start = SourceMgr.getCharacterData(
Tok.getLocation());
309 llvm::errs() <<
" [UnClean='" << StringRef(Start,
Tok.getLength()) <<
"']";
314 Loc.
print(llvm::errs(), SourceMgr);
318 llvm::errs() <<
"MACRO: ";
319 for (
unsigned i = 0, e = MI.
getNumTokens(); i != e; ++i) {
323 llvm::errs() <<
"\n";
327 llvm::errs() <<
"\n*** Preprocessor Stats:\n";
328 llvm::errs() << NumDirectives <<
" directives found:\n";
329 llvm::errs() <<
" " << NumDefined <<
" #define.\n";
330 llvm::errs() <<
" " << NumUndefined <<
" #undef.\n";
331 llvm::errs() <<
" #include/#include_next/#import:\n";
332 llvm::errs() <<
" " << NumEnteredSourceFiles <<
" source files entered.\n";
333 llvm::errs() <<
" " << MaxIncludeStackDepth <<
" max include stack depth\n";
334 llvm::errs() <<
" " << NumIf <<
" #if/#ifndef/#ifdef.\n";
335 llvm::errs() <<
" " << NumElse <<
" #else/#elif/#elifdef/#elifndef.\n";
336 llvm::errs() <<
" " << NumEndif <<
" #endif.\n";
337 llvm::errs() <<
" " << NumPragma <<
" #pragma.\n";
338 llvm::errs() << NumSkipped <<
" #if/#ifndef#ifdef regions skipped\n";
340 llvm::errs() << NumMacroExpanded <<
"/" << NumFnMacroExpanded <<
"/"
341 << NumBuiltinMacroExpanded <<
" obj/fn/builtin macros expanded, "
342 << NumFastMacroExpanded <<
" on the fast path.\n";
343 llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
344 <<
" token paste (##) operations performed, "
345 << NumFastTokenPaste <<
" on the fast path.\n";
347 llvm::errs() <<
"\nPreprocessor Memory: " <<
getTotalMemory() <<
"B total";
349 llvm::errs() <<
"\n BumpPtr: " << BP.getTotalMemory();
350 llvm::errs() <<
"\n Macro Expanded Tokens: "
351 << llvm::capacity_in_bytes(MacroExpandedTokens);
352 llvm::errs() <<
"\n Predefines Buffer: " << Predefines.capacity();
354 llvm::errs() <<
"\n Macros: "
355 << llvm::capacity_in_bytes(CurSubmoduleState->Macros);
356 llvm::errs() <<
"\n #pragma push_macro Info: "
357 << llvm::capacity_in_bytes(PragmaPushMacroInfo);
358 llvm::errs() <<
"\n Poison Reasons: "
359 << llvm::capacity_in_bytes(PoisonReasons);
360 llvm::errs() <<
"\n Comment Handlers: "
361 << llvm::capacity_in_bytes(CommentHandlers) <<
"\n";
364llvm::iterator_range<Preprocessor::macro_iterator>
366 if (IncludeExternalMacros && ExternalSource &&
367 !ReadMacrosFromExternalSource) {
368 ReadMacrosFromExternalSource =
true;
369 ExternalSource->ReadDefinedMacros();
373 CurSubmoduleState->Macros.try_emplace(
Macro.II);
375 return CurSubmoduleState->Macros;
379 return BP.getTotalMemory()
380 + llvm::capacity_in_bytes(MacroExpandedTokens)
381 + Predefines.capacity()
384 + llvm::capacity_in_bytes(CurSubmoduleState->Macros)
385 + llvm::capacity_in_bytes(PragmaPushMacroInfo)
386 + llvm::capacity_in_bytes(PoisonReasons)
387 + llvm::capacity_in_bytes(CommentHandlers);
394 std::equal(Tokens.begin(), Tokens.end(), MI->
tokens_begin());
401 StringRef BestSpelling;
402 for (
const auto &M :
macros()) {
404 M.second.findDirectiveAtLoc(Loc, SourceMgr);
414 (Location.isValid() &&
415 SourceMgr.isBeforeInTranslationUnit(BestLocation, Location))) {
416 BestLocation = Location;
417 BestSpelling = M.first->getName();
424 if (InCachingLexMode())
425 CurLexerCallback = CLK_CachingLexer;
427 CurLexerCallback = CurLexer->isDependencyDirectivesLexer()
428 ? CLK_DependencyDirectivesLexer
430 else if (CurTokenLexer)
431 CurLexerCallback = CLK_TokenLexer;
433 CurLexerCallback = CLK_Lexer;
437 unsigned CompleteLine,
438 unsigned CompleteColumn) {
439 assert(CompleteLine && CompleteColumn &&
"Starts from 1:1");
440 assert(!CodeCompletionFile &&
"Already set");
443 std::optional<llvm::MemoryBufferRef> Buffer =
444 SourceMgr.getMemoryBufferForFileOrNone(
File);
449 const char *Position = Buffer->getBufferStart();
451 for (; *Position; ++Position) {
452 if (*Position !=
'\r' && *Position !=
'\n')
456 if ((Position[1] ==
'\r' || Position[1] ==
'\n') &&
457 Position[0] != Position[1])
464 Position += CompleteColumn - 1;
468 if (SkipMainFilePreamble.first &&
469 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID()) ==
File) {
470 if (Position - Buffer->getBufferStart() < SkipMainFilePreamble.first)
471 Position = Buffer->getBufferStart() + SkipMainFilePreamble.first;
474 if (Position > Buffer->getBufferEnd())
475 Position = Buffer->getBufferEnd();
477 CodeCompletionFile =
File;
478 CodeCompletionOffset = Position - Buffer->getBufferStart();
480 auto NewBuffer = llvm::WritableMemoryBuffer::getNewUninitMemBuffer(
481 Buffer->getBufferSize() + 1, Buffer->getBufferIdentifier());
482 char *NewBuf = NewBuffer->getBufferStart();
483 char *NewPos = std::copy(Buffer->getBufferStart(), Position, NewBuf);
485 std::copy(Position, Buffer->getBufferEnd(), NewPos+1);
486 SourceMgr.overrideFileContents(
File, std::move(NewBuffer));
495 CodeComplete->CodeCompleteIncludedFile(Dir, IsAngled);
501 CodeComplete->CodeCompleteNaturalLanguage();
511 if (
Tok.isNot(tok::raw_identifier) && !
Tok.hasUCN()) {
514 return II->getName();
518 if (
Tok.needsCleaning())
519 Buffer.resize(
Tok.getLength());
521 const char *Ptr = Buffer.data();
523 return StringRef(Ptr, Len);
532 Tok.setLength(Str.size());
535 SourceLocation Loc = ScratchBuf->getToken(Str.data(), Str.size(), DestPtr);
537 if (ExpansionLocStart.
isValid())
538 Loc = SourceMgr.createExpansionLoc(Loc, ExpansionLocStart,
539 ExpansionLocEnd, Str.size());
540 Tok.setLocation(Loc);
543 if (
Tok.is(tok::raw_identifier))
544 Tok.setRawIdentifierData(DestPtr);
545 else if (
Tok.isLiteral())
546 Tok.setLiteralData(DestPtr);
554 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
561 ScratchBuf->getToken(Buffer.data() + LocInfo.second, Length, DestPtr);
573 if (!
getLangOpts().isCompilingModuleImplementation())
589 assert(NumEnteredSourceFiles == 0 &&
"Cannot reenter the main file!");
590 FileID MainFileID = SourceMgr.getMainFileID();
594 if (!SourceMgr.isLoadedFileID(MainFileID)) {
600 if (SkipMainFilePreamble.first > 0)
601 CurLexer->SetByteOffset(SkipMainFilePreamble.first,
602 SkipMainFilePreamble.second);
619 std::optional<StringRef> Input =
622 MainFileIsPreprocessedModuleFile =
624 auto Tracer = std::make_unique<NoTrivialPPDirectiveTracer>(*
this);
625 DirTracer = Tracer.get();
627 std::optional<Token> FirstPPTok = CurLexer->peekNextPPToken();
629 FirstPPTokenLoc = FirstPPTok->getLocation();
634 std::unique_ptr<llvm::MemoryBuffer> SB =
635 llvm::MemoryBuffer::getMemBufferCopy(Predefines,
"<built-in>");
636 assert(SB &&
"Cannot create predefined source buffer");
637 FileID FID = SourceMgr.createFileID(std::move(SB));
638 assert(FID.
isValid() &&
"Could not create FileID for predefines?");
639 setPredefinesFileID(FID);
644 if (!PPOpts.PCHThroughHeader.empty()) {
649 false,
nullptr,
nullptr,
650 nullptr,
nullptr,
nullptr,
655 << PPOpts.PCHThroughHeader;
658 setPCHThroughHeaderFileID(
668void Preprocessor::setPCHThroughHeaderFileID(
FileID FID) {
669 assert(PCHThroughHeaderFileID.
isInvalid() &&
670 "PCHThroughHeaderFileID already set!");
671 PCHThroughHeaderFileID = FID;
675 assert(PCHThroughHeaderFileID.isValid() &&
676 "Invalid PCH through header FileID");
677 return FE == SourceMgr.getFileEntryForID(PCHThroughHeaderFileID);
682 PCHThroughHeaderFileID.isValid();
687 PCHThroughHeaderFileID.isValid();
704 bool ReachedMainFileEOF =
false;
705 bool UsingPCHThroughHeader = SkippingUntilPCHThroughHeader;
706 bool UsingPragmaHdrStop = SkippingUntilPragmaHdrStop;
711 CurLexerCallback(*
this,
Tok);
712 if (
Tok.is(tok::eof) && !InPredefines) {
713 ReachedMainFileEOF =
true;
716 if (UsingPCHThroughHeader && !SkippingUntilPCHThroughHeader)
718 if (UsingPragmaHdrStop && !SkippingUntilPragmaHdrStop)
721 if (ReachedMainFileEOF) {
722 if (UsingPCHThroughHeader)
724 << PPOpts.PCHThroughHeader << 1;
725 else if (!PPOpts.PCHWithHdrStopCreate)
730void Preprocessor::replayPreambleConditionalStack() {
732 if (PreambleConditionalStack.isReplaying()) {
734 "CurPPLexer is null when calling replayPreambleConditionalStack.");
736 PreambleConditionalStack.doneReplaying();
737 if (PreambleConditionalStack.reachedEOFWhileSkipping())
738 SkipExcludedConditionalBlock(
739 PreambleConditionalStack.SkipInfo->HashTokenLoc,
740 PreambleConditionalStack.SkipInfo->IfTokenLoc,
741 PreambleConditionalStack.SkipInfo->FoundNonSkipPortion,
742 PreambleConditionalStack.SkipInfo->FoundElse,
743 PreambleConditionalStack.SkipInfo->ElseLoc);
750 Callbacks->EndOfMainFile();
761 assert(!Identifier.
getRawIdentifier().empty() &&
"No raw identifier data!");
771 StringRef CleanedStr =
getSpelling(Identifier, IdentifierBuffer);
773 if (Identifier.
hasUCN()) {
796 PoisonReasons[II] = DiagID;
800 assert(Ident__exception_code && Ident__exception_info);
801 assert(Ident___exception_code && Ident___exception_info);
802 Ident__exception_code->setIsPoisoned(Poison);
803 Ident___exception_code->setIsPoisoned(Poison);
804 Ident_GetExceptionCode->setIsPoisoned(Poison);
805 Ident__exception_info->setIsPoisoned(Poison);
806 Ident___exception_info->setIsPoisoned(Poison);
807 Ident_GetExceptionInfo->setIsPoisoned(Poison);
808 Ident__abnormal_termination->setIsPoisoned(Poison);
809 Ident___abnormal_termination->setIsPoisoned(Poison);
810 Ident_AbnormalTermination->setIsPoisoned(Poison);
815 "Can't handle identifiers without identifier info!");
816 llvm::DenseMap<IdentifierInfo*,unsigned>::const_iterator it =
818 if(it == PoisonReasons.end())
819 Diag(Identifier, diag::err_pp_used_poisoned_id);
824void Preprocessor::updateOutOfDateIdentifier(
const IdentifierInfo &II)
const {
827 "getExternalSource() should not return nullptr");
841 "Can't handle identifiers without identifier info!");
851 bool CurrentIsPoisoned =
false;
852 const bool IsSpecialVariadicMacro =
853 &II == Ident__VA_ARGS__ || &II == Ident__VA_OPT__;
854 if (IsSpecialVariadicMacro)
857 updateOutOfDateIdentifier(II);
860 if (IsSpecialVariadicMacro)
872 const auto *MI = MD.getMacroInfo();
873 assert(MI &&
"macro definition with no macro info?");
874 if (!DisableMacroExpansion) {
879 return HandleMacroExpandedIdentifier(Identifier, MD);
886 Diag(Identifier, diag::pp_disabled_macro_expansion);
906 Diag(Identifier, diag::warn_pp_identifier_is_cpp_keyword) << &II;
913 Diag(Identifier, diag::ext_token_used);
917 !CurLexer->isLexingRawMode() && !CurLexer->isPragmaLexer() &&
918 !CurLexer->ParsingPreprocessorDirective &&
933 while (!CurLexerCallback(*
this,
Result))
936 if (
Result.is(tok::unknown) && TheModuleLoader.HadFatalFailure)
939 if (
Result.is(tok::code_completion) &&
Result.getIdentifierInfo()) {
945 Result.setIdentifierInfo(
nullptr);
953 if (
getLangOpts().CPlusPlusModules && LexLevel == 1 &&
955 switch (
Result.getKind()) {
956 case tok::l_paren:
case tok::l_square:
case tok::l_brace:
957 StdCXXImportSeqState.handleOpenBracket();
959 case tok::r_paren:
case tok::r_square:
960 StdCXXImportSeqState.handleCloseBracket();
963 StdCXXImportSeqState.handleCloseBrace();
965#define PRAGMA_ANNOTATION(X) case tok::annot_##X:
967#include "clang/Basic/TokenKinds.def"
968#undef PRAGMA_ANNOTATION
971 case tok::annot_module_include:
972 case tok::annot_repl_input_end:
974 TrackGMFState.handleSemi();
975 StdCXXImportSeqState.handleSemi();
976 ModuleDeclState.handleSemi();
978 case tok::header_name:
979 case tok::annot_header_unit:
980 StdCXXImportSeqState.handleHeaderName();
985 TrackGMFState.handleExport();
986 StdCXXImportSeqState.handleExport();
987 ModuleDeclState.handleExport();
990 ModuleDeclState.handleColon();
993 if (StdCXXImportSeqState.atTopLevel()) {
994 TrackGMFState.handleImport(StdCXXImportSeqState.afterTopLevelSeq());
995 StdCXXImportSeqState.handleImport();
999 if (StdCXXImportSeqState.atTopLevel()) {
1002 TrackGMFState.handleModule(StdCXXImportSeqState.afterTopLevelSeq());
1003 ModuleDeclState.handleModule();
1006 case tok::annot_module_name:
1007 ModuleDeclState.handleModuleName(
1009 if (ModuleDeclState.isModuleCandidate())
1013 TrackGMFState.handleMisc();
1014 StdCXXImportSeqState.handleMisc();
1015 ModuleDeclState.handleMisc();
1020 if (RecordCheckPoints && CurLexer &&
1022 CheckPoints[CurLexer->getFileID()].push_back(CurLexer->BufferPtr);
1023 CheckPointCounter = 0;
1026 if (
Result.isNot(tok::kw_export))
1027 LastExportKeyword.startToken();
1034 if (LexLevel == 0 && !PendingDestroyLexers.empty())
1035 PendingDestroyLexers.clear();
1037 if ((LexLevel == 0 || PreprocessToken) &&
1050 if (
Tok.isOneOf(tok::unknown, tok::eof, tok::eod,
1051 tok::annot_repl_input_end))
1053 if (Tokens !=
nullptr)
1054 Tokens->push_back(
Tok);
1075 if (CurPPLexer->ParsingFilename)
1078 CurPPLexer->LexIncludeFilename(FilenameTok);
1086 if (FilenameTok.
is(tok::less) && AllowMacroExpansion) {
1093 FilenameBuffer.push_back(
'<');
1099 while (FilenameTok.
isNot(tok::greater)) {
1101 if (FilenameTok.
isOneOf(tok::eod, tok::eof)) {
1103 Diag(Start, diag::note_matching) << tok::less;
1110 if (FilenameTok.
is(tok::code_completion)) {
1119 FilenameBuffer.push_back(
' ');
1123 size_t PreAppendSize = FilenameBuffer.size();
1124 FilenameBuffer.resize(PreAppendSize + FilenameTok.
getLength());
1126 const char *BufPtr = &FilenameBuffer[PreAppendSize];
1127 unsigned ActualLen =
getSpelling(FilenameTok, BufPtr);
1130 if (BufPtr != &FilenameBuffer[PreAppendSize])
1131 memcpy(&FilenameBuffer[PreAppendSize], BufPtr, ActualLen);
1134 if (FilenameTok.
getLength() != ActualLen)
1135 FilenameBuffer.resize(PreAppendSize + ActualLen);
1139 FilenameTok.
setKind(tok::header_name);
1144 }
else if (FilenameTok.
is(tok::string_literal) && AllowMacroExpansion) {
1155 StringRef Str =
getSpelling(FilenameTok, FilenameBuffer);
1156 if (Str.size() >= 2 && Str.front() ==
'"' && Str.back() ==
'"')
1157 FilenameTok.
setKind(tok::header_name);
1163std::optional<Token> Preprocessor::peekNextPPToken()
const {
1165 std::optional<Token> Val;
1167 Val = CurLexer->peekNextPPToken();
1169 Val = CurTokenLexer->peekNextPPToken();
1176 return std::nullopt;
1177 for (
const IncludeStackInfo &Entry : llvm::reverse(IncludeMacroStack)) {
1179 Val = Entry.TheLexer->peekNextPPToken();
1181 Val = Entry.TheTokenLexer->peekNextPPToken();
1187 if (Entry.ThePPLexer)
1188 return std::nullopt;
1206 for (
auto &Piece : Path) {
1207 assert(Piece.getIdentifierInfo() && Piece.getLoc().isValid());
1210 Name += Piece.getIdentifierInfo()->getName();
1216 assert(!Path.empty() &&
"expect at least one identifier in a module name");
1218 totalSizeToAlloc<IdentifierLoc>(Path.size()),
alignof(ModuleNameLoc));
1219 return new (Mem) ModuleNameLoc(Path);
1225 bool AllowMacroExpansion,
1227 auto ConsumeToken = [&]() {
1228 if (AllowMacroExpansion)
1232 Suffix.push_back(
Tok);
1236 if (
Tok.isNot(tok::identifier)) {
1237 if (
Tok.is(tok::code_completion)) {
1238 CurLexer->cutOffLexing();
1239 CodeComplete->CodeCompleteModuleImport(UseLoc, Path);
1243 Diag(
Tok, diag::err_pp_module_expected_ident) << Path.empty();
1252 !AllowMacroExpansion) {
1253 Diag(
Tok, diag::err_pp_module_name_is_macro)
1254 << IsPartition <<
Tok.getIdentifierInfo();
1255 Diag(MI->getDefinitionLoc(), diag::note_macro_here)
1256 <<
Tok.getIdentifierInfo();
1260 Path.emplace_back(
Tok.getLocation(),
Tok.getIdentifierInfo());
1263 if (
Tok.isNot(tok::period))
1274 bool AllowMacroExpansion,
1276 bool LeadingSpace =
Tok.hasLeadingSpace();
1277 unsigned NumToksInDirective = DirToks.size();
1280 if (
Tok.isNot(tok::eod))
1289 DirToks.resize(NumToksInDirective);
1291 DirToks.emplace_back();
1292 DirToks.back().setKind(tok::annot_module_name);
1293 DirToks.back().setAnnotationRange(NameLoc->
getRange());
1294 DirToks.back().setAnnotationValue(
static_cast<void *
>(NameLoc));
1296 DirToks.push_back(
Tok);
1329 if (
Result.is(tok::kw_export)) {
1330 LastExportKeyword =
Result;
1343 if (LastExportKeyword.is(tok::kw_export)) {
1346 if (!LastExportKeyword.isAtPhysicalStartOfLine())
1351 if (
Result.isAtPhysicalStartOfLine())
1353 }
else if (!
Result.isAtPhysicalStartOfLine())
1357 CurPPLexer->ParsingPreprocessorDirective,
true);
1361 CurPPLexer->ParsingFilename,
1362 Result.getIdentifierInfo()->isImportKeyword());
1364 std::optional<Token> NextTok = peekNextPPToken();
1368 if (NextTok->is(tok::raw_identifier))
1371 if (
Result.getIdentifierInfo()->isImportKeyword()) {
1372 if (NextTok->isOneOf(tok::identifier, tok::less, tok::colon,
1373 tok::header_name)) {
1374 Result.setKind(tok::kw_import);
1375 ModuleImportLoc =
Result.getLocation();
1380 if (
Result.getIdentifierInfo()->isModuleKeyword() &&
1381 NextTok->isOneOf(tok::identifier, tok::colon, tok::semi)) {
1382 Result.setKind(tok::kw_module);
1383 ModuleDeclLoc =
Result.getLocation();
1400 bool StopUntilEOD) {
1402 Toks.emplace_back();
1405 switch (Toks.back().getKind()) {
1424 auto ToksCopy = std::make_unique<Token[]>(Toks.size());
1425 std::copy(Toks.begin(), Toks.end(), ToksCopy.get());
1426 EnterTokenStream(std::move(ToksCopy), Toks.size(),
1428 assert(CurTokenLexer &&
"Must have a TokenLexer");
1429 CurTokenLexer->setLexingCXXModuleDirective();
1433 bool IncludeExports) {
1434 CurSubmoduleState->VisibleModules.setVisible(
1435 M, Loc, IncludeExports, [](
Module *) {},
1439 Diag(ModuleImportLoc, diag::warn_module_conflict)
1440 << Path[0]->getFullModuleName()
1441 << Conflict->getFullModuleName()
1446 if (!BuildingSubmoduleStack.empty() && M != BuildingSubmoduleStack.back().M)
1447 BuildingSubmoduleStack.back().M->Imports.push_back(M);
1451 const char *DiagnosticTag,
1452 bool AllowMacroExpansion) {
1454 if (
Result.isNot(tok::string_literal)) {
1455 Diag(
Result, diag::err_expected_string_literal)
1456 << 0 << DiagnosticTag;
1463 StrToks.push_back(
Result);
1465 if (
Result.hasUDSuffix())
1468 if (AllowMacroExpansion)
1472 }
while (
Result.is(tok::string_literal));
1476 assert(Literal.isOrdinary() &&
"Didn't allow wide strings in");
1478 if (Literal.hadError)
1481 if (Literal.Pascal) {
1482 Diag(StrToks[0].getLocation(), diag::err_expected_string_literal)
1483 << 0 << DiagnosticTag;
1487 String = std::string(Literal.GetString());
1492 assert(
Tok.is(tok::numeric_constant));
1494 bool NumberInvalid =
false;
1495 StringRef Spelling =
getSpelling(
Tok, IntegerBuffer, &NumberInvalid);
1501 if (Literal.hadError || !Literal.isIntegerLiteral() || Literal.hasUDSuffix())
1503 llvm::APInt APVal(64, 0);
1504 if (Literal.GetIntegerValue(APVal))
1507 Value = APVal.getLimitedValue();
1512 assert(Handler &&
"NULL comment handler");
1513 assert(!llvm::is_contained(CommentHandlers, Handler) &&
1514 "Comment handler already registered");
1515 CommentHandlers.push_back(Handler);
1519 std::vector<CommentHandler *>::iterator Pos =
1520 llvm::find(CommentHandlers, Handler);
1521 assert(Pos != CommentHandlers.end() &&
"Comment handler not registered");
1522 CommentHandlers.erase(Pos);
1526 bool AnyPendingTokens =
false;
1528 if (H->HandleComment(*
this, Comment))
1529 AnyPendingTokens =
true;
1537void Preprocessor::emitMacroDeprecationWarning(
const Token &Identifier)
const {
1538 const MacroAnnotations &A =
1540 assert(A.DeprecationInfo &&
1541 "Macro deprecation warning without recorded annotation!");
1542 const MacroAnnotationInfo &Info = *A.DeprecationInfo;
1543 if (Info.Message.empty())
1544 Diag(Identifier, diag::warn_pragma_deprecated_macro_use)
1547 Diag(Identifier, diag::warn_pragma_deprecated_macro_use)
1549 Diag(Info.Location, diag::note_pp_macro_annotation) << 0;
1552void Preprocessor::emitRestrictExpansionWarning(
const Token &Identifier)
const {
1553 const MacroAnnotations &A =
1555 assert(A.RestrictExpansionInfo &&
1556 "Macro restricted expansion warning without recorded annotation!");
1557 const MacroAnnotationInfo &Info = *A.RestrictExpansionInfo;
1558 if (Info.Message.empty())
1559 Diag(Identifier, diag::warn_pragma_restrict_expansion_macro_use)
1562 Diag(Identifier, diag::warn_pragma_restrict_expansion_macro_use)
1564 Diag(Info.Location, diag::note_pp_macro_annotation) << 1;
1567void Preprocessor::emitRestrictInfNaNWarning(
const Token &Identifier,
1568 unsigned DiagSelection)
const {
1569 Diag(Identifier, diag::warn_fp_nan_inf_when_disabled) << DiagSelection << 1;
1572void Preprocessor::emitFinalMacroWarning(
const Token &Identifier,
1573 bool IsUndef)
const {
1574 const MacroAnnotations &A =
1576 assert(A.FinalAnnotationLoc &&
1577 "Final macro warning without recorded annotation!");
1579 Diag(Identifier, diag::warn_pragma_final_macro)
1581 Diag(*A.FinalAnnotationLoc, diag::note_pp_macro_annotation) << 2;
1588 auto TestInMap = [&SourceMgr](
const SafeBufferOptOutRegionsTy &Map,
1591 auto FirstRegionEndingAfterLoc = llvm::partition_point(
1593 &Loc](
const std::pair<SourceLocation, SourceLocation> &Region) {
1594 return SourceMgr.isBeforeInTranslationUnit(Region.second, Loc);
1597 if (FirstRegionEndingAfterLoc != Map.end()) {
1599 return SourceMgr.isBeforeInTranslationUnit(
1600 FirstRegionEndingAfterLoc->first, Loc);
1604 if (!Map.empty() && Map.back().first == Map.back().second)
1605 return SourceMgr.isBeforeInTranslationUnit(Map.back().first, Loc);
1627 if (SourceMgr.isLocalSourceLocation(Loc))
1628 return TestInMap(SafeBufferOptOutMap, Loc);
1631 LoadedSafeBufferOptOutMap.lookupLoadedOptOutMap(Loc, SourceMgr);
1643 InSafeBufferOptOutRegion =
true;
1644 CurrentSafeBufferOptOutStart = Loc;
1648 if (!SafeBufferOptOutMap.empty()) {
1649 [[maybe_unused]]
auto *PrevRegion = &SafeBufferOptOutMap.back();
1650 assert(PrevRegion->first != PrevRegion->second &&
1651 "Shall not begin a safe buffer opt-out region before closing the "
1657 SafeBufferOptOutMap.emplace_back(Loc, Loc);
1661 InSafeBufferOptOutRegion =
false;
1665 assert(!SafeBufferOptOutMap.empty() &&
1666 "Misordered safe buffer opt-out regions");
1667 auto *CurrRegion = &SafeBufferOptOutMap.back();
1668 assert(CurrRegion->first == CurrRegion->second &&
1669 "Set end location to a closed safe buffer opt-out region");
1670 CurrRegion->second = Loc;
1676 return InSafeBufferOptOutRegion;
1679 StartLoc = CurrentSafeBufferOptOutStart;
1680 return InSafeBufferOptOutRegion;
1685 assert(!InSafeBufferOptOutRegion &&
1686 "Attempt to serialize safe buffer opt-out regions before file being "
1687 "completely preprocessed");
1691 for (
const auto &[begin, end] : SafeBufferOptOutMap) {
1692 SrcSeq.push_back(begin);
1693 SrcSeq.push_back(end);
1705 if (SourceLocations.size() == 0)
1708 assert(SourceLocations.size() % 2 == 0 &&
1709 "ill-formed SourceLocation sequence");
1711 auto It = SourceLocations.begin();
1712 SafeBufferOptOutRegionsTy &Regions =
1713 LoadedSafeBufferOptOutMap.findAndConsLoadedOptOutMap(*It, SourceMgr);
1719 Regions.emplace_back(Begin, End);
1720 }
while (It != SourceLocations.end());
1742 return C == Record ||
C == DirTracer;
1747 for (
auto *P : Released)
1752 if (
auto It = CheckPoints.find(FID); It != CheckPoints.end()) {
1754 auto P = llvm::upper_bound(FileCheckPoints, Start);
1755 if (P == FileCheckPoints.begin())
1757 return *std::prev(P);
1763 return DirTracer && DirTracer->hasSeenNoTrivialPPDirective();
1767 return SeenNoTrivialPPDirective;
1770void NoTrivialPPDirectiveTracer::setSeenNoTrivialPPDirective() {
1771 if (InMainFile && !SeenNoTrivialPPDirective)
1772 SeenNoTrivialPPDirective =
true;
1778 InMainFile = (FID == PP.getSourceManager().getMainFileID());
1787 setSeenNoTrivialPPDirective();
Defines enum values for all the target-independent builtin functions.
This is the interface for scanning header and source files to get the minimum necessary preprocessor ...
LLVM_INSTANTIATE_REGISTRY_EX(CLANG_ABI_EXPORT, clang::tooling::ToolExecutorPluginRegistry) namespace clang
Defines the clang::FileManager interface and associated types.
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 PreprocessorLexer interface.
static bool MacroDefinitionEquals(const MacroInfo *MI, ArrayRef< TokenValue > Tokens)
Compares macro tokens with a specified token value sequence.
static constexpr unsigned CheckPointStepSize
Minimum distance between two check points, in tokens.
Defines the clang::Preprocessor interface.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
virtual ~CodeCompletionHandler()
Concrete class used by the front-end to report problems and issues.
virtual ~EmptylineHandler()
virtual ~ExternalPreprocessorSource()
virtual void updateOutOfDateIdentifier(const IdentifierInfo &II)=0
Update an out-of-date identifier.
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...
Provides lookups to, and iteration over, IdentiferInfo objects.
One of these records is kept for each identifier that is lexed.
bool IsKeywordInCPlusPlus() const
Return true if this identifier would be a keyword in C++ mode.
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isPoisoned() const
Return true if this token has been poisoned.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setIsFutureCompatKeyword(bool Val)
StringRef getName() const
Return the actual identifier string.
bool isFutureCompatKeyword() const
is/setIsFutureCompatKeyword - Initialize information about whether or not this language token is a ke...
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
@ 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...
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
A description of the current definition of a macro.
MacroInfo * getMacroInfo() const
Get the MacroInfo that should be used for this definition.
MacroInfo * getMacroInfo()
SourceLocation getLocation() const
Encapsulates the data about a macro definition (e.g.
const_tokens_iterator tokens_begin() const
unsigned getNumTokens() const
Return the number of tokens that this macro expands to.
const Token & getReplacementToken(unsigned Tok) const
bool isBuiltinMacro() const
Return true if this macro requires processing before expansion.
bool isObjectLike() const
Abstract interface for a module loader.
static std::string getFlatNameFromPath(ModuleIdPath Path)
Represents a macro directive exported by a module.
static ModuleNameLoc * Create(Preprocessor &PP, ModuleIdPath Path)
SourceRange getRange() const
Describes a module or submodule.
void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, SourceRange Range, const MacroArgs *Args) override
Called by Preprocessor::HandleMacroExpandedIdentifier when a macro invocation is found.
bool hasSeenNoTrivialPPDirective() const
void LexedFileChanged(FileID FID, LexedFileChangeReason Reason, SrcMgr::CharacteristicKind FileType, FileID PrevFID, SourceLocation Loc) override
Callback invoked whenever the Lexer moves to a different file for lexing.
NumericLiteralParser - This performs strict semantic analysis of the content of a ppnumber,...
This interface provides a way to observe the actions of the preprocessor as it does its thing.
static void releaseIfPreserved(std::unique_ptr< PPCallbacks > &CB, llvm::function_ref< bool(PPCallbacks *)> Pred, SmallVectorImpl< PPCallbacks * > &Released)
Walk the subtree rooted at CB (recursing into descendants first), then check CB itself.
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...
void setConditionalLevels(ArrayRef< PPConditionalInfo > CL)
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool GeneratePreamble
True indicates that a preamble is being generated.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
bool markIncluded(FileEntryRef File)
Mark the file as included.
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...
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 EnterModuleSuffixTokenStream(ArrayRef< Token > Toks)
void InitializeForModelFile()
Initialize the preprocessor to parse a model file.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
void setCodeCompletionTokenRange(const SourceLocation Start, const SourceLocation End)
Set the code completion token range for detecting replacement range later on.
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 ...
bool isSafeBufferOptOut(const SourceManager &SourceMgr, const SourceLocation &Loc) const
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.
IdentifierInfo * LookUpIdentifierInfo(Token &Identifier) const
Given a tok::raw_identifier token, look up the identifier information for the token and install it in...
void DumpMacro(const MacroInfo &MI) const
llvm::iterator_range< macro_iterator > macros(bool IncludeExternalMacros=true) const
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 Lex(Token &Result)
Lex the next token for this preprocessor.
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...
void addCommentHandler(CommentHandler *Handler)
Add the specified comment handler to the preprocessor.
void removeCommentHandler(CommentHandler *Handler)
Remove the specified comment handler.
void HandlePoisonedIdentifier(Token &Identifier)
Display reason for poisoned identifier.
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 EnterMainSourceFile()
Enter the specified FileID as the main source file, which implicitly adds the builtin defines etc.
const MacroAnnotations & getMacroAnnotations(const IdentifierInfo *II) const
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
SourceManager & getSourceManager() const
bool isBacktrackEnabled() const
True if EnableBacktrackAtThisPos() was called and caching of tokens is on.
MacroDefinition getMacroDefinition(const IdentifierInfo *II)
bool isPreprocessedModuleFile() const
Whether the main file is preprocessed module file.
void SetPoisonReason(IdentifierInfo *II, unsigned DiagID)
Specifies the reason for poisoning an identifier.
SourceLocation CheckEndOfDirective(StringRef DirType, bool EnableMacros=false, SmallVectorImpl< Token > *ExtraToks=nullptr)
Ensure that the next token is a tok::eod token.
bool getCommentRetentionState() const
Module * getCurrentModuleImplementation()
Retrieves the module whose implementation we're current compiling, if any.
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 ...
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
bool isPPInSafeBufferOptOutRegion()
void makeModuleVisible(Module *M, SourceLocation Loc, bool IncludeExports=true)
bool hadModuleLoaderFatalFailure() const
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
bool LexHeaderName(Token &Result, bool AllowMacroExpansion=true)
Lex a token, forming a header-name token if possible.
bool isPCHThroughHeader(const FileEntry *FE)
Returns true if the FileEntry is the PCH through header.
void DumpLocation(SourceLocation Loc) const
bool parseSimpleIntegerLiteral(Token &Tok, uint64_t &Value)
Parses a simple integer literal to get its numeric value.
void LexUnexpandedToken(Token &Result)
Just like Lex, but disables macro expansion of identifier tokens.
bool creatingPCHWithPragmaHdrStop()
True if creating a PCH with a pragma hdrstop.
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.
llvm::BumpPtrAllocator & getPreprocessorAllocator()
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)
HeaderSearch & getHeaderSearchInfo() const
bool setDeserializedSafeBufferOptOutMap(const SmallVectorImpl< SourceLocation > &SrcLocSeqs)
ExternalPreprocessorSource * getExternalSource() const
void HandleDirective(Token &Result)
Callback invoked when the lexer sees a # token at the start of a line.
SmallVector< SourceLocation, 64 > serializeSafeBufferOptOutMap() const
void recomputeCurLexerKind()
Recompute the current lexer kind based on the CurLexer/ CurTokenLexer pointers.
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)
const LangOptions & getLangOpts() const
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.
llvm::DenseMap< FileID, SafeBufferOptOutRegionsTy > LoadedRegions
void PoisonSEHIdentifiers(bool Poison=true)
size_t getTotalMemory() const
void LexTokensUntilEOF(std::vector< Token > *Tokens=nullptr)
Lex all tokens for this preprocessor until (and excluding) end of file.
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.
void CollectPPImportSuffix(SmallVectorImpl< Token > &Toks, bool StopUntilEOD=false)
Collect the tokens of a C++20 pp-import-suffix.
DiagnosticsEngine & getDiagnostics() const
bool hasSeenNoTrivialPPDirective() const
Whether we've seen pp-directives which may have changed the preprocessing state.
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
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)
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)
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)
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
unsigned getLine() const
Return the presumed line number of this location.
bool isInvalid() const
Return true if this object is invalid or uninitialized.
ScratchBuffer - This class exposes a simple interface for the dynamic construction of tokens.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
void print(raw_ostream &OS, const SourceManager &SM) const
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
std::optional< StringRef > getBufferDataOrNone(FileID FID) const
Return a StringRef to the source buffer data for the specified FileID, returning std::nullopt if inva...
A trivial tuple used to represent a source range.
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
Exposes information about the current target.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
bool hasUCN() const
Returns true if this token contains a universal character name.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
unsigned getLength() const
bool isExpandDisabled() const
Return true if this identifier token should never be expanded in the future, due to C99 6....
void setKind(tok::TokenKind K)
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isAtStartOfLine() const
isAtStartOfLine - Return true if this token is at the start of a line.
bool isOneOf(Ts... Ks) const
@ HasSeenNoTrivialPPDirective
bool isModuleContextualKeyword(bool AllowExport=true) const
Return true if we have a C++20 modules contextual keyword(export, importor module).
bool hasLeadingSpace() const
Return true if this token has whitespace before it.
bool hasLeadingEmptyMacro() const
Return true if this token has an empty macro before it.
bool isNot(tok::TokenKind K) const
void startToken()
Reset all flags to cleared.
bool needsCleaning() const
Return true if this token has trigraphs or escaped newlines in it.
void setIdentifierInfo(IdentifierInfo *II)
void setFlagValue(TokenFlags Flag, bool Val)
Set a flag to either true or false.
StringRef getRawIdentifier() const
getRawIdentifier - For a raw identifier token (i.e., an identifier lexed in raw mode),...
void setFlag(TokenFlags Flag)
Set the specified flag.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
const char * getTokenName(TokenKind Kind) LLVM_READNONE
Determines the name of a token as used within the front end.
const char * getKeywordSpelling(TokenKind Kind) LLVM_READNONE
Determines the spelling of simple keyword and contextual keyword tokens like 'int' and 'dynamic_cast'...
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.
void expandUCNs(SmallVectorImpl< char > &Buf, StringRef Input)
Copy characters from Input to Buf, expanding any UCNs.
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
std::pair< FileID, unsigned > FileIDAndOffset
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool isPreprocessedModuleFile(StringRef Source)
Scan an input source buffer, and check whether the input source is a preprocessed output.
@ Result
The result type of a method or function.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.