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