xref: /freebsd/contrib/llvm-project/clang/lib/Lex/PPDirectives.cpp (revision e1c4c8dd8d2d10b6104f06856a77bd5b4813a801)
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// Implements # directive processing for the Preprocessor.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Basic/CharInfo.h"
15 #include "clang/Basic/DirectoryEntry.h"
16 #include "clang/Basic/FileManager.h"
17 #include "clang/Basic/IdentifierTable.h"
18 #include "clang/Basic/LangOptions.h"
19 #include "clang/Basic/Module.h"
20 #include "clang/Basic/SourceLocation.h"
21 #include "clang/Basic/SourceManager.h"
22 #include "clang/Basic/TokenKinds.h"
23 #include "clang/Lex/CodeCompletionHandler.h"
24 #include "clang/Lex/HeaderSearch.h"
25 #include "clang/Lex/HeaderSearchOptions.h"
26 #include "clang/Lex/LexDiagnostic.h"
27 #include "clang/Lex/LiteralSupport.h"
28 #include "clang/Lex/MacroInfo.h"
29 #include "clang/Lex/ModuleLoader.h"
30 #include "clang/Lex/ModuleMap.h"
31 #include "clang/Lex/PPCallbacks.h"
32 #include "clang/Lex/Pragma.h"
33 #include "clang/Lex/Preprocessor.h"
34 #include "clang/Lex/PreprocessorOptions.h"
35 #include "clang/Lex/Token.h"
36 #include "clang/Lex/VariadicMacroSupport.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/ADT/STLExtras.h"
39 #include "llvm/ADT/ScopeExit.h"
40 #include "llvm/ADT/SmallString.h"
41 #include "llvm/ADT/SmallVector.h"
42 #include "llvm/ADT/StringRef.h"
43 #include "llvm/ADT/StringSwitch.h"
44 #include "llvm/Support/AlignOf.h"
45 #include "llvm/Support/ErrorHandling.h"
46 #include "llvm/Support/Path.h"
47 #include "llvm/Support/SaveAndRestore.h"
48 #include <algorithm>
49 #include <cassert>
50 #include <cstring>
51 #include <new>
52 #include <optional>
53 #include <string>
54 #include <utility>
55 
56 using namespace clang;
57 
58 //===----------------------------------------------------------------------===//
59 // Utility Methods for Preprocessor Directive Handling.
60 //===----------------------------------------------------------------------===//
61 
62 MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
63   static_assert(std::is_trivially_destructible_v<MacroInfo>, "");
64   return new (BP) MacroInfo(L);
65 }
66 
67 DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
68                                                            SourceLocation Loc) {
69   return new (BP) DefMacroDirective(MI, Loc);
70 }
71 
72 UndefMacroDirective *
73 Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
74   return new (BP) UndefMacroDirective(UndefLoc);
75 }
76 
77 VisibilityMacroDirective *
78 Preprocessor::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 until
84 /// the tok::eod token is found.
85 SourceRange Preprocessor::DiscardUntilEndOfDirective() {
86   Token Tmp;
87   SourceRange Res;
88 
89   LexUnexpandedToken(Tmp);
90   Res.setBegin(Tmp.getLocation());
91   while (Tmp.isNot(tok::eod)) {
92     assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");
93     LexUnexpandedToken(Tmp);
94   }
95   Res.setEnd(Tmp.getLocation());
96   return Res;
97 }
98 
99 /// Enumerates possible cases of #define/#undef a reserved identifier.
100 enum MacroDiag {
101   MD_NoWarn,        //> Not a reserved identifier
102   MD_KeywordDef,    //> Macro hides keyword, enabled by default
103   MD_ReservedMacro  //> #define of #undef reserved id, disabled by default
104 };
105 
106 /// Enumerates possible %select values for the pp_err_elif_after_else and
107 /// pp_err_elif_without_if diagnostics.
108 enum PPElifDiag {
109   PED_Elif,
110   PED_Elifdef,
111   PED_Elifndef
112 };
113 
114 static bool isFeatureTestMacro(StringRef MacroName) {
115   // list from:
116   // * https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html
117   // * https://docs.microsoft.com/en-us/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-160
118   // * man 7 feature_test_macros
119   // 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 std::binary_search(std::begin(ReservedMacro), std::end(ReservedMacro),
152                             MacroName);
153 }
154 
155 static bool isLanguageDefinedBuiltin(const SourceManager &SourceMgr,
156                                      const MacroInfo *MI,
157                                      const StringRef MacroName) {
158   // If this is a macro with special handling (like __LINE__) then it's language
159   // defined.
160   if (MI->isBuiltinMacro())
161     return true;
162   // Builtin macros are defined in the builtin file
163   if (!SourceMgr.isWrittenInBuiltinFile(MI->getDefinitionLoc()))
164     return false;
165   // C defines macros starting with __STDC, and C++ defines macros starting with
166   // __STDCPP
167   if (MacroName.starts_with("__STDC"))
168     return true;
169   // C++ defines the __cplusplus macro
170   if (MacroName == "__cplusplus")
171     return true;
172   // C++ defines various feature-test macros starting with __cpp
173   if (MacroName.starts_with("__cpp"))
174     return true;
175   // Anything else isn't language-defined
176   return false;
177 }
178 
179 static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
180   const LangOptions &Lang = PP.getLangOpts();
181   StringRef Text = II->getName();
182   if (isReservedInAllContexts(II->isReserved(Lang)))
183     return isFeatureTestMacro(Text) ? MD_NoWarn : MD_ReservedMacro;
184   if (II->isKeyword(Lang))
185     return MD_KeywordDef;
186   if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
187     return MD_KeywordDef;
188   return MD_NoWarn;
189 }
190 
191 static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
192   const LangOptions &Lang = PP.getLangOpts();
193   // Do not warn on keyword undef.  It is generally harmless and widely used.
194   if (isReservedInAllContexts(II->isReserved(Lang)))
195     return MD_ReservedMacro;
196   return MD_NoWarn;
197 }
198 
199 // Return true if we want to issue a diagnostic by default if we
200 // encounter this name in a #include with the wrong case. For now,
201 // this includes the standard C and C++ headers, Posix headers,
202 // and Boost headers. Improper case for these #includes is a
203 // potential portability issue.
204 static bool warnByDefaultOnWrongCase(StringRef Include) {
205   // If the first component of the path is "boost", treat this like a standard header
206   // for the purposes of diagnostics.
207   if (::llvm::sys::path::begin(Include)->equals_insensitive("boost"))
208     return true;
209 
210   // "condition_variable" is the longest standard header name at 18 characters.
211   // If the include file name is longer than that, it can't be a standard header.
212   static const size_t MaxStdHeaderNameLen = 18u;
213   if (Include.size() > MaxStdHeaderNameLen)
214     return false;
215 
216   // Lowercase and normalize the search string.
217   SmallString<32> LowerInclude{Include};
218   for (char &Ch : LowerInclude) {
219     // In the ASCII range?
220     if (static_cast<unsigned char>(Ch) > 0x7f)
221       return false; // Can't be a standard header
222     // ASCII lowercase:
223     if (Ch >= 'A' && Ch <= 'Z')
224       Ch += 'a' - 'A';
225     // Normalize path separators for comparison purposes.
226     else if (::llvm::sys::path::is_separator(Ch))
227       Ch = '/';
228   }
229 
230   // The standard C/C++ and Posix headers
231   return llvm::StringSwitch<bool>(LowerInclude)
232     // C library headers
233     .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
234     .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
235     .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
236     .Cases("stdatomic.h", "stdbool.h", "stdckdint.h", "stddef.h", true)
237     .Cases("stdint.h", "stdio.h", "stdlib.h", "stdnoreturn.h", true)
238     .Cases("string.h", "tgmath.h", "threads.h", "time.h", "uchar.h", true)
239     .Cases("wchar.h", "wctype.h", true)
240 
241     // C++ headers for C library facilities
242     .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
243     .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
244     .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
245     .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
246     .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
247     .Case("cwctype", true)
248 
249     // C++ library headers
250     .Cases("algorithm", "fstream", "list", "regex", "thread", true)
251     .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
252     .Cases("atomic", "future", "map", "set", "type_traits", true)
253     .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
254     .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
255     .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
256     .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
257     .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
258     .Cases("deque", "istream", "queue", "string", "valarray", true)
259     .Cases("exception", "iterator", "random", "strstream", "vector", true)
260     .Cases("forward_list", "limits", "ratio", "system_error", true)
261 
262     // POSIX headers (which aren't also C headers)
263     .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
264     .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
265     .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
266     .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
267     .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
268     .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
269     .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
270     .Cases("sys/resource.h", "sys/select.h",  "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
271     .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
272     .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
273     .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
274     .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
275     .Default(false);
276 }
277 
278 /// Find a similar string in `Candidates`.
279 ///
280 /// \param LHS a string for a similar string in `Candidates`
281 ///
282 /// \param Candidates the candidates to find a similar string.
283 ///
284 /// \returns a similar string if exists. If no similar string exists,
285 /// returns std::nullopt.
286 static std::optional<StringRef>
287 findSimilarStr(StringRef LHS, const std::vector<StringRef> &Candidates) {
288   // We need to check if `Candidates` has the exact case-insensitive string
289   // because the Levenshtein distance match does not care about it.
290   for (StringRef C : Candidates) {
291     if (LHS.equals_insensitive(C)) {
292       return C;
293     }
294   }
295 
296   // Keep going with the Levenshtein distance match.
297   // If the LHS size is less than 3, use the LHS size minus 1 and if not,
298   // use the LHS size divided by 3.
299   size_t Length = LHS.size();
300   size_t MaxDist = Length < 3 ? Length - 1 : Length / 3;
301 
302   std::optional<std::pair<StringRef, size_t>> SimilarStr;
303   for (StringRef C : Candidates) {
304     size_t CurDist = LHS.edit_distance(C, true);
305     if (CurDist <= MaxDist) {
306       if (!SimilarStr) {
307         // The first similar string found.
308         SimilarStr = {C, CurDist};
309       } else if (CurDist < SimilarStr->second) {
310         // More similar string found.
311         SimilarStr = {C, CurDist};
312       }
313     }
314   }
315 
316   if (SimilarStr) {
317     return SimilarStr->first;
318   } else {
319     return std::nullopt;
320   }
321 }
322 
323 bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
324                                   bool *ShadowFlag) {
325   // Missing macro name?
326   if (MacroNameTok.is(tok::eod))
327     return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
328 
329   IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
330   if (!II)
331     return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
332 
333   if (II->isCPlusPlusOperatorKeyword()) {
334     // C++ 2.5p2: Alternative tokens behave the same as its primary token
335     // except for their spellings.
336     Diag(MacroNameTok, getLangOpts().MicrosoftExt
337                            ? diag::ext_pp_operator_used_as_macro_name
338                            : diag::err_pp_operator_used_as_macro_name)
339         << II << MacroNameTok.getKind();
340     // Allow #defining |and| and friends for Microsoft compatibility or
341     // recovery when legacy C headers are included in C++.
342   }
343 
344   if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
345     // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
346     return Diag(MacroNameTok, diag::err_defined_macro_name);
347   }
348 
349   // If defining/undefining reserved identifier or a keyword, we need to issue
350   // a warning.
351   SourceLocation MacroNameLoc = MacroNameTok.getLocation();
352   if (ShadowFlag)
353     *ShadowFlag = false;
354   if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
355       (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
356     MacroDiag D = MD_NoWarn;
357     if (isDefineUndef == MU_Define) {
358       D = shouldWarnOnMacroDef(*this, II);
359     }
360     else if (isDefineUndef == MU_Undef)
361       D = shouldWarnOnMacroUndef(*this, II);
362     if (D == MD_KeywordDef) {
363       // We do not want to warn on some patterns widely used in configuration
364       // scripts.  This requires analyzing next tokens, so do not issue warnings
365       // now, only inform caller.
366       if (ShadowFlag)
367         *ShadowFlag = true;
368     }
369     if (D == MD_ReservedMacro)
370       Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
371   }
372 
373   // Okay, we got a good identifier.
374   return false;
375 }
376 
377 /// Lex and validate a macro name, which occurs after a
378 /// \#define or \#undef.
379 ///
380 /// This sets the token kind to eod and discards the rest of the macro line if
381 /// the macro name is invalid.
382 ///
383 /// \param MacroNameTok Token that is expected to be a macro name.
384 /// \param isDefineUndef Context in which macro is used.
385 /// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
386 void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
387                                  bool *ShadowFlag) {
388   // Read the token, don't allow macro expansion on it.
389   LexUnexpandedToken(MacroNameTok);
390 
391   if (MacroNameTok.is(tok::code_completion)) {
392     if (CodeComplete)
393       CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
394     setCodeCompletionReached();
395     LexUnexpandedToken(MacroNameTok);
396   }
397 
398   if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
399     return;
400 
401   // Invalid macro name, read and discard the rest of the line and set the
402   // token kind to tok::eod if necessary.
403   if (MacroNameTok.isNot(tok::eod)) {
404     MacroNameTok.setKind(tok::eod);
405     DiscardUntilEndOfDirective();
406   }
407 }
408 
409 /// Ensure that the next token is a tok::eod token.
410 ///
411 /// If not, emit a diagnostic and consume up until the eod.  If EnableMacros is
412 /// true, then we consider macros that expand to zero tokens as being ok.
413 ///
414 /// Returns the location of the end of the directive.
415 SourceLocation Preprocessor::CheckEndOfDirective(const char *DirType,
416                                                  bool EnableMacros) {
417   Token Tmp;
418   // Lex unexpanded tokens for most directives: macros might expand to zero
419   // tokens, causing us to miss diagnosing invalid lines.  Some directives (like
420   // #line) allow empty macros.
421   if (EnableMacros)
422     Lex(Tmp);
423   else
424     LexUnexpandedToken(Tmp);
425 
426   // There should be no tokens after the directive, but we allow them as an
427   // extension.
428   while (Tmp.is(tok::comment))  // Skip comments in -C mode.
429     LexUnexpandedToken(Tmp);
430 
431   if (Tmp.is(tok::eod))
432     return Tmp.getLocation();
433 
434   // Add a fixit in GNU/C99/C++ mode.  Don't offer a fixit for strict-C89,
435   // or if this is a macro-style preprocessing directive, because it is more
436   // trouble than it is worth to insert /**/ and check that there is no /**/
437   // in the range also.
438   FixItHint Hint;
439   if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
440       !CurTokenLexer)
441     Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
442   Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
443   return DiscardUntilEndOfDirective().getEnd();
444 }
445 
446 void Preprocessor::SuggestTypoedDirective(const Token &Tok,
447                                           StringRef Directive) const {
448   // If this is a `.S` file, treat unknown # directives as non-preprocessor
449   // directives.
450   if (getLangOpts().AsmPreprocessor) return;
451 
452   std::vector<StringRef> Candidates = {
453       "if", "ifdef", "ifndef", "elif", "else", "endif"
454   };
455   if (LangOpts.C23 || LangOpts.CPlusPlus23)
456     Candidates.insert(Candidates.end(), {"elifdef", "elifndef"});
457 
458   if (std::optional<StringRef> Sugg = findSimilarStr(Directive, Candidates)) {
459     // Directive cannot be coming from macro.
460     assert(Tok.getLocation().isFileID());
461     CharSourceRange DirectiveRange = CharSourceRange::getCharRange(
462         Tok.getLocation(),
463         Tok.getLocation().getLocWithOffset(Directive.size()));
464     StringRef SuggValue = *Sugg;
465 
466     auto Hint = FixItHint::CreateReplacement(DirectiveRange, SuggValue);
467     Diag(Tok, diag::warn_pp_invalid_directive) << 1 << SuggValue << Hint;
468   }
469 }
470 
471 /// SkipExcludedConditionalBlock - We just read a \#if or related directive and
472 /// decided that the subsequent tokens are in the \#if'd out portion of the
473 /// file.  Lex the rest of the file, until we see an \#endif.  If
474 /// FoundNonSkipPortion is true, then we have already emitted code for part of
475 /// this \#if directive, so \#else/\#elif blocks should never be entered.
476 /// If ElseOk is true, then \#else directives are ok, if not, then we have
477 /// already seen one so a \#else directive is a duplicate.  When this returns,
478 /// the caller can lex the first valid token.
479 void Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
480                                                 SourceLocation IfTokenLoc,
481                                                 bool FoundNonSkipPortion,
482                                                 bool FoundElse,
483                                                 SourceLocation ElseLoc) {
484   // In SkippingRangeStateTy we are depending on SkipExcludedConditionalBlock()
485   // not getting called recursively by storing the RecordedSkippedRanges
486   // DenseMap lookup pointer (field SkipRangePtr). SkippingRangeStateTy expects
487   // that RecordedSkippedRanges won't get modified and SkipRangePtr won't be
488   // invalidated. If this changes and there is a need to call
489   // SkipExcludedConditionalBlock() recursively, SkippingRangeStateTy should
490   // change to do a second lookup in endLexPass function instead of reusing the
491   // lookup pointer.
492   assert(!SkippingExcludedConditionalBlock &&
493          "calling SkipExcludedConditionalBlock recursively");
494   llvm::SaveAndRestore SARSkipping(SkippingExcludedConditionalBlock, true);
495 
496   ++NumSkipped;
497   assert(!CurTokenLexer && "Conditional PP block cannot appear in a macro!");
498   assert(CurPPLexer && "Conditional PP block must be in a file!");
499   assert(CurLexer && "Conditional PP block but no current lexer set!");
500 
501   if (PreambleConditionalStack.reachedEOFWhileSkipping())
502     PreambleConditionalStack.clearSkipInfo();
503   else
504     CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/ false,
505                                      FoundNonSkipPortion, FoundElse);
506 
507   // Enter raw mode to disable identifier lookup (and thus macro expansion),
508   // disabling warnings, etc.
509   CurPPLexer->LexingRawMode = true;
510   Token Tok;
511   SourceLocation endLoc;
512 
513   /// Keeps track and caches skipped ranges and also retrieves a prior skipped
514   /// range if the same block is re-visited.
515   struct SkippingRangeStateTy {
516     Preprocessor &PP;
517 
518     const char *BeginPtr = nullptr;
519     unsigned *SkipRangePtr = nullptr;
520 
521     SkippingRangeStateTy(Preprocessor &PP) : PP(PP) {}
522 
523     void beginLexPass() {
524       if (BeginPtr)
525         return; // continue skipping a block.
526 
527       // Initiate a skipping block and adjust the lexer if we already skipped it
528       // before.
529       BeginPtr = PP.CurLexer->getBufferLocation();
530       SkipRangePtr = &PP.RecordedSkippedRanges[BeginPtr];
531       if (*SkipRangePtr) {
532         PP.CurLexer->seek(PP.CurLexer->getCurrentBufferOffset() + *SkipRangePtr,
533                           /*IsAtStartOfLine*/ true);
534       }
535     }
536 
537     void endLexPass(const char *Hashptr) {
538       if (!BeginPtr) {
539         // Not doing normal lexing.
540         assert(PP.CurLexer->isDependencyDirectivesLexer());
541         return;
542       }
543 
544       // Finished skipping a block, record the range if it's first time visited.
545       if (!*SkipRangePtr) {
546         *SkipRangePtr = Hashptr - BeginPtr;
547       }
548       assert(*SkipRangePtr == Hashptr - BeginPtr);
549       BeginPtr = nullptr;
550       SkipRangePtr = nullptr;
551     }
552   } SkippingRangeState(*this);
553 
554   while (true) {
555     if (CurLexer->isDependencyDirectivesLexer()) {
556       CurLexer->LexDependencyDirectiveTokenWhileSkipping(Tok);
557     } else {
558       SkippingRangeState.beginLexPass();
559       while (true) {
560         CurLexer->Lex(Tok);
561 
562         if (Tok.is(tok::code_completion)) {
563           setCodeCompletionReached();
564           if (CodeComplete)
565             CodeComplete->CodeCompleteInConditionalExclusion();
566           continue;
567         }
568 
569         // If this is the end of the buffer, we have an error.
570         if (Tok.is(tok::eof)) {
571           // We don't emit errors for unterminated conditionals here,
572           // Lexer::LexEndOfFile can do that properly.
573           // Just return and let the caller lex after this #include.
574           if (PreambleConditionalStack.isRecording())
575             PreambleConditionalStack.SkipInfo.emplace(HashTokenLoc, IfTokenLoc,
576                                                       FoundNonSkipPortion,
577                                                       FoundElse, ElseLoc);
578           break;
579         }
580 
581         // If this token is not a preprocessor directive, just skip it.
582         if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
583           continue;
584 
585         break;
586       }
587     }
588     if (Tok.is(tok::eof))
589       break;
590 
591     // We just parsed a # character at the start of a line, so we're in
592     // directive mode.  Tell the lexer this so any newlines we see will be
593     // converted into an EOD token (this terminates the macro).
594     CurPPLexer->ParsingPreprocessorDirective = true;
595     if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
596 
597     assert(Tok.is(tok::hash));
598     const char *Hashptr = CurLexer->getBufferLocation() - Tok.getLength();
599     assert(CurLexer->getSourceLocation(Hashptr) == Tok.getLocation());
600 
601     // Read the next token, the directive flavor.
602     LexUnexpandedToken(Tok);
603 
604     // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
605     // something bogus), skip it.
606     if (Tok.isNot(tok::raw_identifier)) {
607       CurPPLexer->ParsingPreprocessorDirective = false;
608       // Restore comment saving mode.
609       if (CurLexer) CurLexer->resetExtendedTokenMode();
610       continue;
611     }
612 
613     // If the first letter isn't i or e, it isn't intesting to us.  We know that
614     // this is safe in the face of spelling differences, because there is no way
615     // to spell an i/e in a strange way that is another letter.  Skipping this
616     // allows us to avoid looking up the identifier info for #define/#undef and
617     // other common directives.
618     StringRef RI = Tok.getRawIdentifier();
619 
620     char FirstChar = RI[0];
621     if (FirstChar >= 'a' && FirstChar <= 'z' &&
622         FirstChar != 'i' && FirstChar != 'e') {
623       CurPPLexer->ParsingPreprocessorDirective = false;
624       // Restore comment saving mode.
625       if (CurLexer) CurLexer->resetExtendedTokenMode();
626       continue;
627     }
628 
629     // Get the identifier name without trigraphs or embedded newlines.  Note
630     // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
631     // when skipping.
632     char DirectiveBuf[20];
633     StringRef Directive;
634     if (!Tok.needsCleaning() && RI.size() < 20) {
635       Directive = RI;
636     } else {
637       std::string DirectiveStr = getSpelling(Tok);
638       size_t IdLen = DirectiveStr.size();
639       if (IdLen >= 20) {
640         CurPPLexer->ParsingPreprocessorDirective = false;
641         // Restore comment saving mode.
642         if (CurLexer) CurLexer->resetExtendedTokenMode();
643         continue;
644       }
645       memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
646       Directive = StringRef(DirectiveBuf, IdLen);
647     }
648 
649     if (Directive.starts_with("if")) {
650       StringRef Sub = Directive.substr(2);
651       if (Sub.empty() ||   // "if"
652           Sub == "def" ||   // "ifdef"
653           Sub == "ndef") {  // "ifndef"
654         // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
655         // bother parsing the condition.
656         DiscardUntilEndOfDirective();
657         CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
658                                        /*foundnonskip*/false,
659                                        /*foundelse*/false);
660       } else {
661         SuggestTypoedDirective(Tok, Directive);
662       }
663     } else if (Directive[0] == 'e') {
664       StringRef Sub = Directive.substr(1);
665       if (Sub == "ndif") {  // "endif"
666         PPConditionalInfo CondInfo;
667         CondInfo.WasSkipping = true; // Silence bogus warning.
668         bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
669         (void)InCond;  // Silence warning in no-asserts mode.
670         assert(!InCond && "Can't be skipping if not in a conditional!");
671 
672         // If we popped the outermost skipping block, we're done skipping!
673         if (!CondInfo.WasSkipping) {
674           SkippingRangeState.endLexPass(Hashptr);
675           // Restore the value of LexingRawMode so that trailing comments
676           // are handled correctly, if we've reached the outermost block.
677           CurPPLexer->LexingRawMode = false;
678           endLoc = CheckEndOfDirective("endif");
679           CurPPLexer->LexingRawMode = true;
680           if (Callbacks)
681             Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
682           break;
683         } else {
684           DiscardUntilEndOfDirective();
685         }
686       } else if (Sub == "lse") { // "else".
687         // #else directive in a skipping conditional.  If not in some other
688         // skipping conditional, and if #else hasn't already been seen, enter it
689         // as a non-skipping conditional.
690         PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
691 
692         if (!CondInfo.WasSkipping)
693           SkippingRangeState.endLexPass(Hashptr);
694 
695         // If this is a #else with a #else before it, report the error.
696         if (CondInfo.FoundElse)
697           Diag(Tok, diag::pp_err_else_after_else);
698 
699         // Note that we've seen a #else in this conditional.
700         CondInfo.FoundElse = true;
701 
702         // If the conditional is at the top level, and the #if block wasn't
703         // entered, enter the #else block now.
704         if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
705           CondInfo.FoundNonSkip = true;
706           // Restore the value of LexingRawMode so that trailing comments
707           // are handled correctly.
708           CurPPLexer->LexingRawMode = false;
709           endLoc = CheckEndOfDirective("else");
710           CurPPLexer->LexingRawMode = true;
711           if (Callbacks)
712             Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
713           break;
714         } else {
715           DiscardUntilEndOfDirective();  // C99 6.10p4.
716         }
717       } else if (Sub == "lif") {  // "elif".
718         PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
719 
720         if (!CondInfo.WasSkipping)
721           SkippingRangeState.endLexPass(Hashptr);
722 
723         // If this is a #elif with a #else before it, report the error.
724         if (CondInfo.FoundElse)
725           Diag(Tok, diag::pp_err_elif_after_else) << PED_Elif;
726 
727         // If this is in a skipping block or if we're already handled this #if
728         // block, don't bother parsing the condition.
729         if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
730           // FIXME: We should probably do at least some minimal parsing of the
731           // condition to verify that it is well-formed. The current state
732           // allows #elif* directives with completely malformed (or missing)
733           // conditions.
734           DiscardUntilEndOfDirective();
735         } else {
736           // Restore the value of LexingRawMode so that identifiers are
737           // looked up, etc, inside the #elif expression.
738           assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
739           CurPPLexer->LexingRawMode = false;
740           IdentifierInfo *IfNDefMacro = nullptr;
741           DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
742           // Stop if Lexer became invalid after hitting code completion token.
743           if (!CurPPLexer)
744             return;
745           const bool CondValue = DER.Conditional;
746           CurPPLexer->LexingRawMode = true;
747           if (Callbacks) {
748             Callbacks->Elif(
749                 Tok.getLocation(), DER.ExprRange,
750                 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False),
751                 CondInfo.IfLoc);
752           }
753           // If this condition is true, enter it!
754           if (CondValue) {
755             CondInfo.FoundNonSkip = true;
756             break;
757           }
758         }
759       } else if (Sub == "lifdef" ||  // "elifdef"
760                  Sub == "lifndef") { // "elifndef"
761         bool IsElifDef = Sub == "lifdef";
762         PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
763         Token DirectiveToken = Tok;
764 
765         if (!CondInfo.WasSkipping)
766           SkippingRangeState.endLexPass(Hashptr);
767 
768         // Warn if using `#elifdef` & `#elifndef` in not C23 & C++23 mode even
769         // if this branch is in a skipping block.
770         unsigned DiagID;
771         if (LangOpts.CPlusPlus)
772           DiagID = LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_pp_directive
773                                         : diag::ext_cxx23_pp_directive;
774         else
775           DiagID = LangOpts.C23 ? diag::warn_c23_compat_pp_directive
776                                 : diag::ext_c23_pp_directive;
777         Diag(Tok, DiagID) << (IsElifDef ? PED_Elifdef : PED_Elifndef);
778 
779         // If this is a #elif with a #else before it, report the error.
780         if (CondInfo.FoundElse)
781           Diag(Tok, diag::pp_err_elif_after_else)
782               << (IsElifDef ? PED_Elifdef : PED_Elifndef);
783 
784         // If this is in a skipping block or if we're already handled this #if
785         // block, don't bother parsing the condition.
786         if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
787           // FIXME: We should probably do at least some minimal parsing of the
788           // condition to verify that it is well-formed. The current state
789           // allows #elif* directives with completely malformed (or missing)
790           // conditions.
791           DiscardUntilEndOfDirective();
792         } else {
793           // Restore the value of LexingRawMode so that identifiers are
794           // looked up, etc, inside the #elif[n]def expression.
795           assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
796           CurPPLexer->LexingRawMode = false;
797           Token MacroNameTok;
798           ReadMacroName(MacroNameTok);
799           CurPPLexer->LexingRawMode = true;
800 
801           // If the macro name token is tok::eod, there was an error that was
802           // already reported.
803           if (MacroNameTok.is(tok::eod)) {
804             // Skip code until we get to #endif.  This helps with recovery by
805             // not emitting an error when the #endif is reached.
806             continue;
807           }
808 
809           emitMacroExpansionWarnings(MacroNameTok);
810 
811           CheckEndOfDirective(IsElifDef ? "elifdef" : "elifndef");
812 
813           IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
814           auto MD = getMacroDefinition(MII);
815           MacroInfo *MI = MD.getMacroInfo();
816 
817           if (Callbacks) {
818             if (IsElifDef) {
819               Callbacks->Elifdef(DirectiveToken.getLocation(), MacroNameTok,
820                                  MD);
821             } else {
822               Callbacks->Elifndef(DirectiveToken.getLocation(), MacroNameTok,
823                                   MD);
824             }
825           }
826           // If this condition is true, enter it!
827           if (static_cast<bool>(MI) == IsElifDef) {
828             CondInfo.FoundNonSkip = true;
829             break;
830           }
831         }
832       } else {
833         SuggestTypoedDirective(Tok, Directive);
834       }
835     } else {
836       SuggestTypoedDirective(Tok, Directive);
837     }
838 
839     CurPPLexer->ParsingPreprocessorDirective = false;
840     // Restore comment saving mode.
841     if (CurLexer) CurLexer->resetExtendedTokenMode();
842   }
843 
844   // Finally, if we are out of the conditional (saw an #endif or ran off the end
845   // of the file, just stop skipping and return to lexing whatever came after
846   // the #if block.
847   CurPPLexer->LexingRawMode = false;
848 
849   // The last skipped range isn't actually skipped yet if it's truncated
850   // by the end of the preamble; we'll resume parsing after the preamble.
851   if (Callbacks && (Tok.isNot(tok::eof) || !isRecordingPreamble()))
852     Callbacks->SourceRangeSkipped(
853         SourceRange(HashTokenLoc, endLoc.isValid()
854                                       ? endLoc
855                                       : CurPPLexer->getSourceLocation()),
856         Tok.getLocation());
857 }
858 
859 Module *Preprocessor::getModuleForLocation(SourceLocation Loc,
860                                            bool AllowTextual) {
861   if (!SourceMgr.isInMainFile(Loc)) {
862     // Try to determine the module of the include directive.
863     // FIXME: Look into directly passing the FileEntry from LookupFile instead.
864     FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
865     if (auto EntryOfIncl = SourceMgr.getFileEntryRefForID(IDOfIncl)) {
866       // The include comes from an included file.
867       return HeaderInfo.getModuleMap()
868           .findModuleForHeader(*EntryOfIncl, AllowTextual)
869           .getModule();
870     }
871   }
872 
873   // This is either in the main file or not in a file at all. It belongs
874   // to the current module, if there is one.
875   return getLangOpts().CurrentModule.empty()
876              ? nullptr
877              : HeaderInfo.lookupModule(getLangOpts().CurrentModule, Loc);
878 }
879 
880 OptionalFileEntryRef
881 Preprocessor::getHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
882                                                SourceLocation Loc) {
883   Module *IncM = getModuleForLocation(
884       IncLoc, LangOpts.ModulesValidateTextualHeaderIncludes);
885 
886   // Walk up through the include stack, looking through textual headers of M
887   // until we hit a non-textual header that we can #include. (We assume textual
888   // headers of a module with non-textual headers aren't meant to be used to
889   // import entities from the module.)
890   auto &SM = getSourceManager();
891   while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
892     auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
893     auto FE = SM.getFileEntryRefForID(ID);
894     if (!FE)
895       break;
896 
897     // We want to find all possible modules that might contain this header, so
898     // search all enclosing directories for module maps and load them.
899     HeaderInfo.hasModuleMap(FE->getName(), /*Root*/ nullptr,
900                             SourceMgr.isInSystemHeader(Loc));
901 
902     bool InPrivateHeader = false;
903     for (auto Header : HeaderInfo.findAllModulesForHeader(*FE)) {
904       if (!Header.isAccessibleFrom(IncM)) {
905         // It's in a private header; we can't #include it.
906         // FIXME: If there's a public header in some module that re-exports it,
907         // then we could suggest including that, but it's not clear that's the
908         // expected way to make this entity visible.
909         InPrivateHeader = true;
910         continue;
911       }
912 
913       // Don't suggest explicitly excluded headers.
914       if (Header.getRole() == ModuleMap::ExcludedHeader)
915         continue;
916 
917       // We'll suggest including textual headers below if they're
918       // include-guarded.
919       if (Header.getRole() & ModuleMap::TextualHeader)
920         continue;
921 
922       // If we have a module import syntax, we shouldn't include a header to
923       // make a particular module visible. Let the caller know they should
924       // suggest an import instead.
925       if (getLangOpts().ObjC || getLangOpts().CPlusPlusModules)
926         return std::nullopt;
927 
928       // If this is an accessible, non-textual header of M's top-level module
929       // that transitively includes the given location and makes the
930       // corresponding module visible, this is the thing to #include.
931       return *FE;
932     }
933 
934     // FIXME: If we're bailing out due to a private header, we shouldn't suggest
935     // an import either.
936     if (InPrivateHeader)
937       return std::nullopt;
938 
939     // If the header is includable and has an include guard, assume the
940     // intended way to expose its contents is by #include, not by importing a
941     // module that transitively includes it.
942     if (getHeaderSearchInfo().isFileMultipleIncludeGuarded(*FE))
943       return *FE;
944 
945     Loc = SM.getIncludeLoc(ID);
946   }
947 
948   return std::nullopt;
949 }
950 
951 OptionalFileEntryRef Preprocessor::LookupFile(
952     SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
953     ConstSearchDirIterator FromDir, const FileEntry *FromFile,
954     ConstSearchDirIterator *CurDirArg, SmallVectorImpl<char> *SearchPath,
955     SmallVectorImpl<char> *RelativePath,
956     ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped,
957     bool *IsFrameworkFound, bool SkipCache, bool OpenFile, bool CacheFailures) {
958   ConstSearchDirIterator CurDirLocal = nullptr;
959   ConstSearchDirIterator &CurDir = CurDirArg ? *CurDirArg : CurDirLocal;
960 
961   Module *RequestingModule = getModuleForLocation(
962       FilenameLoc, LangOpts.ModulesValidateTextualHeaderIncludes);
963 
964   // If the header lookup mechanism may be relative to the current inclusion
965   // stack, record the parent #includes.
966   SmallVector<std::pair<OptionalFileEntryRef, DirectoryEntryRef>, 16> Includers;
967   bool BuildSystemModule = false;
968   if (!FromDir && !FromFile) {
969     FileID FID = getCurrentFileLexer()->getFileID();
970     OptionalFileEntryRef FileEnt = SourceMgr.getFileEntryRefForID(FID);
971 
972     // If there is no file entry associated with this file, it must be the
973     // predefines buffer or the module includes buffer. Any other file is not
974     // lexed with a normal lexer, so it won't be scanned for preprocessor
975     // directives.
976     //
977     // If we have the predefines buffer, resolve #include references (which come
978     // from the -include command line argument) from the current working
979     // directory instead of relative to the main file.
980     //
981     // If we have the module includes buffer, resolve #include references (which
982     // come from header declarations in the module map) relative to the module
983     // map file.
984     if (!FileEnt) {
985       if (FID == SourceMgr.getMainFileID() && MainFileDir) {
986         auto IncludeDir =
987             HeaderInfo.getModuleMap().shouldImportRelativeToBuiltinIncludeDir(
988                 Filename, getCurrentModule())
989                 ? HeaderInfo.getModuleMap().getBuiltinDir()
990                 : MainFileDir;
991         Includers.push_back(std::make_pair(std::nullopt, *IncludeDir));
992         BuildSystemModule = getCurrentModule()->IsSystem;
993       } else if ((FileEnt = SourceMgr.getFileEntryRefForID(
994                       SourceMgr.getMainFileID()))) {
995         auto CWD = FileMgr.getOptionalDirectoryRef(".");
996         Includers.push_back(std::make_pair(*FileEnt, *CWD));
997       }
998     } else {
999       Includers.push_back(std::make_pair(*FileEnt, FileEnt->getDir()));
1000     }
1001 
1002     // MSVC searches the current include stack from top to bottom for
1003     // headers included by quoted include directives.
1004     // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
1005     if (LangOpts.MSVCCompat && !isAngled) {
1006       for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
1007         if (IsFileLexer(ISEntry))
1008           if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
1009             Includers.push_back(std::make_pair(*FileEnt, FileEnt->getDir()));
1010       }
1011     }
1012   }
1013 
1014   CurDir = CurDirLookup;
1015 
1016   if (FromFile) {
1017     // We're supposed to start looking from after a particular file. Search
1018     // the include path until we find that file or run out of files.
1019     ConstSearchDirIterator TmpCurDir = CurDir;
1020     ConstSearchDirIterator TmpFromDir = nullptr;
1021     while (OptionalFileEntryRef FE = HeaderInfo.LookupFile(
1022                Filename, FilenameLoc, isAngled, TmpFromDir, &TmpCurDir,
1023                Includers, SearchPath, RelativePath, RequestingModule,
1024                SuggestedModule, /*IsMapped=*/nullptr,
1025                /*IsFrameworkFound=*/nullptr, SkipCache)) {
1026       // Keep looking as if this file did a #include_next.
1027       TmpFromDir = TmpCurDir;
1028       ++TmpFromDir;
1029       if (&FE->getFileEntry() == FromFile) {
1030         // Found it.
1031         FromDir = TmpFromDir;
1032         CurDir = TmpCurDir;
1033         break;
1034       }
1035     }
1036   }
1037 
1038   // Do a standard file entry lookup.
1039   OptionalFileEntryRef FE = HeaderInfo.LookupFile(
1040       Filename, FilenameLoc, isAngled, FromDir, &CurDir, Includers, SearchPath,
1041       RelativePath, RequestingModule, SuggestedModule, IsMapped,
1042       IsFrameworkFound, SkipCache, BuildSystemModule, OpenFile, CacheFailures);
1043   if (FE)
1044     return FE;
1045 
1046   OptionalFileEntryRef CurFileEnt;
1047   // Otherwise, see if this is a subframework header.  If so, this is relative
1048   // to one of the headers on the #include stack.  Walk the list of the current
1049   // headers on the #include stack and pass them to HeaderInfo.
1050   if (IsFileLexer()) {
1051     if ((CurFileEnt = CurPPLexer->getFileEntry())) {
1052       if (OptionalFileEntryRef FE = HeaderInfo.LookupSubframeworkHeader(
1053               Filename, *CurFileEnt, SearchPath, RelativePath, RequestingModule,
1054               SuggestedModule)) {
1055         return FE;
1056       }
1057     }
1058   }
1059 
1060   for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
1061     if (IsFileLexer(ISEntry)) {
1062       if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
1063         if (OptionalFileEntryRef FE = HeaderInfo.LookupSubframeworkHeader(
1064                 Filename, *CurFileEnt, SearchPath, RelativePath,
1065                 RequestingModule, SuggestedModule)) {
1066           return FE;
1067         }
1068       }
1069     }
1070   }
1071 
1072   // Otherwise, we really couldn't find the file.
1073   return std::nullopt;
1074 }
1075 
1076 //===----------------------------------------------------------------------===//
1077 // Preprocessor Directive Handling.
1078 //===----------------------------------------------------------------------===//
1079 
1080 class Preprocessor::ResetMacroExpansionHelper {
1081 public:
1082   ResetMacroExpansionHelper(Preprocessor *pp)
1083     : PP(pp), save(pp->DisableMacroExpansion) {
1084     if (pp->MacroExpansionInDirectivesOverride)
1085       pp->DisableMacroExpansion = false;
1086   }
1087 
1088   ~ResetMacroExpansionHelper() {
1089     PP->DisableMacroExpansion = save;
1090   }
1091 
1092 private:
1093   Preprocessor *PP;
1094   bool save;
1095 };
1096 
1097 /// Process a directive while looking for the through header or a #pragma
1098 /// hdrstop. The following directives are handled:
1099 /// #include (to check if it is the through header)
1100 /// #define (to warn about macros that don't match the PCH)
1101 /// #pragma (to check for pragma hdrstop).
1102 /// All other directives are completely discarded.
1103 void Preprocessor::HandleSkippedDirectiveWhileUsingPCH(Token &Result,
1104                                                        SourceLocation HashLoc) {
1105   if (const IdentifierInfo *II = Result.getIdentifierInfo()) {
1106     if (II->getPPKeywordID() == tok::pp_define) {
1107       return HandleDefineDirective(Result,
1108                                    /*ImmediatelyAfterHeaderGuard=*/false);
1109     }
1110     if (SkippingUntilPCHThroughHeader &&
1111         II->getPPKeywordID() == tok::pp_include) {
1112       return HandleIncludeDirective(HashLoc, Result);
1113     }
1114     if (SkippingUntilPragmaHdrStop && II->getPPKeywordID() == tok::pp_pragma) {
1115       Lex(Result);
1116       auto *II = Result.getIdentifierInfo();
1117       if (II && II->getName() == "hdrstop")
1118         return HandlePragmaHdrstop(Result);
1119     }
1120   }
1121   DiscardUntilEndOfDirective();
1122 }
1123 
1124 /// HandleDirective - This callback is invoked when the lexer sees a # token
1125 /// at the start of a line.  This consumes the directive, modifies the
1126 /// lexer/preprocessor state, and advances the lexer(s) so that the next token
1127 /// read is the correct one.
1128 void Preprocessor::HandleDirective(Token &Result) {
1129   // FIXME: Traditional: # with whitespace before it not recognized by K&R?
1130 
1131   // We just parsed a # character at the start of a line, so we're in directive
1132   // mode.  Tell the lexer this so any newlines we see will be converted into an
1133   // EOD token (which terminates the directive).
1134   CurPPLexer->ParsingPreprocessorDirective = true;
1135   if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
1136 
1137   bool ImmediatelyAfterTopLevelIfndef =
1138       CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
1139   CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
1140 
1141   ++NumDirectives;
1142 
1143   // We are about to read a token.  For the multiple-include optimization FA to
1144   // work, we have to remember if we had read any tokens *before* this
1145   // pp-directive.
1146   bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
1147 
1148   // Save the '#' token in case we need to return it later.
1149   Token SavedHash = Result;
1150 
1151   // Read the next token, the directive flavor.  This isn't expanded due to
1152   // C99 6.10.3p8.
1153   LexUnexpandedToken(Result);
1154 
1155   // C99 6.10.3p11: Is this preprocessor directive in macro invocation?  e.g.:
1156   //   #define A(x) #x
1157   //   A(abc
1158   //     #warning blah
1159   //   def)
1160   // If so, the user is relying on undefined behavior, emit a diagnostic. Do
1161   // not support this for #include-like directives, since that can result in
1162   // terrible diagnostics, and does not work in GCC.
1163   if (InMacroArgs) {
1164     if (IdentifierInfo *II = Result.getIdentifierInfo()) {
1165       switch (II->getPPKeywordID()) {
1166       case tok::pp_include:
1167       case tok::pp_import:
1168       case tok::pp_include_next:
1169       case tok::pp___include_macros:
1170       case tok::pp_pragma:
1171         Diag(Result, diag::err_embedded_directive) << II->getName();
1172         Diag(*ArgMacro, diag::note_macro_expansion_here)
1173             << ArgMacro->getIdentifierInfo();
1174         DiscardUntilEndOfDirective();
1175         return;
1176       default:
1177         break;
1178       }
1179     }
1180     Diag(Result, diag::ext_embedded_directive);
1181   }
1182 
1183   // Temporarily enable macro expansion if set so
1184   // and reset to previous state when returning from this function.
1185   ResetMacroExpansionHelper helper(this);
1186 
1187   if (SkippingUntilPCHThroughHeader || SkippingUntilPragmaHdrStop)
1188     return HandleSkippedDirectiveWhileUsingPCH(Result, SavedHash.getLocation());
1189 
1190   switch (Result.getKind()) {
1191   case tok::eod:
1192     // Ignore the null directive with regards to the multiple-include
1193     // optimization, i.e. allow the null directive to appear outside of the
1194     // include guard and still enable the multiple-include optimization.
1195     CurPPLexer->MIOpt.SetReadToken(ReadAnyTokensBeforeDirective);
1196     return;   // null directive.
1197   case tok::code_completion:
1198     setCodeCompletionReached();
1199     if (CodeComplete)
1200       CodeComplete->CodeCompleteDirective(
1201                                     CurPPLexer->getConditionalStackDepth() > 0);
1202     return;
1203   case tok::numeric_constant:  // # 7  GNU line marker directive.
1204     // In a .S file "# 4" may be a comment so don't treat it as a preprocessor
1205     // directive. However do permit it in the predefines file, as we use line
1206     // markers to mark the builtin macros as being in a system header.
1207     if (getLangOpts().AsmPreprocessor &&
1208         SourceMgr.getFileID(SavedHash.getLocation()) != getPredefinesFileID())
1209       break;
1210     return HandleDigitDirective(Result);
1211   default:
1212     IdentifierInfo *II = Result.getIdentifierInfo();
1213     if (!II) break; // Not an identifier.
1214 
1215     // Ask what the preprocessor keyword ID is.
1216     switch (II->getPPKeywordID()) {
1217     default: break;
1218     // C99 6.10.1 - Conditional Inclusion.
1219     case tok::pp_if:
1220       return HandleIfDirective(Result, SavedHash, ReadAnyTokensBeforeDirective);
1221     case tok::pp_ifdef:
1222       return HandleIfdefDirective(Result, SavedHash, false,
1223                                   true /*not valid for miopt*/);
1224     case tok::pp_ifndef:
1225       return HandleIfdefDirective(Result, SavedHash, true,
1226                                   ReadAnyTokensBeforeDirective);
1227     case tok::pp_elif:
1228     case tok::pp_elifdef:
1229     case tok::pp_elifndef:
1230       return HandleElifFamilyDirective(Result, SavedHash, II->getPPKeywordID());
1231 
1232     case tok::pp_else:
1233       return HandleElseDirective(Result, SavedHash);
1234     case tok::pp_endif:
1235       return HandleEndifDirective(Result);
1236 
1237     // C99 6.10.2 - Source File Inclusion.
1238     case tok::pp_include:
1239       // Handle #include.
1240       return HandleIncludeDirective(SavedHash.getLocation(), Result);
1241     case tok::pp___include_macros:
1242       // Handle -imacros.
1243       return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
1244 
1245     // C99 6.10.3 - Macro Replacement.
1246     case tok::pp_define:
1247       return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
1248     case tok::pp_undef:
1249       return HandleUndefDirective();
1250 
1251     // C99 6.10.4 - Line Control.
1252     case tok::pp_line:
1253       return HandleLineDirective();
1254 
1255     // C99 6.10.5 - Error Directive.
1256     case tok::pp_error:
1257       return HandleUserDiagnosticDirective(Result, false);
1258 
1259     // C99 6.10.6 - Pragma Directive.
1260     case tok::pp_pragma:
1261       return HandlePragmaDirective({PIK_HashPragma, SavedHash.getLocation()});
1262 
1263     // GNU Extensions.
1264     case tok::pp_import:
1265       return HandleImportDirective(SavedHash.getLocation(), Result);
1266     case tok::pp_include_next:
1267       return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
1268 
1269     case tok::pp_warning:
1270       if (LangOpts.CPlusPlus)
1271         Diag(Result, LangOpts.CPlusPlus23
1272                          ? diag::warn_cxx23_compat_warning_directive
1273                          : diag::ext_pp_warning_directive)
1274             << /*C++23*/ 1;
1275       else
1276         Diag(Result, LangOpts.C23 ? diag::warn_c23_compat_warning_directive
1277                                   : diag::ext_pp_warning_directive)
1278             << /*C23*/ 0;
1279 
1280       return HandleUserDiagnosticDirective(Result, true);
1281     case tok::pp_ident:
1282       return HandleIdentSCCSDirective(Result);
1283     case tok::pp_sccs:
1284       return HandleIdentSCCSDirective(Result);
1285     case tok::pp_assert:
1286       //isExtension = true;  // FIXME: implement #assert
1287       break;
1288     case tok::pp_unassert:
1289       //isExtension = true;  // FIXME: implement #unassert
1290       break;
1291 
1292     case tok::pp___public_macro:
1293       if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)
1294         return HandleMacroPublicDirective(Result);
1295       break;
1296 
1297     case tok::pp___private_macro:
1298       if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)
1299         return HandleMacroPrivateDirective();
1300       break;
1301     }
1302     break;
1303   }
1304 
1305   // If this is a .S file, treat unknown # directives as non-preprocessor
1306   // directives.  This is important because # may be a comment or introduce
1307   // various pseudo-ops.  Just return the # token and push back the following
1308   // token to be lexed next time.
1309   if (getLangOpts().AsmPreprocessor) {
1310     auto Toks = std::make_unique<Token[]>(2);
1311     // Return the # and the token after it.
1312     Toks[0] = SavedHash;
1313     Toks[1] = Result;
1314 
1315     // If the second token is a hashhash token, then we need to translate it to
1316     // unknown so the token lexer doesn't try to perform token pasting.
1317     if (Result.is(tok::hashhash))
1318       Toks[1].setKind(tok::unknown);
1319 
1320     // Enter this token stream so that we re-lex the tokens.  Make sure to
1321     // enable macro expansion, in case the token after the # is an identifier
1322     // that is expanded.
1323     EnterTokenStream(std::move(Toks), 2, false, /*IsReinject*/false);
1324     return;
1325   }
1326 
1327   // If we reached here, the preprocessing token is not valid!
1328   // Start suggesting if a similar directive found.
1329   Diag(Result, diag::err_pp_invalid_directive) << 0;
1330 
1331   // Read the rest of the PP line.
1332   DiscardUntilEndOfDirective();
1333 
1334   // Okay, we're done parsing the directive.
1335 }
1336 
1337 /// GetLineValue - Convert a numeric token into an unsigned value, emitting
1338 /// Diagnostic DiagID if it is invalid, and returning the value in Val.
1339 static bool GetLineValue(Token &DigitTok, unsigned &Val,
1340                          unsigned DiagID, Preprocessor &PP,
1341                          bool IsGNULineDirective=false) {
1342   if (DigitTok.isNot(tok::numeric_constant)) {
1343     PP.Diag(DigitTok, DiagID);
1344 
1345     if (DigitTok.isNot(tok::eod))
1346       PP.DiscardUntilEndOfDirective();
1347     return true;
1348   }
1349 
1350   SmallString<64> IntegerBuffer;
1351   IntegerBuffer.resize(DigitTok.getLength());
1352   const char *DigitTokBegin = &IntegerBuffer[0];
1353   bool Invalid = false;
1354   unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1355   if (Invalid)
1356     return true;
1357 
1358   // Verify that we have a simple digit-sequence, and compute the value.  This
1359   // is always a simple digit string computed in decimal, so we do this manually
1360   // here.
1361   Val = 0;
1362   for (unsigned i = 0; i != ActualLength; ++i) {
1363     // C++1y [lex.fcon]p1:
1364     //   Optional separating single quotes in a digit-sequence are ignored
1365     if (DigitTokBegin[i] == '\'')
1366       continue;
1367 
1368     if (!isDigit(DigitTokBegin[i])) {
1369       PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
1370               diag::err_pp_line_digit_sequence) << IsGNULineDirective;
1371       PP.DiscardUntilEndOfDirective();
1372       return true;
1373     }
1374 
1375     unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1376     if (NextVal < Val) { // overflow.
1377       PP.Diag(DigitTok, DiagID);
1378       PP.DiscardUntilEndOfDirective();
1379       return true;
1380     }
1381     Val = NextVal;
1382   }
1383 
1384   if (DigitTokBegin[0] == '0' && Val)
1385     PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1386       << IsGNULineDirective;
1387 
1388   return false;
1389 }
1390 
1391 /// Handle a \#line directive: C99 6.10.4.
1392 ///
1393 /// The two acceptable forms are:
1394 /// \verbatim
1395 ///   # line digit-sequence
1396 ///   # line digit-sequence "s-char-sequence"
1397 /// \endverbatim
1398 void Preprocessor::HandleLineDirective() {
1399   // Read the line # and string argument.  Per C99 6.10.4p5, these tokens are
1400   // expanded.
1401   Token DigitTok;
1402   Lex(DigitTok);
1403 
1404   // Validate the number and convert it to an unsigned.
1405   unsigned LineNo;
1406   if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
1407     return;
1408 
1409   if (LineNo == 0)
1410     Diag(DigitTok, diag::ext_pp_line_zero);
1411 
1412   // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1413   // number greater than 2147483647".  C90 requires that the line # be <= 32767.
1414   unsigned LineLimit = 32768U;
1415   if (LangOpts.C99 || LangOpts.CPlusPlus11)
1416     LineLimit = 2147483648U;
1417   if (LineNo >= LineLimit)
1418     Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
1419   else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
1420     Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
1421 
1422   int FilenameID = -1;
1423   Token StrTok;
1424   Lex(StrTok);
1425 
1426   // If the StrTok is "eod", then it wasn't present.  Otherwise, it must be a
1427   // string followed by eod.
1428   if (StrTok.is(tok::eod))
1429     ; // ok
1430   else if (StrTok.isNot(tok::string_literal)) {
1431     Diag(StrTok, diag::err_pp_line_invalid_filename);
1432     DiscardUntilEndOfDirective();
1433     return;
1434   } else if (StrTok.hasUDSuffix()) {
1435     Diag(StrTok, diag::err_invalid_string_udl);
1436     DiscardUntilEndOfDirective();
1437     return;
1438   } else {
1439     // Parse and validate the string, converting it into a unique ID.
1440     StringLiteralParser Literal(StrTok, *this);
1441     assert(Literal.isOrdinary() && "Didn't allow wide strings in");
1442     if (Literal.hadError) {
1443       DiscardUntilEndOfDirective();
1444       return;
1445     }
1446     if (Literal.Pascal) {
1447       Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1448       DiscardUntilEndOfDirective();
1449       return;
1450     }
1451     FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
1452 
1453     // Verify that there is nothing after the string, other than EOD.  Because
1454     // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1455     CheckEndOfDirective("line", true);
1456   }
1457 
1458   // Take the file kind of the file containing the #line directive. #line
1459   // directives are often used for generated sources from the same codebase, so
1460   // the new file should generally be classified the same way as the current
1461   // file. This is visible in GCC's pre-processed output, which rewrites #line
1462   // to GNU line markers.
1463   SrcMgr::CharacteristicKind FileKind =
1464       SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1465 
1466   SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1467                         false, FileKind);
1468 
1469   if (Callbacks)
1470     Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
1471                            PPCallbacks::RenameFile, FileKind);
1472 }
1473 
1474 /// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1475 /// marker directive.
1476 static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
1477                                 SrcMgr::CharacteristicKind &FileKind,
1478                                 Preprocessor &PP) {
1479   unsigned FlagVal;
1480   Token FlagTok;
1481   PP.Lex(FlagTok);
1482   if (FlagTok.is(tok::eod)) return false;
1483   if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1484     return true;
1485 
1486   if (FlagVal == 1) {
1487     IsFileEntry = true;
1488 
1489     PP.Lex(FlagTok);
1490     if (FlagTok.is(tok::eod)) return false;
1491     if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1492       return true;
1493   } else if (FlagVal == 2) {
1494     IsFileExit = true;
1495 
1496     SourceManager &SM = PP.getSourceManager();
1497     // If we are leaving the current presumed file, check to make sure the
1498     // presumed include stack isn't empty!
1499     FileID CurFileID =
1500       SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
1501     PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
1502     if (PLoc.isInvalid())
1503       return true;
1504 
1505     // If there is no include loc (main file) or if the include loc is in a
1506     // different physical file, then we aren't in a "1" line marker flag region.
1507     SourceLocation IncLoc = PLoc.getIncludeLoc();
1508     if (IncLoc.isInvalid() ||
1509         SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
1510       PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1511       PP.DiscardUntilEndOfDirective();
1512       return true;
1513     }
1514 
1515     PP.Lex(FlagTok);
1516     if (FlagTok.is(tok::eod)) return false;
1517     if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1518       return true;
1519   }
1520 
1521   // We must have 3 if there are still flags.
1522   if (FlagVal != 3) {
1523     PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
1524     PP.DiscardUntilEndOfDirective();
1525     return true;
1526   }
1527 
1528   FileKind = SrcMgr::C_System;
1529 
1530   PP.Lex(FlagTok);
1531   if (FlagTok.is(tok::eod)) return false;
1532   if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1533     return true;
1534 
1535   // We must have 4 if there is yet another flag.
1536   if (FlagVal != 4) {
1537     PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
1538     PP.DiscardUntilEndOfDirective();
1539     return true;
1540   }
1541 
1542   FileKind = SrcMgr::C_ExternCSystem;
1543 
1544   PP.Lex(FlagTok);
1545   if (FlagTok.is(tok::eod)) return false;
1546 
1547   // There are no more valid flags here.
1548   PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
1549   PP.DiscardUntilEndOfDirective();
1550   return true;
1551 }
1552 
1553 /// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1554 /// one of the following forms:
1555 ///
1556 ///     # 42
1557 ///     # 42 "file" ('1' | '2')?
1558 ///     # 42 "file" ('1' | '2')? '3' '4'?
1559 ///
1560 void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1561   // Validate the number and convert it to an unsigned.  GNU does not have a
1562   // line # limit other than it fit in 32-bits.
1563   unsigned LineNo;
1564   if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
1565                    *this, true))
1566     return;
1567 
1568   Token StrTok;
1569   Lex(StrTok);
1570 
1571   bool IsFileEntry = false, IsFileExit = false;
1572   int FilenameID = -1;
1573   SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
1574 
1575   // If the StrTok is "eod", then it wasn't present.  Otherwise, it must be a
1576   // string followed by eod.
1577   if (StrTok.is(tok::eod)) {
1578     Diag(StrTok, diag::ext_pp_gnu_line_directive);
1579     // Treat this like "#line NN", which doesn't change file characteristics.
1580     FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1581   } else if (StrTok.isNot(tok::string_literal)) {
1582     Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1583     DiscardUntilEndOfDirective();
1584     return;
1585   } else if (StrTok.hasUDSuffix()) {
1586     Diag(StrTok, diag::err_invalid_string_udl);
1587     DiscardUntilEndOfDirective();
1588     return;
1589   } else {
1590     // Parse and validate the string, converting it into a unique ID.
1591     StringLiteralParser Literal(StrTok, *this);
1592     assert(Literal.isOrdinary() && "Didn't allow wide strings in");
1593     if (Literal.hadError) {
1594       DiscardUntilEndOfDirective();
1595       return;
1596     }
1597     if (Literal.Pascal) {
1598       Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1599       DiscardUntilEndOfDirective();
1600       return;
1601     }
1602 
1603     // If a filename was present, read any flags that are present.
1604     if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
1605       return;
1606     if (!SourceMgr.isWrittenInBuiltinFile(DigitTok.getLocation()) &&
1607         !SourceMgr.isWrittenInCommandLineFile(DigitTok.getLocation()))
1608       Diag(StrTok, diag::ext_pp_gnu_line_directive);
1609 
1610     // Exiting to an empty string means pop to the including file, so leave
1611     // FilenameID as -1 in that case.
1612     if (!(IsFileExit && Literal.GetString().empty()))
1613       FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
1614   }
1615 
1616   // Create a line note with this information.
1617   SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1618                         IsFileExit, FileKind);
1619 
1620   // If the preprocessor has callbacks installed, notify them of the #line
1621   // change.  This is used so that the line marker comes out in -E mode for
1622   // example.
1623   if (Callbacks) {
1624     PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1625     if (IsFileEntry)
1626       Reason = PPCallbacks::EnterFile;
1627     else if (IsFileExit)
1628       Reason = PPCallbacks::ExitFile;
1629 
1630     Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
1631   }
1632 }
1633 
1634 /// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1635 ///
1636 void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
1637                                                  bool isWarning) {
1638   // Read the rest of the line raw.  We do this because we don't want macros
1639   // to be expanded and we don't require that the tokens be valid preprocessing
1640   // tokens.  For example, this is allowed: "#warning `   'foo".  GCC does
1641   // collapse multiple consecutive white space between tokens, but this isn't
1642   // specified by the standard.
1643   SmallString<128> Message;
1644   CurLexer->ReadToEndOfLine(&Message);
1645 
1646   // Find the first non-whitespace character, so that we can make the
1647   // diagnostic more succinct.
1648   StringRef Msg = Message.str().ltrim(' ');
1649 
1650   if (isWarning)
1651     Diag(Tok, diag::pp_hash_warning) << Msg;
1652   else
1653     Diag(Tok, diag::err_pp_hash_error) << Msg;
1654 }
1655 
1656 /// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1657 ///
1658 void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1659   // Yes, this directive is an extension.
1660   Diag(Tok, diag::ext_pp_ident_directive);
1661 
1662   // Read the string argument.
1663   Token StrTok;
1664   Lex(StrTok);
1665 
1666   // If the token kind isn't a string, it's a malformed directive.
1667   if (StrTok.isNot(tok::string_literal) &&
1668       StrTok.isNot(tok::wide_string_literal)) {
1669     Diag(StrTok, diag::err_pp_malformed_ident);
1670     if (StrTok.isNot(tok::eod))
1671       DiscardUntilEndOfDirective();
1672     return;
1673   }
1674 
1675   if (StrTok.hasUDSuffix()) {
1676     Diag(StrTok, diag::err_invalid_string_udl);
1677     DiscardUntilEndOfDirective();
1678     return;
1679   }
1680 
1681   // Verify that there is nothing after the string, other than EOD.
1682   CheckEndOfDirective("ident");
1683 
1684   if (Callbacks) {
1685     bool Invalid = false;
1686     std::string Str = getSpelling(StrTok, &Invalid);
1687     if (!Invalid)
1688       Callbacks->Ident(Tok.getLocation(), Str);
1689   }
1690 }
1691 
1692 /// Handle a #public directive.
1693 void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
1694   Token MacroNameTok;
1695   ReadMacroName(MacroNameTok, MU_Undef);
1696 
1697   // Error reading macro name?  If so, diagnostic already issued.
1698   if (MacroNameTok.is(tok::eod))
1699     return;
1700 
1701   // Check to see if this is the last token on the #__public_macro line.
1702   CheckEndOfDirective("__public_macro");
1703 
1704   IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
1705   // Okay, we finally have a valid identifier to undef.
1706   MacroDirective *MD = getLocalMacroDirective(II);
1707 
1708   // If the macro is not defined, this is an error.
1709   if (!MD) {
1710     Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
1711     return;
1712   }
1713 
1714   // Note that this macro has now been exported.
1715   appendMacroDirective(II, AllocateVisibilityMacroDirective(
1716                                 MacroNameTok.getLocation(), /*isPublic=*/true));
1717 }
1718 
1719 /// Handle a #private directive.
1720 void Preprocessor::HandleMacroPrivateDirective() {
1721   Token MacroNameTok;
1722   ReadMacroName(MacroNameTok, MU_Undef);
1723 
1724   // Error reading macro name?  If so, diagnostic already issued.
1725   if (MacroNameTok.is(tok::eod))
1726     return;
1727 
1728   // Check to see if this is the last token on the #__private_macro line.
1729   CheckEndOfDirective("__private_macro");
1730 
1731   IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
1732   // Okay, we finally have a valid identifier to undef.
1733   MacroDirective *MD = getLocalMacroDirective(II);
1734 
1735   // If the macro is not defined, this is an error.
1736   if (!MD) {
1737     Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
1738     return;
1739   }
1740 
1741   // Note that this macro has now been marked private.
1742   appendMacroDirective(II, AllocateVisibilityMacroDirective(
1743                                MacroNameTok.getLocation(), /*isPublic=*/false));
1744 }
1745 
1746 //===----------------------------------------------------------------------===//
1747 // Preprocessor Include Directive Handling.
1748 //===----------------------------------------------------------------------===//
1749 
1750 /// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
1751 /// checked and spelled filename, e.g. as an operand of \#include. This returns
1752 /// true if the input filename was in <>'s or false if it were in ""'s.  The
1753 /// caller is expected to provide a buffer that is large enough to hold the
1754 /// spelling of the filename, but is also expected to handle the case when
1755 /// this method decides to use a different buffer.
1756 bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
1757                                               StringRef &Buffer) {
1758   // Get the text form of the filename.
1759   assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
1760 
1761   // FIXME: Consider warning on some of the cases described in C11 6.4.7/3 and
1762   // C++20 [lex.header]/2:
1763   //
1764   // If `"`, `'`, `\`, `/*`, or `//` appears in a header-name, then
1765   //   in C: behavior is undefined
1766   //   in C++: program is conditionally-supported with implementation-defined
1767   //           semantics
1768 
1769   // Make sure the filename is <x> or "x".
1770   bool isAngled;
1771   if (Buffer[0] == '<') {
1772     if (Buffer.back() != '>') {
1773       Diag(Loc, diag::err_pp_expects_filename);
1774       Buffer = StringRef();
1775       return true;
1776     }
1777     isAngled = true;
1778   } else if (Buffer[0] == '"') {
1779     if (Buffer.back() != '"') {
1780       Diag(Loc, diag::err_pp_expects_filename);
1781       Buffer = StringRef();
1782       return true;
1783     }
1784     isAngled = false;
1785   } else {
1786     Diag(Loc, diag::err_pp_expects_filename);
1787     Buffer = StringRef();
1788     return true;
1789   }
1790 
1791   // Diagnose #include "" as invalid.
1792   if (Buffer.size() <= 2) {
1793     Diag(Loc, diag::err_pp_empty_filename);
1794     Buffer = StringRef();
1795     return true;
1796   }
1797 
1798   // Skip the brackets.
1799   Buffer = Buffer.substr(1, Buffer.size()-2);
1800   return isAngled;
1801 }
1802 
1803 /// Push a token onto the token stream containing an annotation.
1804 void Preprocessor::EnterAnnotationToken(SourceRange Range,
1805                                         tok::TokenKind Kind,
1806                                         void *AnnotationVal) {
1807   // FIXME: Produce this as the current token directly, rather than
1808   // allocating a new token for it.
1809   auto Tok = std::make_unique<Token[]>(1);
1810   Tok[0].startToken();
1811   Tok[0].setKind(Kind);
1812   Tok[0].setLocation(Range.getBegin());
1813   Tok[0].setAnnotationEndLoc(Range.getEnd());
1814   Tok[0].setAnnotationValue(AnnotationVal);
1815   EnterTokenStream(std::move(Tok), 1, true, /*IsReinject*/ false);
1816 }
1817 
1818 /// Produce a diagnostic informing the user that a #include or similar
1819 /// was implicitly treated as a module import.
1820 static void diagnoseAutoModuleImport(
1821     Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1822     ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1823     SourceLocation PathEnd) {
1824   SmallString<128> PathString;
1825   for (size_t I = 0, N = Path.size(); I != N; ++I) {
1826     if (I)
1827       PathString += '.';
1828     PathString += Path[I].first->getName();
1829   }
1830 
1831   int IncludeKind = 0;
1832   switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1833   case tok::pp_include:
1834     IncludeKind = 0;
1835     break;
1836 
1837   case tok::pp_import:
1838     IncludeKind = 1;
1839     break;
1840 
1841   case tok::pp_include_next:
1842     IncludeKind = 2;
1843     break;
1844 
1845   case tok::pp___include_macros:
1846     IncludeKind = 3;
1847     break;
1848 
1849   default:
1850     llvm_unreachable("unknown include directive kind");
1851   }
1852 
1853   PP.Diag(HashLoc, diag::remark_pp_include_directive_modular_translation)
1854       << IncludeKind << PathString;
1855 }
1856 
1857 // Given a vector of path components and a string containing the real
1858 // path to the file, build a properly-cased replacement in the vector,
1859 // and return true if the replacement should be suggested.
1860 static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1861                             StringRef RealPathName,
1862                             llvm::sys::path::Style Separator) {
1863   auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1864   auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1865   int Cnt = 0;
1866   bool SuggestReplacement = false;
1867 
1868   auto IsSep = [Separator](StringRef Component) {
1869     return Component.size() == 1 &&
1870            llvm::sys::path::is_separator(Component[0], Separator);
1871   };
1872 
1873   // Below is a best-effort to handle ".." in paths. It is admittedly
1874   // not 100% correct in the presence of symlinks.
1875   for (auto &Component : llvm::reverse(Components)) {
1876     if ("." == Component) {
1877     } else if (".." == Component) {
1878       ++Cnt;
1879     } else if (Cnt) {
1880       --Cnt;
1881     } else if (RealPathComponentIter != RealPathComponentEnd) {
1882       if (!IsSep(Component) && !IsSep(*RealPathComponentIter) &&
1883           Component != *RealPathComponentIter) {
1884         // If these non-separator path components differ by more than just case,
1885         // then we may be looking at symlinked paths. Bail on this diagnostic to
1886         // avoid noisy false positives.
1887         SuggestReplacement =
1888             RealPathComponentIter->equals_insensitive(Component);
1889         if (!SuggestReplacement)
1890           break;
1891         Component = *RealPathComponentIter;
1892       }
1893       ++RealPathComponentIter;
1894     }
1895   }
1896   return SuggestReplacement;
1897 }
1898 
1899 bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1900                                           const TargetInfo &TargetInfo,
1901                                           const Module &M,
1902                                           DiagnosticsEngine &Diags) {
1903   Module::Requirement Requirement;
1904   Module::UnresolvedHeaderDirective MissingHeader;
1905   Module *ShadowingModule = nullptr;
1906   if (M.isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,
1907                     ShadowingModule))
1908     return false;
1909 
1910   if (MissingHeader.FileNameLoc.isValid()) {
1911     Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1912         << MissingHeader.IsUmbrella << MissingHeader.FileName;
1913   } else if (ShadowingModule) {
1914     Diags.Report(M.DefinitionLoc, diag::err_module_shadowed) << M.Name;
1915     Diags.Report(ShadowingModule->DefinitionLoc,
1916                  diag::note_previous_definition);
1917   } else {
1918     // FIXME: Track the location at which the requirement was specified, and
1919     // use it here.
1920     Diags.Report(M.DefinitionLoc, diag::err_module_unavailable)
1921         << M.getFullModuleName() << Requirement.second << Requirement.first;
1922   }
1923   return true;
1924 }
1925 
1926 std::pair<ConstSearchDirIterator, const FileEntry *>
1927 Preprocessor::getIncludeNextStart(const Token &IncludeNextTok) const {
1928   // #include_next is like #include, except that we start searching after
1929   // the current found directory.  If we can't do this, issue a
1930   // diagnostic.
1931   ConstSearchDirIterator Lookup = CurDirLookup;
1932   const FileEntry *LookupFromFile = nullptr;
1933 
1934   if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
1935     // If the main file is a header, then it's either for PCH/AST generation,
1936     // or libclang opened it. Either way, handle it as a normal include below
1937     // and do not complain about include_next.
1938   } else if (isInPrimaryFile()) {
1939     Lookup = nullptr;
1940     Diag(IncludeNextTok, diag::pp_include_next_in_primary);
1941   } else if (CurLexerSubmodule) {
1942     // Start looking up in the directory *after* the one in which the current
1943     // file would be found, if any.
1944     assert(CurPPLexer && "#include_next directive in macro?");
1945     if (auto FE = CurPPLexer->getFileEntry())
1946       LookupFromFile = *FE;
1947     Lookup = nullptr;
1948   } else if (!Lookup) {
1949     // The current file was not found by walking the include path. Either it
1950     // is the primary file (handled above), or it was found by absolute path,
1951     // or it was found relative to such a file.
1952     // FIXME: Track enough information so we know which case we're in.
1953     Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
1954   } else {
1955     // Start looking up in the next directory.
1956     ++Lookup;
1957   }
1958 
1959   return {Lookup, LookupFromFile};
1960 }
1961 
1962 /// HandleIncludeDirective - The "\#include" tokens have just been read, read
1963 /// the file to be included from the lexer, then include it!  This is a common
1964 /// routine with functionality shared between \#include, \#include_next and
1965 /// \#import.  LookupFrom is set when this is a \#include_next directive, it
1966 /// specifies the file to start searching from.
1967 void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
1968                                           Token &IncludeTok,
1969                                           ConstSearchDirIterator LookupFrom,
1970                                           const FileEntry *LookupFromFile) {
1971   Token FilenameTok;
1972   if (LexHeaderName(FilenameTok))
1973     return;
1974 
1975   if (FilenameTok.isNot(tok::header_name)) {
1976     Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1977     if (FilenameTok.isNot(tok::eod))
1978       DiscardUntilEndOfDirective();
1979     return;
1980   }
1981 
1982   // Verify that there is nothing after the filename, other than EOD.  Note
1983   // that we allow macros that expand to nothing after the filename, because
1984   // this falls into the category of "#include pp-tokens new-line" specified
1985   // in C99 6.10.2p4.
1986   SourceLocation EndLoc =
1987       CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
1988 
1989   auto Action = HandleHeaderIncludeOrImport(HashLoc, IncludeTok, FilenameTok,
1990                                             EndLoc, LookupFrom, LookupFromFile);
1991   switch (Action.Kind) {
1992   case ImportAction::None:
1993   case ImportAction::SkippedModuleImport:
1994     break;
1995   case ImportAction::ModuleBegin:
1996     EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
1997                          tok::annot_module_begin, Action.ModuleForHeader);
1998     break;
1999   case ImportAction::HeaderUnitImport:
2000     EnterAnnotationToken(SourceRange(HashLoc, EndLoc), tok::annot_header_unit,
2001                          Action.ModuleForHeader);
2002     break;
2003   case ImportAction::ModuleImport:
2004     EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
2005                          tok::annot_module_include, Action.ModuleForHeader);
2006     break;
2007   case ImportAction::Failure:
2008     assert(TheModuleLoader.HadFatalFailure &&
2009            "This should be an early exit only to a fatal error");
2010     TheModuleLoader.HadFatalFailure = true;
2011     IncludeTok.setKind(tok::eof);
2012     CurLexer->cutOffLexing();
2013     return;
2014   }
2015 }
2016 
2017 OptionalFileEntryRef Preprocessor::LookupHeaderIncludeOrImport(
2018     ConstSearchDirIterator *CurDir, StringRef &Filename,
2019     SourceLocation FilenameLoc, CharSourceRange FilenameRange,
2020     const Token &FilenameTok, bool &IsFrameworkFound, bool IsImportDecl,
2021     bool &IsMapped, ConstSearchDirIterator LookupFrom,
2022     const FileEntry *LookupFromFile, StringRef &LookupFilename,
2023     SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath,
2024     ModuleMap::KnownHeader &SuggestedModule, bool isAngled) {
2025   auto DiagnoseHeaderInclusion = [&](FileEntryRef FE) {
2026     if (LangOpts.AsmPreprocessor)
2027       return;
2028 
2029     Module *RequestingModule = getModuleForLocation(
2030         FilenameLoc, LangOpts.ModulesValidateTextualHeaderIncludes);
2031     bool RequestingModuleIsModuleInterface =
2032         !SourceMgr.isInMainFile(FilenameLoc);
2033 
2034     HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
2035         RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
2036         Filename, FE);
2037   };
2038 
2039   OptionalFileEntryRef File = LookupFile(
2040       FilenameLoc, LookupFilename, isAngled, LookupFrom, LookupFromFile, CurDir,
2041       Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
2042       &SuggestedModule, &IsMapped, &IsFrameworkFound);
2043   if (File) {
2044     DiagnoseHeaderInclusion(*File);
2045     return File;
2046   }
2047 
2048   // Give the clients a chance to silently skip this include.
2049   if (Callbacks && Callbacks->FileNotFound(Filename))
2050     return std::nullopt;
2051 
2052   if (SuppressIncludeNotFoundError)
2053     return std::nullopt;
2054 
2055   // If the file could not be located and it was included via angle
2056   // brackets, we can attempt a lookup as though it were a quoted path to
2057   // provide the user with a possible fixit.
2058   if (isAngled) {
2059     OptionalFileEntryRef File = LookupFile(
2060         FilenameLoc, LookupFilename, false, LookupFrom, LookupFromFile, CurDir,
2061         Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
2062         &SuggestedModule, &IsMapped,
2063         /*IsFrameworkFound=*/nullptr);
2064     if (File) {
2065       DiagnoseHeaderInclusion(*File);
2066       Diag(FilenameTok, diag::err_pp_file_not_found_angled_include_not_fatal)
2067           << Filename << IsImportDecl
2068           << FixItHint::CreateReplacement(FilenameRange,
2069                                           "\"" + Filename.str() + "\"");
2070       return File;
2071     }
2072   }
2073 
2074   // Check for likely typos due to leading or trailing non-isAlphanumeric
2075   // characters
2076   StringRef OriginalFilename = Filename;
2077   if (LangOpts.SpellChecking) {
2078     // A heuristic to correct a typo file name by removing leading and
2079     // trailing non-isAlphanumeric characters.
2080     auto CorrectTypoFilename = [](llvm::StringRef Filename) {
2081       Filename = Filename.drop_until(isAlphanumeric);
2082       while (!Filename.empty() && !isAlphanumeric(Filename.back())) {
2083         Filename = Filename.drop_back();
2084       }
2085       return Filename;
2086     };
2087     StringRef TypoCorrectionName = CorrectTypoFilename(Filename);
2088     StringRef TypoCorrectionLookupName = CorrectTypoFilename(LookupFilename);
2089 
2090     OptionalFileEntryRef File = LookupFile(
2091         FilenameLoc, TypoCorrectionLookupName, isAngled, LookupFrom,
2092         LookupFromFile, CurDir, Callbacks ? &SearchPath : nullptr,
2093         Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped,
2094         /*IsFrameworkFound=*/nullptr);
2095     if (File) {
2096       DiagnoseHeaderInclusion(*File);
2097       auto Hint =
2098           isAngled ? FixItHint::CreateReplacement(
2099                          FilenameRange, "<" + TypoCorrectionName.str() + ">")
2100                    : FixItHint::CreateReplacement(
2101                          FilenameRange, "\"" + TypoCorrectionName.str() + "\"");
2102       Diag(FilenameTok, diag::err_pp_file_not_found_typo_not_fatal)
2103           << OriginalFilename << TypoCorrectionName << Hint;
2104       // We found the file, so set the Filename to the name after typo
2105       // correction.
2106       Filename = TypoCorrectionName;
2107       LookupFilename = TypoCorrectionLookupName;
2108       return File;
2109     }
2110   }
2111 
2112   // If the file is still not found, just go with the vanilla diagnostic
2113   assert(!File && "expected missing file");
2114   Diag(FilenameTok, diag::err_pp_file_not_found)
2115       << OriginalFilename << FilenameRange;
2116   if (IsFrameworkFound) {
2117     size_t SlashPos = OriginalFilename.find('/');
2118     assert(SlashPos != StringRef::npos &&
2119            "Include with framework name should have '/' in the filename");
2120     StringRef FrameworkName = OriginalFilename.substr(0, SlashPos);
2121     FrameworkCacheEntry &CacheEntry =
2122         HeaderInfo.LookupFrameworkCache(FrameworkName);
2123     assert(CacheEntry.Directory && "Found framework should be in cache");
2124     Diag(FilenameTok, diag::note_pp_framework_without_header)
2125         << OriginalFilename.substr(SlashPos + 1) << FrameworkName
2126         << CacheEntry.Directory->getName();
2127   }
2128 
2129   return std::nullopt;
2130 }
2131 
2132 /// Handle either a #include-like directive or an import declaration that names
2133 /// a header file.
2134 ///
2135 /// \param HashLoc The location of the '#' token for an include, or
2136 ///        SourceLocation() for an import declaration.
2137 /// \param IncludeTok The include / include_next / import token.
2138 /// \param FilenameTok The header-name token.
2139 /// \param EndLoc The location at which any imported macros become visible.
2140 /// \param LookupFrom For #include_next, the starting directory for the
2141 ///        directory lookup.
2142 /// \param LookupFromFile For #include_next, the starting file for the directory
2143 ///        lookup.
2144 Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport(
2145     SourceLocation HashLoc, Token &IncludeTok, Token &FilenameTok,
2146     SourceLocation EndLoc, ConstSearchDirIterator LookupFrom,
2147     const FileEntry *LookupFromFile) {
2148   SmallString<128> FilenameBuffer;
2149   StringRef Filename = getSpelling(FilenameTok, FilenameBuffer);
2150   SourceLocation CharEnd = FilenameTok.getEndLoc();
2151 
2152   CharSourceRange FilenameRange
2153     = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
2154   StringRef OriginalFilename = Filename;
2155   bool isAngled =
2156     GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
2157 
2158   // If GetIncludeFilenameSpelling set the start ptr to null, there was an
2159   // error.
2160   if (Filename.empty())
2161     return {ImportAction::None};
2162 
2163   bool IsImportDecl = HashLoc.isInvalid();
2164   SourceLocation StartLoc = IsImportDecl ? IncludeTok.getLocation() : HashLoc;
2165 
2166   // Complain about attempts to #include files in an audit pragma.
2167   if (PragmaARCCFCodeAuditedInfo.second.isValid()) {
2168     Diag(StartLoc, diag::err_pp_include_in_arc_cf_code_audited) << IsImportDecl;
2169     Diag(PragmaARCCFCodeAuditedInfo.second, diag::note_pragma_entered_here);
2170 
2171     // Immediately leave the pragma.
2172     PragmaARCCFCodeAuditedInfo = {nullptr, SourceLocation()};
2173   }
2174 
2175   // Complain about attempts to #include files in an assume-nonnull pragma.
2176   if (PragmaAssumeNonNullLoc.isValid()) {
2177     Diag(StartLoc, diag::err_pp_include_in_assume_nonnull) << IsImportDecl;
2178     Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
2179 
2180     // Immediately leave the pragma.
2181     PragmaAssumeNonNullLoc = SourceLocation();
2182   }
2183 
2184   if (HeaderInfo.HasIncludeAliasMap()) {
2185     // Map the filename with the brackets still attached.  If the name doesn't
2186     // map to anything, fall back on the filename we've already gotten the
2187     // spelling for.
2188     StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
2189     if (!NewName.empty())
2190       Filename = NewName;
2191   }
2192 
2193   // Search include directories.
2194   bool IsMapped = false;
2195   bool IsFrameworkFound = false;
2196   ConstSearchDirIterator CurDir = nullptr;
2197   SmallString<1024> SearchPath;
2198   SmallString<1024> RelativePath;
2199   // We get the raw path only if we have 'Callbacks' to which we later pass
2200   // the path.
2201   ModuleMap::KnownHeader SuggestedModule;
2202   SourceLocation FilenameLoc = FilenameTok.getLocation();
2203   StringRef LookupFilename = Filename;
2204 
2205   // Normalize slashes when compiling with -fms-extensions on non-Windows. This
2206   // is unnecessary on Windows since the filesystem there handles backslashes.
2207   SmallString<128> NormalizedPath;
2208   llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::native;
2209   if (is_style_posix(BackslashStyle) && LangOpts.MicrosoftExt) {
2210     NormalizedPath = Filename.str();
2211     llvm::sys::path::native(NormalizedPath);
2212     LookupFilename = NormalizedPath;
2213     BackslashStyle = llvm::sys::path::Style::windows;
2214   }
2215 
2216   OptionalFileEntryRef File = LookupHeaderIncludeOrImport(
2217       &CurDir, Filename, FilenameLoc, FilenameRange, FilenameTok,
2218       IsFrameworkFound, IsImportDecl, IsMapped, LookupFrom, LookupFromFile,
2219       LookupFilename, RelativePath, SearchPath, SuggestedModule, isAngled);
2220 
2221   if (usingPCHWithThroughHeader() && SkippingUntilPCHThroughHeader) {
2222     if (File && isPCHThroughHeader(&File->getFileEntry()))
2223       SkippingUntilPCHThroughHeader = false;
2224     return {ImportAction::None};
2225   }
2226 
2227   // Should we enter the source file? Set to Skip if either the source file is
2228   // known to have no effect beyond its effect on module visibility -- that is,
2229   // if it's got an include guard that is already defined, set to Import if it
2230   // is a modular header we've already built and should import.
2231 
2232   // For C++20 Modules
2233   // [cpp.include]/7 If the header identified by the header-name denotes an
2234   // importable header, it is implementation-defined whether the #include
2235   // preprocessing directive is instead replaced by an import directive.
2236   // For this implementation, the translation is permitted when we are parsing
2237   // the Global Module Fragment, and not otherwise (the cases where it would be
2238   // valid to replace an include with an import are highly constrained once in
2239   // named module purview; this choice avoids considerable complexity in
2240   // determining valid cases).
2241 
2242   enum { Enter, Import, Skip, IncludeLimitReached } Action = Enter;
2243 
2244   if (PPOpts->SingleFileParseMode)
2245     Action = IncludeLimitReached;
2246 
2247   // If we've reached the max allowed include depth, it is usually due to an
2248   // include cycle. Don't enter already processed files again as it can lead to
2249   // reaching the max allowed include depth again.
2250   if (Action == Enter && HasReachedMaxIncludeDepth && File &&
2251       alreadyIncluded(*File))
2252     Action = IncludeLimitReached;
2253 
2254   // FIXME: We do not have a good way to disambiguate C++ clang modules from
2255   // C++ standard modules (other than use/non-use of Header Units).
2256   Module *SM = SuggestedModule.getModule();
2257 
2258   bool MaybeTranslateInclude =
2259       Action == Enter && File && SM && !SM->isForBuilding(getLangOpts());
2260 
2261   // Maybe a usable Header Unit
2262   bool UsableHeaderUnit = false;
2263   if (getLangOpts().CPlusPlusModules && SM && SM->isHeaderUnit()) {
2264     if (TrackGMFState.inGMF() || IsImportDecl)
2265       UsableHeaderUnit = true;
2266     else if (!IsImportDecl) {
2267       // This is a Header Unit that we do not include-translate
2268       SuggestedModule = ModuleMap::KnownHeader();
2269       SM = nullptr;
2270     }
2271   }
2272   // Maybe a usable clang header module.
2273   bool UsableClangHeaderModule =
2274       (getLangOpts().CPlusPlusModules || getLangOpts().Modules) && SM &&
2275       !SM->isHeaderUnit();
2276 
2277   // Determine whether we should try to import the module for this #include, if
2278   // there is one. Don't do so if precompiled module support is disabled or we
2279   // are processing this module textually (because we're building the module).
2280   if (MaybeTranslateInclude && (UsableHeaderUnit || UsableClangHeaderModule)) {
2281     // If this include corresponds to a module but that module is
2282     // unavailable, diagnose the situation and bail out.
2283     // FIXME: Remove this; loadModule does the same check (but produces
2284     // slightly worse diagnostics).
2285     if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(),
2286                                *SuggestedModule.getModule(),
2287                                getDiagnostics())) {
2288       Diag(FilenameTok.getLocation(),
2289            diag::note_implicit_top_level_module_import_here)
2290           << SuggestedModule.getModule()->getTopLevelModuleName();
2291       return {ImportAction::None};
2292     }
2293 
2294     // Compute the module access path corresponding to this module.
2295     // FIXME: Should we have a second loadModule() overload to avoid this
2296     // extra lookup step?
2297     SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
2298     for (Module *Mod = SM; Mod; Mod = Mod->Parent)
2299       Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
2300                                     FilenameTok.getLocation()));
2301     std::reverse(Path.begin(), Path.end());
2302 
2303     // Warn that we're replacing the include/import with a module import.
2304     if (!IsImportDecl)
2305       diagnoseAutoModuleImport(*this, StartLoc, IncludeTok, Path, CharEnd);
2306 
2307     // Load the module to import its macros. We'll make the declarations
2308     // visible when the parser gets here.
2309     // FIXME: Pass SuggestedModule in here rather than converting it to a path
2310     // and making the module loader convert it back again.
2311     ModuleLoadResult Imported = TheModuleLoader.loadModule(
2312         IncludeTok.getLocation(), Path, Module::Hidden,
2313         /*IsInclusionDirective=*/true);
2314     assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
2315            "the imported module is different than the suggested one");
2316 
2317     if (Imported) {
2318       Action = Import;
2319     } else if (Imported.isMissingExpected()) {
2320       markClangModuleAsAffecting(
2321           static_cast<Module *>(Imported)->getTopLevelModule());
2322       // We failed to find a submodule that we assumed would exist (because it
2323       // was in the directory of an umbrella header, for instance), but no
2324       // actual module containing it exists (because the umbrella header is
2325       // incomplete).  Treat this as a textual inclusion.
2326       SuggestedModule = ModuleMap::KnownHeader();
2327       SM = nullptr;
2328     } else if (Imported.isConfigMismatch()) {
2329       // On a configuration mismatch, enter the header textually. We still know
2330       // that it's part of the corresponding module.
2331     } else {
2332       // We hit an error processing the import. Bail out.
2333       if (hadModuleLoaderFatalFailure()) {
2334         // With a fatal failure in the module loader, we abort parsing.
2335         Token &Result = IncludeTok;
2336         assert(CurLexer && "#include but no current lexer set!");
2337         Result.startToken();
2338         CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
2339         CurLexer->cutOffLexing();
2340       }
2341       return {ImportAction::None};
2342     }
2343   }
2344 
2345   // The #included file will be considered to be a system header if either it is
2346   // in a system include directory, or if the #includer is a system include
2347   // header.
2348   SrcMgr::CharacteristicKind FileCharacter =
2349       SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
2350   if (File)
2351     FileCharacter = std::max(HeaderInfo.getFileDirFlavor(*File), FileCharacter);
2352 
2353   // If this is a '#import' or an import-declaration, don't re-enter the file.
2354   //
2355   // FIXME: If we have a suggested module for a '#include', and we've already
2356   // visited this file, don't bother entering it again. We know it has no
2357   // further effect.
2358   bool EnterOnce =
2359       IsImportDecl ||
2360       IncludeTok.getIdentifierInfo()->getPPKeywordID() == tok::pp_import;
2361 
2362   bool IsFirstIncludeOfFile = false;
2363 
2364   // Ask HeaderInfo if we should enter this #include file.  If not, #including
2365   // this file will have no effect.
2366   if (Action == Enter && File &&
2367       !HeaderInfo.ShouldEnterIncludeFile(*this, *File, EnterOnce,
2368                                          getLangOpts().Modules, SM,
2369                                          IsFirstIncludeOfFile)) {
2370     // C++ standard modules:
2371     // If we are not in the GMF, then we textually include only
2372     // clang modules:
2373     // Even if we've already preprocessed this header once and know that we
2374     // don't need to see its contents again, we still need to import it if it's
2375     // modular because we might not have imported it from this submodule before.
2376     //
2377     // FIXME: We don't do this when compiling a PCH because the AST
2378     // serialization layer can't cope with it. This means we get local
2379     // submodule visibility semantics wrong in that case.
2380     if (UsableHeaderUnit && !getLangOpts().CompilingPCH)
2381       Action = TrackGMFState.inGMF() ? Import : Skip;
2382     else
2383       Action = (SuggestedModule && !getLangOpts().CompilingPCH) ? Import : Skip;
2384   }
2385 
2386   // Check for circular inclusion of the main file.
2387   // We can't generate a consistent preamble with regard to the conditional
2388   // stack if the main file is included again as due to the preamble bounds
2389   // some directives (e.g. #endif of a header guard) will never be seen.
2390   // Since this will lead to confusing errors, avoid the inclusion.
2391   if (Action == Enter && File && PreambleConditionalStack.isRecording() &&
2392       SourceMgr.isMainFile(File->getFileEntry())) {
2393     Diag(FilenameTok.getLocation(),
2394          diag::err_pp_including_mainfile_in_preamble);
2395     return {ImportAction::None};
2396   }
2397 
2398   if (Callbacks && !IsImportDecl) {
2399     // Notify the callback object that we've seen an inclusion directive.
2400     // FIXME: Use a different callback for a pp-import?
2401     Callbacks->InclusionDirective(HashLoc, IncludeTok, LookupFilename, isAngled,
2402                                   FilenameRange, File, SearchPath, RelativePath,
2403                                   Action == Import ? SuggestedModule.getModule()
2404                                                    : nullptr,
2405                                   FileCharacter);
2406     if (Action == Skip && File)
2407       Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
2408   }
2409 
2410   if (!File)
2411     return {ImportAction::None};
2412 
2413   // If this is a C++20 pp-import declaration, diagnose if we didn't find any
2414   // module corresponding to the named header.
2415   if (IsImportDecl && !SuggestedModule) {
2416     Diag(FilenameTok, diag::err_header_import_not_header_unit)
2417       << OriginalFilename << File->getName();
2418     return {ImportAction::None};
2419   }
2420 
2421   // Issue a diagnostic if the name of the file on disk has a different case
2422   // than the one we're about to open.
2423   const bool CheckIncludePathPortability =
2424       !IsMapped && !File->getFileEntry().tryGetRealPathName().empty();
2425 
2426   if (CheckIncludePathPortability) {
2427     StringRef Name = LookupFilename;
2428     StringRef NameWithoriginalSlashes = Filename;
2429 #if defined(_WIN32)
2430     // Skip UNC prefix if present. (tryGetRealPathName() always
2431     // returns a path with the prefix skipped.)
2432     bool NameWasUNC = Name.consume_front("\\\\?\\");
2433     NameWithoriginalSlashes.consume_front("\\\\?\\");
2434 #endif
2435     StringRef RealPathName = File->getFileEntry().tryGetRealPathName();
2436     SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
2437                                           llvm::sys::path::end(Name));
2438 #if defined(_WIN32)
2439     // -Wnonportable-include-path is designed to diagnose includes using
2440     // case even on systems with a case-insensitive file system.
2441     // On Windows, RealPathName always starts with an upper-case drive
2442     // letter for absolute paths, but Name might start with either
2443     // case depending on if `cd c:\foo` or `cd C:\foo` was used in the shell.
2444     // ("foo" will always have on-disk case, no matter which case was
2445     // used in the cd command). To not emit this warning solely for
2446     // the drive letter, whose case is dependent on if `cd` is used
2447     // with upper- or lower-case drive letters, always consider the
2448     // given drive letter case as correct for the purpose of this warning.
2449     SmallString<128> FixedDriveRealPath;
2450     if (llvm::sys::path::is_absolute(Name) &&
2451         llvm::sys::path::is_absolute(RealPathName) &&
2452         toLowercase(Name[0]) == toLowercase(RealPathName[0]) &&
2453         isLowercase(Name[0]) != isLowercase(RealPathName[0])) {
2454       assert(Components.size() >= 3 && "should have drive, backslash, name");
2455       assert(Components[0].size() == 2 && "should start with drive");
2456       assert(Components[0][1] == ':' && "should have colon");
2457       FixedDriveRealPath = (Name.substr(0, 1) + RealPathName.substr(1)).str();
2458       RealPathName = FixedDriveRealPath;
2459     }
2460 #endif
2461 
2462     if (trySimplifyPath(Components, RealPathName, BackslashStyle)) {
2463       SmallString<128> Path;
2464       Path.reserve(Name.size()+2);
2465       Path.push_back(isAngled ? '<' : '"');
2466 
2467       const auto IsSep = [BackslashStyle](char c) {
2468         return llvm::sys::path::is_separator(c, BackslashStyle);
2469       };
2470 
2471       for (auto Component : Components) {
2472         // On POSIX, Components will contain a single '/' as first element
2473         // exactly if Name is an absolute path.
2474         // On Windows, it will contain "C:" followed by '\' for absolute paths.
2475         // The drive letter is optional for absolute paths on Windows, but
2476         // clang currently cannot process absolute paths in #include lines that
2477         // don't have a drive.
2478         // If the first entry in Components is a directory separator,
2479         // then the code at the bottom of this loop that keeps the original
2480         // directory separator style copies it. If the second entry is
2481         // a directory separator (the C:\ case), then that separator already
2482         // got copied when the C: was processed and we want to skip that entry.
2483         if (!(Component.size() == 1 && IsSep(Component[0])))
2484           Path.append(Component);
2485         else if (Path.size() != 1)
2486           continue;
2487 
2488         // Append the separator(s) the user used, or the close quote
2489         if (Path.size() > NameWithoriginalSlashes.size()) {
2490           Path.push_back(isAngled ? '>' : '"');
2491           continue;
2492         }
2493         assert(IsSep(NameWithoriginalSlashes[Path.size()-1]));
2494         do
2495           Path.push_back(NameWithoriginalSlashes[Path.size()-1]);
2496         while (Path.size() <= NameWithoriginalSlashes.size() &&
2497                IsSep(NameWithoriginalSlashes[Path.size()-1]));
2498       }
2499 
2500 #if defined(_WIN32)
2501       // Restore UNC prefix if it was there.
2502       if (NameWasUNC)
2503         Path = (Path.substr(0, 1) + "\\\\?\\" + Path.substr(1)).str();
2504 #endif
2505 
2506       // For user files and known standard headers, issue a diagnostic.
2507       // For other system headers, don't. They can be controlled separately.
2508       auto DiagId =
2509           (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name))
2510               ? diag::pp_nonportable_path
2511               : diag::pp_nonportable_system_path;
2512       Diag(FilenameTok, DiagId) << Path <<
2513         FixItHint::CreateReplacement(FilenameRange, Path);
2514     }
2515   }
2516 
2517   switch (Action) {
2518   case Skip:
2519     // If we don't need to enter the file, stop now.
2520     if (SM)
2521       return {ImportAction::SkippedModuleImport, SM};
2522     return {ImportAction::None};
2523 
2524   case IncludeLimitReached:
2525     // If we reached our include limit and don't want to enter any more files,
2526     // don't go any further.
2527     return {ImportAction::None};
2528 
2529   case Import: {
2530     // If this is a module import, make it visible if needed.
2531     assert(SM && "no module to import");
2532 
2533     makeModuleVisible(SM, EndLoc);
2534 
2535     if (IncludeTok.getIdentifierInfo()->getPPKeywordID() ==
2536         tok::pp___include_macros)
2537       return {ImportAction::None};
2538 
2539     return {ImportAction::ModuleImport, SM};
2540   }
2541 
2542   case Enter:
2543     break;
2544   }
2545 
2546   // Check that we don't have infinite #include recursion.
2547   if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
2548     Diag(FilenameTok, diag::err_pp_include_too_deep);
2549     HasReachedMaxIncludeDepth = true;
2550     return {ImportAction::None};
2551   }
2552 
2553   if (isAngled && isInNamedModule())
2554     Diag(FilenameTok, diag::warn_pp_include_angled_in_module_purview)
2555         << getNamedModuleName();
2556 
2557   // Look up the file, create a File ID for it.
2558   SourceLocation IncludePos = FilenameTok.getLocation();
2559   // If the filename string was the result of macro expansions, set the include
2560   // position on the file where it will be included and after the expansions.
2561   if (IncludePos.isMacroID())
2562     IncludePos = SourceMgr.getExpansionRange(IncludePos).getEnd();
2563   FileID FID = SourceMgr.createFileID(*File, IncludePos, FileCharacter);
2564   if (!FID.isValid()) {
2565     TheModuleLoader.HadFatalFailure = true;
2566     return ImportAction::Failure;
2567   }
2568 
2569   // If all is good, enter the new file!
2570   if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation(),
2571                       IsFirstIncludeOfFile))
2572     return {ImportAction::None};
2573 
2574   // Determine if we're switching to building a new submodule, and which one.
2575   // This does not apply for C++20 modules header units.
2576   if (SM && !SM->isHeaderUnit()) {
2577     if (SM->getTopLevelModule()->ShadowingModule) {
2578       // We are building a submodule that belongs to a shadowed module. This
2579       // means we find header files in the shadowed module.
2580       Diag(SM->DefinitionLoc, diag::err_module_build_shadowed_submodule)
2581           << SM->getFullModuleName();
2582       Diag(SM->getTopLevelModule()->ShadowingModule->DefinitionLoc,
2583            diag::note_previous_definition);
2584       return {ImportAction::None};
2585     }
2586     // When building a pch, -fmodule-name tells the compiler to textually
2587     // include headers in the specified module. We are not building the
2588     // specified module.
2589     //
2590     // FIXME: This is the wrong way to handle this. We should produce a PCH
2591     // that behaves the same as the header would behave in a compilation using
2592     // that PCH, which means we should enter the submodule. We need to teach
2593     // the AST serialization layer to deal with the resulting AST.
2594     if (getLangOpts().CompilingPCH && SM->isForBuilding(getLangOpts()))
2595       return {ImportAction::None};
2596 
2597     assert(!CurLexerSubmodule && "should not have marked this as a module yet");
2598     CurLexerSubmodule = SM;
2599 
2600     // Let the macro handling code know that any future macros are within
2601     // the new submodule.
2602     EnterSubmodule(SM, EndLoc, /*ForPragma*/ false);
2603 
2604     // Let the parser know that any future declarations are within the new
2605     // submodule.
2606     // FIXME: There's no point doing this if we're handling a #__include_macros
2607     // directive.
2608     return {ImportAction::ModuleBegin, SM};
2609   }
2610 
2611   assert(!IsImportDecl && "failed to diagnose missing module for import decl");
2612   return {ImportAction::None};
2613 }
2614 
2615 /// HandleIncludeNextDirective - Implements \#include_next.
2616 ///
2617 void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2618                                               Token &IncludeNextTok) {
2619   Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
2620 
2621   ConstSearchDirIterator Lookup = nullptr;
2622   const FileEntry *LookupFromFile;
2623   std::tie(Lookup, LookupFromFile) = getIncludeNextStart(IncludeNextTok);
2624 
2625   return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2626                                 LookupFromFile);
2627 }
2628 
2629 /// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
2630 void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2631   // The Microsoft #import directive takes a type library and generates header
2632   // files from it, and includes those.  This is beyond the scope of what clang
2633   // does, so we ignore it and error out.  However, #import can optionally have
2634   // trailing attributes that span multiple lines.  We're going to eat those
2635   // so we can continue processing from there.
2636   Diag(Tok, diag::err_pp_import_directive_ms );
2637 
2638   // Read tokens until we get to the end of the directive.  Note that the
2639   // directive can be split over multiple lines using the backslash character.
2640   DiscardUntilEndOfDirective();
2641 }
2642 
2643 /// HandleImportDirective - Implements \#import.
2644 ///
2645 void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2646                                          Token &ImportTok) {
2647   if (!LangOpts.ObjC) {  // #import is standard for ObjC.
2648     if (LangOpts.MSVCCompat)
2649       return HandleMicrosoftImportDirective(ImportTok);
2650     Diag(ImportTok, diag::ext_pp_import_directive);
2651   }
2652   return HandleIncludeDirective(HashLoc, ImportTok);
2653 }
2654 
2655 /// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2656 /// pseudo directive in the predefines buffer.  This handles it by sucking all
2657 /// tokens through the preprocessor and discarding them (only keeping the side
2658 /// effects on the preprocessor).
2659 void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2660                                                 Token &IncludeMacrosTok) {
2661   // This directive should only occur in the predefines buffer.  If not, emit an
2662   // error and reject it.
2663   SourceLocation Loc = IncludeMacrosTok.getLocation();
2664   if (SourceMgr.getBufferName(Loc) != "<built-in>") {
2665     Diag(IncludeMacrosTok.getLocation(),
2666          diag::pp_include_macros_out_of_predefines);
2667     DiscardUntilEndOfDirective();
2668     return;
2669   }
2670 
2671   // Treat this as a normal #include for checking purposes.  If this is
2672   // successful, it will push a new lexer onto the include stack.
2673   HandleIncludeDirective(HashLoc, IncludeMacrosTok);
2674 
2675   Token TmpTok;
2676   do {
2677     Lex(TmpTok);
2678     assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2679   } while (TmpTok.isNot(tok::hashhash));
2680 }
2681 
2682 //===----------------------------------------------------------------------===//
2683 // Preprocessor Macro Directive Handling.
2684 //===----------------------------------------------------------------------===//
2685 
2686 /// ReadMacroParameterList - The ( starting a parameter list of a macro
2687 /// definition has just been read.  Lex the rest of the parameters and the
2688 /// closing ), updating MI with what we learn.  Return true if an error occurs
2689 /// parsing the param list.
2690 bool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {
2691   SmallVector<IdentifierInfo*, 32> Parameters;
2692 
2693   while (true) {
2694     LexUnexpandedNonComment(Tok);
2695     switch (Tok.getKind()) {
2696     case tok::r_paren:
2697       // Found the end of the parameter list.
2698       if (Parameters.empty())  // #define FOO()
2699         return false;
2700       // Otherwise we have #define FOO(A,)
2701       Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2702       return true;
2703     case tok::ellipsis:  // #define X(... -> C99 varargs
2704       if (!LangOpts.C99)
2705         Diag(Tok, LangOpts.CPlusPlus11 ?
2706              diag::warn_cxx98_compat_variadic_macro :
2707              diag::ext_variadic_macro);
2708 
2709       // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2710       if (LangOpts.OpenCL && !LangOpts.OpenCLCPlusPlus) {
2711         Diag(Tok, diag::ext_pp_opencl_variadic_macros);
2712       }
2713 
2714       // Lex the token after the identifier.
2715       LexUnexpandedNonComment(Tok);
2716       if (Tok.isNot(tok::r_paren)) {
2717         Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2718         return true;
2719       }
2720       // Add the __VA_ARGS__ identifier as a parameter.
2721       Parameters.push_back(Ident__VA_ARGS__);
2722       MI->setIsC99Varargs();
2723       MI->setParameterList(Parameters, BP);
2724       return false;
2725     case tok::eod:  // #define X(
2726       Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2727       return true;
2728     default:
2729       // Handle keywords and identifiers here to accept things like
2730       // #define Foo(for) for.
2731       IdentifierInfo *II = Tok.getIdentifierInfo();
2732       if (!II) {
2733         // #define X(1
2734         Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2735         return true;
2736       }
2737 
2738       // If this is already used as a parameter, it is used multiple times (e.g.
2739       // #define X(A,A.
2740       if (llvm::is_contained(Parameters, II)) { // C99 6.10.3p6
2741         Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
2742         return true;
2743       }
2744 
2745       // Add the parameter to the macro info.
2746       Parameters.push_back(II);
2747 
2748       // Lex the token after the identifier.
2749       LexUnexpandedNonComment(Tok);
2750 
2751       switch (Tok.getKind()) {
2752       default:          // #define X(A B
2753         Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2754         return true;
2755       case tok::r_paren: // #define X(A)
2756         MI->setParameterList(Parameters, BP);
2757         return false;
2758       case tok::comma:  // #define X(A,
2759         break;
2760       case tok::ellipsis:  // #define X(A... -> GCC extension
2761         // Diagnose extension.
2762         Diag(Tok, diag::ext_named_variadic_macro);
2763 
2764         // Lex the token after the identifier.
2765         LexUnexpandedNonComment(Tok);
2766         if (Tok.isNot(tok::r_paren)) {
2767           Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2768           return true;
2769         }
2770 
2771         MI->setIsGNUVarargs();
2772         MI->setParameterList(Parameters, BP);
2773         return false;
2774       }
2775     }
2776   }
2777 }
2778 
2779 static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2780                                    const LangOptions &LOptions) {
2781   if (MI->getNumTokens() == 1) {
2782     const Token &Value = MI->getReplacementToken(0);
2783 
2784     // Macro that is identity, like '#define inline inline' is a valid pattern.
2785     if (MacroName.getKind() == Value.getKind())
2786       return true;
2787 
2788     // Macro that maps a keyword to the same keyword decorated with leading/
2789     // trailing underscores is a valid pattern:
2790     //    #define inline __inline
2791     //    #define inline __inline__
2792     //    #define inline _inline (in MS compatibility mode)
2793     StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2794     if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2795       if (!II->isKeyword(LOptions))
2796         return false;
2797       StringRef ValueText = II->getName();
2798       StringRef TrimmedValue = ValueText;
2799       if (!ValueText.starts_with("__")) {
2800         if (ValueText.starts_with("_"))
2801           TrimmedValue = TrimmedValue.drop_front(1);
2802         else
2803           return false;
2804       } else {
2805         TrimmedValue = TrimmedValue.drop_front(2);
2806         if (TrimmedValue.ends_with("__"))
2807           TrimmedValue = TrimmedValue.drop_back(2);
2808       }
2809       return TrimmedValue.equals(MacroText);
2810     } else {
2811       return false;
2812     }
2813   }
2814 
2815   // #define inline
2816   return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2817                            tok::kw_const) &&
2818          MI->getNumTokens() == 0;
2819 }
2820 
2821 // ReadOptionalMacroParameterListAndBody - This consumes all (i.e. the
2822 // entire line) of the macro's tokens and adds them to MacroInfo, and while
2823 // doing so performs certain validity checks including (but not limited to):
2824 //   - # (stringization) is followed by a macro parameter
2825 //
2826 //  Returns a nullptr if an invalid sequence of tokens is encountered or returns
2827 //  a pointer to a MacroInfo object.
2828 
2829 MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(
2830     const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {
2831 
2832   Token LastTok = MacroNameTok;
2833   // Create the new macro.
2834   MacroInfo *const MI = AllocateMacroInfo(MacroNameTok.getLocation());
2835 
2836   Token Tok;
2837   LexUnexpandedToken(Tok);
2838 
2839   // Ensure we consume the rest of the macro body if errors occur.
2840   auto _ = llvm::make_scope_exit([&]() {
2841     // The flag indicates if we are still waiting for 'eod'.
2842     if (CurLexer->ParsingPreprocessorDirective)
2843       DiscardUntilEndOfDirective();
2844   });
2845 
2846   // Used to un-poison and then re-poison identifiers of the __VA_ARGS__ ilk
2847   // within their appropriate context.
2848   VariadicMacroScopeGuard VariadicMacroScopeGuard(*this);
2849 
2850   // If this is a function-like macro definition, parse the argument list,
2851   // marking each of the identifiers as being used as macro arguments.  Also,
2852   // check other constraints on the first token of the macro body.
2853   if (Tok.is(tok::eod)) {
2854     if (ImmediatelyAfterHeaderGuard) {
2855       // Save this macro information since it may part of a header guard.
2856       CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2857                                         MacroNameTok.getLocation());
2858     }
2859     // If there is no body to this macro, we have no special handling here.
2860   } else if (Tok.hasLeadingSpace()) {
2861     // This is a normal token with leading space.  Clear the leading space
2862     // marker on the first token to get proper expansion.
2863     Tok.clearFlag(Token::LeadingSpace);
2864   } else if (Tok.is(tok::l_paren)) {
2865     // This is a function-like macro definition.  Read the argument list.
2866     MI->setIsFunctionLike();
2867     if (ReadMacroParameterList(MI, LastTok))
2868       return nullptr;
2869 
2870     // If this is a definition of an ISO C/C++ variadic function-like macro (not
2871     // using the GNU named varargs extension) inform our variadic scope guard
2872     // which un-poisons and re-poisons certain identifiers (e.g. __VA_ARGS__)
2873     // allowed only within the definition of a variadic macro.
2874 
2875     if (MI->isC99Varargs()) {
2876       VariadicMacroScopeGuard.enterScope();
2877     }
2878 
2879     // Read the first token after the arg list for down below.
2880     LexUnexpandedToken(Tok);
2881   } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
2882     // C99 requires whitespace between the macro definition and the body.  Emit
2883     // a diagnostic for something like "#define X+".
2884     Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
2885   } else {
2886     // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2887     // first character of a replacement list is not a character required by
2888     // subclause 5.2.1, then there shall be white-space separation between the
2889     // identifier and the replacement list.".  5.2.1 lists this set:
2890     //   "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2891     // is irrelevant here.
2892     bool isInvalid = false;
2893     if (Tok.is(tok::at)) // @ is not in the list above.
2894       isInvalid = true;
2895     else if (Tok.is(tok::unknown)) {
2896       // If we have an unknown token, it is something strange like "`".  Since
2897       // all of valid characters would have lexed into a single character
2898       // token of some sort, we know this is not a valid case.
2899       isInvalid = true;
2900     }
2901     if (isInvalid)
2902       Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2903     else
2904       Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
2905   }
2906 
2907   if (!Tok.is(tok::eod))
2908     LastTok = Tok;
2909 
2910   SmallVector<Token, 16> Tokens;
2911 
2912   // Read the rest of the macro body.
2913   if (MI->isObjectLike()) {
2914     // Object-like macros are very simple, just read their body.
2915     while (Tok.isNot(tok::eod)) {
2916       LastTok = Tok;
2917       Tokens.push_back(Tok);
2918       // Get the next token of the macro.
2919       LexUnexpandedToken(Tok);
2920     }
2921   } else {
2922     // Otherwise, read the body of a function-like macro.  While we are at it,
2923     // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2924     // parameters in function-like macro expansions.
2925 
2926     VAOptDefinitionContext VAOCtx(*this);
2927 
2928     while (Tok.isNot(tok::eod)) {
2929       LastTok = Tok;
2930 
2931       if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
2932         Tokens.push_back(Tok);
2933 
2934         if (VAOCtx.isVAOptToken(Tok)) {
2935           // If we're already within a VAOPT, emit an error.
2936           if (VAOCtx.isInVAOpt()) {
2937             Diag(Tok, diag::err_pp_vaopt_nested_use);
2938             return nullptr;
2939           }
2940           // Ensure VAOPT is followed by a '(' .
2941           LexUnexpandedToken(Tok);
2942           if (Tok.isNot(tok::l_paren)) {
2943             Diag(Tok, diag::err_pp_missing_lparen_in_vaopt_use);
2944             return nullptr;
2945           }
2946           Tokens.push_back(Tok);
2947           VAOCtx.sawVAOptFollowedByOpeningParens(Tok.getLocation());
2948           LexUnexpandedToken(Tok);
2949           if (Tok.is(tok::hashhash)) {
2950             Diag(Tok, diag::err_vaopt_paste_at_start);
2951             return nullptr;
2952           }
2953           continue;
2954         } else if (VAOCtx.isInVAOpt()) {
2955           if (Tok.is(tok::r_paren)) {
2956             if (VAOCtx.sawClosingParen()) {
2957               assert(Tokens.size() >= 3 &&
2958                      "Must have seen at least __VA_OPT__( "
2959                      "and a subsequent tok::r_paren");
2960               if (Tokens[Tokens.size() - 2].is(tok::hashhash)) {
2961                 Diag(Tok, diag::err_vaopt_paste_at_end);
2962                 return nullptr;
2963               }
2964             }
2965           } else if (Tok.is(tok::l_paren)) {
2966             VAOCtx.sawOpeningParen(Tok.getLocation());
2967           }
2968         }
2969         // Get the next token of the macro.
2970         LexUnexpandedToken(Tok);
2971         continue;
2972       }
2973 
2974       // If we're in -traditional mode, then we should ignore stringification
2975       // and token pasting. Mark the tokens as unknown so as not to confuse
2976       // things.
2977       if (getLangOpts().TraditionalCPP) {
2978         Tok.setKind(tok::unknown);
2979         Tokens.push_back(Tok);
2980 
2981         // Get the next token of the macro.
2982         LexUnexpandedToken(Tok);
2983         continue;
2984       }
2985 
2986       if (Tok.is(tok::hashhash)) {
2987         // If we see token pasting, check if it looks like the gcc comma
2988         // pasting extension.  We'll use this information to suppress
2989         // diagnostics later on.
2990 
2991         // Get the next token of the macro.
2992         LexUnexpandedToken(Tok);
2993 
2994         if (Tok.is(tok::eod)) {
2995           Tokens.push_back(LastTok);
2996           break;
2997         }
2998 
2999         if (!Tokens.empty() && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
3000             Tokens[Tokens.size() - 1].is(tok::comma))
3001           MI->setHasCommaPasting();
3002 
3003         // Things look ok, add the '##' token to the macro.
3004         Tokens.push_back(LastTok);
3005         continue;
3006       }
3007 
3008       // Our Token is a stringization operator.
3009       // Get the next token of the macro.
3010       LexUnexpandedToken(Tok);
3011 
3012       // Check for a valid macro arg identifier or __VA_OPT__.
3013       if (!VAOCtx.isVAOptToken(Tok) &&
3014           (Tok.getIdentifierInfo() == nullptr ||
3015            MI->getParameterNum(Tok.getIdentifierInfo()) == -1)) {
3016 
3017         // If this is assembler-with-cpp mode, we accept random gibberish after
3018         // the '#' because '#' is often a comment character.  However, change
3019         // the kind of the token to tok::unknown so that the preprocessor isn't
3020         // confused.
3021         if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
3022           LastTok.setKind(tok::unknown);
3023           Tokens.push_back(LastTok);
3024           continue;
3025         } else {
3026           Diag(Tok, diag::err_pp_stringize_not_parameter)
3027             << LastTok.is(tok::hashat);
3028           return nullptr;
3029         }
3030       }
3031 
3032       // Things look ok, add the '#' and param name tokens to the macro.
3033       Tokens.push_back(LastTok);
3034 
3035       // If the token following '#' is VAOPT, let the next iteration handle it
3036       // and check it for correctness, otherwise add the token and prime the
3037       // loop with the next one.
3038       if (!VAOCtx.isVAOptToken(Tok)) {
3039         Tokens.push_back(Tok);
3040         LastTok = Tok;
3041 
3042         // Get the next token of the macro.
3043         LexUnexpandedToken(Tok);
3044       }
3045     }
3046     if (VAOCtx.isInVAOpt()) {
3047       assert(Tok.is(tok::eod) && "Must be at End Of preprocessing Directive");
3048       Diag(Tok, diag::err_pp_expected_after)
3049         << LastTok.getKind() << tok::r_paren;
3050       Diag(VAOCtx.getUnmatchedOpeningParenLoc(), diag::note_matching) << tok::l_paren;
3051       return nullptr;
3052     }
3053   }
3054   MI->setDefinitionEndLoc(LastTok.getLocation());
3055 
3056   MI->setTokens(Tokens, BP);
3057   return MI;
3058 }
3059 
3060 static bool isObjCProtectedMacro(const IdentifierInfo *II) {
3061   return II->isStr("__strong") || II->isStr("__weak") ||
3062          II->isStr("__unsafe_unretained") || II->isStr("__autoreleasing");
3063 }
3064 
3065 /// HandleDefineDirective - Implements \#define.  This consumes the entire macro
3066 /// line then lets the caller lex the next real token.
3067 void Preprocessor::HandleDefineDirective(
3068     Token &DefineTok, const bool ImmediatelyAfterHeaderGuard) {
3069   ++NumDefined;
3070 
3071   Token MacroNameTok;
3072   bool MacroShadowsKeyword;
3073   ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
3074 
3075   // Error reading macro name?  If so, diagnostic already issued.
3076   if (MacroNameTok.is(tok::eod))
3077     return;
3078 
3079   IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
3080   // Issue a final pragma warning if we're defining a macro that was has been
3081   // undefined and is being redefined.
3082   if (!II->hasMacroDefinition() && II->hadMacroDefinition() && II->isFinal())
3083     emitFinalMacroWarning(MacroNameTok, /*IsUndef=*/false);
3084 
3085   // If we are supposed to keep comments in #defines, reenable comment saving
3086   // mode.
3087   if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
3088 
3089   MacroInfo *const MI = ReadOptionalMacroParameterListAndBody(
3090       MacroNameTok, ImmediatelyAfterHeaderGuard);
3091 
3092   if (!MI) return;
3093 
3094   if (MacroShadowsKeyword &&
3095       !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
3096     Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
3097   }
3098   // Check that there is no paste (##) operator at the beginning or end of the
3099   // replacement list.
3100   unsigned NumTokens = MI->getNumTokens();
3101   if (NumTokens != 0) {
3102     if (MI->getReplacementToken(0).is(tok::hashhash)) {
3103       Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
3104       return;
3105     }
3106     if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
3107       Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
3108       return;
3109     }
3110   }
3111 
3112   // When skipping just warn about macros that do not match.
3113   if (SkippingUntilPCHThroughHeader) {
3114     const MacroInfo *OtherMI = getMacroInfo(MacroNameTok.getIdentifierInfo());
3115     if (!OtherMI || !MI->isIdenticalTo(*OtherMI, *this,
3116                              /*Syntactic=*/LangOpts.MicrosoftExt))
3117       Diag(MI->getDefinitionLoc(), diag::warn_pp_macro_def_mismatch_with_pch)
3118           << MacroNameTok.getIdentifierInfo();
3119     // Issue the diagnostic but allow the change if msvc extensions are enabled
3120     if (!LangOpts.MicrosoftExt)
3121       return;
3122   }
3123 
3124   // Finally, if this identifier already had a macro defined for it, verify that
3125   // the macro bodies are identical, and issue diagnostics if they are not.
3126   if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
3127     // Final macros are hard-mode: they always warn. Even if the bodies are
3128     // identical. Even if they are in system headers. Even if they are things we
3129     // would silently allow in the past.
3130     if (MacroNameTok.getIdentifierInfo()->isFinal())
3131       emitFinalMacroWarning(MacroNameTok, /*IsUndef=*/false);
3132 
3133     // In Objective-C, ignore attempts to directly redefine the builtin
3134     // definitions of the ownership qualifiers.  It's still possible to
3135     // #undef them.
3136     if (getLangOpts().ObjC &&
3137         SourceMgr.getFileID(OtherMI->getDefinitionLoc()) ==
3138             getPredefinesFileID() &&
3139         isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
3140       // Warn if it changes the tokens.
3141       if ((!getDiagnostics().getSuppressSystemWarnings() ||
3142            !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
3143           !MI->isIdenticalTo(*OtherMI, *this,
3144                              /*Syntactic=*/LangOpts.MicrosoftExt)) {
3145         Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
3146       }
3147       assert(!OtherMI->isWarnIfUnused());
3148       return;
3149     }
3150 
3151     // It is very common for system headers to have tons of macro redefinitions
3152     // and for warnings to be disabled in system headers.  If this is the case,
3153     // then don't bother calling MacroInfo::isIdenticalTo.
3154     if (!getDiagnostics().getSuppressSystemWarnings() ||
3155         !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
3156 
3157       if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
3158         Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
3159 
3160       // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
3161       // C++ [cpp.predefined]p4, but allow it as an extension.
3162       if (isLanguageDefinedBuiltin(SourceMgr, OtherMI, II->getName()))
3163         Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
3164       // Macros must be identical.  This means all tokens and whitespace
3165       // separation must be the same.  C99 6.10.3p2.
3166       else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
3167                !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
3168         Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
3169           << MacroNameTok.getIdentifierInfo();
3170         Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
3171       }
3172     }
3173     if (OtherMI->isWarnIfUnused())
3174       WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
3175   }
3176 
3177   DefMacroDirective *MD =
3178       appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
3179 
3180   assert(!MI->isUsed());
3181   // If we need warning for not using the macro, add its location in the
3182   // warn-because-unused-macro set. If it gets used it will be removed from set.
3183   if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
3184       !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc()) &&
3185       !MacroExpansionInDirectivesOverride &&
3186       getSourceManager().getFileID(MI->getDefinitionLoc()) !=
3187           getPredefinesFileID()) {
3188     MI->setIsWarnIfUnused(true);
3189     WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
3190   }
3191 
3192   // If the callbacks want to know, tell them about the macro definition.
3193   if (Callbacks)
3194     Callbacks->MacroDefined(MacroNameTok, MD);
3195 
3196   // If we're in MS compatibility mode and the macro being defined is the
3197   // assert macro, implicitly add a macro definition for static_assert to work
3198   // around their broken assert.h header file in C. Only do so if there isn't
3199   // already a static_assert macro defined.
3200   if (!getLangOpts().CPlusPlus && getLangOpts().MSVCCompat &&
3201       MacroNameTok.getIdentifierInfo()->isStr("assert") &&
3202       !isMacroDefined("static_assert")) {
3203     MacroInfo *MI = AllocateMacroInfo(SourceLocation());
3204 
3205     Token Tok;
3206     Tok.startToken();
3207     Tok.setKind(tok::kw__Static_assert);
3208     Tok.setIdentifierInfo(getIdentifierInfo("_Static_assert"));
3209     MI->setTokens({Tok}, BP);
3210     (void)appendDefMacroDirective(getIdentifierInfo("static_assert"), MI);
3211   }
3212 }
3213 
3214 /// HandleUndefDirective - Implements \#undef.
3215 ///
3216 void Preprocessor::HandleUndefDirective() {
3217   ++NumUndefined;
3218 
3219   Token MacroNameTok;
3220   ReadMacroName(MacroNameTok, MU_Undef);
3221 
3222   // Error reading macro name?  If so, diagnostic already issued.
3223   if (MacroNameTok.is(tok::eod))
3224     return;
3225 
3226   // Check to see if this is the last token on the #undef line.
3227   CheckEndOfDirective("undef");
3228 
3229   // Okay, we have a valid identifier to undef.
3230   auto *II = MacroNameTok.getIdentifierInfo();
3231   auto MD = getMacroDefinition(II);
3232   UndefMacroDirective *Undef = nullptr;
3233 
3234   if (II->isFinal())
3235     emitFinalMacroWarning(MacroNameTok, /*IsUndef=*/true);
3236 
3237   // If the macro is not defined, this is a noop undef.
3238   if (const MacroInfo *MI = MD.getMacroInfo()) {
3239     if (!MI->isUsed() && MI->isWarnIfUnused())
3240       Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
3241 
3242     // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4 and
3243     // C++ [cpp.predefined]p4, but allow it as an extension.
3244     if (isLanguageDefinedBuiltin(SourceMgr, MI, II->getName()))
3245       Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
3246 
3247     if (MI->isWarnIfUnused())
3248       WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
3249 
3250     Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
3251   }
3252 
3253   // If the callbacks want to know, tell them about the macro #undef.
3254   // Note: no matter if the macro was defined or not.
3255   if (Callbacks)
3256     Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
3257 
3258   if (Undef)
3259     appendMacroDirective(II, Undef);
3260 }
3261 
3262 //===----------------------------------------------------------------------===//
3263 // Preprocessor Conditional Directive Handling.
3264 //===----------------------------------------------------------------------===//
3265 
3266 /// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive.  isIfndef
3267 /// is true when this is a \#ifndef directive.  ReadAnyTokensBeforeDirective is
3268 /// true if any tokens have been returned or pp-directives activated before this
3269 /// \#ifndef has been lexed.
3270 ///
3271 void Preprocessor::HandleIfdefDirective(Token &Result,
3272                                         const Token &HashToken,
3273                                         bool isIfndef,
3274                                         bool ReadAnyTokensBeforeDirective) {
3275   ++NumIf;
3276   Token DirectiveTok = Result;
3277 
3278   Token MacroNameTok;
3279   ReadMacroName(MacroNameTok);
3280 
3281   // Error reading macro name?  If so, diagnostic already issued.
3282   if (MacroNameTok.is(tok::eod)) {
3283     // Skip code until we get to #endif.  This helps with recovery by not
3284     // emitting an error when the #endif is reached.
3285     SkipExcludedConditionalBlock(HashToken.getLocation(),
3286                                  DirectiveTok.getLocation(),
3287                                  /*Foundnonskip*/ false, /*FoundElse*/ false);
3288     return;
3289   }
3290 
3291   emitMacroExpansionWarnings(MacroNameTok, /*IsIfnDef=*/true);
3292 
3293   // Check to see if this is the last token on the #if[n]def line.
3294   CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
3295 
3296   IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
3297   auto MD = getMacroDefinition(MII);
3298   MacroInfo *MI = MD.getMacroInfo();
3299 
3300   if (CurPPLexer->getConditionalStackDepth() == 0) {
3301     // If the start of a top-level #ifdef and if the macro is not defined,
3302     // inform MIOpt that this might be the start of a proper include guard.
3303     // Otherwise it is some other form of unknown conditional which we can't
3304     // handle.
3305     if (!ReadAnyTokensBeforeDirective && !MI) {
3306       assert(isIfndef && "#ifdef shouldn't reach here");
3307       CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
3308     } else
3309       CurPPLexer->MIOpt.EnterTopLevelConditional();
3310   }
3311 
3312   // If there is a macro, process it.
3313   if (MI)  // Mark it used.
3314     markMacroAsUsed(MI);
3315 
3316   if (Callbacks) {
3317     if (isIfndef)
3318       Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
3319     else
3320       Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
3321   }
3322 
3323   bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3324     getSourceManager().isInMainFile(DirectiveTok.getLocation());
3325 
3326   // Should we include the stuff contained by this directive?
3327   if (PPOpts->SingleFileParseMode && !MI) {
3328     // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3329     // the directive blocks.
3330     CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
3331                                      /*wasskip*/false, /*foundnonskip*/false,
3332                                      /*foundelse*/false);
3333   } else if (!MI == isIfndef || RetainExcludedCB) {
3334     // Yes, remember that we are inside a conditional, then lex the next token.
3335     CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
3336                                      /*wasskip*/false, /*foundnonskip*/true,
3337                                      /*foundelse*/false);
3338   } else {
3339     // No, skip the contents of this block.
3340     SkipExcludedConditionalBlock(HashToken.getLocation(),
3341                                  DirectiveTok.getLocation(),
3342                                  /*Foundnonskip*/ false,
3343                                  /*FoundElse*/ false);
3344   }
3345 }
3346 
3347 /// HandleIfDirective - Implements the \#if directive.
3348 ///
3349 void Preprocessor::HandleIfDirective(Token &IfToken,
3350                                      const Token &HashToken,
3351                                      bool ReadAnyTokensBeforeDirective) {
3352   ++NumIf;
3353 
3354   // Parse and evaluate the conditional expression.
3355   IdentifierInfo *IfNDefMacro = nullptr;
3356   const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
3357   const bool ConditionalTrue = DER.Conditional;
3358   // Lexer might become invalid if we hit code completion point while evaluating
3359   // expression.
3360   if (!CurPPLexer)
3361     return;
3362 
3363   // If this condition is equivalent to #ifndef X, and if this is the first
3364   // directive seen, handle it for the multiple-include optimization.
3365   if (CurPPLexer->getConditionalStackDepth() == 0) {
3366     if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
3367       // FIXME: Pass in the location of the macro name, not the 'if' token.
3368       CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
3369     else
3370       CurPPLexer->MIOpt.EnterTopLevelConditional();
3371   }
3372 
3373   if (Callbacks)
3374     Callbacks->If(
3375         IfToken.getLocation(), DER.ExprRange,
3376         (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
3377 
3378   bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3379     getSourceManager().isInMainFile(IfToken.getLocation());
3380 
3381   // Should we include the stuff contained by this directive?
3382   if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
3383     // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3384     // the directive blocks.
3385     CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
3386                                      /*foundnonskip*/false, /*foundelse*/false);
3387   } else if (ConditionalTrue || RetainExcludedCB) {
3388     // Yes, remember that we are inside a conditional, then lex the next token.
3389     CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
3390                                    /*foundnonskip*/true, /*foundelse*/false);
3391   } else {
3392     // No, skip the contents of this block.
3393     SkipExcludedConditionalBlock(HashToken.getLocation(), IfToken.getLocation(),
3394                                  /*Foundnonskip*/ false,
3395                                  /*FoundElse*/ false);
3396   }
3397 }
3398 
3399 /// HandleEndifDirective - Implements the \#endif directive.
3400 ///
3401 void Preprocessor::HandleEndifDirective(Token &EndifToken) {
3402   ++NumEndif;
3403 
3404   // Check that this is the whole directive.
3405   CheckEndOfDirective("endif");
3406 
3407   PPConditionalInfo CondInfo;
3408   if (CurPPLexer->popConditionalLevel(CondInfo)) {
3409     // No conditionals on the stack: this is an #endif without an #if.
3410     Diag(EndifToken, diag::err_pp_endif_without_if);
3411     return;
3412   }
3413 
3414   // If this the end of a top-level #endif, inform MIOpt.
3415   if (CurPPLexer->getConditionalStackDepth() == 0)
3416     CurPPLexer->MIOpt.ExitTopLevelConditional();
3417 
3418   assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&
3419          "This code should only be reachable in the non-skipping case!");
3420 
3421   if (Callbacks)
3422     Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
3423 }
3424 
3425 /// HandleElseDirective - Implements the \#else directive.
3426 ///
3427 void Preprocessor::HandleElseDirective(Token &Result, const Token &HashToken) {
3428   ++NumElse;
3429 
3430   // #else directive in a non-skipping conditional... start skipping.
3431   CheckEndOfDirective("else");
3432 
3433   PPConditionalInfo CI;
3434   if (CurPPLexer->popConditionalLevel(CI)) {
3435     Diag(Result, diag::pp_err_else_without_if);
3436     return;
3437   }
3438 
3439   // If this is a top-level #else, inform the MIOpt.
3440   if (CurPPLexer->getConditionalStackDepth() == 0)
3441     CurPPLexer->MIOpt.EnterTopLevelConditional();
3442 
3443   // If this is a #else with a #else before it, report the error.
3444   if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
3445 
3446   if (Callbacks)
3447     Callbacks->Else(Result.getLocation(), CI.IfLoc);
3448 
3449   bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3450     getSourceManager().isInMainFile(Result.getLocation());
3451 
3452   if ((PPOpts->SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {
3453     // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3454     // the directive blocks.
3455     CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
3456                                      /*foundnonskip*/false, /*foundelse*/true);
3457     return;
3458   }
3459 
3460   // Finally, skip the rest of the contents of this block.
3461   SkipExcludedConditionalBlock(HashToken.getLocation(), CI.IfLoc,
3462                                /*Foundnonskip*/ true,
3463                                /*FoundElse*/ true, Result.getLocation());
3464 }
3465 
3466 /// Implements the \#elif, \#elifdef, and \#elifndef directives.
3467 void Preprocessor::HandleElifFamilyDirective(Token &ElifToken,
3468                                              const Token &HashToken,
3469                                              tok::PPKeywordKind Kind) {
3470   PPElifDiag DirKind = Kind == tok::pp_elif      ? PED_Elif
3471                        : Kind == tok::pp_elifdef ? PED_Elifdef
3472                                                  : PED_Elifndef;
3473   ++NumElse;
3474 
3475   // Warn if using `#elifdef` & `#elifndef` in not C23 & C++23 mode.
3476   switch (DirKind) {
3477   case PED_Elifdef:
3478   case PED_Elifndef:
3479     unsigned DiagID;
3480     if (LangOpts.CPlusPlus)
3481       DiagID = LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_pp_directive
3482                                     : diag::ext_cxx23_pp_directive;
3483     else
3484       DiagID = LangOpts.C23 ? diag::warn_c23_compat_pp_directive
3485                             : diag::ext_c23_pp_directive;
3486     Diag(ElifToken, DiagID) << DirKind;
3487     break;
3488   default:
3489     break;
3490   }
3491 
3492   // #elif directive in a non-skipping conditional... start skipping.
3493   // We don't care what the condition is, because we will always skip it (since
3494   // the block immediately before it was included).
3495   SourceRange ConditionRange = DiscardUntilEndOfDirective();
3496 
3497   PPConditionalInfo CI;
3498   if (CurPPLexer->popConditionalLevel(CI)) {
3499     Diag(ElifToken, diag::pp_err_elif_without_if) << DirKind;
3500     return;
3501   }
3502 
3503   // If this is a top-level #elif, inform the MIOpt.
3504   if (CurPPLexer->getConditionalStackDepth() == 0)
3505     CurPPLexer->MIOpt.EnterTopLevelConditional();
3506 
3507   // If this is a #elif with a #else before it, report the error.
3508   if (CI.FoundElse)
3509     Diag(ElifToken, diag::pp_err_elif_after_else) << DirKind;
3510 
3511   if (Callbacks) {
3512     switch (Kind) {
3513     case tok::pp_elif:
3514       Callbacks->Elif(ElifToken.getLocation(), ConditionRange,
3515                       PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
3516       break;
3517     case tok::pp_elifdef:
3518       Callbacks->Elifdef(ElifToken.getLocation(), ConditionRange, CI.IfLoc);
3519       break;
3520     case tok::pp_elifndef:
3521       Callbacks->Elifndef(ElifToken.getLocation(), ConditionRange, CI.IfLoc);
3522       break;
3523     default:
3524       assert(false && "unexpected directive kind");
3525       break;
3526     }
3527   }
3528 
3529   bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3530     getSourceManager().isInMainFile(ElifToken.getLocation());
3531 
3532   if ((PPOpts->SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {
3533     // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3534     // the directive blocks.
3535     CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
3536                                      /*foundnonskip*/false, /*foundelse*/false);
3537     return;
3538   }
3539 
3540   // Finally, skip the rest of the contents of this block.
3541   SkipExcludedConditionalBlock(
3542       HashToken.getLocation(), CI.IfLoc, /*Foundnonskip*/ true,
3543       /*FoundElse*/ CI.FoundElse, ElifToken.getLocation());
3544 }
3545