36#include "llvm/ADT/ArrayRef.h"
37#include "llvm/ADT/DenseMap.h"
38#include "llvm/ADT/SmallVector.h"
39#include "llvm/ADT/StringRef.h"
40#include "llvm/Support/Compiler.h"
41#include "llvm/Support/ErrorHandling.h"
42#include "llvm/Support/Timer.h"
77 bool IgnoreNull)
const {
78 auto I = Handlers.find(Name);
79 if (I != Handlers.end())
80 return I->getValue().get();
83 I = Handlers.find(StringRef());
84 if (I != Handlers.end())
85 return I->getValue().get();
90 assert(!Handlers.count(Handler->
getName()) &&
91 "A handler with this name is already registered in this namespace");
92 Handlers[Handler->
getName()].reset(Handler);
96 auto I = Handlers.find(Handler->
getName());
97 assert(I != Handlers.end() &&
98 "Handler not registered in this namespace");
100 I->getValue().release();
116 PP.
Diag(
Tok, diag::warn_pragma_ignored);
132struct TokenCollector {
140 Tokens.push_back(
Tok);
145 assert(Collect &&
"did not collect tokens");
146 assert(!Tokens.empty() &&
"collected unexpected number of tokens");
149 auto Toks = std::make_unique<Token[]>(Tokens.size());
150 std::copy(Tokens.begin() + 1, Tokens.end(), Toks.get());
151 Toks[Tokens.size() - 1] =
Tok;
152 Self.EnterTokenStream(std::move(Toks), Tokens.size(),
157 Tok = *Tokens.begin();
166 Callbacks->PragmaDirective(Introducer.
Loc, Introducer.
Kind);
175 PragmaHandlers->HandlePragma(*
this, Introducer,
Tok);
178 if ((CurTokenLexer && CurTokenLexer->isParsingPreprocessorDirective())
179 || (CurPPLexer && CurPPLexer->ParsingPreprocessorDirective))
186void Preprocessor::Handle_Pragma(
Token &
Tok) {
207 TokenCollector Toks = {*
this, InMacroArgPreExpansion, {},
Tok};
215 Diag(PragmaLoc, diag::err__Pragma_malformed);
222 Diag(PragmaLoc, diag::err__Pragma_malformed);
230 if (
Tok.
is(tok::r_paren))
236 Diag(
Tok, diag::err_invalid_string_udl);
239 if (
Tok.
is(tok::r_paren))
250 Diag(PragmaLoc, diag::err__Pragma_malformed);
255 if (InMacroArgPreExpansion) {
262 SmallString<64> StrVal;
266 Diag(PragmaLoc, diag::err__Pragma_malformed);
270 assert(StrValRef.size() <= StrVal.size());
273 if (StrValRef.begin() != StrVal.begin())
274 StrVal.assign(StrValRef);
276 else if (StrValRef.size() != StrVal.size())
277 StrVal.resize(StrValRef.size());
292 StrVal.size(), *
this);
294 EnterSourceFileWithLexer(TL,
nullptr);
304 if (StrVal[0] ==
'L' || StrVal[0] ==
'U' ||
305 (StrVal[0] ==
'u' && StrVal[1] !=
'8'))
306 StrVal.erase(StrVal.begin());
307 else if (StrVal[0] ==
'u')
308 StrVal.erase(StrVal.begin(), StrVal.begin() + 2);
310 if (StrVal[0] ==
'R') {
313 assert(StrVal[1] ==
'"' && StrVal[StrVal.size() - 1] ==
'"' &&
314 "Invalid raw string token!");
317 unsigned NumDChars = 0;
318 while (StrVal[2 + NumDChars] !=
'(') {
319 assert(NumDChars < (StrVal.size() - 5) / 2 &&
320 "Invalid raw string token!");
323 assert(StrVal[StrVal.size() - 2 - NumDChars] ==
')');
327 StrVal.erase(StrVal.begin(), StrVal.begin() + 2 + NumDChars);
328 StrVal.erase(StrVal.end() - 1 - NumDChars, StrVal.end());
330 assert(StrVal[0] ==
'"' && StrVal[StrVal.size()-1] ==
'"' &&
331 "Invalid string token!");
334 unsigned ResultPos = 1;
335 for (
size_t i = 1, e = StrVal.size() - 1; i != e; ++i) {
337 if (StrVal[i] ==
'\\' && i + 1 < e &&
338 (StrVal[i + 1] ==
'\\' || StrVal[i + 1] ==
'"'))
340 StrVal[ResultPos++] = StrVal[i];
342 StrVal.erase(StrVal.begin() + ResultPos, StrVal.end() - 1);
350 StrVal[StrVal.size() - 1] =
'\n';
355void Preprocessor::HandleMicrosoft__pragma(
Token &
Tok) {
358 TokenCollector Toks = {*
this, InMacroArgPreExpansion, {},
Tok};
366 Diag(PragmaLoc, diag::err__Pragma_malformed);
371 SmallVector<Token, 32> PragmaToks;
375 PragmaToks.push_back(
Tok);
376 if (
Tok.
is(tok::l_paren))
378 else if (
Tok.
is(tok::r_paren) && NumParens-- == 0)
383 if (
Tok.
is(tok::eof)) {
384 Diag(PragmaLoc, diag::err_unterminated___pragma);
389 if (InMacroArgPreExpansion) {
397 PragmaToks.back().setKind(tok::eod);
399 Token *TokArray =
new Token[PragmaToks.size()];
400 std::copy(PragmaToks.begin(), PragmaToks.end(), TokArray);
403 EnterTokenStream(TokArray, PragmaToks.size(),
true,
true,
420 Diag(OnceTok, diag::pp_pragma_once_in_main_file);
430 assert(CurPPLexer &&
"No current lexer?");
433 CurLexer->ReadToEndOfLine(&Buffer);
435 Callbacks->PragmaMark(MarkTok.
getLocation(), Buffer);
448 if (CurPPLexer) CurPPLexer->LexingRawMode =
true;
450 if (CurPPLexer) CurPPLexer->LexingRawMode =
false;
453 if (
Tok.is(tok::eod))
return;
456 if (
Tok.isNot(tok::raw_identifier)) {
457 Diag(
Tok, diag::err_pp_invalid_poison);
470 Diag(
Tok, diag::pp_poisoning_existing_macro);
483 Diag(SysHeaderTok, diag::pp_pragma_sysheader_in_main_file);
491 HeaderInfo.MarkFileSystemHeader(*TheLexer->
getFileEntry());
497 unsigned FilenameID = SourceMgr.getLineTableFilenameID(PLoc.
getFilename());
508 FilenameID,
false,
false,
519 if (FilenameTok.
isNot(tok::header_name)) {
535 if (Filename.empty())
541 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr);
543 if (!SuppressIncludeNotFoundError)
544 Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
555 while (DependencyTok.
isNot(tok::eod)) {
561 if (!Message.empty())
562 Message.erase(Message.end()-1);
563 Diag(FilenameTok, diag::pp_out_of_date_dependency) << Message;
575 if (
Tok.isNot(tok::l_paren)) {
576 Diag(PragmaTok.
getLocation(), diag::err_pragma_push_pop_macro_malformed)
583 if (
Tok.isNot(tok::string_literal)) {
584 Diag(PragmaTok.
getLocation(), diag::err_pragma_push_pop_macro_malformed)
589 if (
Tok.hasUDSuffix()) {
590 Diag(
Tok, diag::err_invalid_string_udl);
600 if (
Tok.isNot(tok::r_paren)) {
601 Diag(PragmaTok.
getLocation(), diag::err_pragma_push_pop_macro_malformed)
606 assert(StrVal[0] ==
'"' && StrVal[StrVal.size()-1] ==
'"' &&
607 "Invalid string token!");
609 if (StrVal.size() <= 2) {
610 Diag(StrTok.
getLocation(), diag::warn_pargma_push_pop_macro_empty_string)
621 MacroTok.
setKind(tok::raw_identifier);
622 CreateString(StringRef(&StrVal[1], StrVal.size() - 2), MacroTok);
637 if (!IdentInfo)
return;
648 PragmaPushMacroInfo[IdentInfo].push_back(MI);
662 if (!IdentInfo)
return;
665 llvm::DenseMap<IdentifierInfo *, std::vector<MacroInfo *>>
::iterator iter =
666 PragmaPushMacroInfo.find(IdentInfo);
667 if (iter != PragmaPushMacroInfo.end()) {
670 if (MI->isWarnIfUnused())
671 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
676 MacroInfo *MacroToReInstall = iter->second.back();
678 if (MacroToReInstall)
683 iter->second.pop_back();
684 if (iter->second.empty())
685 PragmaPushMacroInfo.erase(iter);
687 Diag(MessageLoc, diag::warn_pragma_pop_macro_no_push)
700 if (
Tok.isNot(tok::l_paren)) {
701 Diag(
Tok, diag::warn_pragma_include_alias_expected) <<
"(";
706 Token SourceFilenameTok;
710 StringRef SourceFileName;
712 if (SourceFilenameTok.
is(tok::header_name)) {
713 SourceFileName =
getSpelling(SourceFilenameTok, FileNameBuffer);
715 Diag(
Tok, diag::warn_pragma_include_alias_expected_filename);
718 FileNameBuffer.clear();
722 if (
Tok.isNot(tok::comma)) {
723 Diag(
Tok, diag::warn_pragma_include_alias_expected) <<
",";
727 Token ReplaceFilenameTok;
731 StringRef ReplaceFileName;
732 if (ReplaceFilenameTok.
is(tok::header_name)) {
733 ReplaceFileName =
getSpelling(ReplaceFilenameTok, FileNameBuffer);
735 Diag(
Tok, diag::warn_pragma_include_alias_expected_filename);
741 if (
Tok.isNot(tok::r_paren)) {
742 Diag(
Tok, diag::warn_pragma_include_alias_expected) <<
")";
748 StringRef OriginalSource = SourceFileName;
750 bool SourceIsAngled =
753 bool ReplaceIsAngled =
756 if (!SourceFileName.empty() && !ReplaceFileName.empty() &&
757 (SourceIsAngled != ReplaceIsAngled)) {
760 DiagID = diag::warn_pragma_include_alias_mismatch_angle;
762 DiagID = diag::warn_pragma_include_alias_mismatch_quote;
781 if (
Tok.is(tok::string_literal) && !
Tok.hasUDSuffix()) {
783 if (Literal.hadError)
787 }
else if (!
Tok.isAnnotation() &&
Tok.getIdentifierInfo()) {
788 ModuleNameComponent =
791 PP.
Diag(
Tok.getLocation(), diag::err_pp_expected_module_name) <<
First;
803 ModuleName.push_back(NameComponent);
806 if (
Tok.isNot(tok::period))
820 if (
Tok.isNot(tok::eod)) {
821 Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
825 CurLexer->LexingRawMode =
true;
827 auto TryConsumeIdentifier = [&](StringRef Ident) ->
bool {
828 if (
Tok.getKind() != tok::raw_identifier ||
829 Tok.getRawIdentifier() != Ident)
836 const char *Start = CurLexer->getBufferLocation();
837 const char *End =
nullptr;
840 End = CurLexer->getBufferLocation();
843 if (
Tok.is(tok::eof)) {
844 Diag(Loc, diag::err_pp_module_build_missing_end);
848 if (
Tok.isNot(tok::hash) || !
Tok.isAtStartOfLine()) {
855 CurLexer->ParsingPreprocessorDirective =
true;
857 if (TryConsumeIdentifier(
"pragma") && TryConsumeIdentifier(
"clang") &&
858 TryConsumeIdentifier(
"module")) {
859 if (TryConsumeIdentifier(
"build"))
862 else if (TryConsumeIdentifier(
"endbuild")) {
869 assert(
Tok.getKind() != tok::eof &&
"missing EOD before EOF");
873 CurLexer->LexingRawMode =
false;
876 assert(CurLexer->getBuffer().begin() <= Start &&
877 Start <= CurLexer->getBuffer().end() &&
878 CurLexer->getBuffer().begin() <= End &&
879 End <= CurLexer->getBuffer().end() &&
880 "module source range not contained within same file buffer");
881 TheModuleLoader.createModuleFromSource(Loc, ModuleName->
getName(),
882 StringRef(Start, End - Start));
887 if (
Tok.is(tok::l_paren)) {
888 Diag(
Tok.getLocation(), diag::warn_pp_hdrstop_filename_ignored);
894 if (
Tok.isNot(tok::r_paren)) {
895 Diag(
Tok, diag::err_expected) << tok::r_paren;
900 if (
Tok.isNot(tok::eod))
901 Diag(
Tok.getLocation(), diag::ext_pp_extra_tokens_at_eol)
905 SourceMgr.isInMainFile(
Tok.getLocation())) {
906 assert(CurLexer &&
"no lexer for #pragma hdrstop processing");
909 CurLexer->FormTokenWithChars(
Result, CurLexer->BufferEnd, tok::eof);
910 CurLexer->cutOffLexing();
913 SkippingUntilPragmaHdrStop =
false;
924 if (!Namespace.empty()) {
928 if (
PragmaHandler *Existing = PragmaHandlers->FindHandler(Namespace)) {
930 assert(InsertNS !=
nullptr &&
"Cannot have a pragma namespace and pragma"
931 " handler with the same name!");
936 PragmaHandlers->AddPragma(InsertNS);
942 "Pragma handler already exists for this identifier!");
955 if (!Namespace.empty()) {
956 PragmaHandler *Existing = PragmaHandlers->FindHandler(Namespace);
957 assert(Existing &&
"Namespace containing handler does not exist!");
960 assert(NS &&
"Invalid namespace, registered as a regular pragma handler!");
966 if (NS != PragmaHandlers.get() && NS->
IsEmpty()) {
967 PragmaHandlers->RemovePragmaHandler(NS);
976 if (
Tok.isNot(tok::identifier)) {
977 Diag(
Tok, diag::ext_on_off_switch_syntax);
983 else if (II->
isStr(
"OFF"))
985 else if (II->
isStr(
"DEFAULT"))
988 Diag(
Tok, diag::ext_on_off_switch_syntax);
994 if (
Tok.isNot(tok::eod))
995 Diag(
Tok, diag::ext_pragma_syntax_eod);
1006 Token &OnceTok)
override {
1015 PragmaMarkHandler() : PragmaHandler(
"mark") {}
1017 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1018 Token &MarkTok)
override {
1025 PragmaPoisonHandler() : PragmaHandler(
"poison") {}
1027 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1028 Token &PoisonTok)
override {
1036 PragmaSystemHeaderHandler() : PragmaHandler(
"system_header") {}
1038 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1039 Token &SHToken)
override {
1046 PragmaDependencyHandler() : PragmaHandler(
"dependency") {}
1048 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1049 Token &DepToken)
override {
1055 PragmaDebugHandler() : PragmaHandler(
"__debug") {}
1057 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1058 Token &DebugToken)
override {
1062 PP.
Diag(
Tok, diag::warn_pragma_debug_missing_command);
1067 if (II->
isStr(
"assert")) {
1069 llvm_unreachable(
"This is an assertion!");
1070 }
else if (II->
isStr(
"crash")) {
1071 llvm::Timer T(
"crash",
"pragma crash");
1072 llvm::TimeRegion
R(&T);
1075 }
else if (II->
isStr(
"parser_crash")) {
1079 Crasher.
setKind(tok::annot_pragma_parser_crash);
1083 }
else if (II->
isStr(
"sleep")) {
1084 std::this_thread::sleep_for(std::chrono::milliseconds(100));
1085 }
else if (II->
isStr(
"dump")) {
1088 DumpAnnot.
setKind(tok::annot_pragma_dump);
1091 }
else if (II->
isStr(
"diag_mapping")) {
1094 if (DiagName.
is(tok::eod))
1096 else if (DiagName.
is(tok::string_literal) && !DiagName.
hasUDSuffix()) {
1097 StringLiteralParser
Literal(DiagName, PP,
1098 StringLiteralEvalMethod::Unevaluated);
1103 PP.
Diag(DiagName, diag::warn_pragma_debug_missing_argument)
1106 }
else if (II->
isStr(
"llvm_fatal_error")) {
1108 llvm::report_fatal_error(
"#pragma clang __debug llvm_fatal_error");
1109 }
else if (II->
isStr(
"llvm_unreachable")) {
1111 llvm_unreachable(
"#pragma clang __debug llvm_unreachable");
1112 }
else if (II->
isStr(
"macro")) {
1119 PP.
Diag(MacroName, diag::warn_pragma_debug_missing_argument)
1121 }
else if (II->
isStr(
"module_map")) {
1122 llvm::SmallVector<IdentifierLoc, 8> ModuleName;
1127 for (
auto IIAndLoc : ModuleName) {
1131 PP.
Diag(IIAndLoc.getLoc(), diag::warn_pragma_debug_unknown_module)
1132 << IIAndLoc.getIdentifierInfo()->getName();
1137 }
else if (II->
isStr(
"module_lookup")) {
1142 PP.
Diag(MName, diag::warn_pragma_debug_missing_argument)
1148 PP.
Diag(MName, diag::warn_pragma_debug_unable_to_find_module)
1149 << MNameII->getName();
1153 }
else if (II->
isStr(
"overflow_stack")) {
1155 DebugOverflowStack();
1156 }
else if (II->
isStr(
"captured")) {
1158 }
else if (II->
isStr(
"modules")) {
1159 struct ModuleVisitor {
1161 void visit(
Module *M,
bool VisibleOnly) {
1163 if (!VisibleOnly || ImportLoc.
isValid()) {
1166 llvm::errs() << M <<
" visible ";
1169 llvm::errs() <<
"\n";
1172 if (!VisibleOnly || ImportLoc.
isInvalid() ||
Sub->IsExplicit)
1173 visit(Sub, VisibleOnly);
1176 void visitAll(
bool VisibleOnly) {
1177 for (
auto &NameAndMod :
1179 visit(NameAndMod.second, VisibleOnly);
1185 auto *DumpII =
Kind.getIdentifierInfo();
1187 PP.
Diag(Kind, diag::warn_pragma_debug_missing_argument)
1189 }
else if (DumpII->isStr(
"all")) {
1190 Visitor.visitAll(
false);
1191 }
else if (DumpII->isStr(
"visible")) {
1192 Visitor.visitAll(
true);
1193 }
else if (DumpII->isStr(
"building")) {
1195 llvm::errs() <<
"in " << Building.M->getFullModuleName();
1196 if (Building.ImportLoc.isValid()) {
1197 llvm::errs() <<
" imported ";
1198 if (Building.IsPragma)
1199 llvm::errs() <<
"via pragma ";
1200 llvm::errs() <<
"at ";
1202 llvm::errs() <<
"\n";
1206 PP.
Diag(
Tok, diag::warn_pragma_debug_unexpected_command)
1207 << DumpII->getName();
1209 }
else if (II->
isStr(
"sloc_usage")) {
1212 std::optional<unsigned> MaxNotes;
1216 if (ArgToken.
is(tok::numeric_constant) &&
1219 }
else if (ArgToken.
isNot(tok::eod)) {
1220 PP.
Diag(ArgToken, diag::warn_pragma_debug_unexpected_argument);
1223 PP.
Diag(
Tok, diag::remark_sloc_usage);
1227 PP.
Diag(
Tok, diag::warn_pragma_debug_unexpected_command)
1236 void HandleCaptured(Preprocessor &PP) {
1241 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol)
1242 <<
"pragma clang __debug captured";
1247 MutableArrayRef<Token> Toks(
1249 Toks[0].startToken();
1250 Toks[0].setKind(tok::annot_pragma_captured);
1251 Toks[0].setLocation(NameLoc);
1253 PP.EnterTokenStream(Toks,
true,
1259 #pragma warning(disable : 4717)
1261 static void DebugOverflowStack(
void (*P)() =
nullptr) {
1262 void (*
volatile Self)(void(*P)()) = DebugOverflowStack;
1263 Self(
reinterpret_cast<void(*)()
>(
Self));
1266 #pragma warning(default : 4717)
1270struct PragmaUnsafeBufferUsageHandler :
public PragmaHandler {
1271 PragmaUnsafeBufferUsageHandler() : PragmaHandler(
"unsafe_buffer_usage") {}
1272 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1273 Token &FirstToken)
override {
1278 PP.
Diag(
Tok, diag::err_pp_pragma_unsafe_buffer_usage_syntax);
1285 if (II->
isStr(
"begin")) {
1287 PP.
Diag(Loc, diag::err_pp_double_begin_pragma_unsafe_buffer_usage);
1288 }
else if (II->
isStr(
"end")) {
1290 PP.
Diag(Loc, diag::err_pp_unmatched_end_begin_pragma_unsafe_buffer_usage);
1292 PP.
Diag(
Tok, diag::err_pp_pragma_unsafe_buffer_usage_syntax);
1302 explicit PragmaDiagnosticHandler(
const char *NS)
1303 : PragmaHandler(
"diagnostic"),
Namespace(NS) {}
1305 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1306 Token &DiagToken)
override {
1311 PP.
Diag(
Tok, diag::warn_pragma_diagnostic_invalid);
1321 if (II->
isStr(
"pop")) {
1323 PP.
Diag(
Tok, diag::warn_pragma_diagnostic_cannot_pop);
1330 }
else if (II->
isStr(
"push")) {
1341 .Case(
"ignored", diag::Severity::Ignored)
1342 .Case(
"warning", diag::Severity::Warning)
1343 .Case(
"error", diag::Severity::Error)
1344 .Case(
"fatal", diag::Severity::Fatal)
1348 PP.
Diag(
Tok, diag::warn_pragma_diagnostic_invalid);
1354 std::string WarningName;
1364 if (WarningName.size() < 3 || WarningName[0] !=
'-' ||
1365 (WarningName[1] !=
'W' && WarningName[1] !=
'R')) {
1366 PP.
Diag(StringLoc, diag::warn_pragma_diagnostic_invalid_option);
1371 : diag::Flavor::Remark;
1372 StringRef
Group = StringRef(WarningName).substr(2);
1373 bool unknownDiag =
false;
1374 if (Group ==
"everything") {
1383 PP.
Diag(StringLoc, diag::warn_pragma_diagnostic_unknown_warning)
1392 PragmaHdrstopHandler() : PragmaHandler(
"hdrstop") {}
1393 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1394 Token &DepToken)
override {
1403 PragmaWarningHandler() : PragmaHandler(
"warning") {}
1405 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1406 Token &
Tok)
override {
1416 PP.
Diag(
Tok, diag::warn_pragma_warning_expected) <<
"(";
1423 if (II && II->
isStr(
"push")) {
1427 if (
Tok.
is(tok::comma)) {
1430 if (
Tok.
is(tok::numeric_constant) &&
1434 PP.
Diag(
Tok, diag::warn_pragma_warning_push_level);
1441 }
else if (II && II->
isStr(
"pop")) {
1445 PP.
Diag(
Tok, diag::warn_pragma_diagnostic_cannot_pop);
1453 if (!II && !
Tok.
is(tok::numeric_constant)) {
1454 PP.
Diag(
Tok, diag::warn_pragma_warning_spec_invalid);
1459 bool SpecifierValid;
1462 int SpecifierInt = llvm::StringSwitch<int>(II->
getName())
1469 SpecifierValid = SpecifierInt != -1;
1482 if ((SpecifierValid = (
Value >= 1) && (
Value <= 4)))
1486 SpecifierValid =
false;
1490 if (!SpecifierValid) {
1491 PP.
Diag(
Tok, diag::warn_pragma_warning_spec_invalid);
1495 PP.
Diag(
Tok, diag::warn_pragma_warning_expected) <<
":";
1500 SmallVector<int, 4> Ids;
1502 while (
Tok.
is(tok::numeric_constant)) {
1506 PP.
Diag(
Tok, diag::warn_pragma_warning_expected_number);
1509 Ids.push_back(
int(
Value));
1515 SV = diag::Severity::Ignored;
1517 for (
int Id : Ids) {
1520 diag::Flavor::WarningOrError, *Group, SV, DiagLoc);
1521 assert(!unknownDiag &&
1522 "wd table should only contain known diags");
1538 PP.
Diag(
Tok, diag::warn_pragma_warning_expected) <<
")";
1544 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma warning";
1552 PragmaExecCharsetHandler() : PragmaHandler(
"execution_character_set") {}
1554 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1555 Token &
Tok)
override {
1564 PP.
Diag(
Tok, diag::warn_pragma_exec_charset_expected) <<
"(";
1571 if (II && II->
isStr(
"push")) {
1574 if (
Tok.
is(tok::comma)) {
1577 std::string ExecCharset;
1579 "pragma execution_character_set",
1584 if (ExecCharset !=
"UTF-8" && ExecCharset !=
"utf-8") {
1585 PP.
Diag(
Tok, diag::warn_pragma_exec_charset_push_invalid) << ExecCharset;
1591 }
else if (II && II->
isStr(
"pop")) {
1597 PP.
Diag(
Tok, diag::warn_pragma_exec_charset_spec_invalid);
1602 PP.
Diag(
Tok, diag::warn_pragma_exec_charset_expected) <<
")";
1608 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma execution_character_set";
1614 PragmaIncludeAliasHandler() : PragmaHandler(
"include_alias") {}
1616 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1617 Token &IncludeAliasTok)
override {
1641 bool PragmaNameOnly =
false) {
1644 return PragmaNameOnly ?
"message" :
"pragma message";
1646 return PragmaNameOnly ?
"warning" :
"pragma warning";
1648 return PragmaNameOnly ?
"error" :
"pragma error";
1650 llvm_unreachable(
"Unknown PragmaMessageKind!");
1655 StringRef Namespace = StringRef())
1659 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1660 Token &
Tok)
override {
1663 bool ExpectClosingParen =
false;
1667 ExpectClosingParen =
true;
1671 case tok::string_literal:
1675 PP.
Diag(MessageLoc, diag::err_pragma_message_malformed) <<
Kind;
1679 std::string MessageString;
1684 if (ExpectClosingParen) {
1699 ? diag::err_pragma_message
1700 : diag::warn_pragma_message) << MessageString;
1704 Callbacks->
PragmaMessage(MessageLoc, Namespace, Kind, MessageString);
1713 PragmaModuleImportHandler() : PragmaHandler(
"import") {}
1715 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1716 Token &
Tok)
override {
1720 llvm::SmallVector<IdentifierLoc, 8> ModuleName;
1725 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
1736 tok::annot_module_include, Imported);
1738 CB->moduleImport(ImportLoc, ModuleName, Imported);
1749 PragmaModuleBeginHandler() : PragmaHandler(
"begin") {}
1751 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1752 Token &
Tok)
override {
1756 llvm::SmallVector<IdentifierLoc, 8> ModuleName;
1761 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
1765 if (ModuleName.front().getIdentifierInfo()->getName() != Current) {
1766 PP.
Diag(ModuleName.front().getLoc(),
1767 diag::err_pp_module_begin_wrong_module)
1768 << ModuleName.front().getIdentifierInfo() << (ModuleName.size() > 1)
1769 << Current.empty() << Current;
1776 auto &MM = HSI.getModuleMap();
1777 Module *M = HSI.lookupModule(Current, ModuleName.front().getLoc());
1779 PP.
Diag(ModuleName.front().getLoc(),
1780 diag::err_pp_module_begin_no_module_map)
1784 for (
unsigned I = 1; I != ModuleName.size(); ++I) {
1786 M, ModuleName[I].getIdentifierInfo()->
getName());
1788 PP.
Diag(ModuleName[I].getLoc(), diag::err_pp_module_begin_no_submodule)
1798 PP.
Diag(BeginLoc, diag::note_pp_module_begin_here)
1806 tok::annot_module_begin, M);
1812 PragmaModuleEndHandler() : PragmaHandler(
"end") {}
1814 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1815 Token &
Tok)
override {
1820 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
1826 PP.
Diag(Loc, diag::err_pp_module_end_without_module_begin);
1832 PragmaModuleBuildHandler() : PragmaHandler(
"build") {}
1834 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1835 Token &
Tok)
override {
1842 PragmaModuleLoadHandler() : PragmaHandler(
"load") {}
1844 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1845 Token &
Tok)
override {
1849 llvm::SmallVector<IdentifierLoc, 8> ModuleName;
1854 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
1865 PragmaPushMacroHandler() : PragmaHandler(
"push_macro") {}
1867 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1868 Token &PushMacroTok)
override {
1876 PragmaPopMacroHandler() : PragmaHandler(
"pop_macro") {}
1878 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1879 Token &PopMacroTok)
override {
1886struct PragmaARCCFCodeAuditedHandler :
public PragmaHandler {
1887 PragmaARCCFCodeAuditedHandler() : PragmaHandler(
"arc_cf_code_audited") {}
1889 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1890 Token &NameTok)
override {
1899 if (BeginEnd && BeginEnd->
isStr(
"begin")) {
1901 }
else if (BeginEnd && BeginEnd->
isStr(
"end")) {
1911 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
1917 SourceLocation NewLoc;
1922 PP.
Diag(Loc, diag::err_pp_double_begin_of_arc_cf_code_audited);
1923 PP.
Diag(BeginLoc, diag::note_pragma_entered_here);
1929 PP.
Diag(Loc, diag::err_pp_unmatched_end_of_arc_cf_code_audited);
1932 NewLoc = SourceLocation();
1942 PragmaAssumeNonNullHandler() : PragmaHandler(
"assume_nonnull") {}
1944 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
1945 Token &NameTok)
override {
1954 if (BeginEnd && BeginEnd->
isStr(
"begin")) {
1956 }
else if (BeginEnd && BeginEnd->
isStr(
"end")) {
1966 PP.
Diag(
Tok, diag::ext_pp_extra_tokens_at_eol) <<
"pragma";
1972 SourceLocation NewLoc;
1978 PP.
Diag(Loc, diag::err_pp_double_begin_of_assume_nonnull);
1979 PP.
Diag(BeginLoc, diag::note_pragma_entered_here);
1987 PP.
Diag(Loc, diag::err_pp_unmatched_end_of_assume_nonnull);
1990 NewLoc = SourceLocation();
2011 PragmaRegionHandler(
const char *pragma) : PragmaHandler(pragma) {}
2013 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
2014 Token &NameTok)
override {
2028 PragmaManagedHandler(
const char *pragma) : EmptyPragmaHandler(pragma) {}
2034 std::string &MessageString) {
2037 PP.
Diag(
Tok, diag::err_expected) <<
"(";
2042 if (!
Tok.
is(tok::identifier)) {
2043 PP.
Diag(
Tok, diag::err_expected) << tok::identifier;
2049 PP.
Diag(
Tok, diag::err_pp_visibility_non_macro) << II;
2054 if (
Tok.
is(tok::comma)) {
2062 PP.
Diag(
Tok, diag::err_expected) <<
")";
2075 PragmaDeprecatedHandler() : PragmaHandler(
"deprecated") {}
2077 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
2078 Token &
Tok)
override {
2079 std::string MessageString;
2081 if (IdentifierInfo *II = HandleMacroAnnotationPragma(
2082 PP,
Tok,
"#pragma clang deprecated", MessageString)) {
2096struct PragmaRestrictExpansionHandler :
public PragmaHandler {
2097 PragmaRestrictExpansionHandler() : PragmaHandler(
"restrict_expansion") {}
2099 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
2100 Token &
Tok)
override {
2101 std::string MessageString;
2103 if (IdentifierInfo *II = HandleMacroAnnotationPragma(
2104 PP,
Tok,
"#pragma clang restrict_expansion", MessageString)) {
2119 PragmaFinalHandler() : PragmaHandler(
"final") {}
2121 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
2122 Token &
Tok)
override {
2125 PP.
Diag(
Tok, diag::err_expected) <<
"(";
2130 if (!
Tok.
is(tok::identifier)) {
2131 PP.
Diag(
Tok, diag::err_expected) << tok::identifier;
2137 PP.
Diag(
Tok, diag::err_pp_visibility_non_macro) << II;
2143 PP.
Diag(
Tok, diag::err_expected) <<
")";
2155void Preprocessor::RegisterBuiltinPragmas() {
2184 auto *ModuleHandler =
new PragmaNamespace(
"module");
2186 ModuleHandler->AddPragma(
new PragmaModuleImportHandler());
2187 ModuleHandler->AddPragma(
new PragmaModuleBeginHandler());
2188 ModuleHandler->AddPragma(
new PragmaModuleEndHandler());
2189 ModuleHandler->AddPragma(
new PragmaModuleBuildHandler());
2190 ModuleHandler->AddPragma(
new PragmaModuleLoadHandler());
2200 if (LangOpts.MicrosoftExt) {
2211 for (
const PragmaHandlerRegistry::entry &handler :
2212 PragmaHandlerRegistry::entries()) {
Defines the Diagnostic-related interfaces.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines the PPCallbacks interface.
static bool LexModuleName(Preprocessor &PP, Token &Tok, llvm::SmallVectorImpl< IdentifierLoc > &ModuleName)
static bool LexModuleNameComponent(Preprocessor &PP, Token &Tok, IdentifierLoc &ModuleNameComponent, bool First)
Defines the PreprocessorLexer interface.
Defines the clang::Preprocessor interface.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines the clang::TokenKind enum and support functions.
void setSeverityForAll(diag::Flavor Flavor, diag::Severity Map, SourceLocation Loc=SourceLocation())
Add the specified mapping to all diagnostics of the specified flavor.
LLVM_DUMP_METHOD void dump() const
void pushMappings(SourceLocation Loc)
Copies the current DiagMappings and pushes the new copy onto the top of the stack.
bool setSeverityForGroup(diag::Flavor Flavor, StringRef Group, diag::Severity Map, SourceLocation Loc=SourceLocation())
Change an entire diagnostic group (e.g.
bool popMappings(SourceLocation Loc)
Pops the current DiagMappings off the top of the stack, causing the new top of the stack to be the ac...
EmptyPragmaHandler - A pragma handler which takes no action, which can be used to ignore particular p...
void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer, Token &FirstToken) override
EmptyPragmaHandler(StringRef Name=StringRef())
time_t getModificationTime() const
One of these records is kept for each identifier that is lexed.
void setIsRestrictExpansion(bool Val)
void setIsDeprecatedMacro(bool Val)
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
void setIsFinal(bool Val)
bool hasMacroDefinition() const
Return true if this identifier is #defined to some other value.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
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.
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
StringRef getName() const
Return the actual identifier string.
A simple pair of identifier info and location.
SourceLocation getLoc() const
std::string CurrentModule
The name of the current module, of which the main source file is a part.
static Lexer * Create_PragmaLexer(SourceLocation SpellingLoc, SourceLocation ExpansionLocStart, SourceLocation ExpansionLocEnd, unsigned TokLen, Preprocessor &PP)
Create_PragmaLexer: Lexer constructor - Create a new lexer object for _Pragma expansion.
Encapsulates the data about a macro definition (e.g.
void setIsAllowRedefinitionsWithoutWarning(bool Val)
Set the value of the IsAllowRedefinitionsWithoutWarning flag.
virtual ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective)=0
Attempt to load the given module.
Module * lookupModuleQualified(StringRef Name, Module *Context) const
Retrieve a module with the given name within the given context, using direct (qualified) name lookup.
Module * findOrInferSubmodule(Module *Parent, StringRef Name)
llvm::iterator_range< module_iterator > modules() const
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
llvm::iterator_range< submodule_iterator > submodules()
void dump() const
Dump the contents of this module to the given output stream.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
virtual void PragmaExecCharsetPop(SourceLocation Loc)
Callback invoked when a #pragma execution_character_set(pop) directive is read.
virtual void PragmaDiagnosticPush(SourceLocation Loc, StringRef Namespace)
Callback invoked when a #pragma gcc diagnostic push directive is read.
virtual void PragmaWarning(SourceLocation Loc, PragmaWarningSpecifier WarningSpec, ArrayRef< int > Ids)
virtual void PragmaDebug(SourceLocation Loc, StringRef DebugType)
Callback invoked when a #pragma clang __debug directive is read.
virtual void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace, diag::Severity mapping, StringRef Str)
Callback invoked when a #pragma gcc diagnostic directive is read.
PragmaWarningSpecifier
Callback invoked when a #pragma warning directive is read.
virtual void PragmaAssumeNonNullEnd(SourceLocation Loc)
Callback invoked when a #pragma clang assume_nonnull end directive is read.
virtual void PragmaAssumeNonNullBegin(SourceLocation Loc)
Callback invoked when a #pragma clang assume_nonnull begin directive is read.
virtual void PragmaMessage(SourceLocation Loc, StringRef Namespace, PragmaMessageKind Kind, StringRef Str)
Callback invoked when a #pragma message directive is read.
virtual void PragmaExecCharsetPush(SourceLocation Loc, StringRef Str)
Callback invoked when a #pragma execution_character_set(push) directive is read.
virtual void PragmaDiagnosticPop(SourceLocation Loc, StringRef Namespace)
Callback invoked when a #pragma gcc diagnostic pop directive is read.
virtual void PragmaWarningPop(SourceLocation Loc)
Callback invoked when a #pragma warning(pop) directive is read.
PragmaMessageKind
Determines the kind of #pragma invoking a call to PragmaMessage.
@ PMK_Warning
#pragma GCC warning has been invoked.
@ PMK_Error
#pragma GCC error has been invoked.
@ PMK_Message
#pragma message has been invoked.
virtual void PragmaWarningPush(SourceLocation Loc, int Level)
Callback invoked when a #pragma warning(push) directive is read.
PragmaHandler - Instances of this interface defined to handle the various pragmas that the language f...
StringRef getName() const
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer, Token &FirstToken)=0
virtual PragmaNamespace * getIfNamespace()
getIfNamespace - If this is a namespace, return it.
PragmaNamespace - This PragmaHandler subdivides the namespace of pragmas, allowing hierarchical pragm...
void AddPragma(PragmaHandler *Handler)
AddPragma - Add a pragma to this namespace.
PragmaHandler * FindHandler(StringRef Name, bool IgnoreNull=true) const
FindHandler - Check to see if there is already a handler for the specified name.
void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer, Token &Tok) override
void RemovePragmaHandler(PragmaHandler *Handler)
RemovePragmaHandler - Remove the given handler from the namespace.
PragmaNamespace * getIfNamespace() override
getIfNamespace - If this is a namespace, return it.
OptionalFileEntryRef getFileEntry() const
getFileEntry - Return the FileEntry corresponding to this FileID.
bool DisablePragmaDebugCrash
Prevents intended crashes when using pragma clang __debug. For testing.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
void HandlePragmaPushMacro(Token &Tok)
Handle #pragma push_macro.
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 dumpMacroInfo(const IdentifierInfo *II)
void HandlePragmaSystemHeader(Token &SysHeaderTok)
HandlePragmaSystemHeader - Implement #pragma GCC system_header.
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 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).
PPCallbacks * getPPCallbacks() const
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 getModuleImportLoc(Module *M) const
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 EnterSubmodule(Module *M, SourceLocation ImportLoc, bool ForPragma)
void addMacroDeprecationMsg(const IdentifierInfo *II, std::string Msg, SourceLocation AnnotationLoc)
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...
void addFinalLoc(const IdentifierInfo *II, SourceLocation AnnotationLoc)
void Lex(Token &Result)
Lex the next token for this preprocessor.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
bool LexOnOffSwitch(tok::OnOffSwitch &Result)
Lex an on-off-switch (C99 6.10.6p2) and verify that it is followed by EOD.
void HandlePragmaDependency(Token &DependencyTok)
HandlePragmaDependency - Handle #pragma GCC dependency "foo" blah.
bool enterOrExitSafeBufferOptOutRegion(bool isEnter, const SourceLocation &Loc)
Alter the state of whether this PP currently is in a "-Wunsafe-buffer-usage" opt-out region.
IdentifierLoc getPragmaARCCFCodeAuditedInfo() const
The location of the currently-active #pragma clang arc_cf_code_audited begin.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
SourceManager & getSourceManager() const
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.
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.
SourceLocation getPragmaAssumeNonNullLoc() const
The location of the currently-active #pragma clang assume_nonnull begin.
void makeModuleVisible(Module *M, SourceLocation Loc, bool IncludeExports=true)
const TargetInfo & getTargetInfo() const
bool LexHeaderName(Token &Result, bool AllowMacroExpansion=true)
Lex a token, forming a header-name token if possible.
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 AddPragmaHandler(StringRef Namespace, PragmaHandler *Handler)
Add the specified pragma handler to this preprocessor.
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 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 HandlePragmaPopMacro(Token &Tok)
Handle #pragma pop_macro.
Module * LeaveSubmodule(bool ForPragma)
void EnterAnnotationToken(SourceRange Range, tok::TokenKind Kind, void *AnnotationVal)
Enter an annotation token into the token stream.
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.
const PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
const LangOptions & getLangOpts() const
IdentifierInfo * ParsePragmaPushOrPopMacro(Token &Tok)
ParsePragmaPushOrPopMacro - Handle parsing of pragma push_macro/pop_macro.
bool usingPCHWithPragmaHdrStop()
True if using a PCH with a pragma hdrstop.
DefMacroDirective * appendDefMacroDirective(IdentifierInfo *II, MacroInfo *MI, SourceLocation Loc)
void HandlePragmaMark(Token &MarkTok)
void HandlePragmaHdrstop(Token &Tok)
DiagnosticsEngine & getDiagnostics() const
void RemovePragmaHandler(StringRef Namespace, PragmaHandler *Handler)
Remove the specific pragma handler from this preprocessor.
void HandlePragmaIncludeAlias(Token &Tok)
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
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 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.
const char * getFilename() const
Return the presumed filename 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.
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.
void noteSLocAddressSpaceUsage(DiagnosticsEngine &Diag, std::optional< unsigned > MaxNotes=32) const
A trivial tuple used to represent a source range.
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
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.
unsigned getLength() const
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)) {....
tok::TokenKind getKind() const
bool isAtStartOfLine() const
isAtStartOfLine - Return true if this token is at the start of a line.
bool isNot(tok::TokenKind K) const
bool hasUDSuffix() const
Return true if this token is a string or character literal which has a ud-suffix.
void setAnnotationRange(SourceRange R)
void startToken()
Reset all flags to cleared.
uint32_t Literal
Literals are represented as positive integers.
Flavor
Flavors of diagnostics we can emit.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
StringRef getName(const HeaderType T)
bool Sub(InterpState &S, CodePtr OpPC)
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
OnOffSwitch
Defines the possible values of an on-off-switch (C99 6.10.6p2).
The JSON file list parser is used to communicate input to InstallAPI.
std::optional< diag::Group > diagGroupFromCLWarningID(unsigned)
For cl.exe warning IDs that cleany map to clang diagnostic groups, returns the corresponding group.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ 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.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
@ PIK__Pragma
The pragma was introduced via the C99 _Pragma(string-literal).
@ PIK___pragma
The pragma was introduced via the Microsoft __pragma(token-string).
void prepare_PragmaString(SmallVectorImpl< char > &StrVal)
Destringize a _Pragma("") string according to C11 6.10.9.1: "The string literal is destringized by de...
Describes how and where the pragma was introduced.
PragmaIntroducerKind Kind