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