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 ModuleMacroInfo &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 if (State && State->isAmbiguous(*
this, II))
268 llvm::errs() <<
" ambiguous";
269 if (State && !State->getOverriddenMacros().empty()) {
270 llvm::errs() <<
" overrides";
271 for (
auto *O : State->getOverriddenMacros())
272 llvm::errs() <<
" " << O->getOwningModule()->getFullModuleName();
274 llvm::errs() <<
"\n";
277 for (
auto *MD = State ? State->getLatest() :
nullptr; MD;
278 MD = MD->getPrevious()) {
284 llvm::DenseSet<ModuleMacro*> Active;
285 for (
auto *MM : State ? State->getActiveModuleMacros(*
this, II)
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__");
327 Ident__DATE__ = RegisterBuiltinMacro(
"__DATE__");
328 Ident__TIME__ = RegisterBuiltinMacro(
"__TIME__");
329 Ident__COUNTER__ = RegisterBuiltinMacro(
"__COUNTER__");
330 Ident_Pragma = RegisterBuiltinMacro(
"_Pragma");
331 Ident__FLT_EVAL_METHOD__ = RegisterBuiltinMacro(
"__FLT_EVAL_METHOD__");
335 Ident__has_cpp_attribute = RegisterBuiltinMacro(
"__has_cpp_attribute");
337 Ident__has_cpp_attribute =
nullptr;
340 Ident__BASE_FILE__ = RegisterBuiltinMacro(
"__BASE_FILE__");
341 Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(
"__INCLUDE_LEVEL__");
342 Ident__TIMESTAMP__ = RegisterBuiltinMacro(
"__TIMESTAMP__");
346 Ident__identifier = RegisterBuiltinMacro(
"__identifier");
347 Ident__pragma = RegisterBuiltinMacro(
"__pragma");
349 Ident__identifier =
nullptr;
350 Ident__pragma =
nullptr;
354 Ident__FILE_NAME__ = RegisterBuiltinMacro(
"__FILE_NAME__");
355 Ident__has_feature = RegisterBuiltinMacro(
"__has_feature");
356 Ident__has_extension = RegisterBuiltinMacro(
"__has_extension");
357 Ident__has_builtin = RegisterBuiltinMacro(
"__has_builtin");
358 Ident__has_constexpr_builtin =
359 RegisterBuiltinMacro(
"__has_constexpr_builtin");
360 Ident__has_attribute = RegisterBuiltinMacro(
"__has_attribute");
362 Ident__has_c_attribute = RegisterBuiltinMacro(
"__has_c_attribute");
364 Ident__has_c_attribute =
nullptr;
366 Ident__has_declspec = RegisterBuiltinMacro(
"__has_declspec_attribute");
367 Ident__has_embed = RegisterBuiltinMacro(
"__has_embed");
368 Ident__has_include = RegisterBuiltinMacro(
"__has_include");
369 Ident__has_include_next = RegisterBuiltinMacro(
"__has_include_next");
370 Ident__has_warning = RegisterBuiltinMacro(
"__has_warning");
371 Ident__is_identifier = RegisterBuiltinMacro(
"__is_identifier");
372 Ident__is_target_arch = RegisterBuiltinMacro(
"__is_target_arch");
373 Ident__is_target_vendor = RegisterBuiltinMacro(
"__is_target_vendor");
374 Ident__is_target_os = RegisterBuiltinMacro(
"__is_target_os");
375 Ident__is_target_environment =
376 RegisterBuiltinMacro(
"__is_target_environment");
377 Ident__is_target_variant_os = RegisterBuiltinMacro(
"__is_target_variant_os");
378 Ident__is_target_variant_environment =
379 RegisterBuiltinMacro(
"__is_target_variant_environment");
382 Ident__building_module = RegisterBuiltinMacro(
"__building_module");
384 Ident__MODULE__ = RegisterBuiltinMacro(
"__MODULE__");
386 Ident__MODULE__ =
nullptr;
397 if (!II)
return true;
407 if (ExpansionMI->isEnabled() &&
418 return !llvm::is_contained(MI->
params(), II);
423bool Preprocessor::HandleMacroExpandedIdentifier(
Token &Identifier,
432 if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro();
437 Callbacks->MacroExpands(Identifier, M, Identifier.
getLocation(),
439 ExpandBuiltinMacro(Identifier);
450 SourceLocation ExpansionEnd = Identifier.
getLocation();
458 ArgMacro = &Identifier;
460 Args = ReadMacroCallArgumentList(Identifier, MI, ExpansionEnd);
467 if (!Args)
return true;
469 ++NumFnMacroExpanded;
478 SourceLocation ExpandLoc = Identifier.
getLocation();
479 SourceRange ExpansionRange(ExpandLoc, ExpansionEnd);
487 DelayedMacroExpandsCallbacks.push_back(
488 MacroExpandsInfo(Identifier, M, ExpansionRange));
490 Callbacks->MacroExpands(Identifier, M, ExpansionRange, Args);
491 if (!DelayedMacroExpandsCallbacks.empty()) {
492 for (
const MacroExpandsInfo &Info : DelayedMacroExpandsCallbacks) {
494 Callbacks->MacroExpands(Info.Tok, Info.MD, Info.Range,
497 DelayedMacroExpandsCallbacks.clear();
504 Diag(Identifier, diag::warn_pp_ambiguous_macro)
521 if (Args) Args->
destroy(*
this);
526 PropagateLineStartLeadingSpaceInfo(Identifier);
527 ++NumFastMacroExpanded;
537 if (Args) Args->
destroy(*
this);
554 SourceMgr.createExpansionLoc(Identifier.
getLocation(), ExpandLoc,
562 if (!NewMI->isEnabled() || NewMI == MI) {
567 Diag(Identifier, diag::pp_disabled_macro_expansion);
573 ++NumFastMacroExpanded;
578 EnterMacro(Identifier, ExpansionEnd, MI, Args);
594 if (I->is(tok::l_paren)) {
595 Brackets.push_back(
Paren);
596 }
else if (I->is(tok::r_paren)) {
597 if (Brackets.empty() || Brackets.back() ==
Brace)
600 }
else if (I->is(tok::l_brace)) {
601 Brackets.push_back(
Brace);
602 }
else if (I->is(tok::r_brace)) {
603 if (Brackets.empty() || Brackets.back() ==
Paren)
608 return Brackets.empty();
642 bool FoundSeparatorToken =
false;
646 if (I->is(tok::l_brace)) {
648 }
else if (I->is(tok::r_brace)) {
650 if (
Braces == 0 && ClosingBrace == E && FoundSeparatorToken)
652 }
else if (I->is(tok::eof)) {
657 FoundSeparatorToken =
true;
658 I->setKind(tok::comma);
666 if (FoundSeparatorToken && ArgStartIterator->is(tok::l_brace)) {
674 if (FoundSeparatorToken) {
676 TempToken.
setKind(tok::l_paren);
677 TempToken.
setLocation(ArgStartIterator->getLocation());
679 NewTokens.push_back(TempToken);
683 NewTokens.insert(NewTokens.end(), ArgStartIterator, I);
686 if (FoundSeparatorToken) {
689 TempToken.
setKind(tok::r_paren);
692 NewTokens.push_back(TempToken);
693 ParenHints.push_back(
SourceRange(ArgStartIterator->getLocation(),
698 NewTokens.push_back(*I);
701 ArgStartIterator = I + 1;
702 FoundSeparatorToken =
false;
707 return !ParenHints.empty() && InitLists.empty();
714MacroArgs *Preprocessor::ReadMacroCallArgumentList(
Token &MacroName,
727 assert(
Tok.
is(tok::l_paren) &&
"Error computing l-paren-ness?");
732 SmallVector<Token, 64> ArgTokens;
733 bool ContainsCodeCompletionTok =
false;
734 bool FoundElidedComma =
false;
736 SourceLocation TooManyArgsLoc;
738 unsigned NumActuals = 0;
740 if (ContainsCodeCompletionTok &&
Tok.
isOneOf(tok::eof, tok::eod))
743 assert(
Tok.
isOneOf(tok::l_paren, tok::comma) &&
744 "only expect argument separators here");
746 size_t ArgTokenStart = ArgTokens.size();
751 unsigned NumParens = 0;
759 if (!ContainsCodeCompletionTok) {
760 Diag(MacroName, diag::err_unterm_macro_invoc);
768 auto Toks = std::make_unique<Token[]>(1);
770 EnterTokenStream(std::move(Toks), 1,
true,
false);
772 }
else if (
Tok.
is(tok::r_paren)) {
774 if (NumParens-- == 0) {
776 if (!ArgTokens.empty() &&
777 ArgTokens.back().commaAfterElided()) {
778 FoundElidedComma =
true;
782 }
else if (
Tok.
is(tok::l_paren)) {
784 }
else if (
Tok.
is(tok::comma)) {
795 }
else if (NumParens == 0) {
801 if (NumFixedArgsLeft > 1)
804 }
else if (
Tok.
is(tok::comment) && !KeepMacroComments) {
818 }
else if (
Tok.
is(tok::code_completion)) {
819 ContainsCodeCompletionTok =
true;
828 ArgTokens.push_back(
Tok);
833 if (ArgTokens.empty() &&
Tok.
getKind() == tok::r_paren)
838 if (!isVariadic && NumFixedArgsLeft == 0 && TooManyArgsLoc.
isInvalid()) {
839 if (ArgTokens.size() != ArgTokenStart)
840 TooManyArgsLoc = ArgTokens[ArgTokenStart].getLocation();
842 TooManyArgsLoc = ArgStartLoc;
849 ? diag::warn_cxx98_compat_empty_fnmacro_arg
850 : diag::ext_empty_fnmacro_arg);
858 ArgTokens.push_back(EOFTok);
860 if (!ContainsCodeCompletionTok && NumFixedArgsLeft != 0)
870 if (!isVariadic && NumActuals > MinArgsExpected &&
871 !ContainsCodeCompletionTok) {
874 Diag(TooManyArgsLoc, diag::err_too_many_args_in_macro_invoc);
883 SmallVector<Token, 4> FixedArgTokens;
884 unsigned FixedNumArgs = 0;
885 SmallVector<SourceRange, 4> ParenHints, InitLists;
887 ParenHints, InitLists)) {
888 if (!InitLists.empty()) {
889 DiagnosticBuilder DB =
891 diag::note_init_list_at_beginning_of_macro_argument);
892 for (SourceRange Range : InitLists)
897 if (FixedNumArgs != MinArgsExpected)
900 DiagnosticBuilder DB =
Diag(MacroName, diag::note_suggest_parens_for_macro);
901 for (SourceRange ParenLocation : ParenHints) {
905 ArgTokens.swap(FixedArgTokens);
906 NumActuals = FixedNumArgs;
910 bool isVarargsElided =
false;
912 if (ContainsCodeCompletionTok) {
919 for (; NumActuals < MinArgsExpected; ++NumActuals)
920 ArgTokens.push_back(EOFTok);
923 if (NumActuals < MinArgsExpected) {
925 if (NumActuals == 0 && MinArgsExpected == 1) {
932 }
else if ((FoundElidedComma || MI->
isVariadic()) &&
933 (NumActuals+1 == MinArgsExpected ||
934 (NumActuals == 0 && MinArgsExpected == 2))) {
948 ID = diag::warn_cxx17_compat_missing_varargs_arg;
950 ID = diag::ext_cxx_missing_varargs_arg;
952 ID = diag::warn_c17_compat_missing_varargs_arg;
954 ID = diag::ext_c_missing_varargs_arg;
966 isVarargsElided =
true;
967 }
else if (!ContainsCodeCompletionTok) {
969 Diag(
Tok, diag::err_too_few_args_in_macro_invoc);
981 ArgTokens.push_back(
Tok);
984 if (NumActuals == 0 && MinArgsExpected == 2)
985 ArgTokens.push_back(
Tok);
987 }
else if (NumActuals > MinArgsExpected && !MI->
isVariadic() &&
988 !ContainsCodeCompletionTok) {
991 Diag(MacroName, diag::err_too_many_args_in_macro_invoc);
1011 size_t newIndex = MacroExpandedTokens.size();
1012 bool cacheNeedsToGrow = tokens.size() >
1013 MacroExpandedTokens.capacity()-MacroExpandedTokens.size();
1014 MacroExpandedTokens.append(tokens.begin(), tokens.end());
1016 if (cacheNeedsToGrow) {
1019 for (
const auto &Lexer : MacroExpandingLexersStack) {
1020 TokenLexer *prevLexer;
1022 std::tie(prevLexer, tokIndex) = Lexer;
1023 prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex;
1027 MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex));
1028 return MacroExpandedTokens.data() + newIndex;
1031void Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() {
1032 assert(!MacroExpandingLexersStack.empty());
1033 size_t tokIndex = MacroExpandingLexersStack.back().second;
1034 assert(tokIndex < MacroExpandedTokens.size());
1036 MacroExpandedTokens.resize(tokIndex);
1037 MacroExpandingLexersStack.pop_back();
1049 TM = std::gmtime(&TT);
1051 TT = std::time(
nullptr);
1052 TM = std::localtime(&TT);
1055 static const char *
const Months[] = {
1056 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
1061 llvm::raw_svector_ostream TmpStream(TmpBuffer);
1063 TmpStream << llvm::format(
"\"%s %2d %4d\"", Months[TM->tm_mon],
1064 TM->tm_mday, TM->tm_year + 1900);
1066 TmpStream <<
"??? ?? ????";
1075 llvm::raw_svector_ostream TmpStream(TmpBuffer);
1077 TmpStream << llvm::format(
"\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min,
1080 TmpStream <<
"??:??:??";
1098#define FEATURE(Name, Predicate) .Case(#Name, Predicate)
1099 return llvm::StringSwitch<bool>(
Feature)
1100#include "clang/Basic/Features.def"
1121 if (Extension.starts_with(
"__") && Extension.ends_with(
"__") &&
1122 Extension.size() >= 4)
1123 Extension = Extension.substr(2, Extension.size() - 4);
1127#define EXTENSION(Name, Predicate) .Case(#Name, Predicate)
1128 return llvm::StringSwitch<bool>(Extension)
1129#include "clang/Basic/Features.def"
1147 PP.
Diag(LParenLoc, diag::err_pp_directive_required) << II;
1149 assert(
Tok.is(tok::identifier));
1150 Tok.setIdentifierInfo(II);
1158 }
while (
Tok.getKind() == tok::comment);
1161 if (
Tok.isNot(tok::l_paren)) {
1164 PP.
Diag(LParenLoc, diag::err_pp_expected_after) << II << tok::l_paren;
1167 if (
Tok.isNot(tok::header_name))
1171 LParenLoc =
Tok.getLocation();
1176 if (
Tok.isNot(tok::header_name)) {
1177 PP.
Diag(
Tok.getLocation(), diag::err_pp_expects_filename);
1194 if (
Tok.isNot(tok::r_paren)) {
1196 << II << tok::r_paren;
1197 PP.
Diag(LParenLoc, diag::note_matching) << tok::l_paren;
1204 if (Filename.empty())
1214 PP.
LookupFile(FilenameLoc, Filename, isAngled, LookupFrom, LookupFromFile,
1215 nullptr,
nullptr,
nullptr, &KH,
nullptr,
nullptr);
1221 Callbacks->HasInclude(FilenameLoc, Filename, isAngled,
File,
FileType);
1225 return File.has_value();
1233 Diag(
Tok, diag::err_pp_directive_required) << II;
1235 assert(
Tok.
is(tok::identifier));
1243 Diag(
Tok, diag::err_pp_expected_after) << II << tok::l_paren;
1261 Token FilenameTok =
Tok;
1263 std::optional<LexEmbedParametersResult> Params =
1271 << II << tok::r_paren;
1272 Diag(LParenLoc, diag::note_matching) << tok::l_paren;
1278 if (Params->UnrecognizedParams > 0)
1281 SmallString<128> FilenameBuffer;
1282 StringRef Filename = this->
getSpelling(FilenameTok, FilenameBuffer);
1283 if (Filename.empty())
1293 Callbacks->HasEmbed(LParenLoc, Filename, isAngled, MaybeFileEntry);
1295 if (!MaybeFileEntry)
1298 size_t FileSize = MaybeFileEntry->
getSize();
1301 if (Params->MaybeOffsetParam) {
1302 if (Params->MaybeOffsetParam->Offset > FileSize)
1305 FileSize -= Params->MaybeOffsetParam->Offset;
1310 if (Params->MaybeLimitParam) {
1311 if (Params->MaybeLimitParam->Limit > FileSize)
1314 FileSize = Params->MaybeLimitParam->Limit;
1330 const FileEntry *LookupFromFile;
1331 std::tie(Lookup, LookupFromFile) = getIncludeNextStart(
Tok);
1343 bool &HasLexedNextTok)> Op) {
1346 if (
Tok.isNot(tok::l_paren)) {
1347 PP.
Diag(
Tok.getLocation(), diag::err_pp_expected_after) << II
1351 if (!
Tok.isOneOf(tok::eof, tok::eod)) {
1353 Tok.setKind(tok::numeric_constant);
1358 unsigned ParenDepth = 1;
1360 std::optional<int> Result;
1363 bool SuppressDiagnostic =
false;
1364 while (
Tok.isNoneOf(tok::eod, tok::eof)) {
1372 switch (
Tok.getKind()) {
1377 PP.
Diag(
Tok.getLocation(), diag::err_unterm_macro_invoc);
1381 if (!SuppressDiagnostic) {
1382 PP.
Diag(
Tok.getLocation(), diag::err_too_many_args_in_macro_invoc);
1383 SuppressDiagnostic =
true;
1391 if (!SuppressDiagnostic) {
1392 PP.
Diag(
Tok.getLocation(), diag::err_pp_nested_paren) << II;
1393 SuppressDiagnostic =
true;
1398 if (--ParenDepth > 0)
1411 if (!SuppressDiagnostic)
1412 PP.
Diag(
Tok.getLocation(), diag::err_too_few_args_in_macro_invoc);
1414 Tok.setKind(tok::numeric_constant);
1422 bool HasLexedNextToken =
false;
1423 Result = Op(
Tok, HasLexedNextToken);
1425 if (HasLexedNextToken)
1432 if (!SuppressDiagnostic) {
1433 if (
auto Diag = PP.
Diag(
Tok.getLocation(), diag::err_pp_expected_after)) {
1440 PP.
Diag(LParenLoc, diag::note_matching) << tok::l_paren;
1441 SuppressDiagnostic =
true;
1452 if (!
Tok.isAnnotation() && (II =
Tok.getIdentifierInfo()))
1455 PP.
Diag(
Tok.getLocation(), DiagID);
1462 const llvm::Triple &TT = TI.
getTriple();
1465 if ((
Arch.getSubArch() == llvm::Triple::NoSubArch ||
1466 Arch.getSubArch() == TT.getSubArch()) &&
1467 ((TT.getArch() == llvm::Triple::thumb &&
1468 Arch.getArch() == llvm::Triple::arm) ||
1469 (TT.getArch() == llvm::Triple::thumbeb &&
1470 Arch.getArch() == llvm::Triple::armeb)))
1475 return (
Arch.getSubArch() == llvm::Triple::NoSubArch ||
1476 Arch.getSubArch() == TT.getSubArch()) &&
1477 Arch.getArch() == TT.getArch();
1482 StringRef VendorName = TI.
getTriple().getVendorName();
1483 if (VendorName.empty())
1484 VendorName =
"unknown";
1485 return VendorName.equals_insensitive(II->
getName());
1490 llvm::Triple OS(llvm::Twine(
"unknown-unknown-") + II->
getName().lower());
1491 if (OS.getOS() == llvm::Triple::Darwin) {
1495 return TI.
getTriple().getOS() == OS.getOS();
1501 llvm::Triple Env(llvm::Twine(
"---") + II->
getName().lower());
1504 if (Env.getEnvironment() == llvm::Triple::UnknownEnvironment &&
1505 Env.getEnvironmentName() !=
"unknown")
1507 return TI.
getTriple().getEnvironment() == Env.getEnvironment();
1517 llvm::Triple OS(llvm::Twine(
"unknown-unknown-") + II->
getName().lower());
1518 if (OS.getOS() == llvm::Triple::Darwin) {
1520 return VariantTriple->isOSDarwin();
1522 return VariantTriple->getOS() == OS.getOS();
1534 llvm::Triple Env(llvm::Twine(
"---") + II->
getName().lower());
1535 return VariantTriple->getEnvironment() == Env.getEnvironment();
1540#if defined(__sun__) && defined(__svr4__) && defined(__clang__) && \
1546asm(
"_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_"
1547 "RSt8ios_basecPKSt2tmPKcSB_ = "
1548 "_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_"
1549 "RSt8ios_basecPK2tmPKcSB_");
1554#define TYPE_TRAIT_1(Spelling, Name, Key) \
1555 case tok::kw_##Spelling: \
1557#define TYPE_TRAIT_2(Spelling, Name, Key) \
1558 case tok::kw_##Spelling: \
1560#define TYPE_TRAIT_N(Spelling, Name, Key) \
1561 case tok::kw_##Spelling: \
1563#define ARRAY_TYPE_TRAIT(Spelling, Name, Key) \
1564 case tok::kw_##Spelling: \
1566#define EXPRESSION_TRAIT(Spelling, Name, Key) \
1567 case tok::kw_##Spelling: \
1569#define TRANSFORM_TYPE_TRAIT_DEF(K, Spelling) \
1570 case tok::kw___##Spelling: \
1573 switch (
Tok.getKind()) {
1576#include "clang/Basic/TokenKinds.def"
1582void Preprocessor::ExpandBuiltinMacro(
Token &
Tok) {
1585 assert(II &&
"Can't be a macro without id info!");
1589 if (II == Ident_Pragma)
1590 return Handle_Pragma(
Tok);
1591 else if (II == Ident__pragma)
1592 return HandleMicrosoft__pragma(
Tok);
1594 ++NumBuiltinMacroExpanded;
1596 SmallString<128> TmpBuffer;
1597 llvm::raw_svector_ostream
OS(TmpBuffer);
1605 if (II == Ident__LINE__) {
1620 Loc = SourceMgr.getExpansionRange(Loc).getEnd();
1621 PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
1626 }
else if (II == Ident__FILE__ || II == Ident__BASE_FILE__ ||
1627 II == Ident__FILE_NAME__) {
1634 if (II == Ident__BASE_FILE__ && PLoc.
isValid()) {
1637 PLoc = SourceMgr.getPresumedLoc(NextLoc);
1646 SmallString<256> FN;
1650 if (II == Ident__FILE_NAME__) {
1657 OS <<
'"' << FN <<
'"';
1660 }
else if (II == Ident__DATE__) {
1662 if (!DATELoc.isValid())
1670 }
else if (II == Ident__TIME__) {
1672 if (!TIMELoc.isValid())
1680 }
else if (II == Ident__INCLUDE_LEVEL__) {
1688 for (; PLoc.
isValid(); ++Depth)
1695 }
else if (II == Ident__TIMESTAMP__) {
1700 std::stringstream TmpStream;
1701 TmpStream.imbue(std::locale(
"C"));
1704 std::tm *TM = std::gmtime(&TT);
1705 TmpStream << std::put_time(TM,
"%a %b %e %T %Y");
1709 const FileEntry *CurFile =
nullptr;
1711 CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID());
1714 struct tm *TM = localtime(&TT);
1715 TmpStream << std::put_time(TM,
"%a %b %e %T %Y");
1718 Result = TmpStream.str();
1720 Result =
"??? ??? ?? ??:??:?? ????";
1723 }
else if (II == Ident__FLT_EVAL_METHOD__) {
1731 Diag(
Tok, diag::err_illegal_use_of_flt_eval_macro);
1734 }
else if (II == Ident__COUNTER__) {
1739 constexpr uint32_t MaxPosValue = std::numeric_limits<int32_t>::max();
1740 if (CounterValue > MaxPosValue) {
1746 CounterValue = MaxPosValue;
1748 OS << CounterValue++;
1750 }
else if (II == Ident__has_feature) {
1752 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1754 diag::err_feature_check_malformed);
1757 }
else if (II == Ident__has_extension) {
1759 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1761 diag::err_feature_check_malformed);
1764 }
else if (II == Ident__has_builtin) {
1766 OS,
Tok, II, *
this,
false,
1767 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1769 Tok, *
this, diag::err_feature_check_malformed);
1773 if (BuiltinID != 0) {
1775 case Builtin::BI__builtin_cpu_is:
1777 case Builtin::BI__builtin_cpu_init:
1779 case Builtin::BI__builtin_cpu_supports:
1781 case Builtin::BI__builtin_operator_new:
1782 case Builtin::BI__builtin_operator_delete:
1797 }
else if (II->
getTokenID() != tok::identifier &&
1798 II->
getName().starts_with(
"__builtin_")) {
1801 return llvm::StringSwitch<bool>(II->
getName())
1803#define BuiltinTemplate(BTName) .Case(#BTName, getLangOpts().CPlusPlus)
1804#include "clang/Basic/BuiltinTemplates.inc"
1808 .Case(
"__is_target_arch",
true)
1809 .Case(
"__is_target_vendor",
true)
1810 .Case(
"__is_target_os",
true)
1811 .Case(
"__is_target_environment",
true)
1812 .Case(
"__is_target_variant_os",
true)
1813 .Case(
"__is_target_variant_environment",
true)
1817 }
else if (II == Ident__has_constexpr_builtin) {
1819 OS,
Tok, II, *
this,
false,
1820 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1822 Tok, *
this, diag::err_feature_check_malformed);
1826 return BuiltinOp != 0 &&
1829 }
else if (II == Ident__is_identifier) {
1831 [](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1832 return Tok.
is(tok::identifier);
1834 }
else if (II == Ident__has_attribute) {
1836 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1838 diag::err_feature_check_malformed);
1843 }
else if (II == Ident__has_declspec) {
1845 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1847 diag::err_feature_check_malformed);
1850 return LangOpts.DeclSpecKeyword &&
1857 }
else if (II == Ident__has_cpp_attribute ||
1858 II == Ident__has_c_attribute) {
1859 bool IsCXX = II == Ident__has_cpp_attribute;
1861 [&](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1862 IdentifierInfo *ScopeII =
nullptr;
1864 Tok, *
this, diag::err_feature_check_malformed);
1872 HasLexedNextToken =
true;
1878 diag::err_feature_check_malformed);
1888 }
else if (II == Ident__has_include ||
1889 II == Ident__has_include_next) {
1894 if (II == Ident__has_include)
1895 Value = EvaluateHasInclude(
Tok, II);
1897 Value = EvaluateHasIncludeNext(
Tok, II);
1903 }
else if (II == Ident__has_embed) {
1913 OS << static_cast<int>(
Value);
1914 }
else if (II == Ident__has_warning) {
1917 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1918 std::string WarningName;
1921 HasLexedNextToken =
Tok.
is(tok::string_literal);
1928 if (WarningName.size() < 3 || WarningName[0] !=
'-' ||
1929 WarningName[1] !=
'W') {
1930 Diag(StrStartLoc, diag::warn_has_warning_invalid_option);
1938 SmallVector<diag::kind, 10> Diags;
1941 WarningName.substr(2), Diags);
1943 }
else if (II == Ident__building_module) {
1948 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
1950 diag::err_expected_id_building_module);
1954 }
else if (II == Ident__MODULE__) {
1960 }
else if (II == Ident__identifier) {
1969 << II << tok::l_paren;
2000 if (RParen.
isNot(tok::r_paren)) {
2003 Diag(LParenLoc, diag::note_matching) << tok::l_paren;
2006 }
else if (II == Ident__is_target_arch) {
2008 OS,
Tok, II, *
this,
false,
2009 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2011 Tok, *
this, diag::err_feature_check_malformed);
2014 }
else if (II == Ident__is_target_vendor) {
2016 OS,
Tok, II, *
this,
false,
2017 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2019 Tok, *
this, diag::err_feature_check_malformed);
2022 }
else if (II == Ident__is_target_os) {
2024 OS,
Tok, II, *
this,
false,
2025 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2027 Tok, *
this, diag::err_feature_check_malformed);
2030 }
else if (II == Ident__is_target_environment) {
2032 OS,
Tok, II, *
this,
false,
2033 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2035 Tok, *
this, diag::err_feature_check_malformed);
2038 }
else if (II == Ident__is_target_variant_os) {
2040 OS,
Tok, II, *
this,
false,
2041 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2043 Tok, *
this, diag::err_feature_check_malformed);
2046 }
else if (II == Ident__is_target_variant_environment) {
2048 OS,
Tok, II, *
this,
false,
2049 [
this](Token &
Tok,
bool &HasLexedNextToken) ->
int {
2051 Tok, *
this, diag::err_feature_check_malformed);
2055 llvm_unreachable(
"Unknown identifier!");
2074 LangOpts.remapPathPrefix(Path);
2075 if (LangOpts.UseTargetPathSeparator) {
2077 llvm::sys::path::remove_dots(Path,
false,
2078 llvm::sys::path::Style::windows_backslash);
2080 llvm::sys::path::remove_dots(Path,
false, llvm::sys::path::Style::posix);
2090 StringRef PLFileName = llvm::sys::path::filename(PLoc.
getFilename());
2091 if (PLFileName.empty())
2093 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.
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 void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, Preprocessor &PP)
ComputeDATE_TIME - Compute the current time, enter it into the specified scratch buffer,...
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 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.
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',...
@ Result
The result type of a method or function.
@ Braces
New-expression has a C++11 list-initializer.