34#include "llvm/ADT/ArrayRef.h"
35#include "llvm/ADT/DenseMap.h"
36#include "llvm/ADT/DenseSet.h"
37#include "llvm/ADT/FoldingSet.h"
38#include "llvm/ADT/STLExtras.h"
39#include "llvm/ADT/SmallVector.h"
40#include "llvm/ADT/StringRef.h"
41#include "llvm/ADT/StringSwitch.h"
42#include "llvm/Support/ErrorHandling.h"
43#include "llvm/Support/Format.h"
44#include "llvm/Support/Path.h"
45#include "llvm/Support/raw_ostream.h"
64 auto Pos = CurSubmoduleState->Macros.find(II);
65 return Pos == CurSubmoduleState->Macros.end() ?
nullptr
66 : Pos->second.getLatest();
70 assert(MD &&
"MacroDirective should be non-zero!");
71 assert(!MD->
getPrevious() &&
"Already attached to a MacroDirective history.");
73 MacroState &StoredMD = CurSubmoduleState->Macros[II];
74 auto *OldMD = StoredMD.getLatest();
76 StoredMD.setLatest(MD);
77 StoredMD.overrideActiveModuleMacros(*
this, II);
79 if (needModuleMacros()) {
83 PendingModuleMacroNames.push_back(II);
88 if (!MD->
isDefined() && !LeafModuleMacros.contains(II))
107 MacroState &StoredMD = CurSubmoduleState->Macros[II];
109 if (
auto *OldMD = StoredMD.getLatest()) {
115 assert(OldMD->getMacroInfo()->isBuiltinMacro() &&
116 "only built-ins should have an entry here");
117 assert(!OldMD->getPrevious() &&
"builtin should only have a single entry");
119 StoredMD.setLatest(MD);
126 if (!MD->
isDefined() && !LeafModuleMacros.contains(II))
134 llvm::FoldingSetNodeID ID;
138 if (
auto *MM = ModuleMacros.FindNodeOrInsertPos(ID, InsertPos)) {
144 ModuleMacros.InsertNode(MM, InsertPos);
148 for (
auto *O : Overrides) {
149 HidAny |= (O->NumOverriddenBy == 0);
150 ++O->NumOverriddenBy;
154 auto &LeafMacros = LeafModuleMacros[II];
156 llvm::erase_if(LeafMacros,
157 [](
ModuleMacro *MM) {
return MM->NumOverriddenBy != 0; });
161 LeafMacros.push_back(MM);
171 llvm::FoldingSetNodeID ID;
175 return ModuleMacros.FindNodeOrInsertPos(ID, InsertPos);
179 FullModuleMacroInfo &Info) {
180 assert(Info.ActiveModuleMacrosGeneration !=
182 "don't need to update this macro name info");
183 Info.ActiveModuleMacrosGeneration =
186 auto Leaf = LeafModuleMacros.find(II);
187 if (Leaf == LeafModuleMacros.end()) {
192 Info.ActiveModuleMacros.clear();
195 llvm::DenseMap<ModuleMacro *, int> NumHiddenOverrides;
196 for (
auto *O : Info.OverriddenMacros)
197 NumHiddenOverrides[O] = -1;
201 for (
auto *LeafMM : Leaf->second) {
202 assert(LeafMM->getNumOverridingMacros() == 0 &&
"leaf macro overridden");
203 if (NumHiddenOverrides.lookup(LeafMM) == 0)
204 Worklist.push_back(LeafMM);
206 while (!Worklist.empty()) {
207 auto *MM = Worklist.pop_back_val();
208 if (CurSubmoduleState->VisibleModules.isVisible(MM->getOwningModule())) {
211 if (MM->getMacroInfo())
212 Info.ActiveModuleMacros.push_back(MM);
214 for (
auto *O : MM->overrides())
215 if ((
unsigned)++NumHiddenOverrides[O] == O->getNumOverridingMacros())
216 Worklist.push_back(O);
220 std::reverse(Info.ActiveModuleMacros.begin(), Info.ActiveModuleMacros.end());
223 MacroInfo *MI =
nullptr;
224 bool IsSystemMacro =
true;
225 bool IsAmbiguous =
false;
226 if (
auto *MD = Info.MD) {
227 while (isa_and_nonnull<VisibilityMacroDirective>(MD))
228 MD = MD->getPrevious();
229 if (
auto *DMD = dyn_cast_or_null<DefMacroDirective>(MD)) {
231 IsSystemMacro &= SourceMgr.isInSystemHeader(DMD->getLocation());
234 for (
auto *Active : Info.ActiveModuleMacros) {
235 auto *NewMI = Active->getMacroInfo();
246 if (MI && NewMI != MI &&
249 IsSystemMacro &= Active->getOwningModule()->IsSystem ||
250 SourceMgr.isInSystemHeader(NewMI->getDefinitionLoc());
253 Info.IsAmbiguous = IsAmbiguous && !IsSystemMacro;
258 auto LeafIt = LeafModuleMacros.find(II);
259 if (LeafIt != LeafModuleMacros.end())
260 Leaf = LeafIt->second;
261 const MacroState *State =
nullptr;
262 auto Pos = CurSubmoduleState->Macros.find(II);
263 if (Pos != CurSubmoduleState->Macros.end())
264 State = &Pos->second;
266 llvm::errs() <<
"MacroState " << State <<
" " << II->
getNameStart();
267 const auto ModuleInfo =
269 if (ModuleInfo.IsAmbiguous)
270 llvm::errs() <<
" ambiguous";
271 if (State && !State->getOverriddenMacros().empty()) {
272 llvm::errs() <<
" overrides";
273 for (
auto *O : State->getOverriddenMacros())
274 llvm::errs() <<
" " << O->getOwningModule()->getFullModuleName();
276 llvm::errs() <<
"\n";
279 for (
auto *MD = State ? State->getLatest() :
nullptr; MD;
280 MD = MD->getPrevious()) {
286 llvm::DenseSet<ModuleMacro *> Active(llvm::from_range,
287 ModuleInfo.ActiveModuleMacros);
288 llvm::DenseSet<ModuleMacro*> Visited;
290 while (!Worklist.empty()) {
291 auto *MM = Worklist.pop_back_val();
292 llvm::errs() <<
" ModuleMacro " << MM <<
" "
293 << MM->getOwningModule()->getFullModuleName();
294 if (!MM->getMacroInfo())
295 llvm::errs() <<
" undef";
297 if (Active.count(MM))
298 llvm::errs() <<
" active";
299 else if (!CurSubmoduleState->VisibleModules.isVisible(
300 MM->getOwningModule()))
301 llvm::errs() <<
" hidden";
302 else if (MM->getMacroInfo())
303 llvm::errs() <<
" overridden";
305 if (!MM->overrides().empty()) {
306 llvm::errs() <<
" overrides";
307 for (
auto *O : MM->overrides()) {
308 llvm::errs() <<
" " << O->getOwningModule()->getFullModuleName();
309 if (Visited.insert(O).second)
310 Worklist.push_back(O);
313 llvm::errs() <<
"\n";
314 if (
auto *MI = MM->getMacroInfo()) {
317 llvm::errs() <<
"\n";
324void Preprocessor::RegisterBuiltinMacros() {
325 Ident__LINE__ = RegisterBuiltinMacro(
"__LINE__");
326 Ident__FILE__ = RegisterBuiltinMacro(
"__FILE__");
330 Ident__DATE__ = RegisterBuiltinMacro(
"__DATE__");
331 Ident__TIME__ = RegisterBuiltinMacro(
"__TIME__");
333 Ident__DATE__ =
nullptr;
334 Ident__TIME__ =
nullptr;
336 Ident__COUNTER__ = RegisterBuiltinMacro(
"__COUNTER__");
337 Ident_Pragma = RegisterBuiltinMacro(
"_Pragma");
338 Ident__FLT_EVAL_METHOD__ = RegisterBuiltinMacro(
"__FLT_EVAL_METHOD__");
342 Ident__has_cpp_attribute = RegisterBuiltinMacro(
"__has_cpp_attribute");
344 Ident__has_cpp_attribute =
nullptr;
347 Ident__BASE_FILE__ = RegisterBuiltinMacro(
"__BASE_FILE__");
348 Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(
"__INCLUDE_LEVEL__");
350 Ident__TIMESTAMP__ = RegisterBuiltinMacro(
"__TIMESTAMP__");
352 Ident__TIMESTAMP__ =
nullptr;
356 Ident__identifier = RegisterBuiltinMacro(
"__identifier");
357 Ident__pragma = RegisterBuiltinMacro(
"__pragma");
359 Ident__identifier =
nullptr;
360 Ident__pragma =
nullptr;
364 Ident__FILE_NAME__ = RegisterBuiltinMacro(
"__FILE_NAME__");
365 Ident__has_feature = RegisterBuiltinMacro(
"__has_feature");
366 Ident__has_extension = RegisterBuiltinMacro(
"__has_extension");
367 Ident__has_builtin = RegisterBuiltinMacro(
"__has_builtin");
368 Ident__has_constexpr_builtin =
369 RegisterBuiltinMacro(
"__has_constexpr_builtin");
370 Ident__has_attribute = RegisterBuiltinMacro(
"__has_attribute");
372 Ident__has_c_attribute = RegisterBuiltinMacro(
"__has_c_attribute");
374 Ident__has_c_attribute =
nullptr;
376 Ident__has_declspec = RegisterBuiltinMacro(
"__has_declspec_attribute");
377 Ident__has_embed = RegisterBuiltinMacro(
"__has_embed");
378 Ident__has_include = RegisterBuiltinMacro(
"__has_include");
379 Ident__has_include_next = RegisterBuiltinMacro(
"__has_include_next");
380 Ident__has_warning = RegisterBuiltinMacro(
"__has_warning");
381 Ident__is_identifier = RegisterBuiltinMacro(
"__is_identifier");
382 Ident__is_target_arch = RegisterBuiltinMacro(
"__is_target_arch");
383 Ident__is_target_vendor = RegisterBuiltinMacro(
"__is_target_vendor");
384 Ident__is_target_os = RegisterBuiltinMacro(
"__is_target_os");
385 Ident__is_target_environment =
386 RegisterBuiltinMacro(
"__is_target_environment");
387 Ident__is_target_variant_os = RegisterBuiltinMacro(
"__is_target_variant_os");
388 Ident__is_target_variant_environment =
389 RegisterBuiltinMacro(
"__is_target_variant_environment");
392 Ident__building_module = RegisterBuiltinMacro(
"__building_module");
394 Ident__MODULE__ = RegisterBuiltinMacro(
"__MODULE__");
396 Ident__MODULE__ =
nullptr;
407 if (!II)
return true;
417 if (ExpansionMI->isEnabled() &&
428 return !llvm::is_contained(MI->
params(), II);
433bool Preprocessor::HandleMacroExpandedIdentifier(
Token &Identifier,
442 if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro();
447 Callbacks->MacroExpands(Identifier, M, Identifier.
getLocation(),
449 ExpandBuiltinMacro(Identifier);
460 SourceLocation ExpansionEnd = Identifier.
getLocation();
468 ArgMacro = &Identifier;
470 Args = ReadMacroCallArgumentList(Identifier, MI, ExpansionEnd);
477 if (!Args)
return true;
479 ++NumFnMacroExpanded;
488 SourceLocation ExpandLoc = Identifier.
getLocation();
489 SourceRange ExpansionRange(ExpandLoc, ExpansionEnd);
497 DelayedMacroExpandsCallbacks.push_back(
498 MacroExpandsInfo(Identifier, M, ExpansionRange));
500 Callbacks->MacroExpands(Identifier, M, ExpansionRange, Args);
501 if (!DelayedMacroExpandsCallbacks.empty()) {
502 for (
const MacroExpandsInfo &Info : DelayedMacroExpandsCallbacks) {
504 Callbacks->MacroExpands(Info.Tok, Info.MD, Info.Range,
507 DelayedMacroExpandsCallbacks.clear();
514 Diag(Identifier, diag::warn_pp_ambiguous_macro)
531 if (Args) Args->
destroy(*
this);
536 PropagateLineStartLeadingSpaceInfo(Identifier);
537 ++NumFastMacroExpanded;
547 if (Args) Args->
destroy(*
this);
564 SourceMgr.createExpansionLoc(Identifier.
getLocation(), ExpandLoc,
572 if (!NewMI->isEnabled() || NewMI == MI) {
577 Diag(Identifier, diag::pp_disabled_macro_expansion);
583 ++NumFastMacroExpanded;
588 EnterMacro(Identifier, ExpansionEnd, MI, Args);
604 if (I->is(tok::l_paren)) {
605 Brackets.push_back(
Paren);
606 }
else if (I->is(tok::r_paren)) {
607 if (Brackets.empty() || Brackets.back() ==
Brace)
610 }
else if (I->is(tok::l_brace)) {
611 Brackets.push_back(
Brace);
612 }
else if (I->is(tok::r_brace)) {
613 if (Brackets.empty() || Brackets.back() ==
Paren)
618 return Brackets.empty();
652 bool FoundSeparatorToken =
false;
656 if (I->is(tok::l_brace)) {
658 }
else if (I->is(tok::r_brace)) {
660 if (
Braces == 0 && ClosingBrace == E && FoundSeparatorToken)
662 }
else if (I->is(tok::eof)) {
667 FoundSeparatorToken =
true;
668 I->setKind(tok::comma);
676 if (FoundSeparatorToken && ArgStartIterator->is(tok::l_brace)) {
684 if (FoundSeparatorToken) {
686 TempToken.
setKind(tok::l_paren);
687 TempToken.
setLocation(ArgStartIterator->getLocation());
689 NewTokens.push_back(TempToken);
693 NewTokens.insert(NewTokens.end(), ArgStartIterator, I);
696 if (FoundSeparatorToken) {
699 TempToken.
setKind(tok::r_paren);
702 NewTokens.push_back(TempToken);
703 ParenHints.push_back(
SourceRange(ArgStartIterator->getLocation(),
708 NewTokens.push_back(*I);
711 ArgStartIterator = I + 1;
712 FoundSeparatorToken =
false;
717 return !ParenHints.empty() && InitLists.empty();
724MacroArgs *Preprocessor::ReadMacroCallArgumentList(
Token &MacroName,
737 assert(
Tok.
is(tok::l_paren) &&
"Error computing l-paren-ness?");
742 SmallVector<Token, 64> ArgTokens;
743 bool ContainsCodeCompletionTok =
false;
744 bool FoundElidedComma =
false;
746 SourceLocation TooManyArgsLoc;
748 unsigned NumActuals = 0;
750 if (ContainsCodeCompletionTok &&
Tok.
isOneOf(tok::eof, tok::eod))
753 assert(
Tok.
isOneOf(tok::l_paren, tok::comma) &&
754 "only expect argument separators here");
756 size_t ArgTokenStart = ArgTokens.size();
761 unsigned NumParens = 0;
769 if (!ContainsCodeCompletionTok) {
770 Diag(MacroName, diag::err_unterm_macro_invoc);
778 auto Toks = std::make_unique<Token[]>(1);
780 EnterTokenStream(std::move(Toks), 1,
true,
false);
782 }
else if (
Tok.
is(tok::r_paren)) {
784 if (NumParens-- == 0) {
786 if (!ArgTokens.empty() &&
787 ArgTokens.back().commaAfterElided()) {
788 FoundElidedComma =
true;
792 }
else if (
Tok.
is(tok::l_paren)) {
794 }
else if (
Tok.
is(tok::comma)) {
805 }
else if (NumParens == 0) {
811 if (NumFixedArgsLeft > 1)
814 }
else if (
Tok.
is(tok::comment) && !KeepMacroComments) {
828 }
else if (
Tok.
is(tok::code_completion)) {
829 ContainsCodeCompletionTok =
true;
838 ArgTokens.push_back(
Tok);
843 if (ArgTokens.empty() &&
Tok.
getKind() == tok::r_paren)
848 if (!isVariadic && NumFixedArgsLeft == 0 && TooManyArgsLoc.
isInvalid()) {
849 if (ArgTokens.size() != ArgTokenStart)
850 TooManyArgsLoc = ArgTokens[ArgTokenStart].getLocation();
852 TooManyArgsLoc = ArgStartLoc;
859 ? diag::warn_cxx98_compat_empty_fnmacro_arg
860 : diag::ext_empty_fnmacro_arg);
868 ArgTokens.push_back(EOFTok);
870 if (!ContainsCodeCompletionTok && NumFixedArgsLeft != 0)
880 if (!isVariadic && NumActuals > MinArgsExpected &&
881 !ContainsCodeCompletionTok) {
884 Diag(TooManyArgsLoc, diag::err_too_many_args_in_macro_invoc);
893 SmallVector<Token, 4> FixedArgTokens;
894 unsigned FixedNumArgs = 0;
895 SmallVector<SourceRange, 4> ParenHints, InitLists;
897 ParenHints, InitLists)) {
898 if (!InitLists.empty()) {
899 DiagnosticBuilder DB =
901 diag::note_init_list_at_beginning_of_macro_argument);
902 for (SourceRange Range : InitLists)
907 if (FixedNumArgs != MinArgsExpected)
910 DiagnosticBuilder DB =
Diag(MacroName, diag::note_suggest_parens_for_macro);
911 for (SourceRange ParenLocation : ParenHints) {
915 ArgTokens.swap(FixedArgTokens);
916 NumActuals = FixedNumArgs;
920 bool isVarargsElided =
false;
922 if (ContainsCodeCompletionTok) {
929 for (; NumActuals < MinArgsExpected; ++NumActuals)
930 ArgTokens.push_back(EOFTok);
933 if (NumActuals < MinArgsExpected) {
935 if (NumActuals == 0 && MinArgsExpected == 1) {
942 }
else if ((FoundElidedComma || MI->
isVariadic()) &&
943 (NumActuals+1 == MinArgsExpected ||
944 (NumActuals == 0 && MinArgsExpected == 2))) {
958 ID = diag::warn_cxx17_compat_missing_varargs_arg;
960 ID = diag::ext_cxx_missing_varargs_arg;
962 ID = diag::warn_c17_compat_missing_varargs_arg;
964 ID = diag::ext_c_missing_varargs_arg;
976 isVarargsElided =
true;
977 }
else if (!ContainsCodeCompletionTok) {
979 Diag(
Tok, diag::err_too_few_args_in_macro_invoc);
991 ArgTokens.push_back(
Tok);
994 if (NumActuals == 0 && MinArgsExpected == 2)
995 ArgTokens.push_back(
Tok);
997 }
else if (NumActuals > MinArgsExpected && !MI->
isVariadic() &&
998 !ContainsCodeCompletionTok) {
1001 Diag(MacroName, diag::err_too_many_args_in_macro_invoc);
1021 size_t newIndex = MacroExpandedTokens.size();
1022 bool cacheNeedsToGrow = tokens.size() >
1023 MacroExpandedTokens.capacity()-MacroExpandedTokens.size();
1024 MacroExpandedTokens.append(tokens.begin(), tokens.end());
1026 if (cacheNeedsToGrow) {
1029 for (
const auto &Lexer : MacroExpandingLexersStack) {
1030 TokenLexer *prevLexer;
1032 std::tie(prevLexer, tokIndex) = Lexer;
1033 prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex;
1037 MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex));
1038 return MacroExpandedTokens.data() + newIndex;
1041void Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() {
1042 assert(!MacroExpandingLexersStack.empty());
1043 size_t tokIndex = MacroExpandingLexersStack.back().second;
1044 assert(tokIndex < MacroExpandedTokens.size());
1046 MacroExpandedTokens.resize(tokIndex);
1047 MacroExpandingLexersStack.pop_back();
1066 DATETokLen = strlen(
"\"1\"");
1074 TIMETokLen = strlen(
"\"1\"");
1083 TM = std::gmtime(&TT);
1085 TT = std::time(
nullptr);
1086 TM = std::localtime(&TT);
1089 static const char *
const Months[] = {
1090 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
1095 llvm::raw_svector_ostream TmpStream(TmpBuffer);
1097 TmpStream << llvm::format(
"\"%s %2d %4d\"", Months[TM->tm_mon],
1098 TM->tm_mday, TM->tm_year + 1900);
1100 TmpStream <<
"??? ?? ????";
1106 DATETokLen = strlen(
"\"Mmm dd yyyy\"");
1110 llvm::raw_svector_ostream TmpStream(TmpBuffer);
1112 TmpStream << llvm::format(
"\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min,
1115 TmpStream <<
"??:??:??";
1121 TIMETokLen = strlen(
"\"hh:mm:ss\"");
1134#define FEATURE(Name, Predicate) .Case(#Name, Predicate)
1135 return llvm::StringSwitch<bool>(
Feature)
1136#include "clang/Basic/Features.def"
1157 if (Extension.starts_with(
"__") && Extension.ends_with(
"__") &&
1158 Extension.size() >= 4)
1159 Extension = Extension.substr(2, Extension.size() - 4);
1163#define EXTENSION(Name, Predicate) .Case(#Name, Predicate)
1164 return llvm::StringSwitch<bool>(Extension)
1165#include "clang/Basic/Features.def"
1183 PP.
Diag(LParenLoc, diag::err_pp_directive_required) << II;
1185 assert(
Tok.is(tok::identifier));
1186 Tok.setIdentifierInfo(II);
1194 }
while (
Tok.getKind() == tok::comment);
1197 if (
Tok.isNot(tok::l_paren)) {
1200 PP.
Diag(LParenLoc, diag::err_pp_expected_after) << II << tok::l_paren;
1203 if (
Tok.isNot(tok::header_name))
1207 LParenLoc =
Tok.getLocation();
1212 if (
Tok.isNot(tok::header_name)) {
1213 PP.
Diag(
Tok.getLocation(), diag::err_pp_expects_filename);
1230 if (
Tok.isNot(tok::r_paren)) {
1232 << II << tok::r_paren;
1233 PP.
Diag(LParenLoc, diag::note_matching) << tok::l_paren;
1240 if (Filename.empty())
1250 PP.
LookupFile(FilenameLoc, Filename, isAngled, LookupFrom, LookupFromFile,
1251 nullptr,
nullptr,
nullptr, &KH,
nullptr,
nullptr);
1257 Callbacks->HasInclude(FilenameLoc, Filename, isAngled,
File,
FileType);
1261 return File.has_value();
1269 Diag(
Tok, diag::err_pp_directive_required) << II;
1271 assert(
Tok.
is(tok::identifier));
1279 Diag(
Tok, diag::err_pp_expected_after) << II << tok::l_paren;
1297 Token FilenameTok =
Tok;
1299 std::optional<LexEmbedParametersResult> Params =
1307 << II << tok::r_paren;
1308 Diag(LParenLoc, diag::note_matching) << tok::l_paren;
1314 if (Params->UnrecognizedParams > 0)
1317 SmallString<128> FilenameBuffer;
1318 StringRef Filename = this->
getSpelling(FilenameTok, FilenameBuffer);
1319 if (Filename.empty())
1329 Callbacks->HasEmbed(LParenLoc, Filename, isAngled, MaybeFileEntry);
1331 if (!MaybeFileEntry)
1334 size_t FileSize = MaybeFileEntry->
getSize();
1337 if (Params->MaybeOffsetParam) {
1338 if (Params->MaybeOffsetParam->Offset > FileSize)
1341 FileSize -= Params->MaybeOffsetParam->Offset;
1346 if (Params->MaybeLimitParam) {
1347 if (Params->MaybeLimitParam->Limit > FileSize)
1350 FileSize = Params->MaybeLimitParam->Limit;
1366 const FileEntry *LookupFromFile;
1367 std::tie(Lookup, LookupFromFile) = getIncludeNextStart(
Tok);
1379 bool &HasLexedNextTok)> Op) {
1382 if (
Tok.isNot(tok::l_paren)) {
1383 PP.
Diag(
Tok.getLocation(), diag::err_pp_expected_after) << II
1387 if (!
Tok.isOneOf(tok::eof, tok::eod)) {
1389 Tok.setKind(tok::numeric_constant);
1394 unsigned ParenDepth = 1;
1396 std::optional<int>
Result;
1399 bool SuppressDiagnostic =
false;
1400 while (
Tok.isNoneOf(tok::eod, tok::eof)) {
1408 switch (
Tok.getKind()) {
1413 PP.
Diag(
Tok.getLocation(), diag::err_unterm_macro_invoc);
1417 if (!SuppressDiagnostic) {
1418 PP.
Diag(
Tok.getLocation(), diag::err_too_many_args_in_macro_invoc);
1419 SuppressDiagnostic =
true;
1427 if (!SuppressDiagnostic) {
1428 PP.
Diag(
Tok.getLocation(), diag::err_pp_nested_paren) << II;
1429 SuppressDiagnostic =
true;
1434 if (--ParenDepth > 0)
1447 if (!SuppressDiagnostic)
1448 PP.
Diag(
Tok.getLocation(), diag::err_too_few_args_in_macro_invoc);
1450 Tok.setKind(tok::numeric_constant);
1458 bool HasLexedNextToken =
false;
1461 if (HasLexedNextToken)
1468 if (!SuppressDiagnostic) {
1469 if (
auto Diag = PP.
Diag(
Tok.getLocation(), diag::err_pp_expected_after)) {
1476 PP.
Diag(LParenLoc, diag::note_matching) << tok::l_paren;
1477 SuppressDiagnostic =
true;
1488 if (!
Tok.isAnnotation() && (II =
Tok.getIdentifierInfo()))
1491 PP.
Diag(
Tok.getLocation(), DiagID);
1498 const llvm::Triple &TT = TI.
getTriple();
1501 if ((
Arch.getSubArch() == llvm::Triple::NoSubArch ||
1502 Arch.getSubArch() == TT.getSubArch()) &&
1503 ((TT.getArch() == llvm::Triple::thumb &&
1504 Arch.getArch() == llvm::Triple::arm) ||
1505 (TT.getArch() == llvm::Triple::thumbeb &&
1506 Arch.getArch() == llvm::Triple::armeb)))
1511 return (
Arch.getSubArch() == llvm::Triple::NoSubArch ||
1512 Arch.getSubArch() == TT.getSubArch()) &&
1513 Arch.getArch() == TT.getArch();
1518 StringRef VendorName = TI.
getTriple().getVendorName();
1519 if (VendorName.empty())
1520 VendorName =
"unknown";
1521 return VendorName.equals_insensitive(II->
getName());
1526 llvm::Triple OS(llvm::Twine(
"unknown-unknown-") + II->
getName().lower());
1527 if (OS.getOS() == llvm::Triple::Darwin) {
1531 return TI.
getTriple().getOS() == OS.getOS();
1537 llvm::Triple Env(llvm::Twine(
"---") + II->
getName().lower());
1540 if (Env.getEnvironment() == llvm::Triple::UnknownEnvironment &&
1541 Env.getEnvironmentName() !=
"unknown")
1543 return TI.
getTriple().getEnvironment() == Env.getEnvironment();
1553 llvm::Triple OS(llvm::Twine(
"unknown-unknown-") + II->
getName().lower());
1554 if (OS.getOS() == llvm::Triple::Darwin) {
1556 return VariantTriple->isOSDarwin();
1558 return VariantTriple->getOS() == OS.getOS();
1570 llvm::Triple Env(llvm::Twine(
"---") + II->
getName().lower());
1571 return VariantTriple->getEnvironment() == Env.getEnvironment();
1576#if defined(__sun__) && defined(__svr4__) && defined(__clang__) && \
1582asm(
"_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_"
1583 "RSt8ios_basecPKSt2tmPKcSB_ = "
1584 "_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_"
1585 "RSt8ios_basecPK2tmPKcSB_");
1590#define TYPE_TRAIT_1(Spelling, Name, Key) \
1591 case tok::kw_##Spelling: \
1593#define TYPE_TRAIT_2(Spelling, Name, Key) \
1594 case tok::kw_##Spelling: \
1596#define TYPE_TRAIT_N(Spelling, Name, Key) \
1597 case tok::kw_##Spelling: \
1599#define ARRAY_TYPE_TRAIT(Spelling, Name, Key) \
1600 case tok::kw_##Spelling: \
1602#define EXPRESSION_TRAIT(Spelling, Name, Key) \
1603 case tok::kw_##Spelling: \
1605#define TRANSFORM_TYPE_TRAIT_DEF(K, Spelling) \
1606 case tok::kw___##Spelling: \
1609 switch (
Tok.getKind()) {
1612#include "clang/Basic/TokenKinds.def"
1618void Preprocessor::ExpandBuiltinMacro(
Token &
Tok) {
1621 assert(II &&
"Can't be a macro without id info!");
1625 if (II == Ident_Pragma)
1626 return Handle_Pragma(
Tok);
1627 else if (II == Ident__pragma)
1628 return HandleMicrosoft__pragma(
Tok);
1630 ++NumBuiltinMacroExpanded;
1632 SmallString<128> TmpBuffer;
1633 llvm::raw_svector_ostream
OS(TmpBuffer);
1641 if (II == Ident__LINE__) {
1656 Loc = SourceMgr.getExpansionRange(Loc).getEnd();
1657 PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
1662 }
else if (II == Ident__FILE__ || II == Ident__BASE_FILE__ ||
1663 II == Ident__FILE_NAME__) {
1670 if (II == Ident__BASE_FILE__ && PLoc.
isValid()) {
1673 PLoc = SourceMgr.getPresumedLoc(NextLoc);
1682 SmallString<256> FN;
1686 if (II == Ident__FILE_NAME__) {
1693 OS <<
'"' << FN <<
'"';
1696 }
else if (II == Ident__DATE__) {
1699 size_t TIMETokLen = 0, DATETokLen = 0;
1707 }
else if (II == Ident__TIME__) {
1710 size_t TIMETokLen = 0, DATETokLen = 0;
1718 }
else if (II == Ident__INCLUDE_LEVEL__) {
1726 for (; PLoc.
isValid(); ++Depth)
1733 }
else if (II == Ident__TIMESTAMP__) {
1737 std::string
Result =
"1";
1738 std::stringstream TmpStream;
1742 TmpStream.imbue(std::locale(
"C"));
1745 std::tm *TM = std::gmtime(&TT);
1746 TmpStream << std::put_time(TM,
"%a %b %e %T %Y");
1750 const FileEntry *CurFile =
nullptr;
1752 CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID());
1755 struct tm *TM = localtime(&TT);
1756 TmpStream << std::put_time(TM,
"%a %b %e %T %Y");
1759 Result = TmpStream.str();
1761 Result =
"??? ??? ?? ??:??:?? ????";
1765 }
else if (II == Ident__FLT_EVAL_METHOD__) {
1773 Diag(
Tok, diag::err_illegal_use_of_flt_eval_macro);
1776 }
else if (II == Ident__COUNTER__) {
1781 constexpr uint32_t MaxPosValue = std::numeric_limits<int32_t>::max();
1782 if (CounterValue > MaxPosValue) {
1788 CounterValue = MaxPosValue;
1790 OS << CounterValue++;
1792 }
else if (II == Ident__has_feature) {
1794 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1796 diag::err_feature_check_malformed);
1799 }
else if (II == Ident__has_extension) {
1801 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1803 diag::err_feature_check_malformed);
1806 }
else if (II == Ident__has_builtin) {
1808 OS,
Tok, II, *
this,
false,
1809 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1811 Tok, *
this, diag::err_feature_check_malformed);
1815 if (BuiltinID != 0) {
1817 case Builtin::BI__builtin_cpu_is:
1819 case Builtin::BI__builtin_cpu_init:
1821 case Builtin::BI__builtin_cpu_supports:
1823 case Builtin::BI__builtin_operator_new:
1824 case Builtin::BI__builtin_operator_delete:
1839 }
else if (II->
getTokenID() != tok::identifier &&
1840 II->
getName().starts_with(
"__builtin_")) {
1843 return llvm::StringSwitch<bool>(II->
getName())
1845#define BuiltinTemplate(BTName) .Case(#BTName, getLangOpts().CPlusPlus)
1846#include "clang/Basic/BuiltinTemplates.inc"
1850 .Case(
"__is_target_arch",
true)
1851 .Case(
"__is_target_vendor",
true)
1852 .Case(
"__is_target_os",
true)
1853 .Case(
"__is_target_environment",
true)
1854 .Case(
"__is_target_variant_os",
true)
1855 .Case(
"__is_target_variant_environment",
true)
1859 }
else if (II == Ident__has_constexpr_builtin) {
1861 OS,
Tok, II, *
this,
false,
1862 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1864 Tok, *
this, diag::err_feature_check_malformed);
1868 return BuiltinOp != 0 &&
1871 }
else if (II == Ident__is_identifier) {
1873 [](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1874 return Tok.
is(tok::identifier);
1876 }
else if (II == Ident__has_attribute) {
1878 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1880 diag::err_feature_check_malformed);
1885 }
else if (II == Ident__has_declspec) {
1887 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1889 diag::err_feature_check_malformed);
1892 return LangOpts.DeclSpecKeyword &&
1899 }
else if (II == Ident__has_cpp_attribute ||
1900 II == Ident__has_c_attribute) {
1901 bool IsCXX = II == Ident__has_cpp_attribute;
1903 [&](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1904 IdentifierInfo *ScopeII =
nullptr;
1906 Tok, *
this, diag::err_feature_check_malformed);
1914 HasLexedNextToken =
true;
1920 diag::err_feature_check_malformed);
1930 }
else if (II == Ident__has_include ||
1931 II == Ident__has_include_next) {
1936 if (II == Ident__has_include)
1937 Value = EvaluateHasInclude(
Tok, II);
1939 Value = EvaluateHasIncludeNext(
Tok, II);
1945 }
else if (II == Ident__has_embed) {
1955 OS << static_cast<int>(
Value);
1956 }
else if (II == Ident__has_warning) {
1959 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1960 std::string WarningName;
1963 HasLexedNextToken =
Tok.
is(tok::string_literal);
1970 if (WarningName.size() < 3 || WarningName[0] !=
'-' ||
1971 WarningName[1] !=
'W') {
1972 Diag(StrStartLoc, diag::warn_has_warning_invalid_option);
1980 SmallVector<diag::kind, 10> Diags;
1983 WarningName.substr(2), Diags);
1985 }
else if (II == Ident__building_module) {
1990 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1992 diag::err_expected_id_building_module);
1996 }
else if (II == Ident__MODULE__) {
2002 }
else if (II == Ident__identifier) {
2011 << II << tok::l_paren;
2042 if (RParen.
isNot(tok::r_paren)) {
2045 Diag(LParenLoc, diag::note_matching) << tok::l_paren;
2048 }
else if (II == Ident__is_target_arch) {
2050 OS,
Tok, II, *
this,
false,
2051 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2053 Tok, *
this, diag::err_feature_check_malformed);
2056 }
else if (II == Ident__is_target_vendor) {
2058 OS,
Tok, II, *
this,
false,
2059 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2061 Tok, *
this, diag::err_feature_check_malformed);
2064 }
else if (II == Ident__is_target_os) {
2066 OS,
Tok, II, *
this,
false,
2067 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2069 Tok, *
this, diag::err_feature_check_malformed);
2072 }
else if (II == Ident__is_target_environment) {
2074 OS,
Tok, II, *
this,
false,
2075 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2077 Tok, *
this, diag::err_feature_check_malformed);
2080 }
else if (II == Ident__is_target_variant_os) {
2082 OS,
Tok, II, *
this,
false,
2083 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2085 Tok, *
this, diag::err_feature_check_malformed);
2088 }
else if (II == Ident__is_target_variant_environment) {
2090 OS,
Tok, II, *
this,
false,
2091 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2093 Tok, *
this, diag::err_feature_check_malformed);
2097 llvm_unreachable(
"Unknown identifier!");
2116 LangOpts.remapPathPrefix(Path);
2117 if (LangOpts.UseTargetPathSeparator) {
2119 llvm::sys::path::remove_dots(Path,
false,
2120 llvm::sys::path::Style::windows_backslash);
2122 llvm::sys::path::remove_dots(Path,
false, llvm::sys::path::Style::posix);
2132 StringRef PLFileName = llvm::sys::path::filename(PLoc.
getFilename());
2133 if (PLFileName.empty())
2135 FileName.append(PLFileName.begin(), PLFileName.end());
Defines enum values for all the target-independent builtin functions.
static bool getDiagnosticsInGroup(diag::Flavor Flavor, const WarningOption *Group, SmallVectorImpl< diag::kind > &Diags, diag::CustomDiagInfo *CustomDiagInfo)
Return true if any diagnostics were found in this group, even if they were filtered out due to having...
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.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::FileType FileType
Defines the clang::MacroInfo and clang::MacroDirective classes.
static bool HasExtension(const Preprocessor &PP, StringRef Extension)
HasExtension - Return true if we recognize and implement the feature specified by the identifier,...
static bool CheckMatchedBrackets(const SmallVectorImpl< Token > &Tokens)
CheckMatchedBrackets - Returns true if the braces and parentheses in the token vector are properly ne...
static bool EvaluateHasIncludeCommon(Token &Tok, IdentifierInfo *II, Preprocessor &PP, ConstSearchDirIterator LookupFrom, const FileEntry *LookupFromFile)
EvaluateHasIncludeCommon - Process a '__has_include("path")' or '__has_include_next("path")' expressi...
static bool GenerateNewArgTokens(Preprocessor &PP, SmallVectorImpl< Token > &OldTokens, SmallVectorImpl< Token > &NewTokens, unsigned &NumArgs, SmallVectorImpl< SourceRange > &ParenHints, SmallVectorImpl< SourceRange > &InitLists)
GenerateNewArgTokens - Returns true if OldTokens can be converted to a new vector of tokens in NewTok...
static bool isTargetVariantOS(const TargetInfo &TI, const IdentifierInfo *II)
Implements the __is_target_variant_os builtin macro.
static bool isTrivialSingleTokenExpansion(const MacroInfo *MI, const IdentifierInfo *MacroIdent, Preprocessor &PP)
isTrivialSingleTokenExpansion - Return true if MI, which has a single token in its expansion,...
static bool isTargetArch(const TargetInfo &TI, const IdentifierInfo *II)
Implements the __is_target_arch builtin macro.
static bool isTargetVariantEnvironment(const TargetInfo &TI, const IdentifierInfo *II)
Implements the __is_target_variant_environment builtin macro.
static bool isTargetEnvironment(const TargetInfo &TI, const IdentifierInfo *II)
Implements the __is_target_environment builtin macro.
static bool IsBuiltinTrait(Token &Tok)
static bool isTargetOS(const TargetInfo &TI, const IdentifierInfo *II)
Implements the __is_target_os builtin macro.
static bool isTargetVendor(const TargetInfo &TI, const IdentifierInfo *II)
Implements the __is_target_vendor builtin macro.
static void ComputeDATE_TIME(SourceLocation &DATELoc, size_t &DATETokLen, SourceLocation &TIMELoc, size_t &TIMETokLen, Preprocessor &PP)
ComputeDATE_TIME - Compute the current time, enter it into the specified scratch buffer,...
static void EvaluateFeatureLikeBuiltinMacro(llvm::raw_svector_ostream &OS, Token &Tok, IdentifierInfo *II, Preprocessor &PP, bool ExpandArgs, llvm::function_ref< int(Token &Tok, bool &HasLexedNextTok)> Op)
Process single-argument builtin feature-like macros that return integer values.
static bool HasFeature(const Preprocessor &PP, StringRef Feature)
HasFeature - Return true if we recognize and implement the feature specified by the identifier as a s...
static IdentifierInfo * ExpectFeatureIdentifierInfo(Token &Tok, Preprocessor &PP, signed DiagID)
Helper function to return the IdentifierInfo structure of a Token or generate a diagnostic if none av...
Defines the PreprocessorLexer interface.
Defines the clang::Preprocessor interface.
Defines the clang::SourceLocation class and associated facilities.
Syntax
The style used to specify an attribute.
@ AS_Declspec
__declspec(...)
bool isConstantEvaluated(unsigned ID) const
Return true if this function can be constant evaluated by Clang frontend.
diag::Severity getExtensionHandlingBehavior() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
virtual void updateOutOfDateIdentifier(const IdentifierInfo &II)=0
Update an out-of-date identifier.
Cached information about one file (either on disk or in the virtual file system).
time_t getModificationTime() const
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
const char * getNameStart() const
Return the beginning of the actual null-terminated string for this identifier.
void setHasMacroDefinition(bool Val)
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
StringRef getName() const
Return the actual identifier string.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isCompilingModule() const
Are we compiling a module?
std::string CurrentModule
The name of the current module, of which the main source file is a part.
static std::string Stringify(StringRef Str, bool Charify=false)
Stringify - Convert the specified string into a C string by i) escaping '\' and " characters and ii) ...
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
static MacroArgs * create(const MacroInfo *MI, ArrayRef< Token > UnexpArgTokens, bool VarargsElided, Preprocessor &PP)
MacroArgs ctor function - Create a new MacroArgs object with the specified macro and argument info.
void destroy(Preprocessor &PP)
destroy - Destroy and deallocate the memory for this object.
A description of the current definition of a macro.
MacroInfo * getMacroInfo() const
Get the MacroInfo that should be used for this definition.
bool isAmbiguous() const
true if the definition is ambiguous, false otherwise.
void forAllDefinitions(Fn F) const
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
const MacroDirective * getPrevious() const
Get previous definition of the macro with the same name.
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Encapsulates the data about a macro definition (e.g.
bool isIdenticalTo(const MacroInfo &Other, Preprocessor &PP, bool Syntactically) const
Return true if the specified macro definition is equal to this macro in spelling, arguments,...
bool isUsed() const
Return false if this macro is defined in the main file and has not yet been used.
bool isFunctionLike() const
ArrayRef< const IdentifierInfo * > params() const
unsigned getNumTokens() const
Return the number of tokens that this macro expands to.
unsigned getNumParams() const
const Token & getReplacementToken(unsigned Tok) const
bool isBuiltinMacro() const
Return true if this macro requires processing before expansion.
SourceLocation getDefinitionLoc() const
Return the location that the macro was defined at.
bool hasCommaPasting() const
bool isObjectLike() const
bool isWarnIfUnused() const
Return true if we should emit a warning if the macro is unused.
bool isEnabled() const
Return true if this macro is enabled.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
Represents a macro directive exported by a module.
static ModuleMacro * create(Preprocessor &PP, Module *OwningModule, const IdentifierInfo *II, MacroInfo *Macro, ArrayRef< ModuleMacro * > Overrides)
void Profile(llvm::FoldingSetNodeID &ID) const
Describes a module or submodule.
This interface provides a way to observe the actions of the preprocessor as it does its thing.
DateTimeInitKind InitDateTimeMacros
Specify initialization kind for DATE, TIME and TIMESTAMP macros.
std::optional< uint64_t > SourceDateEpoch
If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
SourceLocation getLastFPEvalPragmaLocation() const
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 dumpMacroInfo(const IdentifierInfo *II)
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.
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
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.
MacroDirective * getLocalMacroDirectiveHistory(const IdentifierInfo *II) const
Given an identifier, return the latest non-imported macro directive for that identifier.
void Lex(Token &Result)
Lex the next token for this preprocessor.
bool isParsingIfOrElifDirective() const
True if we are currently preprocessing a if or elif directive.
void LexNonComment(Token &Result)
Lex a token.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
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...
OptionalFileEntryRef LookupEmbedFile(StringRef Filename, bool isAngled, bool OpenFile)
Given a "Filename" or <Filename> reference, look up the indicated embed resource.
static void processPathToFileName(SmallVectorImpl< char > &FileName, const PresumedLoc &PLoc, const LangOptions &LangOpts, const TargetInfo &TI)
const TargetInfo & getTargetInfo() const
bool LexHeaderName(Token &Result, bool AllowMacroExpansion=true)
Lex a token, forming a header-name token if possible.
void LexUnexpandedToken(Token &Result)
Just like Lex, but disables macro expansion of identifier tokens.
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 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
ExternalPreprocessorSource * getExternalSource() const
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.
Builtin::Context & getBuiltinInfo()
const PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
LangOptions::FPEvalMethodKind getTUFPEvalMethod() const
const LangOptions & getLangOpts() const
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
DiagnosticsEngine & getDiagnostics() const
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
std::optional< LexEmbedParametersResult > LexEmbedParameters(Token &Current, bool ForHasEmbed)
Lex the parameters for an embed directive, returns nullopt on error.
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 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.
SourceLocation getIncludeLoc() const
Return the presumed include location of this location.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
Exposes information about the current target.
virtual bool supportsCpuSupports() const
virtual bool supportsCpuInit() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
const llvm::Triple * getDarwinTargetVariantTriple() const
Returns the darwin target variant triple, the variant of the deployment target for which the code is ...
virtual bool supportsCpuIs() const
TokenLexer - This implements a lexer that returns tokens from a macro body or token stream instead of...
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
unsigned getFlags() const
Return the internal represtation of the flags.
void clearFlag(TokenFlags Flag)
Unset the specified flag.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
unsigned getLength() const
void setLength(unsigned Len)
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 isOneOf(Ts... Ks) const
bool hasLeadingSpace() const
Return true if this token has whitespace before it.
void setLocation(SourceLocation L)
bool isNot(tok::TokenKind K) const
bool isAnnotation() const
Return true if this is any of tok::annot_* kind tokens.
bool hasUDSuffix() const
Return true if this token is a string or character literal which has a ud-suffix.
void startToken()
Reset all flags to cleared.
void setIdentifierInfo(IdentifierInfo *II)
void setFlagValue(TokenFlags Flag, bool Val)
Set a flag to either true or false.
void setFlag(TokenFlags Flag)
Set the specified flag.
unsigned getGeneration() const
Get the current visibility generation.
Defines the clang::TargetInfo interface.
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
uint32_t Literal
Literals are represented as positive integers.
@ WarningOrError
A diagnostic that indicates a problem or potential problem.
@ Error
Present this diagnostic as an error.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
int hasAttribute(AttributeCommonInfo::Syntax Syntax, llvm::StringRef ScopeName, llvm::StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts, bool CheckPlugins)
Return the version number associated with the attribute if we recognize and implement the attribute s...
detail::SearchDirIteratorImpl< true > ConstSearchDirIterator
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Default
Set to the current date and time.
@ Undefined
Keep undefined.
@ LiteralOne
Set to literal string "1".
@ Result
The result type of a method or function.
@ Braces
New-expression has a C++11 list-initializer.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t