4077 lines · cpp
1//===--- PPDirectives.cpp - Directive Handling for Preprocessor -----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Implements # directive processing for the Preprocessor.11///12//===----------------------------------------------------------------------===//13 14#include "clang/Basic/AttributeCommonInfo.h"15#include "clang/Basic/Attributes.h"16#include "clang/Basic/CharInfo.h"17#include "clang/Basic/DirectoryEntry.h"18#include "clang/Basic/FileManager.h"19#include "clang/Basic/IdentifierTable.h"20#include "clang/Basic/LangOptions.h"21#include "clang/Basic/Module.h"22#include "clang/Basic/SourceLocation.h"23#include "clang/Basic/SourceManager.h"24#include "clang/Basic/TargetInfo.h"25#include "clang/Basic/TokenKinds.h"26#include "clang/Lex/CodeCompletionHandler.h"27#include "clang/Lex/HeaderSearch.h"28#include "clang/Lex/LexDiagnostic.h"29#include "clang/Lex/LiteralSupport.h"30#include "clang/Lex/MacroInfo.h"31#include "clang/Lex/ModuleLoader.h"32#include "clang/Lex/ModuleMap.h"33#include "clang/Lex/PPCallbacks.h"34#include "clang/Lex/Pragma.h"35#include "clang/Lex/Preprocessor.h"36#include "clang/Lex/PreprocessorOptions.h"37#include "clang/Lex/Token.h"38#include "clang/Lex/VariadicMacroSupport.h"39#include "llvm/ADT/ArrayRef.h"40#include "llvm/ADT/STLExtras.h"41#include "llvm/ADT/ScopeExit.h"42#include "llvm/ADT/SmallVector.h"43#include "llvm/ADT/StringExtras.h"44#include "llvm/ADT/StringRef.h"45#include "llvm/ADT/StringSwitch.h"46#include "llvm/Support/ErrorHandling.h"47#include "llvm/Support/Path.h"48#include "llvm/Support/SaveAndRestore.h"49#include <algorithm>50#include <cassert>51#include <cstring>52#include <optional>53#include <string>54#include <utility>55 56using namespace clang;57 58//===----------------------------------------------------------------------===//59// Utility Methods for Preprocessor Directive Handling.60//===----------------------------------------------------------------------===//61 62MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {63 static_assert(std::is_trivially_destructible_v<MacroInfo>, "");64 return new (BP) MacroInfo(L);65}66 67DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,68 SourceLocation Loc) {69 return new (BP) DefMacroDirective(MI, Loc);70}71 72UndefMacroDirective *73Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {74 return new (BP) UndefMacroDirective(UndefLoc);75}76 77VisibilityMacroDirective *78Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,79 bool isPublic) {80 return new (BP) VisibilityMacroDirective(Loc, isPublic);81}82 83/// Read and discard all tokens remaining on the current line until84/// the tok::eod token is found.85SourceRange Preprocessor::DiscardUntilEndOfDirective(Token &Tmp) {86 SourceRange Res;87 88 LexUnexpandedToken(Tmp);89 Res.setBegin(Tmp.getLocation());90 while (Tmp.isNot(tok::eod)) {91 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");92 LexUnexpandedToken(Tmp);93 }94 Res.setEnd(Tmp.getLocation());95 return Res;96}97 98/// Enumerates possible cases of #define/#undef a reserved identifier.99enum MacroDiag {100 MD_NoWarn, //> Not a reserved identifier101 MD_KeywordDef, //> Macro hides keyword, enabled by default102 MD_ReservedMacro, //> #define of #undef reserved id, disabled by default103 MD_ReservedAttributeIdentifier104};105 106/// Enumerates possible %select values for the pp_err_elif_after_else and107/// pp_err_elif_without_if diagnostics.108enum PPElifDiag {109 PED_Elif,110 PED_Elifdef,111 PED_Elifndef112};113 114static bool isFeatureTestMacro(StringRef MacroName) {115 // list from:116 // * https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html117 // * https://docs.microsoft.com/en-us/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-160118 // * man 7 feature_test_macros119 // The list must be sorted for correct binary search.120 static constexpr StringRef ReservedMacro[] = {121 "_ATFILE_SOURCE",122 "_BSD_SOURCE",123 "_CRT_NONSTDC_NO_WARNINGS",124 "_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES",125 "_CRT_SECURE_NO_WARNINGS",126 "_FILE_OFFSET_BITS",127 "_FORTIFY_SOURCE",128 "_GLIBCXX_ASSERTIONS",129 "_GLIBCXX_CONCEPT_CHECKS",130 "_GLIBCXX_DEBUG",131 "_GLIBCXX_DEBUG_PEDANTIC",132 "_GLIBCXX_PARALLEL",133 "_GLIBCXX_PARALLEL_ASSERTIONS",134 "_GLIBCXX_SANITIZE_VECTOR",135 "_GLIBCXX_USE_CXX11_ABI",136 "_GLIBCXX_USE_DEPRECATED",137 "_GNU_SOURCE",138 "_ISOC11_SOURCE",139 "_ISOC95_SOURCE",140 "_ISOC99_SOURCE",141 "_LARGEFILE64_SOURCE",142 "_POSIX_C_SOURCE",143 "_REENTRANT",144 "_SVID_SOURCE",145 "_THREAD_SAFE",146 "_XOPEN_SOURCE",147 "_XOPEN_SOURCE_EXTENDED",148 "__STDCPP_WANT_MATH_SPEC_FUNCS__",149 "__STDC_FORMAT_MACROS",150 };151 return llvm::binary_search(ReservedMacro, MacroName);152}153 154static bool isLanguageDefinedBuiltin(const SourceManager &SourceMgr,155 const MacroInfo *MI,156 const StringRef MacroName) {157 // If this is a macro with special handling (like __LINE__) then it's language158 // defined.159 if (MI->isBuiltinMacro())160 return true;161 // Builtin macros are defined in the builtin file162 if (!SourceMgr.isWrittenInBuiltinFile(MI->getDefinitionLoc()))163 return false;164 // C defines macros starting with __STDC, and C++ defines macros starting with165 // __STDCPP166 if (MacroName.starts_with("__STDC"))167 return true;168 // C++ defines the __cplusplus macro169 if (MacroName == "__cplusplus")170 return true;171 // C++ defines various feature-test macros starting with __cpp172 if (MacroName.starts_with("__cpp"))173 return true;174 // Anything else isn't language-defined175 return false;176}177 178static bool isReservedCXXAttributeName(Preprocessor &PP, IdentifierInfo *II) {179 const LangOptions &Lang = PP.getLangOpts();180 if (Lang.CPlusPlus &&181 hasAttribute(AttributeCommonInfo::AS_CXX11, /* Scope*/ nullptr, II,182 PP.getTargetInfo(), Lang, /*CheckPlugins*/ false) > 0) {183 AttributeCommonInfo::AttrArgsInfo AttrArgsInfo =184 AttributeCommonInfo::getCXX11AttrArgsInfo(II);185 if (AttrArgsInfo == AttributeCommonInfo::AttrArgsInfo::Required)186 return PP.isNextPPTokenOneOf(tok::l_paren);187 188 return !PP.isNextPPTokenOneOf(tok::l_paren) ||189 AttrArgsInfo == AttributeCommonInfo::AttrArgsInfo::Optional;190 }191 return false;192}193 194static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {195 const LangOptions &Lang = PP.getLangOpts();196 StringRef Text = II->getName();197 if (isReservedInAllContexts(II->isReserved(Lang)))198 return isFeatureTestMacro(Text) ? MD_NoWarn : MD_ReservedMacro;199 if (II->isKeyword(Lang))200 return MD_KeywordDef;201 if (Lang.CPlusPlus11 && (Text == "override" || Text == "final"))202 return MD_KeywordDef;203 if (isReservedCXXAttributeName(PP, II))204 return MD_ReservedAttributeIdentifier;205 return MD_NoWarn;206}207 208static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {209 const LangOptions &Lang = PP.getLangOpts();210 // Do not warn on keyword undef. It is generally harmless and widely used.211 if (isReservedInAllContexts(II->isReserved(Lang)))212 return MD_ReservedMacro;213 if (isReservedCXXAttributeName(PP, II))214 return MD_ReservedAttributeIdentifier;215 return MD_NoWarn;216}217 218// Return true if we want to issue a diagnostic by default if we219// encounter this name in a #include with the wrong case. For now,220// this includes the standard C and C++ headers, Posix headers,221// and Boost headers. Improper case for these #includes is a222// potential portability issue.223static bool warnByDefaultOnWrongCase(StringRef Include) {224 // If the first component of the path is "boost", treat this like a standard header225 // for the purposes of diagnostics.226 if (::llvm::sys::path::begin(Include)->equals_insensitive("boost"))227 return true;228 229 // "condition_variable" is the longest standard header name at 18 characters.230 // If the include file name is longer than that, it can't be a standard header.231 static const size_t MaxStdHeaderNameLen = 18u;232 if (Include.size() > MaxStdHeaderNameLen)233 return false;234 235 // Lowercase and normalize the search string.236 SmallString<32> LowerInclude{Include};237 for (char &Ch : LowerInclude) {238 // In the ASCII range?239 if (static_cast<unsigned char>(Ch) > 0x7f)240 return false; // Can't be a standard header241 // ASCII lowercase:242 if (Ch >= 'A' && Ch <= 'Z')243 Ch += 'a' - 'A';244 // Normalize path separators for comparison purposes.245 else if (::llvm::sys::path::is_separator(Ch))246 Ch = '/';247 }248 249 // The standard C/C++ and Posix headers250 return llvm::StringSwitch<bool>(LowerInclude)251 // C library headers252 .Cases({"assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h"}, true)253 .Cases({"float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h"},254 true)255 .Cases({"math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h"}, true)256 .Cases({"stdatomic.h", "stdbool.h", "stdckdint.h", "stdcountof.h"}, true)257 .Cases({"stddef.h", "stdint.h", "stdio.h", "stdlib.h", "stdnoreturn.h"},258 true)259 .Cases({"string.h", "tgmath.h", "threads.h", "time.h", "uchar.h"}, true)260 .Cases({"wchar.h", "wctype.h"}, true)261 262 // C++ headers for C library facilities263 .Cases({"cassert", "ccomplex", "cctype", "cerrno", "cfenv"}, true)264 .Cases({"cfloat", "cinttypes", "ciso646", "climits", "clocale"}, true)265 .Cases({"cmath", "csetjmp", "csignal", "cstdalign", "cstdarg"}, true)266 .Cases({"cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib"}, true)267 .Cases({"cstring", "ctgmath", "ctime", "cuchar", "cwchar"}, true)268 .Case("cwctype", true)269 270 // C++ library headers271 .Cases({"algorithm", "fstream", "list", "regex", "thread"}, true)272 .Cases({"array", "functional", "locale", "scoped_allocator", "tuple"},273 true)274 .Cases({"atomic", "future", "map", "set", "type_traits"}, true)275 .Cases(276 {"bitset", "initializer_list", "memory", "shared_mutex", "typeindex"},277 true)278 .Cases({"chrono", "iomanip", "mutex", "sstream", "typeinfo"}, true)279 .Cases({"codecvt", "ios", "new", "stack", "unordered_map"}, true)280 .Cases({"complex", "iosfwd", "numeric", "stdexcept", "unordered_set"},281 true)282 .Cases(283 {"condition_variable", "iostream", "ostream", "streambuf", "utility"},284 true)285 .Cases({"deque", "istream", "queue", "string", "valarray"}, true)286 .Cases({"exception", "iterator", "random", "strstream", "vector"}, true)287 .Cases({"forward_list", "limits", "ratio", "system_error"}, true)288 289 // POSIX headers (which aren't also C headers)290 .Cases({"aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h"}, true)291 .Cases({"fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h"}, true)292 .Cases({"grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h"}, true)293 .Cases({"mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h"},294 true)295 .Cases({"netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h"},296 true)297 .Cases({"regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h"}, true)298 .Cases({"strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h"},299 true)300 .Cases({"sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h",301 "sys/socket.h"},302 true)303 .Cases({"sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h",304 "sys/types.h"},305 true)306 .Cases(307 {"sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h"},308 true)309 .Cases({"tar.h", "termios.h", "trace.h", "ulimit.h"}, true)310 .Cases({"unistd.h", "utime.h", "utmpx.h", "wordexp.h"}, true)311 .Default(false);312}313 314/// Find a similar string in `Candidates`.315///316/// \param LHS a string for a similar string in `Candidates`317///318/// \param Candidates the candidates to find a similar string.319///320/// \returns a similar string if exists. If no similar string exists,321/// returns std::nullopt.322static std::optional<StringRef>323findSimilarStr(StringRef LHS, const std::vector<StringRef> &Candidates) {324 // We need to check if `Candidates` has the exact case-insensitive string325 // because the Levenshtein distance match does not care about it.326 for (StringRef C : Candidates) {327 if (LHS.equals_insensitive(C)) {328 return C;329 }330 }331 332 // Keep going with the Levenshtein distance match.333 // If the LHS size is less than 3, use the LHS size minus 1 and if not,334 // use the LHS size divided by 3.335 size_t Length = LHS.size();336 size_t MaxDist = Length < 3 ? Length - 1 : Length / 3;337 338 std::optional<std::pair<StringRef, size_t>> SimilarStr;339 for (StringRef C : Candidates) {340 size_t CurDist = LHS.edit_distance(C, true);341 if (CurDist <= MaxDist) {342 if (!SimilarStr) {343 // The first similar string found.344 SimilarStr = {C, CurDist};345 } else if (CurDist < SimilarStr->second) {346 // More similar string found.347 SimilarStr = {C, CurDist};348 }349 }350 }351 352 if (SimilarStr) {353 return SimilarStr->first;354 } else {355 return std::nullopt;356 }357}358 359bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,360 bool *ShadowFlag) {361 // Missing macro name?362 if (MacroNameTok.is(tok::eod))363 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);364 365 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();366 if (!II)367 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);368 369 if (II->isCPlusPlusOperatorKeyword()) {370 // C++ 2.5p2: Alternative tokens behave the same as its primary token371 // except for their spellings.372 Diag(MacroNameTok, getLangOpts().MicrosoftExt373 ? diag::ext_pp_operator_used_as_macro_name374 : diag::err_pp_operator_used_as_macro_name)375 << II << MacroNameTok.getKind();376 // Allow #defining |and| and friends for Microsoft compatibility or377 // recovery when legacy C headers are included in C++.378 }379 380 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {381 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.382 return Diag(MacroNameTok, diag::err_defined_macro_name);383 }384 385 // If defining/undefining reserved identifier or a keyword, we need to issue386 // a warning.387 SourceLocation MacroNameLoc = MacroNameTok.getLocation();388 if (ShadowFlag)389 *ShadowFlag = false;390 // Macro names with reserved identifiers are accepted if built-in or passed391 // through the command line (the later may be present if -dD was used to392 // generate the preprocessed file).393 // NB: isInPredefinedFile() is relatively expensive, so keep it at the end394 // of the condition.395 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&396 !SourceMgr.isInPredefinedFile(MacroNameLoc)) {397 MacroDiag D = MD_NoWarn;398 if (isDefineUndef == MU_Define) {399 D = shouldWarnOnMacroDef(*this, II);400 }401 else if (isDefineUndef == MU_Undef)402 D = shouldWarnOnMacroUndef(*this, II);403 if (D == MD_KeywordDef) {404 // We do not want to warn on some patterns widely used in configuration405 // scripts. This requires analyzing next tokens, so do not issue warnings406 // now, only inform caller.407 if (ShadowFlag)408 *ShadowFlag = true;409 }410 if (D == MD_ReservedMacro)411 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);412 if (D == MD_ReservedAttributeIdentifier)413 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_attribute_id)414 << II->getName();415 }416 417 // Okay, we got a good identifier.418 return false;419}420 421/// Lex and validate a macro name, which occurs after a422/// \#define or \#undef.423///424/// This sets the token kind to eod and discards the rest of the macro line if425/// the macro name is invalid.426///427/// \param MacroNameTok Token that is expected to be a macro name.428/// \param isDefineUndef Context in which macro is used.429/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.430void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,431 bool *ShadowFlag) {432 // Read the token, don't allow macro expansion on it.433 LexUnexpandedToken(MacroNameTok);434 435 if (MacroNameTok.is(tok::code_completion)) {436 if (CodeComplete)437 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);438 setCodeCompletionReached();439 LexUnexpandedToken(MacroNameTok);440 }441 442 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))443 return;444 445 // Invalid macro name, read and discard the rest of the line and set the446 // token kind to tok::eod if necessary.447 if (MacroNameTok.isNot(tok::eod)) {448 MacroNameTok.setKind(tok::eod);449 DiscardUntilEndOfDirective();450 }451}452 453/// Ensure that the next token is a tok::eod token.454///455/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is456/// true, then we consider macros that expand to zero tokens as being ok.457///458/// Returns the location of the end of the directive.459SourceLocation Preprocessor::CheckEndOfDirective(const char *DirType,460 bool EnableMacros) {461 Token Tmp;462 // Lex unexpanded tokens for most directives: macros might expand to zero463 // tokens, causing us to miss diagnosing invalid lines. Some directives (like464 // #line) allow empty macros.465 if (EnableMacros)466 Lex(Tmp);467 else468 LexUnexpandedToken(Tmp);469 470 // There should be no tokens after the directive, but we allow them as an471 // extension.472 while (Tmp.is(tok::comment)) // Skip comments in -C mode.473 LexUnexpandedToken(Tmp);474 475 if (Tmp.is(tok::eod))476 return Tmp.getLocation();477 478 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,479 // or if this is a macro-style preprocessing directive, because it is more480 // trouble than it is worth to insert /**/ and check that there is no /**/481 // in the range also.482 FixItHint Hint;483 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&484 !CurTokenLexer)485 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");486 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;487 return DiscardUntilEndOfDirective().getEnd();488}489 490void Preprocessor::SuggestTypoedDirective(const Token &Tok,491 StringRef Directive) const {492 // If this is a `.S` file, treat unknown # directives as non-preprocessor493 // directives.494 if (getLangOpts().AsmPreprocessor) return;495 496 std::vector<StringRef> Candidates = {497 "if", "ifdef", "ifndef", "elif", "else", "endif"498 };499 if (LangOpts.C23 || LangOpts.CPlusPlus23)500 Candidates.insert(Candidates.end(), {"elifdef", "elifndef"});501 502 if (std::optional<StringRef> Sugg = findSimilarStr(Directive, Candidates)) {503 // Directive cannot be coming from macro.504 assert(Tok.getLocation().isFileID());505 CharSourceRange DirectiveRange = CharSourceRange::getCharRange(506 Tok.getLocation(),507 Tok.getLocation().getLocWithOffset(Directive.size()));508 StringRef SuggValue = *Sugg;509 510 auto Hint = FixItHint::CreateReplacement(DirectiveRange, SuggValue);511 Diag(Tok, diag::warn_pp_invalid_directive) << 1 << SuggValue << Hint;512 }513}514 515/// SkipExcludedConditionalBlock - We just read a \#if or related directive and516/// decided that the subsequent tokens are in the \#if'd out portion of the517/// file. Lex the rest of the file, until we see an \#endif. If518/// FoundNonSkipPortion is true, then we have already emitted code for part of519/// this \#if directive, so \#else/\#elif blocks should never be entered.520/// If ElseOk is true, then \#else directives are ok, if not, then we have521/// already seen one so a \#else directive is a duplicate. When this returns,522/// the caller can lex the first valid token.523void Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,524 SourceLocation IfTokenLoc,525 bool FoundNonSkipPortion,526 bool FoundElse,527 SourceLocation ElseLoc) {528 // In SkippingRangeStateTy we are depending on SkipExcludedConditionalBlock()529 // not getting called recursively by storing the RecordedSkippedRanges530 // DenseMap lookup pointer (field SkipRangePtr). SkippingRangeStateTy expects531 // that RecordedSkippedRanges won't get modified and SkipRangePtr won't be532 // invalidated. If this changes and there is a need to call533 // SkipExcludedConditionalBlock() recursively, SkippingRangeStateTy should534 // change to do a second lookup in endLexPass function instead of reusing the535 // lookup pointer.536 assert(!SkippingExcludedConditionalBlock &&537 "calling SkipExcludedConditionalBlock recursively");538 llvm::SaveAndRestore SARSkipping(SkippingExcludedConditionalBlock, true);539 540 ++NumSkipped;541 assert(!CurTokenLexer && "Conditional PP block cannot appear in a macro!");542 assert(CurPPLexer && "Conditional PP block must be in a file!");543 assert(CurLexer && "Conditional PP block but no current lexer set!");544 545 if (PreambleConditionalStack.reachedEOFWhileSkipping())546 PreambleConditionalStack.clearSkipInfo();547 else548 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/ false,549 FoundNonSkipPortion, FoundElse);550 551 // Enter raw mode to disable identifier lookup (and thus macro expansion),552 // disabling warnings, etc.553 CurPPLexer->LexingRawMode = true;554 Token Tok;555 SourceLocation endLoc;556 557 /// Keeps track and caches skipped ranges and also retrieves a prior skipped558 /// range if the same block is re-visited.559 struct SkippingRangeStateTy {560 Preprocessor &PP;561 562 const char *BeginPtr = nullptr;563 unsigned *SkipRangePtr = nullptr;564 565 SkippingRangeStateTy(Preprocessor &PP) : PP(PP) {}566 567 void beginLexPass() {568 if (BeginPtr)569 return; // continue skipping a block.570 571 // Initiate a skipping block and adjust the lexer if we already skipped it572 // before.573 BeginPtr = PP.CurLexer->getBufferLocation();574 SkipRangePtr = &PP.RecordedSkippedRanges[BeginPtr];575 if (*SkipRangePtr) {576 PP.CurLexer->seek(PP.CurLexer->getCurrentBufferOffset() + *SkipRangePtr,577 /*IsAtStartOfLine*/ true);578 }579 }580 581 void endLexPass(const char *Hashptr) {582 if (!BeginPtr) {583 // Not doing normal lexing.584 assert(PP.CurLexer->isDependencyDirectivesLexer());585 return;586 }587 588 // Finished skipping a block, record the range if it's first time visited.589 if (!*SkipRangePtr) {590 *SkipRangePtr = Hashptr - BeginPtr;591 }592 assert(*SkipRangePtr == unsigned(Hashptr - BeginPtr));593 BeginPtr = nullptr;594 SkipRangePtr = nullptr;595 }596 } SkippingRangeState(*this);597 598 while (true) {599 if (CurLexer->isDependencyDirectivesLexer()) {600 CurLexer->LexDependencyDirectiveTokenWhileSkipping(Tok);601 } else {602 SkippingRangeState.beginLexPass();603 while (true) {604 CurLexer->Lex(Tok);605 606 if (Tok.is(tok::code_completion)) {607 setCodeCompletionReached();608 if (CodeComplete)609 CodeComplete->CodeCompleteInConditionalExclusion();610 continue;611 }612 613 // If this is the end of the buffer, we have an error.614 if (Tok.is(tok::eof)) {615 // We don't emit errors for unterminated conditionals here,616 // Lexer::LexEndOfFile can do that properly.617 // Just return and let the caller lex after this #include.618 if (PreambleConditionalStack.isRecording())619 PreambleConditionalStack.SkipInfo.emplace(HashTokenLoc, IfTokenLoc,620 FoundNonSkipPortion,621 FoundElse, ElseLoc);622 break;623 }624 625 // If this token is not a preprocessor directive, just skip it.626 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())627 continue;628 629 break;630 }631 }632 if (Tok.is(tok::eof))633 break;634 635 // We just parsed a # character at the start of a line, so we're in636 // directive mode. Tell the lexer this so any newlines we see will be637 // converted into an EOD token (this terminates the macro).638 CurPPLexer->ParsingPreprocessorDirective = true;639 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);640 641 assert(Tok.is(tok::hash));642 const char *Hashptr = CurLexer->getBufferLocation() - Tok.getLength();643 assert(CurLexer->getSourceLocation(Hashptr) == Tok.getLocation());644 645 // Read the next token, the directive flavor.646 LexUnexpandedToken(Tok);647 648 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or649 // something bogus), skip it.650 if (Tok.isNot(tok::raw_identifier)) {651 CurPPLexer->ParsingPreprocessorDirective = false;652 // Restore comment saving mode.653 if (CurLexer) CurLexer->resetExtendedTokenMode();654 continue;655 }656 657 // If the first letter isn't i or e, it isn't intesting to us. We know that658 // this is safe in the face of spelling differences, because there is no way659 // to spell an i/e in a strange way that is another letter. Skipping this660 // allows us to avoid looking up the identifier info for #define/#undef and661 // other common directives.662 StringRef RI = Tok.getRawIdentifier();663 664 char FirstChar = RI[0];665 if (FirstChar >= 'a' && FirstChar <= 'z' &&666 FirstChar != 'i' && FirstChar != 'e') {667 CurPPLexer->ParsingPreprocessorDirective = false;668 // Restore comment saving mode.669 if (CurLexer) CurLexer->resetExtendedTokenMode();670 continue;671 }672 673 // Get the identifier name without trigraphs or embedded newlines. Note674 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled675 // when skipping.676 char DirectiveBuf[20];677 StringRef Directive;678 if (!Tok.needsCleaning() && RI.size() < 20) {679 Directive = RI;680 } else {681 std::string DirectiveStr = getSpelling(Tok);682 size_t IdLen = DirectiveStr.size();683 if (IdLen >= 20) {684 CurPPLexer->ParsingPreprocessorDirective = false;685 // Restore comment saving mode.686 if (CurLexer) CurLexer->resetExtendedTokenMode();687 continue;688 }689 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);690 Directive = StringRef(DirectiveBuf, IdLen);691 }692 693 if (Directive.starts_with("if")) {694 StringRef Sub = Directive.substr(2);695 if (Sub.empty() || // "if"696 Sub == "def" || // "ifdef"697 Sub == "ndef") { // "ifndef"698 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't699 // bother parsing the condition.700 DiscardUntilEndOfDirective();701 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,702 /*foundnonskip*/false,703 /*foundelse*/false);704 } else {705 SuggestTypoedDirective(Tok, Directive);706 }707 } else if (Directive[0] == 'e') {708 StringRef Sub = Directive.substr(1);709 if (Sub == "ndif") { // "endif"710 PPConditionalInfo CondInfo;711 CondInfo.WasSkipping = true; // Silence bogus warning.712 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);713 (void)InCond; // Silence warning in no-asserts mode.714 assert(!InCond && "Can't be skipping if not in a conditional!");715 716 // If we popped the outermost skipping block, we're done skipping!717 if (!CondInfo.WasSkipping) {718 SkippingRangeState.endLexPass(Hashptr);719 // Restore the value of LexingRawMode so that trailing comments720 // are handled correctly, if we've reached the outermost block.721 CurPPLexer->LexingRawMode = false;722 endLoc = CheckEndOfDirective("endif");723 CurPPLexer->LexingRawMode = true;724 if (Callbacks)725 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);726 break;727 } else {728 DiscardUntilEndOfDirective();729 }730 } else if (Sub == "lse") { // "else".731 // #else directive in a skipping conditional. If not in some other732 // skipping conditional, and if #else hasn't already been seen, enter it733 // as a non-skipping conditional.734 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();735 736 if (!CondInfo.WasSkipping)737 SkippingRangeState.endLexPass(Hashptr);738 739 // If this is a #else with a #else before it, report the error.740 if (CondInfo.FoundElse)741 Diag(Tok, diag::pp_err_else_after_else);742 743 // Note that we've seen a #else in this conditional.744 CondInfo.FoundElse = true;745 746 // If the conditional is at the top level, and the #if block wasn't747 // entered, enter the #else block now.748 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {749 CondInfo.FoundNonSkip = true;750 // Restore the value of LexingRawMode so that trailing comments751 // are handled correctly.752 CurPPLexer->LexingRawMode = false;753 endLoc = CheckEndOfDirective("else");754 CurPPLexer->LexingRawMode = true;755 if (Callbacks)756 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);757 break;758 } else {759 DiscardUntilEndOfDirective(); // C99 6.10p4.760 }761 } else if (Sub == "lif") { // "elif".762 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();763 764 if (!CondInfo.WasSkipping)765 SkippingRangeState.endLexPass(Hashptr);766 767 // If this is a #elif with a #else before it, report the error.768 if (CondInfo.FoundElse)769 Diag(Tok, diag::pp_err_elif_after_else) << PED_Elif;770 771 // If this is in a skipping block or if we're already handled this #if772 // block, don't bother parsing the condition.773 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {774 // FIXME: We should probably do at least some minimal parsing of the775 // condition to verify that it is well-formed. The current state776 // allows #elif* directives with completely malformed (or missing)777 // conditions.778 DiscardUntilEndOfDirective();779 } else {780 // Restore the value of LexingRawMode so that identifiers are781 // looked up, etc, inside the #elif expression.782 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");783 CurPPLexer->LexingRawMode = false;784 IdentifierInfo *IfNDefMacro = nullptr;785 DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);786 // Stop if Lexer became invalid after hitting code completion token.787 if (!CurPPLexer)788 return;789 const bool CondValue = DER.Conditional;790 CurPPLexer->LexingRawMode = true;791 if (Callbacks) {792 Callbacks->Elif(793 Tok.getLocation(), DER.ExprRange,794 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False),795 CondInfo.IfLoc);796 }797 // If this condition is true, enter it!798 if (CondValue) {799 CondInfo.FoundNonSkip = true;800 break;801 }802 }803 } else if (Sub == "lifdef" || // "elifdef"804 Sub == "lifndef") { // "elifndef"805 bool IsElifDef = Sub == "lifdef";806 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();807 Token DirectiveToken = Tok;808 809 if (!CondInfo.WasSkipping)810 SkippingRangeState.endLexPass(Hashptr);811 812 // Warn if using `#elifdef` & `#elifndef` in not C23 & C++23 mode even813 // if this branch is in a skipping block.814 unsigned DiagID;815 if (LangOpts.CPlusPlus)816 DiagID = LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_pp_directive817 : diag::ext_cxx23_pp_directive;818 else819 DiagID = LangOpts.C23 ? diag::warn_c23_compat_pp_directive820 : diag::ext_c23_pp_directive;821 Diag(Tok, DiagID) << (IsElifDef ? PED_Elifdef : PED_Elifndef);822 823 // If this is a #elif with a #else before it, report the error.824 if (CondInfo.FoundElse)825 Diag(Tok, diag::pp_err_elif_after_else)826 << (IsElifDef ? PED_Elifdef : PED_Elifndef);827 828 // If this is in a skipping block or if we're already handled this #if829 // block, don't bother parsing the condition.830 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {831 // FIXME: We should probably do at least some minimal parsing of the832 // condition to verify that it is well-formed. The current state833 // allows #elif* directives with completely malformed (or missing)834 // conditions.835 DiscardUntilEndOfDirective();836 } else {837 // Restore the value of LexingRawMode so that identifiers are838 // looked up, etc, inside the #elif[n]def expression.839 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");840 CurPPLexer->LexingRawMode = false;841 Token MacroNameTok;842 ReadMacroName(MacroNameTok);843 CurPPLexer->LexingRawMode = true;844 845 // If the macro name token is tok::eod, there was an error that was846 // already reported.847 if (MacroNameTok.is(tok::eod)) {848 // Skip code until we get to #endif. This helps with recovery by849 // not emitting an error when the #endif is reached.850 continue;851 }852 853 emitMacroExpansionWarnings(MacroNameTok);854 855 CheckEndOfDirective(IsElifDef ? "elifdef" : "elifndef");856 857 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();858 auto MD = getMacroDefinition(MII);859 MacroInfo *MI = MD.getMacroInfo();860 861 if (Callbacks) {862 if (IsElifDef) {863 Callbacks->Elifdef(DirectiveToken.getLocation(), MacroNameTok,864 MD);865 } else {866 Callbacks->Elifndef(DirectiveToken.getLocation(), MacroNameTok,867 MD);868 }869 }870 // If this condition is true, enter it!871 if (static_cast<bool>(MI) == IsElifDef) {872 CondInfo.FoundNonSkip = true;873 break;874 }875 }876 } else {877 SuggestTypoedDirective(Tok, Directive);878 }879 } else {880 SuggestTypoedDirective(Tok, Directive);881 }882 883 CurPPLexer->ParsingPreprocessorDirective = false;884 // Restore comment saving mode.885 if (CurLexer) CurLexer->resetExtendedTokenMode();886 }887 888 // Finally, if we are out of the conditional (saw an #endif or ran off the end889 // of the file, just stop skipping and return to lexing whatever came after890 // the #if block.891 CurPPLexer->LexingRawMode = false;892 893 // The last skipped range isn't actually skipped yet if it's truncated894 // by the end of the preamble; we'll resume parsing after the preamble.895 if (Callbacks && (Tok.isNot(tok::eof) || !isRecordingPreamble()))896 Callbacks->SourceRangeSkipped(897 SourceRange(HashTokenLoc, endLoc.isValid()898 ? endLoc899 : CurPPLexer->getSourceLocation()),900 Tok.getLocation());901}902 903Module *Preprocessor::getModuleForLocation(SourceLocation Loc,904 bool AllowTextual) {905 if (!SourceMgr.isInMainFile(Loc)) {906 // Try to determine the module of the include directive.907 // FIXME: Look into directly passing the FileEntry from LookupFile instead.908 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));909 if (auto EntryOfIncl = SourceMgr.getFileEntryRefForID(IDOfIncl)) {910 // The include comes from an included file.911 return HeaderInfo.getModuleMap()912 .findModuleForHeader(*EntryOfIncl, AllowTextual)913 .getModule();914 }915 }916 917 // This is either in the main file or not in a file at all. It belongs918 // to the current module, if there is one.919 return getLangOpts().CurrentModule.empty()920 ? nullptr921 : HeaderInfo.lookupModule(getLangOpts().CurrentModule, Loc);922}923 924OptionalFileEntryRef925Preprocessor::getHeaderToIncludeForDiagnostics(SourceLocation IncLoc,926 SourceLocation Loc) {927 Module *IncM = getModuleForLocation(928 IncLoc, LangOpts.ModulesValidateTextualHeaderIncludes);929 930 // Walk up through the include stack, looking through textual headers of M931 // until we hit a non-textual header that we can #include. (We assume textual932 // headers of a module with non-textual headers aren't meant to be used to933 // import entities from the module.)934 auto &SM = getSourceManager();935 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {936 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));937 auto FE = SM.getFileEntryRefForID(ID);938 if (!FE)939 break;940 941 // We want to find all possible modules that might contain this header, so942 // search all enclosing directories for module maps and load them.943 HeaderInfo.hasModuleMap(FE->getName(), /*Root*/ nullptr,944 SourceMgr.isInSystemHeader(Loc));945 946 bool InPrivateHeader = false;947 for (auto Header : HeaderInfo.findAllModulesForHeader(*FE)) {948 if (!Header.isAccessibleFrom(IncM)) {949 // It's in a private header; we can't #include it.950 // FIXME: If there's a public header in some module that re-exports it,951 // then we could suggest including that, but it's not clear that's the952 // expected way to make this entity visible.953 InPrivateHeader = true;954 continue;955 }956 957 // Don't suggest explicitly excluded headers.958 if (Header.getRole() == ModuleMap::ExcludedHeader)959 continue;960 961 // We'll suggest including textual headers below if they're962 // include-guarded.963 if (Header.getRole() & ModuleMap::TextualHeader)964 continue;965 966 // If we have a module import syntax, we shouldn't include a header to967 // make a particular module visible. Let the caller know they should968 // suggest an import instead.969 if (getLangOpts().ObjC || getLangOpts().CPlusPlusModules)970 return std::nullopt;971 972 // If this is an accessible, non-textual header of M's top-level module973 // that transitively includes the given location and makes the974 // corresponding module visible, this is the thing to #include.975 return *FE;976 }977 978 // FIXME: If we're bailing out due to a private header, we shouldn't suggest979 // an import either.980 if (InPrivateHeader)981 return std::nullopt;982 983 // If the header is includable and has an include guard, assume the984 // intended way to expose its contents is by #include, not by importing a985 // module that transitively includes it.986 if (getHeaderSearchInfo().isFileMultipleIncludeGuarded(*FE))987 return *FE;988 989 Loc = SM.getIncludeLoc(ID);990 }991 992 return std::nullopt;993}994 995OptionalFileEntryRef Preprocessor::LookupFile(996 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,997 ConstSearchDirIterator FromDir, const FileEntry *FromFile,998 ConstSearchDirIterator *CurDirArg, SmallVectorImpl<char> *SearchPath,999 SmallVectorImpl<char> *RelativePath,1000 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped,1001 bool *IsFrameworkFound, bool SkipCache, bool OpenFile, bool CacheFailures) {1002 ConstSearchDirIterator CurDirLocal = nullptr;1003 ConstSearchDirIterator &CurDir = CurDirArg ? *CurDirArg : CurDirLocal;1004 1005 Module *RequestingModule = getModuleForLocation(1006 FilenameLoc, LangOpts.ModulesValidateTextualHeaderIncludes);1007 1008 // If the header lookup mechanism may be relative to the current inclusion1009 // stack, record the parent #includes.1010 SmallVector<std::pair<OptionalFileEntryRef, DirectoryEntryRef>, 16> Includers;1011 bool BuildSystemModule = false;1012 if (!FromDir && !FromFile) {1013 FileID FID = getCurrentFileLexer()->getFileID();1014 OptionalFileEntryRef FileEnt = SourceMgr.getFileEntryRefForID(FID);1015 1016 // If there is no file entry associated with this file, it must be the1017 // predefines buffer or the module includes buffer. Any other file is not1018 // lexed with a normal lexer, so it won't be scanned for preprocessor1019 // directives.1020 //1021 // If we have the predefines buffer, resolve #include references (which come1022 // from the -include command line argument) from the current working1023 // directory instead of relative to the main file.1024 //1025 // If we have the module includes buffer, resolve #include references (which1026 // come from header declarations in the module map) relative to the module1027 // map file.1028 if (!FileEnt) {1029 if (FID == SourceMgr.getMainFileID() && MainFileDir) {1030 auto IncludeDir =1031 HeaderInfo.getModuleMap().shouldImportRelativeToBuiltinIncludeDir(1032 Filename, getCurrentModule())1033 ? HeaderInfo.getModuleMap().getBuiltinDir()1034 : MainFileDir;1035 Includers.push_back(std::make_pair(std::nullopt, *IncludeDir));1036 BuildSystemModule = getCurrentModule()->IsSystem;1037 } else if ((FileEnt = SourceMgr.getFileEntryRefForID(1038 SourceMgr.getMainFileID()))) {1039 auto CWD = FileMgr.getOptionalDirectoryRef(".");1040 Includers.push_back(std::make_pair(*FileEnt, *CWD));1041 }1042 } else {1043 Includers.push_back(std::make_pair(*FileEnt, FileEnt->getDir()));1044 }1045 1046 // MSVC searches the current include stack from top to bottom for1047 // headers included by quoted include directives.1048 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx1049 if (LangOpts.MSVCCompat && !isAngled) {1050 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {1051 if (IsFileLexer(ISEntry))1052 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))1053 Includers.push_back(std::make_pair(*FileEnt, FileEnt->getDir()));1054 }1055 }1056 }1057 1058 CurDir = CurDirLookup;1059 1060 if (FromFile) {1061 // We're supposed to start looking from after a particular file. Search1062 // the include path until we find that file or run out of files.1063 ConstSearchDirIterator TmpCurDir = CurDir;1064 ConstSearchDirIterator TmpFromDir = nullptr;1065 while (OptionalFileEntryRef FE = HeaderInfo.LookupFile(1066 Filename, FilenameLoc, isAngled, TmpFromDir, &TmpCurDir,1067 Includers, SearchPath, RelativePath, RequestingModule,1068 SuggestedModule, /*IsMapped=*/nullptr,1069 /*IsFrameworkFound=*/nullptr, SkipCache)) {1070 // Keep looking as if this file did a #include_next.1071 TmpFromDir = TmpCurDir;1072 ++TmpFromDir;1073 if (&FE->getFileEntry() == FromFile) {1074 // Found it.1075 FromDir = TmpFromDir;1076 CurDir = TmpCurDir;1077 break;1078 }1079 }1080 }1081 1082 // Do a standard file entry lookup.1083 OptionalFileEntryRef FE = HeaderInfo.LookupFile(1084 Filename, FilenameLoc, isAngled, FromDir, &CurDir, Includers, SearchPath,1085 RelativePath, RequestingModule, SuggestedModule, IsMapped,1086 IsFrameworkFound, SkipCache, BuildSystemModule, OpenFile, CacheFailures);1087 if (FE)1088 return FE;1089 1090 OptionalFileEntryRef CurFileEnt;1091 // Otherwise, see if this is a subframework header. If so, this is relative1092 // to one of the headers on the #include stack. Walk the list of the current1093 // headers on the #include stack and pass them to HeaderInfo.1094 if (IsFileLexer()) {1095 if ((CurFileEnt = CurPPLexer->getFileEntry())) {1096 if (OptionalFileEntryRef FE = HeaderInfo.LookupSubframeworkHeader(1097 Filename, *CurFileEnt, SearchPath, RelativePath, RequestingModule,1098 SuggestedModule)) {1099 return FE;1100 }1101 }1102 }1103 1104 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {1105 if (IsFileLexer(ISEntry)) {1106 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {1107 if (OptionalFileEntryRef FE = HeaderInfo.LookupSubframeworkHeader(1108 Filename, *CurFileEnt, SearchPath, RelativePath,1109 RequestingModule, SuggestedModule)) {1110 return FE;1111 }1112 }1113 }1114 }1115 1116 // Otherwise, we really couldn't find the file.1117 return std::nullopt;1118}1119 1120OptionalFileEntryRef1121Preprocessor::LookupEmbedFile(StringRef Filename, bool isAngled, bool OpenFile,1122 const FileEntry *LookupFromFile) {1123 FileManager &FM = this->getFileManager();1124 if (llvm::sys::path::is_absolute(Filename)) {1125 // lookup path or immediately fail1126 llvm::Expected<FileEntryRef> ShouldBeEntry = FM.getFileRef(1127 Filename, OpenFile, /*CacheFailure=*/true, /*IsText=*/false);1128 return llvm::expectedToOptional(std::move(ShouldBeEntry));1129 }1130 1131 auto SeparateComponents = [](SmallVectorImpl<char> &LookupPath,1132 StringRef StartingFrom, StringRef FileName,1133 bool RemoveInitialFileComponentFromLookupPath) {1134 llvm::sys::path::native(StartingFrom, LookupPath);1135 if (RemoveInitialFileComponentFromLookupPath)1136 llvm::sys::path::remove_filename(LookupPath);1137 if (!LookupPath.empty() &&1138 !llvm::sys::path::is_separator(LookupPath.back())) {1139 LookupPath.push_back(llvm::sys::path::get_separator().front());1140 }1141 LookupPath.append(FileName.begin(), FileName.end());1142 };1143 1144 // Otherwise, it's search time!1145 SmallString<512> LookupPath;1146 // Non-angled lookup1147 if (!isAngled) {1148 if (LookupFromFile) {1149 // Use file-based lookup.1150 StringRef FullFileDir = LookupFromFile->tryGetRealPathName();1151 if (!FullFileDir.empty()) {1152 SeparateComponents(LookupPath, FullFileDir, Filename, true);1153 llvm::Expected<FileEntryRef> ShouldBeEntry = FM.getFileRef(1154 LookupPath, OpenFile, /*CacheFailure=*/true, /*IsText=*/false);1155 if (ShouldBeEntry)1156 return llvm::expectedToOptional(std::move(ShouldBeEntry));1157 llvm::consumeError(ShouldBeEntry.takeError());1158 }1159 }1160 1161 // Otherwise, do working directory lookup.1162 LookupPath.clear();1163 auto MaybeWorkingDirEntry = FM.getDirectoryRef(".");1164 if (MaybeWorkingDirEntry) {1165 DirectoryEntryRef WorkingDirEntry = *MaybeWorkingDirEntry;1166 StringRef WorkingDir = WorkingDirEntry.getName();1167 if (!WorkingDir.empty()) {1168 SeparateComponents(LookupPath, WorkingDir, Filename, false);1169 llvm::Expected<FileEntryRef> ShouldBeEntry = FM.getFileRef(1170 LookupPath, OpenFile, /*CacheFailure=*/true, /*IsText=*/false);1171 if (ShouldBeEntry)1172 return llvm::expectedToOptional(std::move(ShouldBeEntry));1173 llvm::consumeError(ShouldBeEntry.takeError());1174 }1175 }1176 }1177 1178 for (const auto &Entry : PPOpts.EmbedEntries) {1179 LookupPath.clear();1180 SeparateComponents(LookupPath, Entry, Filename, false);1181 llvm::Expected<FileEntryRef> ShouldBeEntry = FM.getFileRef(1182 LookupPath, OpenFile, /*CacheFailure=*/true, /*IsText=*/false);1183 if (ShouldBeEntry)1184 return llvm::expectedToOptional(std::move(ShouldBeEntry));1185 llvm::consumeError(ShouldBeEntry.takeError());1186 }1187 return std::nullopt;1188}1189 1190//===----------------------------------------------------------------------===//1191// Preprocessor Directive Handling.1192//===----------------------------------------------------------------------===//1193 1194class Preprocessor::ResetMacroExpansionHelper {1195public:1196 ResetMacroExpansionHelper(Preprocessor *pp)1197 : PP(pp), save(pp->DisableMacroExpansion) {1198 if (pp->MacroExpansionInDirectivesOverride)1199 pp->DisableMacroExpansion = false;1200 }1201 1202 ~ResetMacroExpansionHelper() {1203 PP->DisableMacroExpansion = save;1204 }1205 1206private:1207 Preprocessor *PP;1208 bool save;1209};1210 1211/// Process a directive while looking for the through header or a #pragma1212/// hdrstop. The following directives are handled:1213/// #include (to check if it is the through header)1214/// #define (to warn about macros that don't match the PCH)1215/// #pragma (to check for pragma hdrstop).1216/// All other directives are completely discarded.1217void Preprocessor::HandleSkippedDirectiveWhileUsingPCH(Token &Result,1218 SourceLocation HashLoc) {1219 if (const IdentifierInfo *II = Result.getIdentifierInfo()) {1220 if (II->getPPKeywordID() == tok::pp_define) {1221 return HandleDefineDirective(Result,1222 /*ImmediatelyAfterHeaderGuard=*/false);1223 }1224 if (SkippingUntilPCHThroughHeader &&1225 II->getPPKeywordID() == tok::pp_include) {1226 return HandleIncludeDirective(HashLoc, Result);1227 }1228 if (SkippingUntilPragmaHdrStop && II->getPPKeywordID() == tok::pp_pragma) {1229 Lex(Result);1230 auto *II = Result.getIdentifierInfo();1231 if (II && II->getName() == "hdrstop")1232 return HandlePragmaHdrstop(Result);1233 }1234 }1235 DiscardUntilEndOfDirective();1236}1237 1238/// HandleDirective - This callback is invoked when the lexer sees a # token1239/// at the start of a line. This consumes the directive, modifies the1240/// lexer/preprocessor state, and advances the lexer(s) so that the next token1241/// read is the correct one.1242void Preprocessor::HandleDirective(Token &Result) {1243 // FIXME: Traditional: # with whitespace before it not recognized by K&R?1244 1245 // We just parsed a # character at the start of a line, so we're in directive1246 // mode. Tell the lexer this so any newlines we see will be converted into an1247 // EOD token (which terminates the directive).1248 CurPPLexer->ParsingPreprocessorDirective = true;1249 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);1250 1251 bool ImmediatelyAfterTopLevelIfndef =1252 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();1253 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();1254 1255 ++NumDirectives;1256 1257 // We are about to read a token. For the multiple-include optimization FA to1258 // work, we have to remember if we had read any tokens *before* this1259 // pp-directive.1260 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();1261 1262 // Save the '#' token in case we need to return it later.1263 Token SavedHash = Result;1264 1265 // Read the next token, the directive flavor. This isn't expanded due to1266 // C99 6.10.3p8.1267 LexUnexpandedToken(Result);1268 1269 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:1270 // #define A(x) #x1271 // A(abc1272 // #warning blah1273 // def)1274 // If so, the user is relying on undefined behavior, emit a diagnostic. Do1275 // not support this for #include-like directives, since that can result in1276 // terrible diagnostics, and does not work in GCC.1277 if (InMacroArgs) {1278 if (IdentifierInfo *II = Result.getIdentifierInfo()) {1279 switch (II->getPPKeywordID()) {1280 case tok::pp_include:1281 case tok::pp_import:1282 case tok::pp_include_next:1283 case tok::pp___include_macros:1284 case tok::pp_pragma:1285 case tok::pp_embed:1286 Diag(Result, diag::err_embedded_directive) << II->getName();1287 Diag(*ArgMacro, diag::note_macro_expansion_here)1288 << ArgMacro->getIdentifierInfo();1289 DiscardUntilEndOfDirective();1290 return;1291 default:1292 break;1293 }1294 }1295 Diag(Result, diag::ext_embedded_directive);1296 }1297 1298 // Temporarily enable macro expansion if set so1299 // and reset to previous state when returning from this function.1300 ResetMacroExpansionHelper helper(this);1301 1302 if (SkippingUntilPCHThroughHeader || SkippingUntilPragmaHdrStop)1303 return HandleSkippedDirectiveWhileUsingPCH(Result, SavedHash.getLocation());1304 1305 switch (Result.getKind()) {1306 case tok::eod:1307 // Ignore the null directive with regards to the multiple-include1308 // optimization, i.e. allow the null directive to appear outside of the1309 // include guard and still enable the multiple-include optimization.1310 CurPPLexer->MIOpt.SetReadToken(ReadAnyTokensBeforeDirective);1311 return; // null directive.1312 case tok::code_completion:1313 setCodeCompletionReached();1314 if (CodeComplete)1315 CodeComplete->CodeCompleteDirective(1316 CurPPLexer->getConditionalStackDepth() > 0);1317 return;1318 case tok::numeric_constant: // # 7 GNU line marker directive.1319 // In a .S file "# 4" may be a comment so don't treat it as a preprocessor1320 // directive. However do permit it in the predefines file, as we use line1321 // markers to mark the builtin macros as being in a system header.1322 if (getLangOpts().AsmPreprocessor &&1323 SourceMgr.getFileID(SavedHash.getLocation()) != getPredefinesFileID())1324 break;1325 return HandleDigitDirective(Result);1326 default:1327 IdentifierInfo *II = Result.getIdentifierInfo();1328 if (!II) break; // Not an identifier.1329 1330 // Ask what the preprocessor keyword ID is.1331 switch (II->getPPKeywordID()) {1332 default: break;1333 // C99 6.10.1 - Conditional Inclusion.1334 case tok::pp_if:1335 return HandleIfDirective(Result, SavedHash, ReadAnyTokensBeforeDirective);1336 case tok::pp_ifdef:1337 return HandleIfdefDirective(Result, SavedHash, false,1338 true /*not valid for miopt*/);1339 case tok::pp_ifndef:1340 return HandleIfdefDirective(Result, SavedHash, true,1341 ReadAnyTokensBeforeDirective);1342 case tok::pp_elif:1343 case tok::pp_elifdef:1344 case tok::pp_elifndef:1345 return HandleElifFamilyDirective(Result, SavedHash, II->getPPKeywordID());1346 1347 case tok::pp_else:1348 return HandleElseDirective(Result, SavedHash);1349 case tok::pp_endif:1350 return HandleEndifDirective(Result);1351 1352 // C99 6.10.2 - Source File Inclusion.1353 case tok::pp_include:1354 // Handle #include.1355 return HandleIncludeDirective(SavedHash.getLocation(), Result);1356 case tok::pp___include_macros:1357 // Handle -imacros.1358 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);1359 1360 // C99 6.10.3 - Macro Replacement.1361 case tok::pp_define:1362 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);1363 case tok::pp_undef:1364 return HandleUndefDirective();1365 1366 // C99 6.10.4 - Line Control.1367 case tok::pp_line:1368 return HandleLineDirective();1369 1370 // C99 6.10.5 - Error Directive.1371 case tok::pp_error:1372 return HandleUserDiagnosticDirective(Result, false);1373 1374 // C99 6.10.6 - Pragma Directive.1375 case tok::pp_pragma:1376 return HandlePragmaDirective({PIK_HashPragma, SavedHash.getLocation()});1377 1378 // GNU Extensions.1379 case tok::pp_import:1380 return HandleImportDirective(SavedHash.getLocation(), Result);1381 case tok::pp_include_next:1382 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);1383 1384 case tok::pp_warning:1385 if (LangOpts.CPlusPlus)1386 Diag(Result, LangOpts.CPlusPlus231387 ? diag::warn_cxx23_compat_warning_directive1388 : diag::ext_pp_warning_directive)1389 << /*C++23*/ 1;1390 else1391 Diag(Result, LangOpts.C23 ? diag::warn_c23_compat_warning_directive1392 : diag::ext_pp_warning_directive)1393 << /*C23*/ 0;1394 1395 return HandleUserDiagnosticDirective(Result, true);1396 case tok::pp_ident:1397 return HandleIdentSCCSDirective(Result);1398 case tok::pp_sccs:1399 return HandleIdentSCCSDirective(Result);1400 case tok::pp_embed:1401 return HandleEmbedDirective(SavedHash.getLocation(), Result,1402 getCurrentFileLexer()1403 ? *getCurrentFileLexer()->getFileEntry()1404 : static_cast<FileEntry *>(nullptr));1405 case tok::pp_assert:1406 //isExtension = true; // FIXME: implement #assert1407 break;1408 case tok::pp_unassert:1409 //isExtension = true; // FIXME: implement #unassert1410 break;1411 1412 case tok::pp___public_macro:1413 if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)1414 return HandleMacroPublicDirective(Result);1415 break;1416 1417 case tok::pp___private_macro:1418 if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)1419 return HandleMacroPrivateDirective();1420 break;1421 }1422 break;1423 }1424 1425 // If this is a .S file, treat unknown # directives as non-preprocessor1426 // directives. This is important because # may be a comment or introduce1427 // various pseudo-ops. Just return the # token and push back the following1428 // token to be lexed next time.1429 if (getLangOpts().AsmPreprocessor) {1430 auto Toks = std::make_unique<Token[]>(2);1431 // Return the # and the token after it.1432 Toks[0] = SavedHash;1433 Toks[1] = Result;1434 1435 // If the second token is a hashhash token, then we need to translate it to1436 // unknown so the token lexer doesn't try to perform token pasting.1437 if (Result.is(tok::hashhash))1438 Toks[1].setKind(tok::unknown);1439 1440 // Enter this token stream so that we re-lex the tokens. Make sure to1441 // enable macro expansion, in case the token after the # is an identifier1442 // that is expanded.1443 EnterTokenStream(std::move(Toks), 2, false, /*IsReinject*/false);1444 return;1445 }1446 1447 // If we reached here, the preprocessing token is not valid!1448 // Start suggesting if a similar directive found.1449 Diag(Result, diag::err_pp_invalid_directive) << 0;1450 1451 // Read the rest of the PP line.1452 DiscardUntilEndOfDirective();1453 1454 // Okay, we're done parsing the directive.1455}1456 1457/// GetLineValue - Convert a numeric token into an unsigned value, emitting1458/// Diagnostic DiagID if it is invalid, and returning the value in Val.1459static bool GetLineValue(Token &DigitTok, unsigned &Val,1460 unsigned DiagID, Preprocessor &PP,1461 bool IsGNULineDirective=false) {1462 if (DigitTok.isNot(tok::numeric_constant)) {1463 PP.Diag(DigitTok, DiagID);1464 1465 if (DigitTok.isNot(tok::eod))1466 PP.DiscardUntilEndOfDirective();1467 return true;1468 }1469 1470 SmallString<64> IntegerBuffer;1471 IntegerBuffer.resize(DigitTok.getLength());1472 const char *DigitTokBegin = &IntegerBuffer[0];1473 bool Invalid = false;1474 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);1475 if (Invalid)1476 return true;1477 1478 // Verify that we have a simple digit-sequence, and compute the value. This1479 // is always a simple digit string computed in decimal, so we do this manually1480 // here.1481 Val = 0;1482 for (unsigned i = 0; i != ActualLength; ++i) {1483 // C++1y [lex.fcon]p1:1484 // Optional separating single quotes in a digit-sequence are ignored1485 if (DigitTokBegin[i] == '\'')1486 continue;1487 1488 if (!isDigit(DigitTokBegin[i])) {1489 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),1490 diag::err_pp_line_digit_sequence) << IsGNULineDirective;1491 PP.DiscardUntilEndOfDirective();1492 return true;1493 }1494 1495 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');1496 if (NextVal < Val) { // overflow.1497 PP.Diag(DigitTok, DiagID);1498 PP.DiscardUntilEndOfDirective();1499 return true;1500 }1501 Val = NextVal;1502 }1503 1504 if (DigitTokBegin[0] == '0' && Val)1505 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)1506 << IsGNULineDirective;1507 1508 return false;1509}1510 1511/// Handle a \#line directive: C99 6.10.4.1512///1513/// The two acceptable forms are:1514/// \verbatim1515/// # line digit-sequence1516/// # line digit-sequence "s-char-sequence"1517/// \endverbatim1518void Preprocessor::HandleLineDirective() {1519 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are1520 // expanded.1521 Token DigitTok;1522 Lex(DigitTok);1523 1524 // Validate the number and convert it to an unsigned.1525 unsigned LineNo;1526 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))1527 return;1528 1529 if (LineNo == 0)1530 Diag(DigitTok, diag::ext_pp_line_zero);1531 1532 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a1533 // number greater than 2147483647". C90 requires that the line # be <= 32767.1534 unsigned LineLimit = 32768U;1535 if (LangOpts.C99 || LangOpts.CPlusPlus11)1536 LineLimit = 2147483648U;1537 if (LineNo >= LineLimit)1538 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;1539 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)1540 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);1541 1542 int FilenameID = -1;1543 Token StrTok;1544 Lex(StrTok);1545 1546 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a1547 // string followed by eod.1548 if (StrTok.is(tok::eod))1549 ; // ok1550 else if (StrTok.isNot(tok::string_literal)) {1551 Diag(StrTok, diag::err_pp_line_invalid_filename);1552 DiscardUntilEndOfDirective();1553 return;1554 } else if (StrTok.hasUDSuffix()) {1555 Diag(StrTok, diag::err_invalid_string_udl);1556 DiscardUntilEndOfDirective();1557 return;1558 } else {1559 // Parse and validate the string, converting it into a unique ID.1560 StringLiteralParser Literal(StrTok, *this);1561 assert(Literal.isOrdinary() && "Didn't allow wide strings in");1562 if (Literal.hadError) {1563 DiscardUntilEndOfDirective();1564 return;1565 }1566 if (Literal.Pascal) {1567 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);1568 DiscardUntilEndOfDirective();1569 return;1570 }1571 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());1572 1573 // Verify that there is nothing after the string, other than EOD. Because1574 // of C99 6.10.4p5, macros that expand to empty tokens are ok.1575 CheckEndOfDirective("line", true);1576 }1577 1578 // Take the file kind of the file containing the #line directive. #line1579 // directives are often used for generated sources from the same codebase, so1580 // the new file should generally be classified the same way as the current1581 // file. This is visible in GCC's pre-processed output, which rewrites #line1582 // to GNU line markers.1583 SrcMgr::CharacteristicKind FileKind =1584 SourceMgr.getFileCharacteristic(DigitTok.getLocation());1585 1586 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,1587 false, FileKind);1588 1589 if (Callbacks)1590 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),1591 PPCallbacks::RenameFile, FileKind);1592}1593 1594/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line1595/// marker directive.1596static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,1597 SrcMgr::CharacteristicKind &FileKind,1598 Preprocessor &PP) {1599 unsigned FlagVal;1600 Token FlagTok;1601 PP.Lex(FlagTok);1602 if (FlagTok.is(tok::eod)) return false;1603 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))1604 return true;1605 1606 if (FlagVal == 1) {1607 IsFileEntry = true;1608 1609 PP.Lex(FlagTok);1610 if (FlagTok.is(tok::eod)) return false;1611 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))1612 return true;1613 } else if (FlagVal == 2) {1614 IsFileExit = true;1615 1616 SourceManager &SM = PP.getSourceManager();1617 // If we are leaving the current presumed file, check to make sure the1618 // presumed include stack isn't empty!1619 FileID CurFileID =1620 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;1621 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());1622 if (PLoc.isInvalid())1623 return true;1624 1625 // If there is no include loc (main file) or if the include loc is in a1626 // different physical file, then we aren't in a "1" line marker flag region.1627 SourceLocation IncLoc = PLoc.getIncludeLoc();1628 if (IncLoc.isInvalid() ||1629 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {1630 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);1631 PP.DiscardUntilEndOfDirective();1632 return true;1633 }1634 1635 PP.Lex(FlagTok);1636 if (FlagTok.is(tok::eod)) return false;1637 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))1638 return true;1639 }1640 1641 // We must have 3 if there are still flags.1642 if (FlagVal != 3) {1643 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);1644 PP.DiscardUntilEndOfDirective();1645 return true;1646 }1647 1648 FileKind = SrcMgr::C_System;1649 1650 PP.Lex(FlagTok);1651 if (FlagTok.is(tok::eod)) return false;1652 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))1653 return true;1654 1655 // We must have 4 if there is yet another flag.1656 if (FlagVal != 4) {1657 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);1658 PP.DiscardUntilEndOfDirective();1659 return true;1660 }1661 1662 FileKind = SrcMgr::C_ExternCSystem;1663 1664 PP.Lex(FlagTok);1665 if (FlagTok.is(tok::eod)) return false;1666 1667 // There are no more valid flags here.1668 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);1669 PP.DiscardUntilEndOfDirective();1670 return true;1671}1672 1673/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is1674/// one of the following forms:1675///1676/// # 421677/// # 42 "file" ('1' | '2')?1678/// # 42 "file" ('1' | '2')? '3' '4'?1679///1680void Preprocessor::HandleDigitDirective(Token &DigitTok) {1681 // Validate the number and convert it to an unsigned. GNU does not have a1682 // line # limit other than it fit in 32-bits.1683 unsigned LineNo;1684 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,1685 *this, true))1686 return;1687 1688 Token StrTok;1689 Lex(StrTok);1690 1691 bool IsFileEntry = false, IsFileExit = false;1692 int FilenameID = -1;1693 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;1694 1695 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a1696 // string followed by eod.1697 if (StrTok.is(tok::eod)) {1698 Diag(StrTok, diag::ext_pp_gnu_line_directive);1699 // Treat this like "#line NN", which doesn't change file characteristics.1700 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());1701 } else if (StrTok.isNot(tok::string_literal)) {1702 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);1703 DiscardUntilEndOfDirective();1704 return;1705 } else if (StrTok.hasUDSuffix()) {1706 Diag(StrTok, diag::err_invalid_string_udl);1707 DiscardUntilEndOfDirective();1708 return;1709 } else {1710 // Parse and validate the string, converting it into a unique ID.1711 StringLiteralParser Literal(StrTok, *this);1712 assert(Literal.isOrdinary() && "Didn't allow wide strings in");1713 if (Literal.hadError) {1714 DiscardUntilEndOfDirective();1715 return;1716 }1717 if (Literal.Pascal) {1718 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);1719 DiscardUntilEndOfDirective();1720 return;1721 }1722 1723 // If a filename was present, read any flags that are present.1724 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))1725 return;1726 if (!SourceMgr.isInPredefinedFile(DigitTok.getLocation()))1727 Diag(StrTok, diag::ext_pp_gnu_line_directive);1728 1729 // Exiting to an empty string means pop to the including file, so leave1730 // FilenameID as -1 in that case.1731 if (!(IsFileExit && Literal.GetString().empty()))1732 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());1733 }1734 1735 // Create a line note with this information.1736 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,1737 IsFileExit, FileKind);1738 1739 // If the preprocessor has callbacks installed, notify them of the #line1740 // change. This is used so that the line marker comes out in -E mode for1741 // example.1742 if (Callbacks) {1743 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;1744 if (IsFileEntry)1745 Reason = PPCallbacks::EnterFile;1746 else if (IsFileExit)1747 Reason = PPCallbacks::ExitFile;1748 1749 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);1750 }1751}1752 1753/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.1754///1755void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,1756 bool isWarning) {1757 // Read the rest of the line raw. We do this because we don't want macros1758 // to be expanded and we don't require that the tokens be valid preprocessing1759 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does1760 // collapse multiple consecutive white space between tokens, but this isn't1761 // specified by the standard.1762 SmallString<128> Message;1763 CurLexer->ReadToEndOfLine(&Message);1764 1765 // Find the first non-whitespace character, so that we can make the1766 // diagnostic more succinct.1767 StringRef Msg = Message.str().ltrim(' ');1768 1769 if (isWarning)1770 Diag(Tok, diag::pp_hash_warning) << Msg;1771 else1772 Diag(Tok, diag::err_pp_hash_error) << Msg;1773}1774 1775/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.1776///1777void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {1778 // Yes, this directive is an extension.1779 Diag(Tok, diag::ext_pp_ident_directive);1780 1781 // Read the string argument.1782 Token StrTok;1783 Lex(StrTok);1784 1785 // If the token kind isn't a string, it's a malformed directive.1786 if (StrTok.isNot(tok::string_literal) &&1787 StrTok.isNot(tok::wide_string_literal)) {1788 Diag(StrTok, diag::err_pp_malformed_ident);1789 if (StrTok.isNot(tok::eod))1790 DiscardUntilEndOfDirective();1791 return;1792 }1793 1794 if (StrTok.hasUDSuffix()) {1795 Diag(StrTok, diag::err_invalid_string_udl);1796 DiscardUntilEndOfDirective();1797 return;1798 }1799 1800 // Verify that there is nothing after the string, other than EOD.1801 CheckEndOfDirective("ident");1802 1803 if (Callbacks) {1804 bool Invalid = false;1805 std::string Str = getSpelling(StrTok, &Invalid);1806 if (!Invalid)1807 Callbacks->Ident(Tok.getLocation(), Str);1808 }1809}1810 1811/// Handle a #public directive.1812void Preprocessor::HandleMacroPublicDirective(Token &Tok) {1813 Token MacroNameTok;1814 ReadMacroName(MacroNameTok, MU_Undef);1815 1816 // Error reading macro name? If so, diagnostic already issued.1817 if (MacroNameTok.is(tok::eod))1818 return;1819 1820 // Check to see if this is the last token on the #__public_macro line.1821 CheckEndOfDirective("__public_macro");1822 1823 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();1824 // Okay, we finally have a valid identifier to undef.1825 MacroDirective *MD = getLocalMacroDirective(II);1826 1827 // If the macro is not defined, this is an error.1828 if (!MD) {1829 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;1830 return;1831 }1832 1833 // Note that this macro has now been exported.1834 appendMacroDirective(II, AllocateVisibilityMacroDirective(1835 MacroNameTok.getLocation(), /*isPublic=*/true));1836}1837 1838/// Handle a #private directive.1839void Preprocessor::HandleMacroPrivateDirective() {1840 Token MacroNameTok;1841 ReadMacroName(MacroNameTok, MU_Undef);1842 1843 // Error reading macro name? If so, diagnostic already issued.1844 if (MacroNameTok.is(tok::eod))1845 return;1846 1847 // Check to see if this is the last token on the #__private_macro line.1848 CheckEndOfDirective("__private_macro");1849 1850 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();1851 // Okay, we finally have a valid identifier to undef.1852 MacroDirective *MD = getLocalMacroDirective(II);1853 1854 // If the macro is not defined, this is an error.1855 if (!MD) {1856 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;1857 return;1858 }1859 1860 // Note that this macro has now been marked private.1861 appendMacroDirective(II, AllocateVisibilityMacroDirective(1862 MacroNameTok.getLocation(), /*isPublic=*/false));1863}1864 1865//===----------------------------------------------------------------------===//1866// Preprocessor Include Directive Handling.1867//===----------------------------------------------------------------------===//1868 1869/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully1870/// checked and spelled filename, e.g. as an operand of \#include. This returns1871/// true if the input filename was in <>'s or false if it were in ""'s. The1872/// caller is expected to provide a buffer that is large enough to hold the1873/// spelling of the filename, but is also expected to handle the case when1874/// this method decides to use a different buffer.1875bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,1876 StringRef &Buffer) {1877 // Get the text form of the filename.1878 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");1879 1880 // FIXME: Consider warning on some of the cases described in C11 6.4.7/3 and1881 // C++20 [lex.header]/2:1882 //1883 // If `"`, `'`, `\`, `/*`, or `//` appears in a header-name, then1884 // in C: behavior is undefined1885 // in C++: program is conditionally-supported with implementation-defined1886 // semantics1887 1888 // Make sure the filename is <x> or "x".1889 bool isAngled;1890 if (Buffer[0] == '<') {1891 if (Buffer.back() != '>') {1892 Diag(Loc, diag::err_pp_expects_filename);1893 Buffer = StringRef();1894 return true;1895 }1896 isAngled = true;1897 } else if (Buffer[0] == '"') {1898 if (Buffer.back() != '"') {1899 Diag(Loc, diag::err_pp_expects_filename);1900 Buffer = StringRef();1901 return true;1902 }1903 isAngled = false;1904 } else {1905 Diag(Loc, diag::err_pp_expects_filename);1906 Buffer = StringRef();1907 return true;1908 }1909 1910 // Diagnose #include "" as invalid.1911 if (Buffer.size() <= 2) {1912 Diag(Loc, diag::err_pp_empty_filename);1913 Buffer = StringRef();1914 return true;1915 }1916 1917 // Skip the brackets.1918 Buffer = Buffer.substr(1, Buffer.size()-2);1919 return isAngled;1920}1921 1922/// Push a token onto the token stream containing an annotation.1923void Preprocessor::EnterAnnotationToken(SourceRange Range,1924 tok::TokenKind Kind,1925 void *AnnotationVal) {1926 // FIXME: Produce this as the current token directly, rather than1927 // allocating a new token for it.1928 auto Tok = std::make_unique<Token[]>(1);1929 Tok[0].startToken();1930 Tok[0].setKind(Kind);1931 Tok[0].setLocation(Range.getBegin());1932 Tok[0].setAnnotationEndLoc(Range.getEnd());1933 Tok[0].setAnnotationValue(AnnotationVal);1934 EnterTokenStream(std::move(Tok), 1, true, /*IsReinject*/ false);1935}1936 1937/// Produce a diagnostic informing the user that a #include or similar1938/// was implicitly treated as a module import.1939static void diagnoseAutoModuleImport(Preprocessor &PP, SourceLocation HashLoc,1940 Token &IncludeTok,1941 ArrayRef<IdentifierLoc> Path,1942 SourceLocation PathEnd) {1943 SmallString<128> PathString;1944 for (size_t I = 0, N = Path.size(); I != N; ++I) {1945 if (I)1946 PathString += '.';1947 PathString += Path[I].getIdentifierInfo()->getName();1948 }1949 1950 int IncludeKind = 0;1951 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {1952 case tok::pp_include:1953 IncludeKind = 0;1954 break;1955 1956 case tok::pp_import:1957 IncludeKind = 1;1958 break;1959 1960 case tok::pp_include_next:1961 IncludeKind = 2;1962 break;1963 1964 case tok::pp___include_macros:1965 IncludeKind = 3;1966 break;1967 1968 default:1969 llvm_unreachable("unknown include directive kind");1970 }1971 1972 PP.Diag(HashLoc, diag::remark_pp_include_directive_modular_translation)1973 << IncludeKind << PathString;1974}1975 1976// Given a vector of path components and a string containing the real1977// path to the file, build a properly-cased replacement in the vector,1978// and return true if the replacement should be suggested.1979static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,1980 StringRef RealPathName,1981 llvm::sys::path::Style Separator) {1982 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);1983 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);1984 int Cnt = 0;1985 bool SuggestReplacement = false;1986 1987 auto IsSep = [Separator](StringRef Component) {1988 return Component.size() == 1 &&1989 llvm::sys::path::is_separator(Component[0], Separator);1990 };1991 1992 // Below is a best-effort to handle ".." in paths. It is admittedly1993 // not 100% correct in the presence of symlinks.1994 for (auto &Component : llvm::reverse(Components)) {1995 if ("." == Component) {1996 } else if (".." == Component) {1997 ++Cnt;1998 } else if (Cnt) {1999 --Cnt;2000 } else if (RealPathComponentIter != RealPathComponentEnd) {2001 if (!IsSep(Component) && !IsSep(*RealPathComponentIter) &&2002 Component != *RealPathComponentIter) {2003 // If these non-separator path components differ by more than just case,2004 // then we may be looking at symlinked paths. Bail on this diagnostic to2005 // avoid noisy false positives.2006 SuggestReplacement =2007 RealPathComponentIter->equals_insensitive(Component);2008 if (!SuggestReplacement)2009 break;2010 Component = *RealPathComponentIter;2011 }2012 ++RealPathComponentIter;2013 }2014 }2015 return SuggestReplacement;2016}2017 2018bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,2019 const TargetInfo &TargetInfo,2020 const Module &M,2021 DiagnosticsEngine &Diags) {2022 Module::Requirement Requirement;2023 Module::UnresolvedHeaderDirective MissingHeader;2024 Module *ShadowingModule = nullptr;2025 if (M.isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,2026 ShadowingModule))2027 return false;2028 2029 if (MissingHeader.FileNameLoc.isValid()) {2030 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)2031 << MissingHeader.IsUmbrella << MissingHeader.FileName;2032 } else if (ShadowingModule) {2033 Diags.Report(M.DefinitionLoc, diag::err_module_shadowed) << M.Name;2034 Diags.Report(ShadowingModule->DefinitionLoc,2035 diag::note_previous_definition);2036 } else {2037 // FIXME: Track the location at which the requirement was specified, and2038 // use it here.2039 Diags.Report(M.DefinitionLoc, diag::err_module_unavailable)2040 << M.getFullModuleName() << Requirement.RequiredState2041 << Requirement.FeatureName;2042 }2043 return true;2044}2045 2046std::pair<ConstSearchDirIterator, const FileEntry *>2047Preprocessor::getIncludeNextStart(const Token &IncludeNextTok) const {2048 // #include_next is like #include, except that we start searching after2049 // the current found directory. If we can't do this, issue a2050 // diagnostic.2051 ConstSearchDirIterator Lookup = CurDirLookup;2052 const FileEntry *LookupFromFile = nullptr;2053 2054 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {2055 // If the main file is a header, then it's either for PCH/AST generation,2056 // or libclang opened it. Either way, handle it as a normal include below2057 // and do not complain about include_next.2058 } else if (isInPrimaryFile()) {2059 Lookup = nullptr;2060 Diag(IncludeNextTok, diag::pp_include_next_in_primary);2061 } else if (CurLexerSubmodule) {2062 // Start looking up in the directory *after* the one in which the current2063 // file would be found, if any.2064 assert(CurPPLexer && "#include_next directive in macro?");2065 if (auto FE = CurPPLexer->getFileEntry())2066 LookupFromFile = *FE;2067 Lookup = nullptr;2068 } else if (!Lookup) {2069 // The current file was not found by walking the include path. Either it2070 // is the primary file (handled above), or it was found by absolute path,2071 // or it was found relative to such a file.2072 // FIXME: Track enough information so we know which case we're in.2073 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);2074 } else {2075 // Start looking up in the next directory.2076 ++Lookup;2077 }2078 2079 return {Lookup, LookupFromFile};2080}2081 2082/// HandleIncludeDirective - The "\#include" tokens have just been read, read2083/// the file to be included from the lexer, then include it! This is a common2084/// routine with functionality shared between \#include, \#include_next and2085/// \#import. LookupFrom is set when this is a \#include_next directive, it2086/// specifies the file to start searching from.2087void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,2088 Token &IncludeTok,2089 ConstSearchDirIterator LookupFrom,2090 const FileEntry *LookupFromFile) {2091 Token FilenameTok;2092 if (LexHeaderName(FilenameTok))2093 return;2094 2095 if (FilenameTok.isNot(tok::header_name)) {2096 if (FilenameTok.is(tok::identifier) && PPOpts.SingleFileParseMode) {2097 // If we saw #include IDENTIFIER and lexing didn't turn in into a header2098 // name, it was undefined. In 'single-file-parse' mode, just skip the2099 // directive without emitting diagnostics - the identifier might be2100 // normally defined in previously-skipped include directive.2101 DiscardUntilEndOfDirective();2102 return;2103 }2104 2105 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);2106 if (FilenameTok.isNot(tok::eod))2107 DiscardUntilEndOfDirective();2108 return;2109 }2110 2111 // Verify that there is nothing after the filename, other than EOD. Note2112 // that we allow macros that expand to nothing after the filename, because2113 // this falls into the category of "#include pp-tokens new-line" specified2114 // in C99 6.10.2p4.2115 SourceLocation EndLoc =2116 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);2117 2118 auto Action = HandleHeaderIncludeOrImport(HashLoc, IncludeTok, FilenameTok,2119 EndLoc, LookupFrom, LookupFromFile);2120 switch (Action.Kind) {2121 case ImportAction::None:2122 case ImportAction::SkippedModuleImport:2123 break;2124 case ImportAction::ModuleBegin:2125 EnterAnnotationToken(SourceRange(HashLoc, EndLoc),2126 tok::annot_module_begin, Action.ModuleForHeader);2127 break;2128 case ImportAction::HeaderUnitImport:2129 EnterAnnotationToken(SourceRange(HashLoc, EndLoc), tok::annot_header_unit,2130 Action.ModuleForHeader);2131 break;2132 case ImportAction::ModuleImport:2133 EnterAnnotationToken(SourceRange(HashLoc, EndLoc),2134 tok::annot_module_include, Action.ModuleForHeader);2135 break;2136 case ImportAction::Failure:2137 assert(TheModuleLoader.HadFatalFailure &&2138 "This should be an early exit only to a fatal error");2139 TheModuleLoader.HadFatalFailure = true;2140 IncludeTok.setKind(tok::eof);2141 CurLexer->cutOffLexing();2142 return;2143 }2144}2145 2146OptionalFileEntryRef Preprocessor::LookupHeaderIncludeOrImport(2147 ConstSearchDirIterator *CurDir, StringRef &Filename,2148 SourceLocation FilenameLoc, CharSourceRange FilenameRange,2149 const Token &FilenameTok, bool &IsFrameworkFound, bool IsImportDecl,2150 bool &IsMapped, ConstSearchDirIterator LookupFrom,2151 const FileEntry *LookupFromFile, StringRef &LookupFilename,2152 SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath,2153 ModuleMap::KnownHeader &SuggestedModule, bool isAngled) {2154 auto DiagnoseHeaderInclusion = [&](FileEntryRef FE) {2155 if (LangOpts.AsmPreprocessor)2156 return;2157 2158 Module *RequestingModule = getModuleForLocation(2159 FilenameLoc, LangOpts.ModulesValidateTextualHeaderIncludes);2160 bool RequestingModuleIsModuleInterface =2161 !SourceMgr.isInMainFile(FilenameLoc);2162 2163 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(2164 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,2165 Filename, FE);2166 };2167 2168 OptionalFileEntryRef File = LookupFile(2169 FilenameLoc, LookupFilename, isAngled, LookupFrom, LookupFromFile, CurDir,2170 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,2171 &SuggestedModule, &IsMapped, &IsFrameworkFound);2172 if (File) {2173 DiagnoseHeaderInclusion(*File);2174 return File;2175 }2176 2177 // Give the clients a chance to silently skip this include.2178 if (Callbacks && Callbacks->FileNotFound(Filename))2179 return std::nullopt;2180 2181 if (SuppressIncludeNotFoundError)2182 return std::nullopt;2183 2184 // If the file could not be located and it was included via angle2185 // brackets, we can attempt a lookup as though it were a quoted path to2186 // provide the user with a possible fixit.2187 if (isAngled) {2188 OptionalFileEntryRef File = LookupFile(2189 FilenameLoc, LookupFilename, false, LookupFrom, LookupFromFile, CurDir,2190 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,2191 &SuggestedModule, &IsMapped,2192 /*IsFrameworkFound=*/nullptr);2193 if (File) {2194 DiagnoseHeaderInclusion(*File);2195 Diag(FilenameTok, diag::err_pp_file_not_found_angled_include_not_fatal)2196 << Filename << IsImportDecl2197 << FixItHint::CreateReplacement(FilenameRange,2198 "\"" + Filename.str() + "\"");2199 return File;2200 }2201 }2202 2203 // Check for likely typos due to leading or trailing non-isAlphanumeric2204 // characters2205 StringRef OriginalFilename = Filename;2206 if (LangOpts.SpellChecking) {2207 // A heuristic to correct a typo file name by removing leading and2208 // trailing non-isAlphanumeric characters.2209 auto CorrectTypoFilename = [](llvm::StringRef Filename) {2210 Filename = Filename.drop_until(isAlphanumeric);2211 while (!Filename.empty() && !isAlphanumeric(Filename.back())) {2212 Filename = Filename.drop_back();2213 }2214 return Filename;2215 };2216 StringRef TypoCorrectionName = CorrectTypoFilename(Filename);2217 StringRef TypoCorrectionLookupName = CorrectTypoFilename(LookupFilename);2218 2219 OptionalFileEntryRef File = LookupFile(2220 FilenameLoc, TypoCorrectionLookupName, isAngled, LookupFrom,2221 LookupFromFile, CurDir, Callbacks ? &SearchPath : nullptr,2222 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped,2223 /*IsFrameworkFound=*/nullptr);2224 if (File) {2225 DiagnoseHeaderInclusion(*File);2226 auto Hint =2227 isAngled ? FixItHint::CreateReplacement(2228 FilenameRange, "<" + TypoCorrectionName.str() + ">")2229 : FixItHint::CreateReplacement(2230 FilenameRange, "\"" + TypoCorrectionName.str() + "\"");2231 Diag(FilenameTok, diag::err_pp_file_not_found_typo_not_fatal)2232 << OriginalFilename << TypoCorrectionName << Hint;2233 // We found the file, so set the Filename to the name after typo2234 // correction.2235 Filename = TypoCorrectionName;2236 LookupFilename = TypoCorrectionLookupName;2237 return File;2238 }2239 }2240 2241 // If the file is still not found, just go with the vanilla diagnostic2242 assert(!File && "expected missing file");2243 Diag(FilenameTok, diag::err_pp_file_not_found)2244 << OriginalFilename << FilenameRange;2245 if (IsFrameworkFound) {2246 size_t SlashPos = OriginalFilename.find('/');2247 assert(SlashPos != StringRef::npos &&2248 "Include with framework name should have '/' in the filename");2249 StringRef FrameworkName = OriginalFilename.substr(0, SlashPos);2250 FrameworkCacheEntry &CacheEntry =2251 HeaderInfo.LookupFrameworkCache(FrameworkName);2252 assert(CacheEntry.Directory && "Found framework should be in cache");2253 Diag(FilenameTok, diag::note_pp_framework_without_header)2254 << OriginalFilename.substr(SlashPos + 1) << FrameworkName2255 << CacheEntry.Directory->getName();2256 }2257 2258 return std::nullopt;2259}2260 2261/// Handle either a #include-like directive or an import declaration that names2262/// a header file.2263///2264/// \param HashLoc The location of the '#' token for an include, or2265/// SourceLocation() for an import declaration.2266/// \param IncludeTok The include / include_next / import token.2267/// \param FilenameTok The header-name token.2268/// \param EndLoc The location at which any imported macros become visible.2269/// \param LookupFrom For #include_next, the starting directory for the2270/// directory lookup.2271/// \param LookupFromFile For #include_next, the starting file for the directory2272/// lookup.2273Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport(2274 SourceLocation HashLoc, Token &IncludeTok, Token &FilenameTok,2275 SourceLocation EndLoc, ConstSearchDirIterator LookupFrom,2276 const FileEntry *LookupFromFile) {2277 SmallString<128> FilenameBuffer;2278 StringRef Filename = getSpelling(FilenameTok, FilenameBuffer);2279 SourceLocation CharEnd = FilenameTok.getEndLoc();2280 2281 CharSourceRange FilenameRange2282 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);2283 StringRef OriginalFilename = Filename;2284 bool isAngled =2285 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);2286 2287 // If GetIncludeFilenameSpelling set the start ptr to null, there was an2288 // error.2289 if (Filename.empty())2290 return {ImportAction::None};2291 2292 bool IsImportDecl = HashLoc.isInvalid();2293 SourceLocation StartLoc = IsImportDecl ? IncludeTok.getLocation() : HashLoc;2294 2295 // Complain about attempts to #include files in an audit pragma.2296 if (PragmaARCCFCodeAuditedInfo.getLoc().isValid()) {2297 Diag(StartLoc, diag::err_pp_include_in_arc_cf_code_audited) << IsImportDecl;2298 Diag(PragmaARCCFCodeAuditedInfo.getLoc(), diag::note_pragma_entered_here);2299 2300 // Immediately leave the pragma.2301 PragmaARCCFCodeAuditedInfo = IdentifierLoc();2302 }2303 2304 // Complain about attempts to #include files in an assume-nonnull pragma.2305 if (PragmaAssumeNonNullLoc.isValid()) {2306 Diag(StartLoc, diag::err_pp_include_in_assume_nonnull) << IsImportDecl;2307 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);2308 2309 // Immediately leave the pragma.2310 PragmaAssumeNonNullLoc = SourceLocation();2311 }2312 2313 if (HeaderInfo.HasIncludeAliasMap()) {2314 // Map the filename with the brackets still attached. If the name doesn't2315 // map to anything, fall back on the filename we've already gotten the2316 // spelling for.2317 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);2318 if (!NewName.empty())2319 Filename = NewName;2320 }2321 2322 // Search include directories.2323 bool IsMapped = false;2324 bool IsFrameworkFound = false;2325 ConstSearchDirIterator CurDir = nullptr;2326 SmallString<1024> SearchPath;2327 SmallString<1024> RelativePath;2328 // We get the raw path only if we have 'Callbacks' to which we later pass2329 // the path.2330 ModuleMap::KnownHeader SuggestedModule;2331 SourceLocation FilenameLoc = FilenameTok.getLocation();2332 StringRef LookupFilename = Filename;2333 2334 // Normalize slashes when compiling with -fms-extensions on non-Windows. This2335 // is unnecessary on Windows since the filesystem there handles backslashes.2336 SmallString<128> NormalizedPath;2337 llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::native;2338 if (is_style_posix(BackslashStyle) && LangOpts.MicrosoftExt) {2339 NormalizedPath = Filename.str();2340 llvm::sys::path::native(NormalizedPath);2341 LookupFilename = NormalizedPath;2342 BackslashStyle = llvm::sys::path::Style::windows;2343 }2344 2345 OptionalFileEntryRef File = LookupHeaderIncludeOrImport(2346 &CurDir, Filename, FilenameLoc, FilenameRange, FilenameTok,2347 IsFrameworkFound, IsImportDecl, IsMapped, LookupFrom, LookupFromFile,2348 LookupFilename, RelativePath, SearchPath, SuggestedModule, isAngled);2349 2350 if (usingPCHWithThroughHeader() && SkippingUntilPCHThroughHeader) {2351 if (File && isPCHThroughHeader(&File->getFileEntry()))2352 SkippingUntilPCHThroughHeader = false;2353 return {ImportAction::None};2354 }2355 2356 // Should we enter the source file? Set to Skip if either the source file is2357 // known to have no effect beyond its effect on module visibility -- that is,2358 // if it's got an include guard that is already defined, set to Import if it2359 // is a modular header we've already built and should import.2360 2361 // For C++20 Modules2362 // [cpp.include]/7 If the header identified by the header-name denotes an2363 // importable header, it is implementation-defined whether the #include2364 // preprocessing directive is instead replaced by an import directive.2365 // For this implementation, the translation is permitted when we are parsing2366 // the Global Module Fragment, and not otherwise (the cases where it would be2367 // valid to replace an include with an import are highly constrained once in2368 // named module purview; this choice avoids considerable complexity in2369 // determining valid cases).2370 2371 enum { Enter, Import, Skip, IncludeLimitReached } Action = Enter;2372 2373 if (PPOpts.SingleFileParseMode)2374 Action = IncludeLimitReached;2375 2376 // If we've reached the max allowed include depth, it is usually due to an2377 // include cycle. Don't enter already processed files again as it can lead to2378 // reaching the max allowed include depth again.2379 if (Action == Enter && HasReachedMaxIncludeDepth && File &&2380 alreadyIncluded(*File))2381 Action = IncludeLimitReached;2382 2383 // FIXME: We do not have a good way to disambiguate C++ clang modules from2384 // C++ standard modules (other than use/non-use of Header Units).2385 2386 Module *ModuleToImport = SuggestedModule.getModule();2387 2388 bool MaybeTranslateInclude = Action == Enter && File && ModuleToImport &&2389 !ModuleToImport->isForBuilding(getLangOpts());2390 2391 // Maybe a usable Header Unit2392 bool UsableHeaderUnit = false;2393 if (getLangOpts().CPlusPlusModules && ModuleToImport &&2394 ModuleToImport->isHeaderUnit()) {2395 if (TrackGMFState.inGMF() || IsImportDecl)2396 UsableHeaderUnit = true;2397 else if (!IsImportDecl) {2398 // This is a Header Unit that we do not include-translate2399 ModuleToImport = nullptr;2400 }2401 }2402 // Maybe a usable clang header module.2403 bool UsableClangHeaderModule =2404 (getLangOpts().CPlusPlusModules || getLangOpts().Modules) &&2405 ModuleToImport && !ModuleToImport->isHeaderUnit();2406 2407 // Determine whether we should try to import the module for this #include, if2408 // there is one. Don't do so if precompiled module support is disabled or we2409 // are processing this module textually (because we're building the module).2410 if (MaybeTranslateInclude && (UsableHeaderUnit || UsableClangHeaderModule)) {2411 // If this include corresponds to a module but that module is2412 // unavailable, diagnose the situation and bail out.2413 // FIXME: Remove this; loadModule does the same check (but produces2414 // slightly worse diagnostics).2415 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), *ModuleToImport,2416 getDiagnostics())) {2417 Diag(FilenameTok.getLocation(),2418 diag::note_implicit_top_level_module_import_here)2419 << ModuleToImport->getTopLevelModuleName();2420 return {ImportAction::None};2421 }2422 2423 // Compute the module access path corresponding to this module.2424 // FIXME: Should we have a second loadModule() overload to avoid this2425 // extra lookup step?2426 SmallVector<IdentifierLoc, 2> Path;2427 for (Module *Mod = ModuleToImport; Mod; Mod = Mod->Parent)2428 Path.emplace_back(FilenameTok.getLocation(),2429 getIdentifierInfo(Mod->Name));2430 std::reverse(Path.begin(), Path.end());2431 2432 // Warn that we're replacing the include/import with a module import.2433 if (!IsImportDecl)2434 diagnoseAutoModuleImport(*this, StartLoc, IncludeTok, Path, CharEnd);2435 2436 // Load the module to import its macros. We'll make the declarations2437 // visible when the parser gets here.2438 // FIXME: Pass ModuleToImport in here rather than converting it to a path2439 // and making the module loader convert it back again.2440 ModuleLoadResult Imported = TheModuleLoader.loadModule(2441 IncludeTok.getLocation(), Path, Module::Hidden,2442 /*IsInclusionDirective=*/true);2443 assert((Imported == nullptr || Imported == ModuleToImport) &&2444 "the imported module is different than the suggested one");2445 2446 if (Imported) {2447 Action = Import;2448 } else if (Imported.isMissingExpected()) {2449 markClangModuleAsAffecting(2450 static_cast<Module *>(Imported)->getTopLevelModule());2451 // We failed to find a submodule that we assumed would exist (because it2452 // was in the directory of an umbrella header, for instance), but no2453 // actual module containing it exists (because the umbrella header is2454 // incomplete). Treat this as a textual inclusion.2455 ModuleToImport = nullptr;2456 } else if (Imported.isConfigMismatch()) {2457 // On a configuration mismatch, enter the header textually. We still know2458 // that it's part of the corresponding module.2459 } else {2460 // We hit an error processing the import. Bail out.2461 if (hadModuleLoaderFatalFailure()) {2462 // With a fatal failure in the module loader, we abort parsing.2463 Token &Result = IncludeTok;2464 assert(CurLexer && "#include but no current lexer set!");2465 Result.startToken();2466 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);2467 CurLexer->cutOffLexing();2468 }2469 return {ImportAction::None};2470 }2471 }2472 2473 // The #included file will be considered to be a system header if either it is2474 // in a system include directory, or if the #includer is a system include2475 // header.2476 SrcMgr::CharacteristicKind FileCharacter =2477 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());2478 if (File)2479 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(*File), FileCharacter);2480 2481 // If this is a '#import' or an import-declaration, don't re-enter the file.2482 //2483 // FIXME: If we have a suggested module for a '#include', and we've already2484 // visited this file, don't bother entering it again. We know it has no2485 // further effect.2486 bool EnterOnce =2487 IsImportDecl ||2488 IncludeTok.getIdentifierInfo()->getPPKeywordID() == tok::pp_import;2489 2490 bool IsFirstIncludeOfFile = false;2491 2492 // Ask HeaderInfo if we should enter this #include file. If not, #including2493 // this file will have no effect.2494 if (Action == Enter && File &&2495 !HeaderInfo.ShouldEnterIncludeFile(*this, *File, EnterOnce,2496 getLangOpts().Modules, ModuleToImport,2497 IsFirstIncludeOfFile)) {2498 // C++ standard modules:2499 // If we are not in the GMF, then we textually include only2500 // clang modules:2501 // Even if we've already preprocessed this header once and know that we2502 // don't need to see its contents again, we still need to import it if it's2503 // modular because we might not have imported it from this submodule before.2504 //2505 // FIXME: We don't do this when compiling a PCH because the AST2506 // serialization layer can't cope with it. This means we get local2507 // submodule visibility semantics wrong in that case.2508 if (UsableHeaderUnit && !getLangOpts().CompilingPCH)2509 Action = TrackGMFState.inGMF() ? Import : Skip;2510 else2511 Action = (ModuleToImport && !getLangOpts().CompilingPCH) ? Import : Skip;2512 }2513 2514 // Check for circular inclusion of the main file.2515 // We can't generate a consistent preamble with regard to the conditional2516 // stack if the main file is included again as due to the preamble bounds2517 // some directives (e.g. #endif of a header guard) will never be seen.2518 // Since this will lead to confusing errors, avoid the inclusion.2519 if (Action == Enter && File && PreambleConditionalStack.isRecording() &&2520 SourceMgr.isMainFile(File->getFileEntry())) {2521 Diag(FilenameTok.getLocation(),2522 diag::err_pp_including_mainfile_in_preamble);2523 return {ImportAction::None};2524 }2525 2526 if (Callbacks && !IsImportDecl) {2527 // Notify the callback object that we've seen an inclusion directive.2528 // FIXME: Use a different callback for a pp-import?2529 Callbacks->InclusionDirective(HashLoc, IncludeTok, LookupFilename, isAngled,2530 FilenameRange, File, SearchPath, RelativePath,2531 SuggestedModule.getModule(), Action == Import,2532 FileCharacter);2533 if (Action == Skip && File)2534 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);2535 }2536 2537 if (!File)2538 return {ImportAction::None};2539 2540 // If this is a C++20 pp-import declaration, diagnose if we didn't find any2541 // module corresponding to the named header.2542 if (IsImportDecl && !ModuleToImport) {2543 Diag(FilenameTok, diag::err_header_import_not_header_unit)2544 << OriginalFilename << File->getName();2545 return {ImportAction::None};2546 }2547 2548 // Issue a diagnostic if the name of the file on disk has a different case2549 // than the one we're about to open.2550 const bool CheckIncludePathPortability =2551 !IsMapped && !File->getFileEntry().tryGetRealPathName().empty();2552 2553 if (CheckIncludePathPortability) {2554 StringRef Name = LookupFilename;2555 StringRef NameWithoriginalSlashes = Filename;2556#if defined(_WIN32)2557 // Skip UNC prefix if present. (tryGetRealPathName() always2558 // returns a path with the prefix skipped.)2559 bool NameWasUNC = Name.consume_front("\\\\?\\");2560 NameWithoriginalSlashes.consume_front("\\\\?\\");2561#endif2562 StringRef RealPathName = File->getFileEntry().tryGetRealPathName();2563 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),2564 llvm::sys::path::end(Name));2565#if defined(_WIN32)2566 // -Wnonportable-include-path is designed to diagnose includes using2567 // case even on systems with a case-insensitive file system.2568 // On Windows, RealPathName always starts with an upper-case drive2569 // letter for absolute paths, but Name might start with either2570 // case depending on if `cd c:\foo` or `cd C:\foo` was used in the shell.2571 // ("foo" will always have on-disk case, no matter which case was2572 // used in the cd command). To not emit this warning solely for2573 // the drive letter, whose case is dependent on if `cd` is used2574 // with upper- or lower-case drive letters, always consider the2575 // given drive letter case as correct for the purpose of this warning.2576 SmallString<128> FixedDriveRealPath;2577 if (llvm::sys::path::is_absolute(Name) &&2578 llvm::sys::path::is_absolute(RealPathName) &&2579 toLowercase(Name[0]) == toLowercase(RealPathName[0]) &&2580 isLowercase(Name[0]) != isLowercase(RealPathName[0])) {2581 assert(Components.size() >= 3 && "should have drive, backslash, name");2582 assert(Components[0].size() == 2 && "should start with drive");2583 assert(Components[0][1] == ':' && "should have colon");2584 FixedDriveRealPath = (Name.substr(0, 1) + RealPathName.substr(1)).str();2585 RealPathName = FixedDriveRealPath;2586 }2587#endif2588 2589 if (trySimplifyPath(Components, RealPathName, BackslashStyle)) {2590 SmallString<128> Path;2591 Path.reserve(Name.size()+2);2592 Path.push_back(isAngled ? '<' : '"');2593 2594 const auto IsSep = [BackslashStyle](char c) {2595 return llvm::sys::path::is_separator(c, BackslashStyle);2596 };2597 2598 for (auto Component : Components) {2599 // On POSIX, Components will contain a single '/' as first element2600 // exactly if Name is an absolute path.2601 // On Windows, it will contain "C:" followed by '\' for absolute paths.2602 // The drive letter is optional for absolute paths on Windows, but2603 // clang currently cannot process absolute paths in #include lines that2604 // don't have a drive.2605 // If the first entry in Components is a directory separator,2606 // then the code at the bottom of this loop that keeps the original2607 // directory separator style copies it. If the second entry is2608 // a directory separator (the C:\ case), then that separator already2609 // got copied when the C: was processed and we want to skip that entry.2610 if (!(Component.size() == 1 && IsSep(Component[0])))2611 Path.append(Component);2612 else if (Path.size() != 1)2613 continue;2614 2615 // Append the separator(s) the user used, or the close quote2616 if (Path.size() > NameWithoriginalSlashes.size()) {2617 Path.push_back(isAngled ? '>' : '"');2618 continue;2619 }2620 assert(IsSep(NameWithoriginalSlashes[Path.size()-1]));2621 do2622 Path.push_back(NameWithoriginalSlashes[Path.size()-1]);2623 while (Path.size() <= NameWithoriginalSlashes.size() &&2624 IsSep(NameWithoriginalSlashes[Path.size()-1]));2625 }2626 2627#if defined(_WIN32)2628 // Restore UNC prefix if it was there.2629 if (NameWasUNC)2630 Path = (Path.substr(0, 1) + "\\\\?\\" + Path.substr(1)).str();2631#endif2632 2633 // For user files and known standard headers, issue a diagnostic.2634 // For other system headers, don't. They can be controlled separately.2635 auto DiagId =2636 (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name))2637 ? diag::pp_nonportable_path2638 : diag::pp_nonportable_system_path;2639 Diag(FilenameTok, DiagId) << Path <<2640 FixItHint::CreateReplacement(FilenameRange, Path);2641 }2642 }2643 2644 switch (Action) {2645 case Skip:2646 // If we don't need to enter the file, stop now.2647 if (ModuleToImport)2648 return {ImportAction::SkippedModuleImport, ModuleToImport};2649 return {ImportAction::None};2650 2651 case IncludeLimitReached:2652 // If we reached our include limit and don't want to enter any more files,2653 // don't go any further.2654 return {ImportAction::None};2655 2656 case Import: {2657 // If this is a module import, make it visible if needed.2658 assert(ModuleToImport && "no module to import");2659 2660 makeModuleVisible(ModuleToImport, EndLoc);2661 2662 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() ==2663 tok::pp___include_macros)2664 return {ImportAction::None};2665 2666 return {ImportAction::ModuleImport, ModuleToImport};2667 }2668 2669 case Enter:2670 break;2671 }2672 2673 // Check that we don't have infinite #include recursion.2674 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {2675 Diag(FilenameTok, diag::err_pp_include_too_deep);2676 HasReachedMaxIncludeDepth = true;2677 return {ImportAction::None};2678 }2679 2680 if (isAngled && isInNamedModule())2681 Diag(FilenameTok, diag::warn_pp_include_angled_in_module_purview)2682 << getNamedModuleName();2683 2684 // Look up the file, create a File ID for it.2685 SourceLocation IncludePos = FilenameTok.getLocation();2686 // If the filename string was the result of macro expansions, set the include2687 // position on the file where it will be included and after the expansions.2688 if (IncludePos.isMacroID())2689 IncludePos = SourceMgr.getExpansionRange(IncludePos).getEnd();2690 FileID FID = SourceMgr.createFileID(*File, IncludePos, FileCharacter);2691 if (!FID.isValid()) {2692 TheModuleLoader.HadFatalFailure = true;2693 return ImportAction::Failure;2694 }2695 2696 // If all is good, enter the new file!2697 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation(),2698 IsFirstIncludeOfFile))2699 return {ImportAction::None};2700 2701 // Determine if we're switching to building a new submodule, and which one.2702 // This does not apply for C++20 modules header units.2703 if (ModuleToImport && !ModuleToImport->isHeaderUnit()) {2704 if (ModuleToImport->getTopLevelModule()->ShadowingModule) {2705 // We are building a submodule that belongs to a shadowed module. This2706 // means we find header files in the shadowed module.2707 Diag(ModuleToImport->DefinitionLoc,2708 diag::err_module_build_shadowed_submodule)2709 << ModuleToImport->getFullModuleName();2710 Diag(ModuleToImport->getTopLevelModule()->ShadowingModule->DefinitionLoc,2711 diag::note_previous_definition);2712 return {ImportAction::None};2713 }2714 // When building a pch, -fmodule-name tells the compiler to textually2715 // include headers in the specified module. We are not building the2716 // specified module.2717 //2718 // FIXME: This is the wrong way to handle this. We should produce a PCH2719 // that behaves the same as the header would behave in a compilation using2720 // that PCH, which means we should enter the submodule. We need to teach2721 // the AST serialization layer to deal with the resulting AST.2722 if (getLangOpts().CompilingPCH &&2723 ModuleToImport->isForBuilding(getLangOpts()))2724 return {ImportAction::None};2725 2726 assert(!CurLexerSubmodule && "should not have marked this as a module yet");2727 CurLexerSubmodule = ModuleToImport;2728 2729 // Let the macro handling code know that any future macros are within2730 // the new submodule.2731 EnterSubmodule(ModuleToImport, EndLoc, /*ForPragma*/ false);2732 2733 // Let the parser know that any future declarations are within the new2734 // submodule.2735 // FIXME: There's no point doing this if we're handling a #__include_macros2736 // directive.2737 return {ImportAction::ModuleBegin, ModuleToImport};2738 }2739 2740 assert(!IsImportDecl && "failed to diagnose missing module for import decl");2741 return {ImportAction::None};2742}2743 2744/// HandleIncludeNextDirective - Implements \#include_next.2745///2746void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,2747 Token &IncludeNextTok) {2748 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);2749 2750 ConstSearchDirIterator Lookup = nullptr;2751 const FileEntry *LookupFromFile;2752 std::tie(Lookup, LookupFromFile) = getIncludeNextStart(IncludeNextTok);2753 2754 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,2755 LookupFromFile);2756}2757 2758/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode2759void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {2760 // The Microsoft #import directive takes a type library and generates header2761 // files from it, and includes those. This is beyond the scope of what clang2762 // does, so we ignore it and error out. However, #import can optionally have2763 // trailing attributes that span multiple lines. We're going to eat those2764 // so we can continue processing from there.2765 Diag(Tok, diag::err_pp_import_directive_ms );2766 2767 // Read tokens until we get to the end of the directive. Note that the2768 // directive can be split over multiple lines using the backslash character.2769 DiscardUntilEndOfDirective();2770}2771 2772/// HandleImportDirective - Implements \#import.2773///2774void Preprocessor::HandleImportDirective(SourceLocation HashLoc,2775 Token &ImportTok) {2776 if (!LangOpts.ObjC) { // #import is standard for ObjC.2777 if (LangOpts.MSVCCompat)2778 return HandleMicrosoftImportDirective(ImportTok);2779 Diag(ImportTok, diag::ext_pp_import_directive);2780 }2781 return HandleIncludeDirective(HashLoc, ImportTok);2782}2783 2784/// HandleIncludeMacrosDirective - The -imacros command line option turns into a2785/// pseudo directive in the predefines buffer. This handles it by sucking all2786/// tokens through the preprocessor and discarding them (only keeping the side2787/// effects on the preprocessor).2788void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,2789 Token &IncludeMacrosTok) {2790 // This directive should only occur in the predefines buffer. If not, emit an2791 // error and reject it.2792 SourceLocation Loc = IncludeMacrosTok.getLocation();2793 if (SourceMgr.getBufferName(Loc) != "<built-in>") {2794 Diag(IncludeMacrosTok.getLocation(),2795 diag::pp_include_macros_out_of_predefines);2796 DiscardUntilEndOfDirective();2797 return;2798 }2799 2800 // Treat this as a normal #include for checking purposes. If this is2801 // successful, it will push a new lexer onto the include stack.2802 HandleIncludeDirective(HashLoc, IncludeMacrosTok);2803 2804 Token TmpTok;2805 do {2806 Lex(TmpTok);2807 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");2808 } while (TmpTok.isNot(tok::hashhash));2809}2810 2811//===----------------------------------------------------------------------===//2812// Preprocessor Macro Directive Handling.2813//===----------------------------------------------------------------------===//2814 2815/// ReadMacroParameterList - The ( starting a parameter list of a macro2816/// definition has just been read. Lex the rest of the parameters and the2817/// closing ), updating MI with what we learn. Return true if an error occurs2818/// parsing the param list.2819bool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {2820 SmallVector<IdentifierInfo*, 32> Parameters;2821 2822 while (true) {2823 LexUnexpandedNonComment(Tok);2824 switch (Tok.getKind()) {2825 case tok::r_paren:2826 // Found the end of the parameter list.2827 if (Parameters.empty()) // #define FOO()2828 return false;2829 // Otherwise we have #define FOO(A,)2830 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);2831 return true;2832 case tok::ellipsis: // #define X(... -> C99 varargs2833 if (!LangOpts.C99)2834 Diag(Tok, LangOpts.CPlusPlus11 ?2835 diag::warn_cxx98_compat_variadic_macro :2836 diag::ext_variadic_macro);2837 2838 // OpenCL v1.2 s6.9.e: variadic macros are not supported.2839 if (LangOpts.OpenCL && !LangOpts.OpenCLCPlusPlus) {2840 Diag(Tok, diag::ext_pp_opencl_variadic_macros);2841 }2842 2843 // Lex the token after the identifier.2844 LexUnexpandedNonComment(Tok);2845 if (Tok.isNot(tok::r_paren)) {2846 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);2847 return true;2848 }2849 // Add the __VA_ARGS__ identifier as a parameter.2850 Parameters.push_back(Ident__VA_ARGS__);2851 MI->setIsC99Varargs();2852 MI->setParameterList(Parameters, BP);2853 return false;2854 case tok::eod: // #define X(2855 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);2856 return true;2857 default:2858 // Handle keywords and identifiers here to accept things like2859 // #define Foo(for) for.2860 IdentifierInfo *II = Tok.getIdentifierInfo();2861 if (!II) {2862 // #define X(12863 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);2864 return true;2865 }2866 2867 // If this is already used as a parameter, it is used multiple times (e.g.2868 // #define X(A,A.2869 if (llvm::is_contained(Parameters, II)) { // C99 6.10.3p62870 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;2871 return true;2872 }2873 2874 // Add the parameter to the macro info.2875 Parameters.push_back(II);2876 2877 // Lex the token after the identifier.2878 LexUnexpandedNonComment(Tok);2879 2880 switch (Tok.getKind()) {2881 default: // #define X(A B2882 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);2883 return true;2884 case tok::r_paren: // #define X(A)2885 MI->setParameterList(Parameters, BP);2886 return false;2887 case tok::comma: // #define X(A,2888 break;2889 case tok::ellipsis: // #define X(A... -> GCC extension2890 // Diagnose extension.2891 Diag(Tok, diag::ext_named_variadic_macro);2892 2893 // Lex the token after the identifier.2894 LexUnexpandedNonComment(Tok);2895 if (Tok.isNot(tok::r_paren)) {2896 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);2897 return true;2898 }2899 2900 MI->setIsGNUVarargs();2901 MI->setParameterList(Parameters, BP);2902 return false;2903 }2904 }2905 }2906}2907 2908static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,2909 const LangOptions &LOptions) {2910 if (MI->getNumTokens() == 1) {2911 const Token &Value = MI->getReplacementToken(0);2912 2913 // Macro that is identity, like '#define inline inline' is a valid pattern.2914 if (MacroName.getKind() == Value.getKind())2915 return true;2916 2917 // Macro that maps a keyword to the same keyword decorated with leading/2918 // trailing underscores is a valid pattern:2919 // #define inline __inline2920 // #define inline __inline__2921 // #define inline _inline (in MS compatibility mode)2922 StringRef MacroText = MacroName.getIdentifierInfo()->getName();2923 if (IdentifierInfo *II = Value.getIdentifierInfo()) {2924 if (!II->isKeyword(LOptions))2925 return false;2926 StringRef ValueText = II->getName();2927 StringRef TrimmedValue = ValueText;2928 if (!ValueText.starts_with("__")) {2929 if (ValueText.starts_with("_"))2930 TrimmedValue = TrimmedValue.drop_front(1);2931 else2932 return false;2933 } else {2934 TrimmedValue = TrimmedValue.drop_front(2);2935 if (TrimmedValue.ends_with("__"))2936 TrimmedValue = TrimmedValue.drop_back(2);2937 }2938 return TrimmedValue == MacroText;2939 } else {2940 return false;2941 }2942 }2943 2944 // #define inline2945 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,2946 tok::kw_const) &&2947 MI->getNumTokens() == 0;2948}2949 2950// ReadOptionalMacroParameterListAndBody - This consumes all (i.e. the2951// entire line) of the macro's tokens and adds them to MacroInfo, and while2952// doing so performs certain validity checks including (but not limited to):2953// - # (stringization) is followed by a macro parameter2954//2955// Returns a nullptr if an invalid sequence of tokens is encountered or returns2956// a pointer to a MacroInfo object.2957 2958MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(2959 const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {2960 2961 Token LastTok = MacroNameTok;2962 // Create the new macro.2963 MacroInfo *const MI = AllocateMacroInfo(MacroNameTok.getLocation());2964 2965 Token Tok;2966 LexUnexpandedToken(Tok);2967 2968 // Ensure we consume the rest of the macro body if errors occur.2969 auto _ = llvm::make_scope_exit([&]() {2970 // The flag indicates if we are still waiting for 'eod'.2971 if (CurLexer->ParsingPreprocessorDirective)2972 DiscardUntilEndOfDirective();2973 });2974 2975 // Used to un-poison and then re-poison identifiers of the __VA_ARGS__ ilk2976 // within their appropriate context.2977 VariadicMacroScopeGuard VariadicMacroScopeGuard(*this);2978 2979 // If this is a function-like macro definition, parse the argument list,2980 // marking each of the identifiers as being used as macro arguments. Also,2981 // check other constraints on the first token of the macro body.2982 if (Tok.is(tok::eod)) {2983 if (ImmediatelyAfterHeaderGuard) {2984 // Save this macro information since it may part of a header guard.2985 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),2986 MacroNameTok.getLocation());2987 }2988 // If there is no body to this macro, we have no special handling here.2989 } else if (Tok.hasLeadingSpace()) {2990 // This is a normal token with leading space. Clear the leading space2991 // marker on the first token to get proper expansion.2992 Tok.clearFlag(Token::LeadingSpace);2993 } else if (Tok.is(tok::l_paren)) {2994 // This is a function-like macro definition. Read the argument list.2995 MI->setIsFunctionLike();2996 if (ReadMacroParameterList(MI, LastTok))2997 return nullptr;2998 2999 // If this is a definition of an ISO C/C++ variadic function-like macro (not3000 // using the GNU named varargs extension) inform our variadic scope guard3001 // which un-poisons and re-poisons certain identifiers (e.g. __VA_ARGS__)3002 // allowed only within the definition of a variadic macro.3003 3004 if (MI->isC99Varargs()) {3005 VariadicMacroScopeGuard.enterScope();3006 }3007 3008 // Read the first token after the arg list for down below.3009 LexUnexpandedToken(Tok);3010 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {3011 // C99 requires whitespace between the macro definition and the body. Emit3012 // a diagnostic for something like "#define X+".3013 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);3014 } else {3015 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the3016 // first character of a replacement list is not a character required by3017 // subclause 5.2.1, then there shall be white-space separation between the3018 // identifier and the replacement list.". 5.2.1 lists this set:3019 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which3020 // is irrelevant here.3021 bool isInvalid = false;3022 if (Tok.is(tok::at)) // @ is not in the list above.3023 isInvalid = true;3024 else if (Tok.is(tok::unknown)) {3025 // If we have an unknown token, it is something strange like "`". Since3026 // all of valid characters would have lexed into a single character3027 // token of some sort, we know this is not a valid case.3028 isInvalid = true;3029 }3030 if (isInvalid)3031 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);3032 else3033 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);3034 }3035 3036 if (!Tok.is(tok::eod))3037 LastTok = Tok;3038 3039 SmallVector<Token, 16> Tokens;3040 3041 // Read the rest of the macro body.3042 if (MI->isObjectLike()) {3043 // Object-like macros are very simple, just read their body.3044 while (Tok.isNot(tok::eod)) {3045 LastTok = Tok;3046 Tokens.push_back(Tok);3047 // Get the next token of the macro.3048 LexUnexpandedToken(Tok);3049 }3050 } else {3051 // Otherwise, read the body of a function-like macro. While we are at it,3052 // check C99 6.10.3.2p1: ensure that # operators are followed by macro3053 // parameters in function-like macro expansions.3054 3055 VAOptDefinitionContext VAOCtx(*this);3056 3057 while (Tok.isNot(tok::eod)) {3058 LastTok = Tok;3059 3060 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {3061 Tokens.push_back(Tok);3062 3063 if (VAOCtx.isVAOptToken(Tok)) {3064 // If we're already within a VAOPT, emit an error.3065 if (VAOCtx.isInVAOpt()) {3066 Diag(Tok, diag::err_pp_vaopt_nested_use);3067 return nullptr;3068 }3069 // Ensure VAOPT is followed by a '(' .3070 LexUnexpandedToken(Tok);3071 if (Tok.isNot(tok::l_paren)) {3072 Diag(Tok, diag::err_pp_missing_lparen_in_vaopt_use);3073 return nullptr;3074 }3075 Tokens.push_back(Tok);3076 VAOCtx.sawVAOptFollowedByOpeningParens(Tok.getLocation());3077 LexUnexpandedToken(Tok);3078 if (Tok.is(tok::hashhash)) {3079 Diag(Tok, diag::err_vaopt_paste_at_start);3080 return nullptr;3081 }3082 continue;3083 } else if (VAOCtx.isInVAOpt()) {3084 if (Tok.is(tok::r_paren)) {3085 if (VAOCtx.sawClosingParen()) {3086 assert(Tokens.size() >= 3 &&3087 "Must have seen at least __VA_OPT__( "3088 "and a subsequent tok::r_paren");3089 if (Tokens[Tokens.size() - 2].is(tok::hashhash)) {3090 Diag(Tok, diag::err_vaopt_paste_at_end);3091 return nullptr;3092 }3093 }3094 } else if (Tok.is(tok::l_paren)) {3095 VAOCtx.sawOpeningParen(Tok.getLocation());3096 }3097 }3098 // Get the next token of the macro.3099 LexUnexpandedToken(Tok);3100 continue;3101 }3102 3103 // If we're in -traditional mode, then we should ignore stringification3104 // and token pasting. Mark the tokens as unknown so as not to confuse3105 // things.3106 if (getLangOpts().TraditionalCPP) {3107 Tok.setKind(tok::unknown);3108 Tokens.push_back(Tok);3109 3110 // Get the next token of the macro.3111 LexUnexpandedToken(Tok);3112 continue;3113 }3114 3115 if (Tok.is(tok::hashhash)) {3116 // If we see token pasting, check if it looks like the gcc comma3117 // pasting extension. We'll use this information to suppress3118 // diagnostics later on.3119 3120 // Get the next token of the macro.3121 LexUnexpandedToken(Tok);3122 3123 if (Tok.is(tok::eod)) {3124 Tokens.push_back(LastTok);3125 break;3126 }3127 3128 if (!Tokens.empty() && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&3129 Tokens[Tokens.size() - 1].is(tok::comma))3130 MI->setHasCommaPasting();3131 3132 // Things look ok, add the '##' token to the macro.3133 Tokens.push_back(LastTok);3134 continue;3135 }3136 3137 // Our Token is a stringization operator.3138 // Get the next token of the macro.3139 LexUnexpandedToken(Tok);3140 3141 // Check for a valid macro arg identifier or __VA_OPT__.3142 if (!VAOCtx.isVAOptToken(Tok) &&3143 (Tok.getIdentifierInfo() == nullptr ||3144 MI->getParameterNum(Tok.getIdentifierInfo()) == -1)) {3145 3146 // If this is assembler-with-cpp mode, we accept random gibberish after3147 // the '#' because '#' is often a comment character. However, change3148 // the kind of the token to tok::unknown so that the preprocessor isn't3149 // confused.3150 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {3151 LastTok.setKind(tok::unknown);3152 Tokens.push_back(LastTok);3153 continue;3154 } else {3155 Diag(Tok, diag::err_pp_stringize_not_parameter)3156 << LastTok.is(tok::hashat);3157 return nullptr;3158 }3159 }3160 3161 // Things look ok, add the '#' and param name tokens to the macro.3162 Tokens.push_back(LastTok);3163 3164 // If the token following '#' is VAOPT, let the next iteration handle it3165 // and check it for correctness, otherwise add the token and prime the3166 // loop with the next one.3167 if (!VAOCtx.isVAOptToken(Tok)) {3168 Tokens.push_back(Tok);3169 LastTok = Tok;3170 3171 // Get the next token of the macro.3172 LexUnexpandedToken(Tok);3173 }3174 }3175 if (VAOCtx.isInVAOpt()) {3176 assert(Tok.is(tok::eod) && "Must be at End Of preprocessing Directive");3177 Diag(Tok, diag::err_pp_expected_after)3178 << LastTok.getKind() << tok::r_paren;3179 Diag(VAOCtx.getUnmatchedOpeningParenLoc(), diag::note_matching) << tok::l_paren;3180 return nullptr;3181 }3182 }3183 MI->setDefinitionEndLoc(LastTok.getLocation());3184 3185 MI->setTokens(Tokens, BP);3186 return MI;3187}3188 3189static bool isObjCProtectedMacro(const IdentifierInfo *II) {3190 return II->isStr("__strong") || II->isStr("__weak") ||3191 II->isStr("__unsafe_unretained") || II->isStr("__autoreleasing");3192}3193 3194/// HandleDefineDirective - Implements \#define. This consumes the entire macro3195/// line then lets the caller lex the next real token.3196void Preprocessor::HandleDefineDirective(3197 Token &DefineTok, const bool ImmediatelyAfterHeaderGuard) {3198 ++NumDefined;3199 3200 Token MacroNameTok;3201 bool MacroShadowsKeyword;3202 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);3203 3204 // Error reading macro name? If so, diagnostic already issued.3205 if (MacroNameTok.is(tok::eod))3206 return;3207 3208 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();3209 // Issue a final pragma warning if we're defining a macro that was has been3210 // undefined and is being redefined.3211 if (!II->hasMacroDefinition() && II->hadMacroDefinition() && II->isFinal())3212 emitFinalMacroWarning(MacroNameTok, /*IsUndef=*/false);3213 3214 // If we are supposed to keep comments in #defines, reenable comment saving3215 // mode.3216 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);3217 3218 MacroInfo *const MI = ReadOptionalMacroParameterListAndBody(3219 MacroNameTok, ImmediatelyAfterHeaderGuard);3220 3221 if (!MI) return;3222 3223 if (MacroShadowsKeyword &&3224 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {3225 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);3226 }3227 // Check that there is no paste (##) operator at the beginning or end of the3228 // replacement list.3229 unsigned NumTokens = MI->getNumTokens();3230 if (NumTokens != 0) {3231 if (MI->getReplacementToken(0).is(tok::hashhash)) {3232 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);3233 return;3234 }3235 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {3236 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);3237 return;3238 }3239 }3240 3241 // When skipping just warn about macros that do not match.3242 if (SkippingUntilPCHThroughHeader) {3243 const MacroInfo *OtherMI = getMacroInfo(MacroNameTok.getIdentifierInfo());3244 if (!OtherMI || !MI->isIdenticalTo(*OtherMI, *this,3245 /*Syntactic=*/LangOpts.MicrosoftExt))3246 Diag(MI->getDefinitionLoc(), diag::warn_pp_macro_def_mismatch_with_pch)3247 << MacroNameTok.getIdentifierInfo();3248 // Issue the diagnostic but allow the change if msvc extensions are enabled3249 if (!LangOpts.MicrosoftExt)3250 return;3251 }3252 3253 // Finally, if this identifier already had a macro defined for it, verify that3254 // the macro bodies are identical, and issue diagnostics if they are not.3255 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {3256 // Final macros are hard-mode: they always warn. Even if the bodies are3257 // identical. Even if they are in system headers. Even if they are things we3258 // would silently allow in the past.3259 if (MacroNameTok.getIdentifierInfo()->isFinal())3260 emitFinalMacroWarning(MacroNameTok, /*IsUndef=*/false);3261 3262 // In Objective-C, ignore attempts to directly redefine the builtin3263 // definitions of the ownership qualifiers. It's still possible to3264 // #undef them.3265 if (getLangOpts().ObjC &&3266 SourceMgr.getFileID(OtherMI->getDefinitionLoc()) ==3267 getPredefinesFileID() &&3268 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {3269 // Warn if it changes the tokens.3270 if ((!getDiagnostics().getSuppressSystemWarnings() ||3271 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&3272 !MI->isIdenticalTo(*OtherMI, *this,3273 /*Syntactic=*/LangOpts.MicrosoftExt)) {3274 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);3275 }3276 assert(!OtherMI->isWarnIfUnused());3277 return;3278 }3279 3280 // It is very common for system headers to have tons of macro redefinitions3281 // and for warnings to be disabled in system headers. If this is the case,3282 // then don't bother calling MacroInfo::isIdenticalTo.3283 if (!getDiagnostics().getSuppressSystemWarnings() ||3284 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {3285 3286 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())3287 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);3288 3289 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and3290 // C++ [cpp.predefined]p4, but allow it as an extension.3291 if (isLanguageDefinedBuiltin(SourceMgr, OtherMI, II->getName()))3292 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);3293 // Macros must be identical. This means all tokens and whitespace3294 // separation must be the same. C99 6.10.3p2.3295 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&3296 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {3297 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)3298 << MacroNameTok.getIdentifierInfo();3299 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);3300 }3301 }3302 if (OtherMI->isWarnIfUnused())3303 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());3304 }3305 3306 DefMacroDirective *MD =3307 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);3308 3309 assert(!MI->isUsed());3310 // If we need warning for not using the macro, add its location in the3311 // warn-because-unused-macro set. If it gets used it will be removed from set.3312 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&3313 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc()) &&3314 !MacroExpansionInDirectivesOverride &&3315 getSourceManager().getFileID(MI->getDefinitionLoc()) !=3316 getPredefinesFileID()) {3317 MI->setIsWarnIfUnused(true);3318 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());3319 }3320 3321 // If the callbacks want to know, tell them about the macro definition.3322 if (Callbacks)3323 Callbacks->MacroDefined(MacroNameTok, MD);3324}3325 3326/// HandleUndefDirective - Implements \#undef.3327///3328void Preprocessor::HandleUndefDirective() {3329 ++NumUndefined;3330 3331 Token MacroNameTok;3332 ReadMacroName(MacroNameTok, MU_Undef);3333 3334 // Error reading macro name? If so, diagnostic already issued.3335 if (MacroNameTok.is(tok::eod))3336 return;3337 3338 // Check to see if this is the last token on the #undef line.3339 CheckEndOfDirective("undef");3340 3341 // Okay, we have a valid identifier to undef.3342 auto *II = MacroNameTok.getIdentifierInfo();3343 auto MD = getMacroDefinition(II);3344 UndefMacroDirective *Undef = nullptr;3345 3346 if (II->isFinal())3347 emitFinalMacroWarning(MacroNameTok, /*IsUndef=*/true);3348 3349 // If the macro is not defined, this is a noop undef.3350 if (const MacroInfo *MI = MD.getMacroInfo()) {3351 if (!MI->isUsed() && MI->isWarnIfUnused())3352 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);3353 3354 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4 and3355 // C++ [cpp.predefined]p4, but allow it as an extension.3356 if (isLanguageDefinedBuiltin(SourceMgr, MI, II->getName()))3357 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);3358 3359 if (MI->isWarnIfUnused())3360 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());3361 3362 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());3363 }3364 3365 // If the callbacks want to know, tell them about the macro #undef.3366 // Note: no matter if the macro was defined or not.3367 if (Callbacks)3368 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);3369 3370 if (Undef)3371 appendMacroDirective(II, Undef);3372}3373 3374//===----------------------------------------------------------------------===//3375// Preprocessor Conditional Directive Handling.3376//===----------------------------------------------------------------------===//3377 3378/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef3379/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is3380/// true if any tokens have been returned or pp-directives activated before this3381/// \#ifndef has been lexed.3382///3383void Preprocessor::HandleIfdefDirective(Token &Result,3384 const Token &HashToken,3385 bool isIfndef,3386 bool ReadAnyTokensBeforeDirective) {3387 ++NumIf;3388 Token DirectiveTok = Result;3389 3390 Token MacroNameTok;3391 ReadMacroName(MacroNameTok);3392 3393 // Error reading macro name? If so, diagnostic already issued.3394 if (MacroNameTok.is(tok::eod)) {3395 // Skip code until we get to #endif. This helps with recovery by not3396 // emitting an error when the #endif is reached.3397 SkipExcludedConditionalBlock(HashToken.getLocation(),3398 DirectiveTok.getLocation(),3399 /*Foundnonskip*/ false, /*FoundElse*/ false);3400 return;3401 }3402 3403 emitMacroExpansionWarnings(MacroNameTok, /*IsIfnDef=*/true);3404 3405 // Check to see if this is the last token on the #if[n]def line.3406 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");3407 3408 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();3409 auto MD = getMacroDefinition(MII);3410 MacroInfo *MI = MD.getMacroInfo();3411 3412 if (CurPPLexer->getConditionalStackDepth() == 0) {3413 // If the start of a top-level #ifdef and if the macro is not defined,3414 // inform MIOpt that this might be the start of a proper include guard.3415 // Otherwise it is some other form of unknown conditional which we can't3416 // handle.3417 if (!ReadAnyTokensBeforeDirective && !MI) {3418 assert(isIfndef && "#ifdef shouldn't reach here");3419 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());3420 } else3421 CurPPLexer->MIOpt.EnterTopLevelConditional();3422 }3423 3424 // If there is a macro, process it.3425 if (MI) // Mark it used.3426 markMacroAsUsed(MI);3427 3428 if (Callbacks) {3429 if (isIfndef)3430 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);3431 else3432 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);3433 }3434 3435 bool RetainExcludedCB = PPOpts.RetainExcludedConditionalBlocks &&3436 getSourceManager().isInMainFile(DirectiveTok.getLocation());3437 3438 // Should we include the stuff contained by this directive?3439 if (PPOpts.SingleFileParseMode && !MI) {3440 // In 'single-file-parse mode' undefined identifiers trigger parsing of all3441 // the directive blocks.3442 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),3443 /*wasskip*/false, /*foundnonskip*/false,3444 /*foundelse*/false);3445 } else if (!MI == isIfndef || RetainExcludedCB) {3446 // Yes, remember that we are inside a conditional, then lex the next token.3447 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),3448 /*wasskip*/false, /*foundnonskip*/true,3449 /*foundelse*/false);3450 } else {3451 // No, skip the contents of this block.3452 SkipExcludedConditionalBlock(HashToken.getLocation(),3453 DirectiveTok.getLocation(),3454 /*Foundnonskip*/ false,3455 /*FoundElse*/ false);3456 }3457}3458 3459/// HandleIfDirective - Implements the \#if directive.3460///3461void Preprocessor::HandleIfDirective(Token &IfToken,3462 const Token &HashToken,3463 bool ReadAnyTokensBeforeDirective) {3464 ++NumIf;3465 3466 // Parse and evaluate the conditional expression.3467 IdentifierInfo *IfNDefMacro = nullptr;3468 const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);3469 const bool ConditionalTrue = DER.Conditional;3470 // Lexer might become invalid if we hit code completion point while evaluating3471 // expression.3472 if (!CurPPLexer)3473 return;3474 3475 // If this condition is equivalent to #ifndef X, and if this is the first3476 // directive seen, handle it for the multiple-include optimization.3477 if (CurPPLexer->getConditionalStackDepth() == 0) {3478 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)3479 // FIXME: Pass in the location of the macro name, not the 'if' token.3480 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());3481 else3482 CurPPLexer->MIOpt.EnterTopLevelConditional();3483 }3484 3485 if (Callbacks)3486 Callbacks->If(3487 IfToken.getLocation(), DER.ExprRange,3488 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));3489 3490 bool RetainExcludedCB = PPOpts.RetainExcludedConditionalBlocks &&3491 getSourceManager().isInMainFile(IfToken.getLocation());3492 3493 // Should we include the stuff contained by this directive?3494 if (PPOpts.SingleFileParseMode && DER.IncludedUndefinedIds) {3495 // In 'single-file-parse mode' undefined identifiers trigger parsing of all3496 // the directive blocks.3497 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,3498 /*foundnonskip*/false, /*foundelse*/false);3499 } else if (ConditionalTrue || RetainExcludedCB) {3500 // Yes, remember that we are inside a conditional, then lex the next token.3501 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,3502 /*foundnonskip*/true, /*foundelse*/false);3503 } else {3504 // No, skip the contents of this block.3505 SkipExcludedConditionalBlock(HashToken.getLocation(), IfToken.getLocation(),3506 /*Foundnonskip*/ false,3507 /*FoundElse*/ false);3508 }3509}3510 3511/// HandleEndifDirective - Implements the \#endif directive.3512///3513void Preprocessor::HandleEndifDirective(Token &EndifToken) {3514 ++NumEndif;3515 3516 // Check that this is the whole directive.3517 CheckEndOfDirective("endif");3518 3519 PPConditionalInfo CondInfo;3520 if (CurPPLexer->popConditionalLevel(CondInfo)) {3521 // No conditionals on the stack: this is an #endif without an #if.3522 Diag(EndifToken, diag::err_pp_endif_without_if);3523 return;3524 }3525 3526 // If this the end of a top-level #endif, inform MIOpt.3527 if (CurPPLexer->getConditionalStackDepth() == 0)3528 CurPPLexer->MIOpt.ExitTopLevelConditional();3529 3530 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&3531 "This code should only be reachable in the non-skipping case!");3532 3533 if (Callbacks)3534 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);3535}3536 3537/// HandleElseDirective - Implements the \#else directive.3538///3539void Preprocessor::HandleElseDirective(Token &Result, const Token &HashToken) {3540 ++NumElse;3541 3542 // #else directive in a non-skipping conditional... start skipping.3543 CheckEndOfDirective("else");3544 3545 PPConditionalInfo CI;3546 if (CurPPLexer->popConditionalLevel(CI)) {3547 Diag(Result, diag::pp_err_else_without_if);3548 return;3549 }3550 3551 // If this is a top-level #else, inform the MIOpt.3552 if (CurPPLexer->getConditionalStackDepth() == 0)3553 CurPPLexer->MIOpt.EnterTopLevelConditional();3554 3555 // If this is a #else with a #else before it, report the error.3556 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);3557 3558 if (Callbacks)3559 Callbacks->Else(Result.getLocation(), CI.IfLoc);3560 3561 bool RetainExcludedCB = PPOpts.RetainExcludedConditionalBlocks &&3562 getSourceManager().isInMainFile(Result.getLocation());3563 3564 if ((PPOpts.SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {3565 // In 'single-file-parse mode' undefined identifiers trigger parsing of all3566 // the directive blocks.3567 CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,3568 /*foundnonskip*/false, /*foundelse*/true);3569 return;3570 }3571 3572 // Finally, skip the rest of the contents of this block.3573 SkipExcludedConditionalBlock(HashToken.getLocation(), CI.IfLoc,3574 /*Foundnonskip*/ true,3575 /*FoundElse*/ true, Result.getLocation());3576}3577 3578/// Implements the \#elif, \#elifdef, and \#elifndef directives.3579void Preprocessor::HandleElifFamilyDirective(Token &ElifToken,3580 const Token &HashToken,3581 tok::PPKeywordKind Kind) {3582 PPElifDiag DirKind = Kind == tok::pp_elif ? PED_Elif3583 : Kind == tok::pp_elifdef ? PED_Elifdef3584 : PED_Elifndef;3585 ++NumElse;3586 3587 // Warn if using `#elifdef` & `#elifndef` in not C23 & C++23 mode.3588 switch (DirKind) {3589 case PED_Elifdef:3590 case PED_Elifndef:3591 unsigned DiagID;3592 if (LangOpts.CPlusPlus)3593 DiagID = LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_pp_directive3594 : diag::ext_cxx23_pp_directive;3595 else3596 DiagID = LangOpts.C23 ? diag::warn_c23_compat_pp_directive3597 : diag::ext_c23_pp_directive;3598 Diag(ElifToken, DiagID) << DirKind;3599 break;3600 default:3601 break;3602 }3603 3604 // #elif directive in a non-skipping conditional... start skipping.3605 // We don't care what the condition is, because we will always skip it (since3606 // the block immediately before it was included).3607 SourceRange ConditionRange = DiscardUntilEndOfDirective();3608 3609 PPConditionalInfo CI;3610 if (CurPPLexer->popConditionalLevel(CI)) {3611 Diag(ElifToken, diag::pp_err_elif_without_if) << DirKind;3612 return;3613 }3614 3615 // If this is a top-level #elif, inform the MIOpt.3616 if (CurPPLexer->getConditionalStackDepth() == 0)3617 CurPPLexer->MIOpt.EnterTopLevelConditional();3618 3619 // If this is a #elif with a #else before it, report the error.3620 if (CI.FoundElse)3621 Diag(ElifToken, diag::pp_err_elif_after_else) << DirKind;3622 3623 if (Callbacks) {3624 switch (Kind) {3625 case tok::pp_elif:3626 Callbacks->Elif(ElifToken.getLocation(), ConditionRange,3627 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);3628 break;3629 case tok::pp_elifdef:3630 Callbacks->Elifdef(ElifToken.getLocation(), ConditionRange, CI.IfLoc);3631 break;3632 case tok::pp_elifndef:3633 Callbacks->Elifndef(ElifToken.getLocation(), ConditionRange, CI.IfLoc);3634 break;3635 default:3636 assert(false && "unexpected directive kind");3637 break;3638 }3639 }3640 3641 bool RetainExcludedCB = PPOpts.RetainExcludedConditionalBlocks &&3642 getSourceManager().isInMainFile(ElifToken.getLocation());3643 3644 if ((PPOpts.SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {3645 // In 'single-file-parse mode' undefined identifiers trigger parsing of all3646 // the directive blocks.3647 CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,3648 /*foundnonskip*/false, /*foundelse*/false);3649 return;3650 }3651 3652 // Finally, skip the rest of the contents of this block.3653 SkipExcludedConditionalBlock(3654 HashToken.getLocation(), CI.IfLoc, /*Foundnonskip*/ true,3655 /*FoundElse*/ CI.FoundElse, ElifToken.getLocation());3656}3657 3658std::optional<LexEmbedParametersResult>3659Preprocessor::LexEmbedParameters(Token &CurTok, bool ForHasEmbed) {3660 LexEmbedParametersResult Result{};3661 tok::TokenKind EndTokenKind = ForHasEmbed ? tok::r_paren : tok::eod;3662 3663 auto DiagMismatchedBracesAndSkipToEOD =3664 [&](tok::TokenKind Expected,3665 std::pair<tok::TokenKind, SourceLocation> Matches) {3666 Diag(CurTok, diag::err_expected) << Expected;3667 Diag(Matches.second, diag::note_matching) << Matches.first;3668 if (CurTok.isNot(EndTokenKind))3669 DiscardUntilEndOfDirective(CurTok);3670 };3671 3672 auto ExpectOrDiagAndSkipToEOD = [&](tok::TokenKind Kind) {3673 if (CurTok.isNot(Kind)) {3674 Diag(CurTok, diag::err_expected) << Kind;3675 if (CurTok.isNot(EndTokenKind))3676 DiscardUntilEndOfDirective(CurTok);3677 return false;3678 }3679 return true;3680 };3681 3682 // C23 6.10:3683 // pp-parameter-name:3684 // pp-standard-parameter3685 // pp-prefixed-parameter3686 //3687 // pp-standard-parameter:3688 // identifier3689 //3690 // pp-prefixed-parameter:3691 // identifier :: identifier3692 auto LexPPParameterName = [&]() -> std::optional<std::string> {3693 // We expect the current token to be an identifier; if it's not, things3694 // have gone wrong.3695 if (!ExpectOrDiagAndSkipToEOD(tok::identifier))3696 return std::nullopt;3697 3698 const IdentifierInfo *Prefix = CurTok.getIdentifierInfo();3699 3700 // Lex another token; it is either a :: or we're done with the parameter3701 // name.3702 LexNonComment(CurTok);3703 if (CurTok.is(tok::coloncolon)) {3704 // We found a ::, so lex another identifier token.3705 LexNonComment(CurTok);3706 if (!ExpectOrDiagAndSkipToEOD(tok::identifier))3707 return std::nullopt;3708 3709 const IdentifierInfo *Suffix = CurTok.getIdentifierInfo();3710 3711 // Lex another token so we're past the name.3712 LexNonComment(CurTok);3713 return (llvm::Twine(Prefix->getName()) + "::" + Suffix->getName()).str();3714 }3715 return Prefix->getName().str();3716 };3717 3718 // C23 6.10p5: In all aspects, a preprocessor standard parameter specified by3719 // this document as an identifier pp_param and an identifier of the form3720 // __pp_param__ shall behave the same when used as a preprocessor parameter,3721 // except for the spelling.3722 auto NormalizeParameterName = [](StringRef Name) {3723 if (Name.size() > 4 && Name.starts_with("__") && Name.ends_with("__"))3724 return Name.substr(2, Name.size() - 4);3725 return Name;3726 };3727 3728 auto LexParenthesizedIntegerExpr = [&]() -> std::optional<size_t> {3729 // we have a limit parameter and its internals are processed using3730 // evaluation rules from #if.3731 if (!ExpectOrDiagAndSkipToEOD(tok::l_paren))3732 return std::nullopt;3733 3734 // We do not consume the ( because EvaluateDirectiveExpression will lex3735 // the next token for us.3736 IdentifierInfo *ParameterIfNDef = nullptr;3737 bool EvaluatedDefined;3738 DirectiveEvalResult LimitEvalResult = EvaluateDirectiveExpression(3739 ParameterIfNDef, CurTok, EvaluatedDefined, /*CheckForEOD=*/false);3740 3741 if (!LimitEvalResult.Value) {3742 // If there was an error evaluating the directive expression, we expect3743 // to be at the end of directive token.3744 assert(CurTok.is(tok::eod) && "expect to be at the end of directive");3745 return std::nullopt;3746 }3747 3748 if (!ExpectOrDiagAndSkipToEOD(tok::r_paren))3749 return std::nullopt;3750 3751 // Eat the ).3752 LexNonComment(CurTok);3753 3754 // C23 6.10.3.2p2: The token defined shall not appear within the constant3755 // expression.3756 if (EvaluatedDefined) {3757 Diag(CurTok, diag::err_defined_in_pp_embed);3758 return std::nullopt;3759 }3760 3761 if (LimitEvalResult.Value) {3762 const llvm::APSInt &Result = *LimitEvalResult.Value;3763 if (Result.isNegative()) {3764 Diag(CurTok, diag::err_requires_positive_value)3765 << toString(Result, 10) << /*positive*/ 0;3766 if (CurTok.isNot(EndTokenKind))3767 DiscardUntilEndOfDirective(CurTok);3768 return std::nullopt;3769 }3770 return Result.getLimitedValue();3771 }3772 return std::nullopt;3773 };3774 3775 auto GetMatchingCloseBracket = [](tok::TokenKind Kind) {3776 switch (Kind) {3777 case tok::l_paren:3778 return tok::r_paren;3779 case tok::l_brace:3780 return tok::r_brace;3781 case tok::l_square:3782 return tok::r_square;3783 default:3784 llvm_unreachable("should not get here");3785 }3786 };3787 3788 auto LexParenthesizedBalancedTokenSoup =3789 [&](llvm::SmallVectorImpl<Token> &Tokens) {3790 std::vector<std::pair<tok::TokenKind, SourceLocation>> BracketStack;3791 3792 // We expect the current token to be a left paren.3793 if (!ExpectOrDiagAndSkipToEOD(tok::l_paren))3794 return false;3795 LexNonComment(CurTok); // Eat the (3796 3797 bool WaitingForInnerCloseParen = false;3798 while (CurTok.isNot(tok::eod) &&3799 (WaitingForInnerCloseParen || CurTok.isNot(tok::r_paren))) {3800 switch (CurTok.getKind()) {3801 default: // Shutting up diagnostics about not fully-covered switch.3802 break;3803 case tok::l_paren:3804 WaitingForInnerCloseParen = true;3805 [[fallthrough]];3806 case tok::l_brace:3807 case tok::l_square:3808 BracketStack.push_back({CurTok.getKind(), CurTok.getLocation()});3809 break;3810 case tok::r_paren:3811 WaitingForInnerCloseParen = false;3812 [[fallthrough]];3813 case tok::r_brace:3814 case tok::r_square: {3815 if (BracketStack.empty()) {3816 ExpectOrDiagAndSkipToEOD(tok::r_paren);3817 return false;3818 }3819 tok::TokenKind Matching =3820 GetMatchingCloseBracket(BracketStack.back().first);3821 if (CurTok.getKind() != Matching) {3822 DiagMismatchedBracesAndSkipToEOD(Matching, BracketStack.back());3823 return false;3824 }3825 BracketStack.pop_back();3826 } break;3827 }3828 Tokens.push_back(CurTok);3829 LexNonComment(CurTok);3830 }3831 3832 // When we're done, we want to eat the closing paren.3833 if (!ExpectOrDiagAndSkipToEOD(tok::r_paren))3834 return false;3835 3836 LexNonComment(CurTok); // Eat the )3837 return true;3838 };3839 3840 LexNonComment(CurTok); // Prime the pump.3841 while (!CurTok.isOneOf(EndTokenKind, tok::eod)) {3842 SourceLocation ParamStartLoc = CurTok.getLocation();3843 std::optional<std::string> ParamName = LexPPParameterName();3844 if (!ParamName)3845 return std::nullopt;3846 StringRef Parameter = NormalizeParameterName(*ParamName);3847 3848 // Lex the parameters (dependent on the parameter type we want!).3849 //3850 // C23 6.10.3.Xp1: The X standard embed parameter may appear zero times or3851 // one time in the embed parameter sequence.3852 if (Parameter == "limit") {3853 if (Result.MaybeLimitParam)3854 Diag(CurTok, diag::err_pp_embed_dup_params) << Parameter;3855 3856 std::optional<size_t> Limit = LexParenthesizedIntegerExpr();3857 if (!Limit)3858 return std::nullopt;3859 Result.MaybeLimitParam =3860 PPEmbedParameterLimit{*Limit, {ParamStartLoc, CurTok.getLocation()}};3861 } else if (Parameter == "clang::offset") {3862 if (Result.MaybeOffsetParam)3863 Diag(CurTok, diag::err_pp_embed_dup_params) << Parameter;3864 3865 std::optional<size_t> Offset = LexParenthesizedIntegerExpr();3866 if (!Offset)3867 return std::nullopt;3868 Result.MaybeOffsetParam = PPEmbedParameterOffset{3869 *Offset, {ParamStartLoc, CurTok.getLocation()}};3870 } else if (Parameter == "prefix") {3871 if (Result.MaybePrefixParam)3872 Diag(CurTok, diag::err_pp_embed_dup_params) << Parameter;3873 3874 SmallVector<Token, 4> Soup;3875 if (!LexParenthesizedBalancedTokenSoup(Soup))3876 return std::nullopt;3877 Result.MaybePrefixParam = PPEmbedParameterPrefix{3878 std::move(Soup), {ParamStartLoc, CurTok.getLocation()}};3879 } else if (Parameter == "suffix") {3880 if (Result.MaybeSuffixParam)3881 Diag(CurTok, diag::err_pp_embed_dup_params) << Parameter;3882 3883 SmallVector<Token, 4> Soup;3884 if (!LexParenthesizedBalancedTokenSoup(Soup))3885 return std::nullopt;3886 Result.MaybeSuffixParam = PPEmbedParameterSuffix{3887 std::move(Soup), {ParamStartLoc, CurTok.getLocation()}};3888 } else if (Parameter == "if_empty") {3889 if (Result.MaybeIfEmptyParam)3890 Diag(CurTok, diag::err_pp_embed_dup_params) << Parameter;3891 3892 SmallVector<Token, 4> Soup;3893 if (!LexParenthesizedBalancedTokenSoup(Soup))3894 return std::nullopt;3895 Result.MaybeIfEmptyParam = PPEmbedParameterIfEmpty{3896 std::move(Soup), {ParamStartLoc, CurTok.getLocation()}};3897 } else {3898 ++Result.UnrecognizedParams;3899 3900 // If there's a left paren, we need to parse a balanced token sequence3901 // and just eat those tokens.3902 if (CurTok.is(tok::l_paren)) {3903 SmallVector<Token, 4> Soup;3904 if (!LexParenthesizedBalancedTokenSoup(Soup))3905 return std::nullopt;3906 }3907 if (!ForHasEmbed) {3908 Diag(ParamStartLoc, diag::err_pp_unknown_parameter) << 1 << Parameter;3909 if (CurTok.isNot(EndTokenKind))3910 DiscardUntilEndOfDirective(CurTok);3911 return std::nullopt;3912 }3913 }3914 }3915 return Result;3916}3917 3918void Preprocessor::HandleEmbedDirectiveImpl(3919 SourceLocation HashLoc, const LexEmbedParametersResult &Params,3920 StringRef BinaryContents, StringRef FileName) {3921 if (BinaryContents.empty()) {3922 // If we have no binary contents, the only thing we need to emit are the3923 // if_empty tokens, if any.3924 // FIXME: this loses AST fidelity; nothing in the compiler will see that3925 // these tokens came from #embed. We have to hack around this when printing3926 // preprocessed output. The same is true for prefix and suffix tokens.3927 if (Params.MaybeIfEmptyParam) {3928 ArrayRef<Token> Toks = Params.MaybeIfEmptyParam->Tokens;3929 size_t TokCount = Toks.size();3930 auto NewToks = std::make_unique<Token[]>(TokCount);3931 llvm::copy(Toks, NewToks.get());3932 EnterTokenStream(std::move(NewToks), TokCount, true, true);3933 }3934 return;3935 }3936 3937 size_t NumPrefixToks = Params.PrefixTokenCount(),3938 NumSuffixToks = Params.SuffixTokenCount();3939 size_t TotalNumToks = 1 + NumPrefixToks + NumSuffixToks;3940 size_t CurIdx = 0;3941 auto Toks = std::make_unique<Token[]>(TotalNumToks);3942 3943 // Add the prefix tokens, if any.3944 if (Params.MaybePrefixParam) {3945 llvm::copy(Params.MaybePrefixParam->Tokens, &Toks[CurIdx]);3946 CurIdx += NumPrefixToks;3947 }3948 3949 EmbedAnnotationData *Data = new (BP) EmbedAnnotationData;3950 Data->BinaryData = BinaryContents;3951 Data->FileName = FileName;3952 3953 Toks[CurIdx].startToken();3954 Toks[CurIdx].setKind(tok::annot_embed);3955 Toks[CurIdx].setAnnotationRange(HashLoc);3956 Toks[CurIdx++].setAnnotationValue(Data);3957 3958 // Now add the suffix tokens, if any.3959 if (Params.MaybeSuffixParam) {3960 llvm::copy(Params.MaybeSuffixParam->Tokens, &Toks[CurIdx]);3961 CurIdx += NumSuffixToks;3962 }3963 3964 assert(CurIdx == TotalNumToks && "Calculated the incorrect number of tokens");3965 EnterTokenStream(std::move(Toks), TotalNumToks, true, true);3966}3967 3968void Preprocessor::HandleEmbedDirective(SourceLocation HashLoc, Token &EmbedTok,3969 const FileEntry *LookupFromFile) {3970 // Give the usual extension/compatibility warnings.3971 if (LangOpts.C23)3972 Diag(EmbedTok, diag::warn_compat_pp_embed_directive);3973 else3974 Diag(EmbedTok, diag::ext_pp_embed_directive)3975 << (LangOpts.CPlusPlus ? /*Clang*/ 1 : /*C23*/ 0);3976 3977 // Parse the filename header3978 Token FilenameTok;3979 if (LexHeaderName(FilenameTok))3980 return;3981 3982 if (FilenameTok.isNot(tok::header_name)) {3983 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);3984 if (FilenameTok.isNot(tok::eod))3985 DiscardUntilEndOfDirective();3986 return;3987 }3988 3989 // Parse the optional sequence of3990 // directive-parameters:3991 // identifier parameter-name-list[opt] directive-argument-list[opt]3992 // directive-argument-list:3993 // '(' balanced-token-sequence ')'3994 // parameter-name-list:3995 // '::' identifier parameter-name-list[opt]3996 Token CurTok;3997 std::optional<LexEmbedParametersResult> Params =3998 LexEmbedParameters(CurTok, /*ForHasEmbed=*/false);3999 4000 assert((Params || CurTok.is(tok::eod)) &&4001 "expected success or to be at the end of the directive");4002 if (!Params)4003 return;4004 4005 // Now, splat the data out!4006 SmallString<128> FilenameBuffer;4007 StringRef Filename = getSpelling(FilenameTok, FilenameBuffer);4008 StringRef OriginalFilename = Filename;4009 bool isAngled =4010 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);4011 4012 // If GetIncludeFilenameSpelling set the start ptr to null, there was an4013 // error.4014 if (Filename.empty())4015 return;4016 4017 OptionalFileEntryRef MaybeFileRef =4018 this->LookupEmbedFile(Filename, isAngled, true, LookupFromFile);4019 if (!MaybeFileRef) {4020 // could not find file4021 if (Callbacks && Callbacks->EmbedFileNotFound(Filename)) {4022 return;4023 }4024 Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;4025 return;4026 }4027 4028 if (MaybeFileRef->isDeviceFile()) {4029 Diag(FilenameTok, diag::err_pp_embed_device_file) << Filename;4030 return;4031 }4032 4033 std::optional<llvm::MemoryBufferRef> MaybeFile =4034 getSourceManager().getMemoryBufferForFileOrNone(*MaybeFileRef);4035 if (!MaybeFile) {4036 // could not find file4037 Diag(FilenameTok, diag::err_cannot_open_file)4038 << Filename << "a buffer to the contents could not be created";4039 return;4040 }4041 StringRef BinaryContents = MaybeFile->getBuffer();4042 4043 // The order is important between 'offset' and 'limit'; we want to offset4044 // first and then limit second; otherwise we may reduce the notional resource4045 // size to something too small to offset into.4046 if (Params->MaybeOffsetParam) {4047 // FIXME: just like with the limit() and if_empty() parameters, this loses4048 // source fidelity in the AST; it has no idea that there was an offset4049 // involved.4050 // offsets all the way to the end of the file make for an empty file.4051 BinaryContents = BinaryContents.substr(Params->MaybeOffsetParam->Offset);4052 }4053 4054 if (Params->MaybeLimitParam) {4055 // FIXME: just like with the clang::offset() and if_empty() parameters,4056 // this loses source fidelity in the AST; it has no idea there was a limit4057 // involved.4058 BinaryContents = BinaryContents.substr(0, Params->MaybeLimitParam->Limit);4059 }4060 4061 if (Callbacks)4062 Callbacks->EmbedDirective(HashLoc, Filename, isAngled, MaybeFileRef,4063 *Params);4064 // getSpelling() may return a buffer from the token itself or it may use the4065 // SmallString buffer we provided. getSpelling() may also return a string that4066 // is actually longer than FilenameTok.getLength(), so we first pass a4067 // locally created buffer to getSpelling() to get the string of real length4068 // and then we allocate a long living buffer because the buffer we used4069 // previously will only live till the end of this function and we need4070 // filename info to live longer.4071 void *Mem = BP.Allocate(OriginalFilename.size(), alignof(char *));4072 memcpy(Mem, OriginalFilename.data(), OriginalFilename.size());4073 StringRef FilenameToGo =4074 StringRef(static_cast<char *>(Mem), OriginalFilename.size());4075 HandleEmbedDirectiveImpl(HashLoc, *Params, BinaryContents, FilenameToGo);4076}4077