blob: 3b7eaee3c914f0bf551bd9c3a9f6e1a89e18f603 [file] [log] [blame]
Chris Lattner89620152008-03-09 03:13:06 +00001//===--- PPDirectives.cpp - Directive Handling for Preprocessor -----------===//
Chris Lattnerf64b3522008-03-09 01:54:53 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Chris Lattnerf64b3522008-03-09 01:54:53 +00006//
7//===----------------------------------------------------------------------===//
James Dennettf6333ac2012-06-22 05:46:07 +00008///
9/// \file
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000010/// Implements # directive processing for the Preprocessor.
James Dennettf6333ac2012-06-22 05:46:07 +000011///
Chris Lattnerf64b3522008-03-09 01:54:53 +000012//===----------------------------------------------------------------------===//
13
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000014#include "clang/Basic/CharInfo.h"
Chris Lattner710bb872009-11-30 04:18:44 +000015#include "clang/Basic/FileManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000016#include "clang/Basic/IdentifierTable.h"
17#include "clang/Basic/LangOptions.h"
18#include "clang/Basic/Module.h"
19#include "clang/Basic/SourceLocation.h"
Chris Lattnerf64b3522008-03-09 01:54:53 +000020#include "clang/Basic/SourceManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000021#include "clang/Basic/TokenKinds.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000022#include "clang/Lex/CodeCompletionHandler.h"
23#include "clang/Lex/HeaderSearch.h"
24#include "clang/Lex/LexDiagnostic.h"
25#include "clang/Lex/LiteralSupport.h"
26#include "clang/Lex/MacroInfo.h"
27#include "clang/Lex/ModuleLoader.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000028#include "clang/Lex/ModuleMap.h"
29#include "clang/Lex/PPCallbacks.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000030#include "clang/Lex/Pragma.h"
Mehdi Amini9670f842016-07-18 19:02:11 +000031#include "clang/Lex/Preprocessor.h"
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +000032#include "clang/Lex/PreprocessorOptions.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000033#include "clang/Lex/Token.h"
Faisal Vali6bf67912017-07-25 03:15:36 +000034#include "clang/Lex/VariadicMacroSupport.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000035#include "llvm/ADT/ArrayRef.h"
Ilya Biryukovb455fc42019-08-01 09:10:37 +000036#include "llvm/ADT/ScopeExit.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000037#include "llvm/ADT/SmallString.h"
38#include "llvm/ADT/SmallVector.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000039#include "llvm/ADT/STLExtras.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000040#include "llvm/ADT/StringSwitch.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000041#include "llvm/ADT/StringRef.h"
42#include "llvm/Support/AlignOf.h"
Douglas Gregor41e115a2011-11-30 18:02:36 +000043#include "llvm/Support/ErrorHandling.h"
Rafael Espindolaf6002232014-08-08 21:31:04 +000044#include "llvm/Support/Path.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000045#include <algorithm>
46#include <cassert>
47#include <cstring>
48#include <new>
49#include <string>
50#include <utility>
Eugene Zelenko1ced5092016-02-12 22:53:10 +000051
Chris Lattnerf64b3522008-03-09 01:54:53 +000052using namespace clang;
53
54//===----------------------------------------------------------------------===//
55// Utility Methods for Preprocessor Directive Handling.
56//===----------------------------------------------------------------------===//
57
Richard Smith3f6dd7a2017-05-12 23:40:52 +000058MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
59 auto *MIChain = new (BP) MacroInfoChain{L, MIChainHead};
Ted Kremenekc8456f82010-10-19 22:15:20 +000060 MIChainHead = MIChain;
Richard Smithee0c4c12014-07-24 01:13:23 +000061 return &MIChain->MI;
Chris Lattnerc0a585d2010-08-17 15:55:45 +000062}
63
Richard Smith50474bf2015-04-23 23:29:05 +000064DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
65 SourceLocation Loc) {
Richard Smith713369b2015-04-23 20:40:50 +000066 return new (BP) DefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000067}
68
69UndefMacroDirective *
Richard Smith50474bf2015-04-23 23:29:05 +000070Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
Richard Smith713369b2015-04-23 20:40:50 +000071 return new (BP) UndefMacroDirective(UndefLoc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000072}
73
74VisibilityMacroDirective *
75Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
76 bool isPublic) {
Richard Smithdaa69e02014-07-25 04:40:03 +000077 return new (BP) VisibilityMacroDirective(Loc, isPublic);
Chris Lattnerc0a585d2010-08-17 15:55:45 +000078}
Chandler Carruthd92d70b2019-01-19 06:36:00 +000079
80/// Read and discard all tokens remaining on the current line until
81/// the tok::eod token is found.
82SourceRange Preprocessor::DiscardUntilEndOfDirective() {
83 Token Tmp;
84 SourceRange Res;
85
86 LexUnexpandedToken(Tmp);
87 Res.setBegin(Tmp.getLocation());
88 while (Tmp.isNot(tok::eod)) {
89 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");
90 LexUnexpandedToken(Tmp);
91 }
92 Res.setEnd(Tmp.getLocation());
93 return Res;
94}
95
96/// Enumerates possible cases of #define/#undef a reserved identifier.
Serge Pavlov07c0f042014-12-18 11:14:21 +000097enum MacroDiag {
98 MD_NoWarn, //> Not a reserved identifier
99 MD_KeywordDef, //> Macro hides keyword, enabled by default
100 MD_ReservedMacro //> #define of #undef reserved id, disabled by default
101};
102
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000103/// Checks if the specified identifier is reserved in the specified
Serge Pavlov07c0f042014-12-18 11:14:21 +0000104/// language.
105/// This function does not check if the identifier is a keyword.
106static bool isReservedId(StringRef Text, const LangOptions &Lang) {
107 // C++ [macro.names], C11 7.1.3:
108 // All identifiers that begin with an underscore and either an uppercase
109 // letter or another underscore are always reserved for any use.
110 if (Text.size() >= 2 && Text[0] == '_' &&
111 (isUppercase(Text[1]) || Text[1] == '_'))
112 return true;
113 // C++ [global.names]
114 // Each name that contains a double underscore ... is reserved to the
115 // implementation for any use.
116 if (Lang.CPlusPlus) {
117 if (Text.find("__") != StringRef::npos)
118 return true;
119 }
Nico Weber92c14bb2014-12-16 21:16:10 +0000120 return false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000121}
122
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +0000123// The -fmodule-name option tells the compiler to textually include headers in
124// the specified module, meaning clang won't build the specified module. This is
125// useful in a number of situations, for instance, when building a library that
126// vends a module map, one might want to avoid hitting intermediate build
Raphael Isemannb23ccec2018-12-10 12:37:46 +0000127// products containimg the the module map or avoid finding the system installed
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +0000128// modulemap for that library.
129static bool isForModuleBuilding(Module *M, StringRef CurrentModule,
130 StringRef ModuleName) {
Bruno Cardoso Lopes5bccc522018-02-16 00:12:57 +0000131 StringRef TopLevelName = M->getTopLevelModuleName();
132
133 // When building framework Foo, we wanna make sure that Foo *and* Foo_Private
134 // are textually included and no modules are built for both.
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +0000135 if (M->getTopLevelModule()->IsFramework && CurrentModule == ModuleName &&
Bruno Cardoso Lopes5bccc522018-02-16 00:12:57 +0000136 !CurrentModule.endswith("_Private") && TopLevelName.endswith("_Private"))
137 TopLevelName = TopLevelName.drop_back(8);
138
139 return TopLevelName == CurrentModule;
140}
141
Serge Pavlov07c0f042014-12-18 11:14:21 +0000142static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
143 const LangOptions &Lang = PP.getLangOpts();
144 StringRef Text = II->getName();
145 if (isReservedId(Text, Lang))
146 return MD_ReservedMacro;
147 if (II->isKeyword(Lang))
148 return MD_KeywordDef;
149 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
150 return MD_KeywordDef;
151 return MD_NoWarn;
152}
153
154static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
155 const LangOptions &Lang = PP.getLangOpts();
156 StringRef Text = II->getName();
157 // Do not warn on keyword undef. It is generally harmless and widely used.
158 if (isReservedId(Text, Lang))
159 return MD_ReservedMacro;
160 return MD_NoWarn;
161}
162
Taewook Ohf42103c2016-06-13 20:40:21 +0000163// Return true if we want to issue a diagnostic by default if we
164// encounter this name in a #include with the wrong case. For now,
165// this includes the standard C and C++ headers, Posix headers,
166// and Boost headers. Improper case for these #includes is a
167// potential portability issue.
168static bool warnByDefaultOnWrongCase(StringRef Include) {
169 // If the first component of the path is "boost", treat this like a standard header
170 // for the purposes of diagnostics.
171 if (::llvm::sys::path::begin(Include)->equals_lower("boost"))
172 return true;
173
174 // "condition_variable" is the longest standard header name at 18 characters.
175 // If the include file name is longer than that, it can't be a standard header.
Taewook Oh755e4d22016-06-13 21:55:33 +0000176 static const size_t MaxStdHeaderNameLen = 18u;
Taewook Ohf42103c2016-06-13 20:40:21 +0000177 if (Include.size() > MaxStdHeaderNameLen)
178 return false;
179
180 // Lowercase and normalize the search string.
181 SmallString<32> LowerInclude{Include};
182 for (char &Ch : LowerInclude) {
183 // In the ASCII range?
George Burgess IV5d3bd932016-06-16 02:30:33 +0000184 if (static_cast<unsigned char>(Ch) > 0x7f)
Taewook Ohf42103c2016-06-13 20:40:21 +0000185 return false; // Can't be a standard header
186 // ASCII lowercase:
187 if (Ch >= 'A' && Ch <= 'Z')
188 Ch += 'a' - 'A';
189 // Normalize path separators for comparison purposes.
190 else if (::llvm::sys::path::is_separator(Ch))
191 Ch = '/';
192 }
193
194 // The standard C/C++ and Posix headers
195 return llvm::StringSwitch<bool>(LowerInclude)
196 // C library headers
197 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
198 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
199 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
200 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
201 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
202 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
203
204 // C++ headers for C library facilities
205 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
206 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
207 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
208 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
209 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
210 .Case("cwctype", true)
211
212 // C++ library headers
213 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
214 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
215 .Cases("atomic", "future", "map", "set", "type_traits", true)
216 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
217 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
218 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
219 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
220 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
221 .Cases("deque", "istream", "queue", "string", "valarray", true)
222 .Cases("exception", "iterator", "random", "strstream", "vector", true)
223 .Cases("forward_list", "limits", "ratio", "system_error", true)
224
225 // POSIX headers (which aren't also C headers)
226 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
227 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
228 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
229 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
230 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
231 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
232 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
233 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
234 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
235 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
236 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
237 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
238 .Default(false);
239}
240
Serge Pavlov07c0f042014-12-18 11:14:21 +0000241bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
242 bool *ShadowFlag) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000243 // Missing macro name?
244 if (MacroNameTok.is(tok::eod))
245 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
246
247 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Olivier Goffart90f981b2017-07-14 09:23:40 +0000248 if (!II)
249 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000250
Olivier Goffart90f981b2017-07-14 09:23:40 +0000251 if (II->isCPlusPlusOperatorKeyword()) {
Alp Tokere03e9e12014-05-31 16:32:22 +0000252 // C++ 2.5p2: Alternative tokens behave the same as its primary token
253 // except for their spellings.
254 Diag(MacroNameTok, getLangOpts().MicrosoftExt
255 ? diag::ext_pp_operator_used_as_macro_name
256 : diag::err_pp_operator_used_as_macro_name)
257 << II << MacroNameTok.getKind();
Alp Tokerc5d194fc2014-05-31 03:38:17 +0000258 // Allow #defining |and| and friends for Microsoft compatibility or
259 // recovery when legacy C headers are included in C++.
Alp Tokerb05e0b52014-05-21 06:13:51 +0000260 }
261
Serge Pavlovd024f522014-10-24 17:31:32 +0000262 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000263 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
264 return Diag(MacroNameTok, diag::err_defined_macro_name);
265 }
266
Richard Smith20e883e2015-04-29 23:20:19 +0000267 if (isDefineUndef == MU_Undef) {
268 auto *MI = getMacroInfo(II);
269 if (MI && MI->isBuiltinMacro()) {
270 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
271 // and C++ [cpp.predefined]p4], but allow it as an extension.
272 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
273 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000274 }
275
Serge Pavlov07c0f042014-12-18 11:14:21 +0000276 // If defining/undefining reserved identifier or a keyword, we need to issue
277 // a warning.
Serge Pavlov83cf0782014-12-11 12:18:08 +0000278 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
Serge Pavlov07c0f042014-12-18 11:14:21 +0000279 if (ShadowFlag)
280 *ShadowFlag = false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000281 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
Mehdi Amini99d1b292016-10-01 16:38:28 +0000282 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
Serge Pavlov07c0f042014-12-18 11:14:21 +0000283 MacroDiag D = MD_NoWarn;
284 if (isDefineUndef == MU_Define) {
285 D = shouldWarnOnMacroDef(*this, II);
286 }
287 else if (isDefineUndef == MU_Undef)
288 D = shouldWarnOnMacroUndef(*this, II);
289 if (D == MD_KeywordDef) {
290 // We do not want to warn on some patterns widely used in configuration
291 // scripts. This requires analyzing next tokens, so do not issue warnings
292 // now, only inform caller.
293 if (ShadowFlag)
294 *ShadowFlag = true;
295 }
296 if (D == MD_ReservedMacro)
297 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
Serge Pavlov83cf0782014-12-11 12:18:08 +0000298 }
299
Alp Tokerb05e0b52014-05-21 06:13:51 +0000300 // Okay, we got a good identifier.
301 return false;
302}
303
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000304/// Lex and validate a macro name, which occurs after a
James Dennettf6333ac2012-06-22 05:46:07 +0000305/// \#define or \#undef.
306///
Serge Pavlovd024f522014-10-24 17:31:32 +0000307/// This sets the token kind to eod and discards the rest of the macro line if
308/// the macro name is invalid.
309///
310/// \param MacroNameTok Token that is expected to be a macro name.
Serge Pavlov07c0f042014-12-18 11:14:21 +0000311/// \param isDefineUndef Context in which macro is used.
312/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
313void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
314 bool *ShadowFlag) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000315 // Read the token, don't allow macro expansion on it.
316 LexUnexpandedToken(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +0000317
Douglas Gregor12785102010-08-24 20:21:13 +0000318 if (MacroNameTok.is(tok::code_completion)) {
319 if (CodeComplete)
Serge Pavlovd024f522014-10-24 17:31:32 +0000320 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000321 setCodeCompletionReached();
Douglas Gregor12785102010-08-24 20:21:13 +0000322 LexUnexpandedToken(MacroNameTok);
Douglas Gregor12785102010-08-24 20:21:13 +0000323 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000324
Serge Pavlov07c0f042014-12-18 11:14:21 +0000325 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
Chris Lattner907dfe92008-11-18 07:59:24 +0000326 return;
Alp Tokerb05e0b52014-05-21 06:13:51 +0000327
328 // Invalid macro name, read and discard the rest of the line and set the
329 // token kind to tok::eod if necessary.
330 if (MacroNameTok.isNot(tok::eod)) {
331 MacroNameTok.setKind(tok::eod);
332 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +0000333 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000334}
335
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000336/// Ensure that the next token is a tok::eod token.
James Dennettf6333ac2012-06-22 05:46:07 +0000337///
338/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
Chris Lattner0003c272009-04-17 23:30:53 +0000339/// true, then we consider macros that expand to zero tokens as being ok.
Richard Smith8af8b862019-04-11 21:18:23 +0000340///
341/// Returns the location of the end of the directive.
342SourceLocation Preprocessor::CheckEndOfDirective(const char *DirType,
343 bool EnableMacros) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000344 Token Tmp;
Chris Lattner0003c272009-04-17 23:30:53 +0000345 // Lex unexpanded tokens for most directives: macros might expand to zero
346 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
347 // #line) allow empty macros.
348 if (EnableMacros)
349 Lex(Tmp);
350 else
351 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000352
Chris Lattnerf64b3522008-03-09 01:54:53 +0000353 // There should be no tokens after the directive, but we allow them as an
354 // extension.
355 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
356 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000357
Richard Smith8af8b862019-04-11 21:18:23 +0000358 if (Tmp.is(tok::eod))
359 return Tmp.getLocation();
360
361 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
362 // or if this is a macro-style preprocessing directive, because it is more
363 // trouble than it is worth to insert /**/ and check that there is no /**/
364 // in the range also.
365 FixItHint Hint;
366 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
367 !CurTokenLexer)
368 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
369 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
370 return DiscardUntilEndOfDirective().getEnd();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000371}
372
Alex Lorenzca6e6092019-09-11 20:40:31 +0000373Optional<unsigned> Preprocessor::getSkippedRangeForExcludedConditionalBlock(
374 SourceLocation HashLoc) {
375 if (!ExcludedConditionalDirectiveSkipMappings)
376 return None;
377 if (!HashLoc.isFileID())
378 return None;
379
380 std::pair<FileID, unsigned> HashFileOffset =
381 SourceMgr.getDecomposedLoc(HashLoc);
382 const llvm::MemoryBuffer *Buf = SourceMgr.getBuffer(HashFileOffset.first);
383 auto It = ExcludedConditionalDirectiveSkipMappings->find(Buf);
384 if (It == ExcludedConditionalDirectiveSkipMappings->end())
385 return None;
386
387 const PreprocessorSkippedRangeMapping &SkippedRanges = *It->getSecond();
388 // Check if the offset of '#' is mapped in the skipped ranges.
389 auto MappingIt = SkippedRanges.find(HashFileOffset.second);
390 if (MappingIt == SkippedRanges.end())
391 return None;
392
393 unsigned BytesToSkip = MappingIt->getSecond();
394 unsigned CurLexerBufferOffset = CurLexer->getCurrentBufferOffset();
395 assert(CurLexerBufferOffset >= HashFileOffset.second &&
396 "lexer is before the hash?");
397 // Take into account the fact that the lexer has already advanced, so the
398 // number of bytes to skip must be adjusted.
399 unsigned LengthDiff = CurLexerBufferOffset - HashFileOffset.second;
400 assert(BytesToSkip >= LengthDiff && "lexer is after the skipped range?");
401 return BytesToSkip - LengthDiff;
402}
403
James Dennettf6333ac2012-06-22 05:46:07 +0000404/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
405/// decided that the subsequent tokens are in the \#if'd out portion of the
406/// file. Lex the rest of the file, until we see an \#endif. If
Chris Lattnerf64b3522008-03-09 01:54:53 +0000407/// FoundNonSkipPortion is true, then we have already emitted code for part of
James Dennettf6333ac2012-06-22 05:46:07 +0000408/// this \#if directive, so \#else/\#elif blocks should never be entered.
409/// If ElseOk is true, then \#else directives are ok, if not, then we have
410/// already seen one so a \#else directive is a duplicate. When this returns,
411/// the caller can lex the first valid token.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000412void Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
Vedant Kumar3919a502017-09-11 20:47:42 +0000413 SourceLocation IfTokenLoc,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000414 bool FoundNonSkipPortion,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000415 bool FoundElse,
416 SourceLocation ElseLoc) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000417 ++NumSkipped;
David Blaikie7d170102013-05-15 07:37:26 +0000418 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?");
Chris Lattnerf64b3522008-03-09 01:54:53 +0000419
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000420 if (PreambleConditionalStack.reachedEOFWhileSkipping())
421 PreambleConditionalStack.clearSkipInfo();
422 else
423 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/ false,
424 FoundNonSkipPortion, FoundElse);
Mike Stump11289f42009-09-09 15:08:12 +0000425
Chris Lattnerf64b3522008-03-09 01:54:53 +0000426 // Enter raw mode to disable identifier lookup (and thus macro expansion),
427 // disabling warnings, etc.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000428 CurPPLexer->LexingRawMode = true;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000429 Token Tok;
Alex Lorenzca6e6092019-09-11 20:40:31 +0000430 if (auto SkipLength =
431 getSkippedRangeForExcludedConditionalBlock(HashTokenLoc)) {
432 // Skip to the next '#endif' / '#else' / '#elif'.
433 CurLexer->skipOver(*SkipLength);
434 }
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000435 while (true) {
Chris Lattnerf406b242010-01-18 22:33:01 +0000436 CurLexer->Lex(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000437
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000438 if (Tok.is(tok::code_completion)) {
439 if (CodeComplete)
440 CodeComplete->CodeCompleteInConditionalExclusion();
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000441 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000442 continue;
443 }
Taewook Oh755e4d22016-06-13 21:55:33 +0000444
Chris Lattnerf64b3522008-03-09 01:54:53 +0000445 // If this is the end of the buffer, we have an error.
446 if (Tok.is(tok::eof)) {
Ilya Biryukov8f738ac2017-09-12 08:35:57 +0000447 // We don't emit errors for unterminated conditionals here,
Raphael Isemannb23ccec2018-12-10 12:37:46 +0000448 // Lexer::LexEndOfFile can do that properly.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000449 // Just return and let the caller lex after this #include.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000450 if (PreambleConditionalStack.isRecording())
451 PreambleConditionalStack.SkipInfo.emplace(
452 HashTokenLoc, IfTokenLoc, FoundNonSkipPortion, FoundElse, ElseLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000453 break;
454 }
Mike Stump11289f42009-09-09 15:08:12 +0000455
Chris Lattnerf64b3522008-03-09 01:54:53 +0000456 // If this token is not a preprocessor directive, just skip it.
457 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
458 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000459
Chris Lattnerf64b3522008-03-09 01:54:53 +0000460 // We just parsed a # character at the start of a line, so we're in
461 // directive mode. Tell the lexer this so any newlines we see will be
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000462 // converted into an EOD token (this terminates the macro).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000463 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rose176057b2013-02-22 00:32:00 +0000464 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000465
Mike Stump11289f42009-09-09 15:08:12 +0000466
Chris Lattnerf64b3522008-03-09 01:54:53 +0000467 // Read the next token, the directive flavor.
468 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000469
Chris Lattnerf64b3522008-03-09 01:54:53 +0000470 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
471 // something bogus), skip it.
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000472 if (Tok.isNot(tok::raw_identifier)) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000473 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000474 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000475 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000476 continue;
477 }
478
479 // If the first letter isn't i or e, it isn't intesting to us. We know that
480 // this is safe in the face of spelling differences, because there is no way
481 // to spell an i/e in a strange way that is another letter. Skipping this
482 // allows us to avoid looking up the identifier info for #define/#undef and
483 // other common directives.
Alp Toker2d57cea2014-05-17 04:53:25 +0000484 StringRef RI = Tok.getRawIdentifier();
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000485
Alp Toker2d57cea2014-05-17 04:53:25 +0000486 char FirstChar = RI[0];
Mike Stump11289f42009-09-09 15:08:12 +0000487 if (FirstChar >= 'a' && FirstChar <= 'z' &&
Chris Lattnerf64b3522008-03-09 01:54:53 +0000488 FirstChar != 'i' && FirstChar != 'e') {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000489 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000490 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000491 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000492 continue;
493 }
Mike Stump11289f42009-09-09 15:08:12 +0000494
Chris Lattnerf64b3522008-03-09 01:54:53 +0000495 // Get the identifier name without trigraphs or embedded newlines. Note
496 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
497 // when skipping.
Benjamin Kramer144884642009-12-31 13:32:38 +0000498 char DirectiveBuf[20];
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000499 StringRef Directive;
Alp Toker2d57cea2014-05-17 04:53:25 +0000500 if (!Tok.needsCleaning() && RI.size() < 20) {
501 Directive = RI;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000502 } else {
503 std::string DirectiveStr = getSpelling(Tok);
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000504 size_t IdLen = DirectiveStr.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000505 if (IdLen >= 20) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000506 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000507 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000508 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000509 continue;
510 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000511 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000512 Directive = StringRef(DirectiveBuf, IdLen);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000513 }
Mike Stump11289f42009-09-09 15:08:12 +0000514
Benjamin Kramer144884642009-12-31 13:32:38 +0000515 if (Directive.startswith("if")) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000516 StringRef Sub = Directive.substr(2);
Benjamin Kramer144884642009-12-31 13:32:38 +0000517 if (Sub.empty() || // "if"
518 Sub == "def" || // "ifdef"
519 Sub == "ndef") { // "ifndef"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000520 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
521 // bother parsing the condition.
522 DiscardUntilEndOfDirective();
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000523 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000524 /*foundnonskip*/false,
Chandler Carruth540960f2011-01-03 17:40:17 +0000525 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000526 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000527 } else if (Directive[0] == 'e') {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000528 StringRef Sub = Directive.substr(1);
Benjamin Kramer144884642009-12-31 13:32:38 +0000529 if (Sub == "ndif") { // "endif"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000530 PPConditionalInfo CondInfo;
531 CondInfo.WasSkipping = true; // Silence bogus warning.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000532 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000533 (void)InCond; // Silence warning in no-asserts mode.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000534 assert(!InCond && "Can't be skipping if not in a conditional!");
Mike Stump11289f42009-09-09 15:08:12 +0000535
Chris Lattnerf64b3522008-03-09 01:54:53 +0000536 // If we popped the outermost skipping block, we're done skipping!
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000537 if (!CondInfo.WasSkipping) {
Richard Smith87d8fb92012-06-24 23:56:26 +0000538 // Restore the value of LexingRawMode so that trailing comments
539 // are handled correctly, if we've reached the outermost block.
540 CurPPLexer->LexingRawMode = false;
Richard Smithd0124572012-06-21 00:35:03 +0000541 CheckEndOfDirective("endif");
Richard Smith87d8fb92012-06-24 23:56:26 +0000542 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000543 if (Callbacks)
544 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000545 break;
Richard Smithd0124572012-06-21 00:35:03 +0000546 } else {
547 DiscardUntilEndOfDirective();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000548 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000549 } else if (Sub == "lse") { // "else".
Chris Lattnerf64b3522008-03-09 01:54:53 +0000550 // #else directive in a skipping conditional. If not in some other
551 // skipping conditional, and if #else hasn't already been seen, enter it
552 // as a non-skipping conditional.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000553 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Mike Stump11289f42009-09-09 15:08:12 +0000554
Chris Lattnerf64b3522008-03-09 01:54:53 +0000555 // If this is a #else with a #else before it, report the error.
556 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000557
Chris Lattnerf64b3522008-03-09 01:54:53 +0000558 // Note that we've seen a #else in this conditional.
559 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000560
Chris Lattnerf64b3522008-03-09 01:54:53 +0000561 // If the conditional is at the top level, and the #if block wasn't
562 // entered, enter the #else block now.
563 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
564 CondInfo.FoundNonSkip = true;
Richard Smith87d8fb92012-06-24 23:56:26 +0000565 // Restore the value of LexingRawMode so that trailing comments
566 // are handled correctly.
567 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000568 CheckEndOfDirective("else");
Richard Smith87d8fb92012-06-24 23:56:26 +0000569 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000570 if (Callbacks)
571 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000572 break;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000573 } else {
574 DiscardUntilEndOfDirective(); // C99 6.10p4.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000575 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000576 } else if (Sub == "lif") { // "elif".
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000577 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000578
John Thompson17c35732013-12-04 20:19:30 +0000579 // If this is a #elif with a #else before it, report the error.
580 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_elif_after_else);
581
Chris Lattnerf64b3522008-03-09 01:54:53 +0000582 // If this is in a skipping block or if we're already handled this #if
583 // block, don't bother parsing the condition.
Chandler Carruthd92d70b2019-01-19 06:36:00 +0000584 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
585 DiscardUntilEndOfDirective();
586 } else {
587 // Restore the value of LexingRawMode so that identifiers are
588 // looked up, etc, inside the #elif expression.
589 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
590 CurPPLexer->LexingRawMode = false;
591 IdentifierInfo *IfNDefMacro = nullptr;
592 DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
593 const bool CondValue = DER.Conditional;
594 CurPPLexer->LexingRawMode = true;
595 if (Callbacks) {
596 Callbacks->Elif(
597 Tok.getLocation(), DER.ExprRange,
598 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False),
599 CondInfo.IfLoc);
600 }
601 // If this condition is true, enter it!
602 if (CondValue) {
John Thompson17c35732013-12-04 20:19:30 +0000603 CondInfo.FoundNonSkip = true;
604 break;
605 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000606 }
607 }
608 }
Mike Stump11289f42009-09-09 15:08:12 +0000609
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000610 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000611 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000612 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000613 }
614
615 // Finally, if we are out of the conditional (saw an #endif or ran off the end
616 // of the file, just stop skipping and return to lexing whatever came after
617 // the #if block.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000618 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000619
Cameron Desrochersb60f1b62018-01-15 19:14:16 +0000620 // The last skipped range isn't actually skipped yet if it's truncated
621 // by the end of the preamble; we'll resume parsing after the preamble.
622 if (Callbacks && (Tok.isNot(tok::eof) || !isRecordingPreamble()))
Vedant Kumar3919a502017-09-11 20:47:42 +0000623 Callbacks->SourceRangeSkipped(
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000624 SourceRange(HashTokenLoc, CurPPLexer->getSourceLocation()),
Vedant Kumar3919a502017-09-11 20:47:42 +0000625 Tok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +0000626}
627
Richard Smith2a553082015-04-23 22:58:06 +0000628Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
Richard Smith7e82e012016-02-19 22:25:36 +0000629 if (!SourceMgr.isInMainFile(Loc)) {
630 // Try to determine the module of the include directive.
631 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
632 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
633 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
634 // The include comes from an included file.
635 return HeaderInfo.getModuleMap()
636 .findModuleForHeader(EntryOfIncl)
637 .getModule();
638 }
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000639 }
Richard Smith7e82e012016-02-19 22:25:36 +0000640
641 // This is either in the main file or not in a file at all. It belongs
642 // to the current module, if there is one.
643 return getLangOpts().CurrentModule.empty()
644 ? nullptr
645 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000646}
647
Richard Smith4eb83932016-04-27 21:57:05 +0000648const FileEntry *
649Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000650 Module *M,
Richard Smith4eb83932016-04-27 21:57:05 +0000651 SourceLocation Loc) {
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000652 assert(M && "no module to include");
653
Richard Smithe867e982019-04-18 00:56:58 +0000654 // If the context is the global module fragment of some module, we never
655 // want to return that file; instead, we want the innermost include-guarded
656 // header that it included.
657 bool InGlobalModuleFragment = M->Kind == Module::GlobalModuleFragment;
658
Richard Smith4eb83932016-04-27 21:57:05 +0000659 // If we have a module import syntax, we shouldn't include a header to
660 // make a particular module visible.
Richard Smithe867e982019-04-18 00:56:58 +0000661 if ((getLangOpts().ObjC || getLangOpts().CPlusPlusModules ||
662 getLangOpts().ModulesTS) &&
663 !InGlobalModuleFragment)
Richard Smith4eb83932016-04-27 21:57:05 +0000664 return nullptr;
665
Richard Smith4eb83932016-04-27 21:57:05 +0000666 Module *TopM = M->getTopLevelModule();
667 Module *IncM = getModuleForLocation(IncLoc);
668
669 // Walk up through the include stack, looking through textual headers of M
670 // until we hit a non-textual header that we can #include. (We assume textual
671 // headers of a module with non-textual headers aren't meant to be used to
672 // import entities from the module.)
673 auto &SM = getSourceManager();
674 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
675 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
676 auto *FE = SM.getFileEntryForID(ID);
Richard Smith040e1262017-06-02 01:55:39 +0000677 if (!FE)
678 break;
Richard Smith4eb83932016-04-27 21:57:05 +0000679
Richard Smithe867e982019-04-18 00:56:58 +0000680 if (InGlobalModuleFragment) {
681 if (getHeaderSearchInfo().isFileMultipleIncludeGuarded(FE))
682 return FE;
683 Loc = SM.getIncludeLoc(ID);
684 continue;
685 }
686
Richard Smith4eb83932016-04-27 21:57:05 +0000687 bool InTextualHeader = false;
688 for (auto Header : HeaderInfo.getModuleMap().findAllModulesForHeader(FE)) {
689 if (!Header.getModule()->isSubModuleOf(TopM))
690 continue;
691
692 if (!(Header.getRole() & ModuleMap::TextualHeader)) {
693 // If this is an accessible, non-textual header of M's top-level module
694 // that transitively includes the given location and makes the
695 // corresponding module visible, this is the thing to #include.
696 if (Header.isAccessibleFrom(IncM))
697 return FE;
698
699 // It's in a private header; we can't #include it.
700 // FIXME: If there's a public header in some module that re-exports it,
701 // then we could suggest including that, but it's not clear that's the
702 // expected way to make this entity visible.
703 continue;
704 }
705
706 InTextualHeader = true;
707 }
708
709 if (!InTextualHeader)
710 break;
711
712 Loc = SM.getIncludeLoc(ID);
713 }
714
715 return nullptr;
716}
717
Alex Lorenz4dc55732019-08-22 18:15:50 +0000718Optional<FileEntryRef> Preprocessor::LookupFile(
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000719 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
720 const DirectoryLookup *FromDir, const FileEntry *FromFile,
721 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
Douglas Gregor97eec242011-09-15 22:00:41 +0000722 SmallVectorImpl<char> *RelativePath,
Volodymyr Sapsai421380a2019-02-05 22:34:55 +0000723 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped,
724 bool *IsFrameworkFound, bool SkipCache) {
Taewook Oh755e4d22016-06-13 21:55:33 +0000725 Module *RequestingModule = getModuleForLocation(FilenameLoc);
Richard Smith8d4e90b2016-03-14 17:52:37 +0000726 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
Richard Smith3d5b48c2015-10-16 21:42:56 +0000727
Will Wilson0fafd342013-12-27 19:46:16 +0000728 // If the header lookup mechanism may be relative to the current inclusion
729 // stack, record the parent #includes.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000730 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
731 Includers;
Manman Rene4a5d372016-05-17 02:15:12 +0000732 bool BuildSystemModule = false;
Richard Smith25d50752014-10-20 00:15:49 +0000733 if (!FromDir && !FromFile) {
Chris Lattnerd32480d2009-01-17 06:22:33 +0000734 FileID FID = getCurrentFileLexer()->getFileID();
Will Wilson0fafd342013-12-27 19:46:16 +0000735 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
Mike Stump11289f42009-09-09 15:08:12 +0000736
Chris Lattner022923a2009-02-04 19:45:07 +0000737 // If there is no file entry associated with this file, it must be the
Richard Smith3c1a41a2014-12-02 00:08:08 +0000738 // predefines buffer or the module includes buffer. Any other file is not
739 // lexed with a normal lexer, so it won't be scanned for preprocessor
740 // directives.
741 //
742 // If we have the predefines buffer, resolve #include references (which come
743 // from the -include command line argument) from the current working
744 // directory instead of relative to the main file.
745 //
746 // If we have the module includes buffer, resolve #include references (which
747 // come from header declarations in the module map) relative to the module
748 // map file.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000749 if (!FileEnt) {
Manman Rene4a5d372016-05-17 02:15:12 +0000750 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Richard Smith3c1a41a2014-12-02 00:08:08 +0000751 Includers.push_back(std::make_pair(nullptr, MainFileDir));
Manman Rene4a5d372016-05-17 02:15:12 +0000752 BuildSystemModule = getCurrentModule()->IsSystem;
753 } else if ((FileEnt =
Richard Smith3c1a41a2014-12-02 00:08:08 +0000754 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Harlan Haskins8d323d12019-08-01 21:31:56 +0000755 Includers.push_back(std::make_pair(FileEnt, *FileMgr.getDirectory(".")));
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000756 } else {
757 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
758 }
Will Wilson0fafd342013-12-27 19:46:16 +0000759
760 // MSVC searches the current include stack from top to bottom for
761 // headers included by quoted include directives.
762 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
Alp Tokerbfa39342014-01-14 12:51:41 +0000763 if (LangOpts.MSVCCompat && !isAngled) {
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000764 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Will Wilson0fafd342013-12-27 19:46:16 +0000765 if (IsFileLexer(ISEntry))
Yaron Keren65224612015-12-18 10:30:12 +0000766 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000767 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
Will Wilson0fafd342013-12-27 19:46:16 +0000768 }
Chris Lattner022923a2009-02-04 19:45:07 +0000769 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000770 }
Mike Stump11289f42009-09-09 15:08:12 +0000771
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000772 CurDir = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +0000773
774 if (FromFile) {
775 // We're supposed to start looking from after a particular file. Search
776 // the include path until we find that file or run out of files.
777 const DirectoryLookup *TmpCurDir = CurDir;
778 const DirectoryLookup *TmpFromDir = nullptr;
Alex Lorenz4dc55732019-08-22 18:15:50 +0000779 while (Optional<FileEntryRef> FE = HeaderInfo.LookupFile(
Richard Smith25d50752014-10-20 00:15:49 +0000780 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000781 Includers, SearchPath, RelativePath, RequestingModule,
Volodymyr Sapsai421380a2019-02-05 22:34:55 +0000782 SuggestedModule, /*IsMapped=*/nullptr,
783 /*IsFrameworkFound=*/nullptr, SkipCache)) {
Richard Smith25d50752014-10-20 00:15:49 +0000784 // Keep looking as if this file did a #include_next.
785 TmpFromDir = TmpCurDir;
786 ++TmpFromDir;
Alex Lorenz4dc55732019-08-22 18:15:50 +0000787 if (&FE->getFileEntry() == FromFile) {
Richard Smith25d50752014-10-20 00:15:49 +0000788 // Found it.
789 FromDir = TmpFromDir;
790 CurDir = TmpCurDir;
791 break;
792 }
793 }
794 }
795
796 // Do a standard file entry lookup.
Alex Lorenz4dc55732019-08-22 18:15:50 +0000797 Optional<FileEntryRef> FE = HeaderInfo.LookupFile(
Will Wilson0fafd342013-12-27 19:46:16 +0000798 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
Volodymyr Sapsai421380a2019-02-05 22:34:55 +0000799 RelativePath, RequestingModule, SuggestedModule, IsMapped,
800 IsFrameworkFound, SkipCache, BuildSystemModule);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000801 if (FE) {
Daniel Jasper5c77e392014-03-14 14:53:17 +0000802 if (SuggestedModule && !LangOpts.AsmPreprocessor)
Daniel Jasper92669ee2013-12-20 12:09:36 +0000803 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000804 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
Alex Lorenz4dc55732019-08-22 18:15:50 +0000805 Filename, &FE->getFileEntry());
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000806 return FE;
807 }
Mike Stump11289f42009-09-09 15:08:12 +0000808
Will Wilson0fafd342013-12-27 19:46:16 +0000809 const FileEntry *CurFileEnt;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000810 // Otherwise, see if this is a subframework header. If so, this is relative
811 // to one of the headers on the #include stack. Walk the list of the current
812 // headers on the #include stack and pass them to HeaderInfo.
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000813 if (IsFileLexer()) {
Yaron Keren65224612015-12-18 10:30:12 +0000814 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
Alex Lorenz4dc55732019-08-22 18:15:50 +0000815 if (Optional<FileEntryRef> FE = HeaderInfo.LookupSubframeworkHeader(
816 Filename, CurFileEnt, SearchPath, RelativePath, RequestingModule,
817 SuggestedModule)) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000818 if (SuggestedModule && !LangOpts.AsmPreprocessor)
819 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000820 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
Alex Lorenz4dc55732019-08-22 18:15:50 +0000821 Filename, &FE->getFileEntry());
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000822 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000823 }
824 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000825 }
Mike Stump11289f42009-09-09 15:08:12 +0000826
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000827 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000828 if (IsFileLexer(ISEntry)) {
Yaron Keren65224612015-12-18 10:30:12 +0000829 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
Alex Lorenz4dc55732019-08-22 18:15:50 +0000830 if (Optional<FileEntryRef> FE = HeaderInfo.LookupSubframeworkHeader(
Douglas Gregorf5f94522013-02-08 00:10:48 +0000831 Filename, CurFileEnt, SearchPath, RelativePath,
Alex Lorenz4dc55732019-08-22 18:15:50 +0000832 RequestingModule, SuggestedModule)) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000833 if (SuggestedModule && !LangOpts.AsmPreprocessor)
834 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000835 RequestingModule, RequestingModuleIsModuleInterface,
Alex Lorenz4dc55732019-08-22 18:15:50 +0000836 FilenameLoc, Filename, &FE->getFileEntry());
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000837 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000838 }
839 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000840 }
841 }
Mike Stump11289f42009-09-09 15:08:12 +0000842
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000843 // Otherwise, we really couldn't find the file.
Alex Lorenz4dc55732019-08-22 18:15:50 +0000844 return None;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000845}
846
Chris Lattnerf64b3522008-03-09 01:54:53 +0000847//===----------------------------------------------------------------------===//
848// Preprocessor Directive Handling.
849//===----------------------------------------------------------------------===//
850
David Blaikied5321242012-06-06 18:52:13 +0000851class Preprocessor::ResetMacroExpansionHelper {
852public:
853 ResetMacroExpansionHelper(Preprocessor *pp)
854 : PP(pp), save(pp->DisableMacroExpansion) {
855 if (pp->MacroExpansionInDirectivesOverride)
856 pp->DisableMacroExpansion = false;
857 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000858
David Blaikied5321242012-06-06 18:52:13 +0000859 ~ResetMacroExpansionHelper() {
860 PP->DisableMacroExpansion = save;
861 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000862
David Blaikied5321242012-06-06 18:52:13 +0000863private:
864 Preprocessor *PP;
865 bool save;
866};
867
Mike Rice58df1af2018-09-11 17:10:44 +0000868/// Process a directive while looking for the through header or a #pragma
869/// hdrstop. The following directives are handled:
870/// #include (to check if it is the through header)
871/// #define (to warn about macros that don't match the PCH)
872/// #pragma (to check for pragma hdrstop).
873/// All other directives are completely discarded.
874void Preprocessor::HandleSkippedDirectiveWhileUsingPCH(Token &Result,
Erich Keane76675de2018-07-05 17:22:13 +0000875 SourceLocation HashLoc) {
876 if (const IdentifierInfo *II = Result.getIdentifierInfo()) {
Mike Rice58df1af2018-09-11 17:10:44 +0000877 if (II->getPPKeywordID() == tok::pp_define) {
Erich Keane76675de2018-07-05 17:22:13 +0000878 return HandleDefineDirective(Result,
879 /*ImmediatelyAfterHeaderGuard=*/false);
Mike Rice58df1af2018-09-11 17:10:44 +0000880 }
881 if (SkippingUntilPCHThroughHeader &&
882 II->getPPKeywordID() == tok::pp_include) {
883 return HandleIncludeDirective(HashLoc, Result);
884 }
885 if (SkippingUntilPragmaHdrStop && II->getPPKeywordID() == tok::pp_pragma) {
Richard Smith75f96812019-04-11 21:18:22 +0000886 Lex(Result);
887 auto *II = Result.getIdentifierInfo();
Mike Rice58df1af2018-09-11 17:10:44 +0000888 if (II && II->getName() == "hdrstop")
Richard Smith75f96812019-04-11 21:18:22 +0000889 return HandlePragmaHdrstop(Result);
Mike Rice58df1af2018-09-11 17:10:44 +0000890 }
Erich Keane76675de2018-07-05 17:22:13 +0000891 }
892 DiscardUntilEndOfDirective();
893}
894
Chris Lattnerf64b3522008-03-09 01:54:53 +0000895/// HandleDirective - This callback is invoked when the lexer sees a # token
Mike Stump11289f42009-09-09 15:08:12 +0000896/// at the start of a line. This consumes the directive, modifies the
Chris Lattnerf64b3522008-03-09 01:54:53 +0000897/// lexer/preprocessor state, and advances the lexer(s) so that the next token
898/// read is the correct one.
899void Preprocessor::HandleDirective(Token &Result) {
900 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
Mike Stump11289f42009-09-09 15:08:12 +0000901
Chris Lattnerf64b3522008-03-09 01:54:53 +0000902 // We just parsed a # character at the start of a line, so we're in directive
903 // mode. Tell the lexer this so any newlines we see will be converted into an
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000904 // EOD token (which terminates the directive).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000905 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000906 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Mike Stump11289f42009-09-09 15:08:12 +0000907
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000908 bool ImmediatelyAfterTopLevelIfndef =
909 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
910 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
911
Chris Lattnerf64b3522008-03-09 01:54:53 +0000912 ++NumDirectives;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +0000913
Chris Lattnerf64b3522008-03-09 01:54:53 +0000914 // We are about to read a token. For the multiple-include optimization FA to
Mike Stump11289f42009-09-09 15:08:12 +0000915 // work, we have to remember if we had read any tokens *before* this
Chris Lattnerf64b3522008-03-09 01:54:53 +0000916 // pp-directive.
Chris Lattner8cf1f932009-12-14 04:54:40 +0000917 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
Mike Stump11289f42009-09-09 15:08:12 +0000918
Chris Lattner2d17ab72009-03-18 21:00:25 +0000919 // Save the '#' token in case we need to return it later.
920 Token SavedHash = Result;
Mike Stump11289f42009-09-09 15:08:12 +0000921
Chris Lattnerf64b3522008-03-09 01:54:53 +0000922 // Read the next token, the directive flavor. This isn't expanded due to
923 // C99 6.10.3p8.
924 LexUnexpandedToken(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000925
Chris Lattnerf64b3522008-03-09 01:54:53 +0000926 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
927 // #define A(x) #x
928 // A(abc
929 // #warning blah
930 // def)
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000931 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
932 // not support this for #include-like directives, since that can result in
933 // terrible diagnostics, and does not work in GCC.
934 if (InMacroArgs) {
935 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
936 switch (II->getPPKeywordID()) {
937 case tok::pp_include:
938 case tok::pp_import:
939 case tok::pp_include_next:
940 case tok::pp___include_macros:
David Majnemerf2d3bc02014-12-28 07:42:49 +0000941 case tok::pp_pragma:
942 Diag(Result, diag::err_embedded_directive) << II->getName();
Nico Weber023dd1e2019-02-14 04:13:17 +0000943 Diag(*ArgMacro, diag::note_macro_expansion_here)
944 << ArgMacro->getIdentifierInfo();
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000945 DiscardUntilEndOfDirective();
946 return;
947 default:
948 break;
949 }
950 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000951 Diag(Result, diag::ext_embedded_directive);
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000952 }
Mike Stump11289f42009-09-09 15:08:12 +0000953
David Blaikied5321242012-06-06 18:52:13 +0000954 // Temporarily enable macro expansion if set so
955 // and reset to previous state when returning from this function.
956 ResetMacroExpansionHelper helper(this);
957
Mike Rice58df1af2018-09-11 17:10:44 +0000958 if (SkippingUntilPCHThroughHeader || SkippingUntilPragmaHdrStop)
959 return HandleSkippedDirectiveWhileUsingPCH(Result, SavedHash.getLocation());
Erich Keane76675de2018-07-05 17:22:13 +0000960
Chris Lattnerf64b3522008-03-09 01:54:53 +0000961 switch (Result.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000962 case tok::eod:
Chris Lattnerf64b3522008-03-09 01:54:53 +0000963 return; // null directive.
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000964 case tok::code_completion:
965 if (CodeComplete)
966 CodeComplete->CodeCompleteDirective(
967 CurPPLexer->getConditionalStackDepth() > 0);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000968 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000969 return;
Chris Lattner76e68962009-01-26 06:19:46 +0000970 case tok::numeric_constant: // # 7 GNU line marker directive.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000971 if (getLangOpts().AsmPreprocessor)
Chris Lattner5eb8ae22009-03-18 20:41:10 +0000972 break; // # 4 is not a preprocessor directive in .S files.
Chris Lattner76e68962009-01-26 06:19:46 +0000973 return HandleDigitDirective(Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000974 default:
975 IdentifierInfo *II = Result.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +0000976 if (!II) break; // Not an identifier.
Mike Stump11289f42009-09-09 15:08:12 +0000977
Chris Lattnerf64b3522008-03-09 01:54:53 +0000978 // Ask what the preprocessor keyword ID is.
979 switch (II->getPPKeywordID()) {
980 default: break;
981 // C99 6.10.1 - Conditional Inclusion.
982 case tok::pp_if:
Vedant Kumar3919a502017-09-11 20:47:42 +0000983 return HandleIfDirective(Result, SavedHash, ReadAnyTokensBeforeDirective);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000984 case tok::pp_ifdef:
Vedant Kumar3919a502017-09-11 20:47:42 +0000985 return HandleIfdefDirective(Result, SavedHash, false,
986 true /*not valid for miopt*/);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000987 case tok::pp_ifndef:
Vedant Kumar3919a502017-09-11 20:47:42 +0000988 return HandleIfdefDirective(Result, SavedHash, true,
989 ReadAnyTokensBeforeDirective);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000990 case tok::pp_elif:
Vedant Kumar3919a502017-09-11 20:47:42 +0000991 return HandleElifDirective(Result, SavedHash);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000992 case tok::pp_else:
Vedant Kumar3919a502017-09-11 20:47:42 +0000993 return HandleElseDirective(Result, SavedHash);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000994 case tok::pp_endif:
995 return HandleEndifDirective(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000996
Chris Lattnerf64b3522008-03-09 01:54:53 +0000997 // C99 6.10.2 - Source File Inclusion.
998 case tok::pp_include:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000999 // Handle #include.
1000 return HandleIncludeDirective(SavedHash.getLocation(), Result);
Chris Lattner14a7f392009-04-08 18:24:34 +00001001 case tok::pp___include_macros:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001002 // Handle -imacros.
Taewook Oh755e4d22016-06-13 21:55:33 +00001003 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001004
Chris Lattnerf64b3522008-03-09 01:54:53 +00001005 // C99 6.10.3 - Macro Replacement.
1006 case tok::pp_define:
Richard Trieu33a4b3d2013-06-12 21:20:57 +00001007 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001008 case tok::pp_undef:
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001009 return HandleUndefDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001010
1011 // C99 6.10.4 - Line Control.
1012 case tok::pp_line:
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001013 return HandleLineDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001014
Chris Lattnerf64b3522008-03-09 01:54:53 +00001015 // C99 6.10.5 - Error Directive.
1016 case tok::pp_error:
1017 return HandleUserDiagnosticDirective(Result, false);
Mike Stump11289f42009-09-09 15:08:12 +00001018
Chris Lattnerf64b3522008-03-09 01:54:53 +00001019 // C99 6.10.6 - Pragma Directive.
1020 case tok::pp_pragma:
Joel E. Dennyddde0ec2019-05-21 23:51:38 +00001021 return HandlePragmaDirective({PIK_HashPragma, SavedHash.getLocation()});
Mike Stump11289f42009-09-09 15:08:12 +00001022
Chris Lattnerf64b3522008-03-09 01:54:53 +00001023 // GNU Extensions.
1024 case tok::pp_import:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001025 return HandleImportDirective(SavedHash.getLocation(), Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001026 case tok::pp_include_next:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001027 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001028
Chris Lattnerf64b3522008-03-09 01:54:53 +00001029 case tok::pp_warning:
1030 Diag(Result, diag::ext_pp_warning_directive);
1031 return HandleUserDiagnosticDirective(Result, true);
1032 case tok::pp_ident:
1033 return HandleIdentSCCSDirective(Result);
1034 case tok::pp_sccs:
1035 return HandleIdentSCCSDirective(Result);
1036 case tok::pp_assert:
1037 //isExtension = true; // FIXME: implement #assert
1038 break;
1039 case tok::pp_unassert:
1040 //isExtension = true; // FIXME: implement #unassert
1041 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001042
Douglas Gregor663b48f2012-01-03 19:48:16 +00001043 case tok::pp___public_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001044 if (getLangOpts().Modules)
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001045 return HandleMacroPublicDirective(Result);
1046 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001047
Douglas Gregor663b48f2012-01-03 19:48:16 +00001048 case tok::pp___private_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001049 if (getLangOpts().Modules)
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001050 return HandleMacroPrivateDirective();
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001051 break;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001052 }
1053 break;
1054 }
Mike Stump11289f42009-09-09 15:08:12 +00001055
Chris Lattner2d17ab72009-03-18 21:00:25 +00001056 // If this is a .S file, treat unknown # directives as non-preprocessor
1057 // directives. This is important because # may be a comment or introduce
1058 // various pseudo-ops. Just return the # token and push back the following
1059 // token to be lexed next time.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001060 if (getLangOpts().AsmPreprocessor) {
Jonas Devlieghere2b3d49b2019-08-14 23:04:18 +00001061 auto Toks = std::make_unique<Token[]>(2);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001062 // Return the # and the token after it.
Mike Stump11289f42009-09-09 15:08:12 +00001063 Toks[0] = SavedHash;
Chris Lattner2d17ab72009-03-18 21:00:25 +00001064 Toks[1] = Result;
Taewook Oh755e4d22016-06-13 21:55:33 +00001065
Chris Lattner56f64c12011-01-06 05:01:51 +00001066 // If the second token is a hashhash token, then we need to translate it to
1067 // unknown so the token lexer doesn't try to perform token pasting.
1068 if (Result.is(tok::hashhash))
1069 Toks[1].setKind(tok::unknown);
Taewook Oh755e4d22016-06-13 21:55:33 +00001070
Chris Lattner2d17ab72009-03-18 21:00:25 +00001071 // Enter this token stream so that we re-lex the tokens. Make sure to
1072 // enable macro expansion, in case the token after the # is an identifier
1073 // that is expanded.
Ilya Biryukov929af672019-05-17 09:32:05 +00001074 EnterTokenStream(std::move(Toks), 2, false, /*IsReinject*/false);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001075 return;
1076 }
Mike Stump11289f42009-09-09 15:08:12 +00001077
Chris Lattnerf64b3522008-03-09 01:54:53 +00001078 // If we reached here, the preprocessing token is not valid!
1079 Diag(Result, diag::err_pp_invalid_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001080
Chris Lattnerf64b3522008-03-09 01:54:53 +00001081 // Read the rest of the PP line.
1082 DiscardUntilEndOfDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001083
Chris Lattnerf64b3522008-03-09 01:54:53 +00001084 // Okay, we're done parsing the directive.
1085}
1086
Chris Lattner76e68962009-01-26 06:19:46 +00001087/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1088/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1089static bool GetLineValue(Token &DigitTok, unsigned &Val,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001090 unsigned DiagID, Preprocessor &PP,
1091 bool IsGNULineDirective=false) {
Chris Lattner76e68962009-01-26 06:19:46 +00001092 if (DigitTok.isNot(tok::numeric_constant)) {
1093 PP.Diag(DigitTok, DiagID);
Mike Stump11289f42009-09-09 15:08:12 +00001094
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001095 if (DigitTok.isNot(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001096 PP.DiscardUntilEndOfDirective();
1097 return true;
1098 }
Mike Stump11289f42009-09-09 15:08:12 +00001099
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001100 SmallString<64> IntegerBuffer;
Chris Lattner76e68962009-01-26 06:19:46 +00001101 IntegerBuffer.resize(DigitTok.getLength());
1102 const char *DigitTokBegin = &IntegerBuffer[0];
Douglas Gregordc970f02010-03-16 22:30:13 +00001103 bool Invalid = false;
1104 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1105 if (Invalid)
1106 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001107
Chris Lattnerd66f1722009-04-18 18:35:15 +00001108 // Verify that we have a simple digit-sequence, and compute the value. This
1109 // is always a simple digit string computed in decimal, so we do this manually
1110 // here.
1111 Val = 0;
1112 for (unsigned i = 0; i != ActualLength; ++i) {
Richard Smith7f2707a2013-09-26 18:13:20 +00001113 // C++1y [lex.fcon]p1:
1114 // Optional separating single quotes in a digit-sequence are ignored
1115 if (DigitTokBegin[i] == '\'')
1116 continue;
1117
Jordan Rosea7d03842013-02-08 22:30:41 +00001118 if (!isDigit(DigitTokBegin[i])) {
Chris Lattnerd66f1722009-04-18 18:35:15 +00001119 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
Michael Ilsemane910cc82013-04-10 01:04:18 +00001120 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001121 PP.DiscardUntilEndOfDirective();
1122 return true;
1123 }
Mike Stump11289f42009-09-09 15:08:12 +00001124
Chris Lattnerd66f1722009-04-18 18:35:15 +00001125 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1126 if (NextVal < Val) { // overflow.
1127 PP.Diag(DigitTok, DiagID);
1128 PP.DiscardUntilEndOfDirective();
1129 return true;
1130 }
1131 Val = NextVal;
Chris Lattner76e68962009-01-26 06:19:46 +00001132 }
Mike Stump11289f42009-09-09 15:08:12 +00001133
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001134 if (DigitTokBegin[0] == '0' && Val)
Michael Ilsemane910cc82013-04-10 01:04:18 +00001135 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1136 << IsGNULineDirective;
Mike Stump11289f42009-09-09 15:08:12 +00001137
Chris Lattner76e68962009-01-26 06:19:46 +00001138 return false;
1139}
1140
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001141/// Handle a \#line directive: C99 6.10.4.
James Dennettf6333ac2012-06-22 05:46:07 +00001142///
1143/// The two acceptable forms are:
1144/// \verbatim
Chris Lattner100c65e2009-01-26 05:29:08 +00001145/// # line digit-sequence
1146/// # line digit-sequence "s-char-sequence"
James Dennettf6333ac2012-06-22 05:46:07 +00001147/// \endverbatim
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001148void Preprocessor::HandleLineDirective() {
Chris Lattner100c65e2009-01-26 05:29:08 +00001149 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1150 // expanded.
1151 Token DigitTok;
1152 Lex(DigitTok);
1153
Chris Lattner100c65e2009-01-26 05:29:08 +00001154 // Validate the number and convert it to an unsigned.
Chris Lattner76e68962009-01-26 06:19:46 +00001155 unsigned LineNo;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001156 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
Chris Lattner100c65e2009-01-26 05:29:08 +00001157 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001158
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001159 if (LineNo == 0)
1160 Diag(DigitTok, diag::ext_pp_line_zero);
Chris Lattner100c65e2009-01-26 05:29:08 +00001161
Chris Lattner76e68962009-01-26 06:19:46 +00001162 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1163 // number greater than 2147483647". C90 requires that the line # be <= 32767.
Eli Friedman192e0342011-10-10 23:35:28 +00001164 unsigned LineLimit = 32768U;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001165 if (LangOpts.C99 || LangOpts.CPlusPlus11)
Eli Friedman192e0342011-10-10 23:35:28 +00001166 LineLimit = 2147483648U;
Chris Lattner100c65e2009-01-26 05:29:08 +00001167 if (LineNo >= LineLimit)
1168 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001169 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
Richard Smithacd4d3d2011-10-15 01:18:56 +00001170 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
Mike Stump11289f42009-09-09 15:08:12 +00001171
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001172 int FilenameID = -1;
Chris Lattner100c65e2009-01-26 05:29:08 +00001173 Token StrTok;
1174 Lex(StrTok);
1175
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001176 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1177 // string followed by eod.
1178 if (StrTok.is(tok::eod))
Chandler Carruthd92d70b2019-01-19 06:36:00 +00001179 ; // ok
1180 else if (StrTok.isNot(tok::string_literal)) {
1181 Diag(StrTok, diag::err_pp_line_invalid_filename);
1182 DiscardUntilEndOfDirective();
1183 return;
1184 } else if (StrTok.hasUDSuffix()) {
1185 Diag(StrTok, diag::err_invalid_string_udl);
1186 DiscardUntilEndOfDirective();
1187 return;
1188 } else {
1189 // Parse and validate the string, converting it into a unique ID.
1190 StringLiteralParser Literal(StrTok, *this);
1191 assert(Literal.isAscii() && "Didn't allow wide strings in");
1192 if (Literal.hadError) {
1193 DiscardUntilEndOfDirective();
1194 return;
1195 }
1196 if (Literal.Pascal) {
1197 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1198 DiscardUntilEndOfDirective();
1199 return;
1200 }
1201 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
1202
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001203 // Verify that there is nothing after the string, other than EOD. Because
Chris Lattner0003c272009-04-17 23:30:53 +00001204 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1205 CheckEndOfDirective("line", true);
Chris Lattner100c65e2009-01-26 05:29:08 +00001206 }
Mike Stump11289f42009-09-09 15:08:12 +00001207
Reid Klecknereb00ee02017-05-22 21:42:58 +00001208 // Take the file kind of the file containing the #line directive. #line
1209 // directives are often used for generated sources from the same codebase, so
1210 // the new file should generally be classified the same way as the current
1211 // file. This is visible in GCC's pre-processed output, which rewrites #line
1212 // to GNU line markers.
1213 SrcMgr::CharacteristicKind FileKind =
1214 SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1215
1216 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1217 false, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001218
Chris Lattner839150e2009-03-27 17:13:49 +00001219 if (Callbacks)
Chris Lattnerc745cec2010-04-14 04:28:50 +00001220 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
Reid Klecknereb00ee02017-05-22 21:42:58 +00001221 PPCallbacks::RenameFile, FileKind);
Chris Lattner100c65e2009-01-26 05:29:08 +00001222}
1223
Chris Lattner76e68962009-01-26 06:19:46 +00001224/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1225/// marker directive.
1226static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
Reid Klecknereb00ee02017-05-22 21:42:58 +00001227 SrcMgr::CharacteristicKind &FileKind,
Chris Lattner76e68962009-01-26 06:19:46 +00001228 Preprocessor &PP) {
1229 unsigned FlagVal;
1230 Token FlagTok;
1231 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001232 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001233 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1234 return true;
1235
1236 if (FlagVal == 1) {
1237 IsFileEntry = true;
Mike Stump11289f42009-09-09 15:08:12 +00001238
Chris Lattner76e68962009-01-26 06:19:46 +00001239 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001240 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001241 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1242 return true;
1243 } else if (FlagVal == 2) {
1244 IsFileExit = true;
Mike Stump11289f42009-09-09 15:08:12 +00001245
Chris Lattner1c967782009-02-04 06:25:26 +00001246 SourceManager &SM = PP.getSourceManager();
1247 // If we are leaving the current presumed file, check to make sure the
1248 // presumed include stack isn't empty!
1249 FileID CurFileID =
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001250 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
Chris Lattner1c967782009-02-04 06:25:26 +00001251 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
Douglas Gregor453b0122010-11-12 07:15:47 +00001252 if (PLoc.isInvalid())
1253 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001254
Chris Lattner1c967782009-02-04 06:25:26 +00001255 // If there is no include loc (main file) or if the include loc is in a
1256 // different physical file, then we aren't in a "1" line marker flag region.
1257 SourceLocation IncLoc = PLoc.getIncludeLoc();
1258 if (IncLoc.isInvalid() ||
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001259 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
Chris Lattner1c967782009-02-04 06:25:26 +00001260 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1261 PP.DiscardUntilEndOfDirective();
1262 return true;
1263 }
Mike Stump11289f42009-09-09 15:08:12 +00001264
Chris Lattner76e68962009-01-26 06:19:46 +00001265 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001266 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001267 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1268 return true;
1269 }
1270
1271 // We must have 3 if there are still flags.
1272 if (FlagVal != 3) {
1273 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001274 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001275 return true;
1276 }
Mike Stump11289f42009-09-09 15:08:12 +00001277
Reid Klecknereb00ee02017-05-22 21:42:58 +00001278 FileKind = SrcMgr::C_System;
Mike Stump11289f42009-09-09 15:08:12 +00001279
Chris Lattner76e68962009-01-26 06:19:46 +00001280 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001281 if (FlagTok.is(tok::eod)) return false;
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001282 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
Chris Lattner76e68962009-01-26 06:19:46 +00001283 return true;
1284
1285 // We must have 4 if there is yet another flag.
1286 if (FlagVal != 4) {
1287 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001288 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001289 return true;
1290 }
Mike Stump11289f42009-09-09 15:08:12 +00001291
Reid Klecknereb00ee02017-05-22 21:42:58 +00001292 FileKind = SrcMgr::C_ExternCSystem;
Mike Stump11289f42009-09-09 15:08:12 +00001293
Chris Lattner76e68962009-01-26 06:19:46 +00001294 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001295 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001296
1297 // There are no more valid flags here.
1298 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001299 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001300 return true;
1301}
1302
1303/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1304/// one of the following forms:
1305///
1306/// # 42
Mike Stump11289f42009-09-09 15:08:12 +00001307/// # 42 "file" ('1' | '2')?
Chris Lattner76e68962009-01-26 06:19:46 +00001308/// # 42 "file" ('1' | '2')? '3' '4'?
1309///
1310void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1311 // Validate the number and convert it to an unsigned. GNU does not have a
1312 // line # limit other than it fit in 32-bits.
1313 unsigned LineNo;
1314 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001315 *this, true))
Chris Lattner76e68962009-01-26 06:19:46 +00001316 return;
Mike Stump11289f42009-09-09 15:08:12 +00001317
Chris Lattner76e68962009-01-26 06:19:46 +00001318 Token StrTok;
1319 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001320
Chris Lattner76e68962009-01-26 06:19:46 +00001321 bool IsFileEntry = false, IsFileExit = false;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001322 int FilenameID = -1;
Reid Klecknereb00ee02017-05-22 21:42:58 +00001323 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001324
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001325 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1326 // string followed by eod.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001327 if (StrTok.is(tok::eod)) {
1328 // Treat this like "#line NN", which doesn't change file characteristics.
Chandler Carruthd92d70b2019-01-19 06:36:00 +00001329 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1330 } else if (StrTok.isNot(tok::string_literal)) {
1331 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1332 DiscardUntilEndOfDirective();
1333 return;
1334 } else if (StrTok.hasUDSuffix()) {
1335 Diag(StrTok, diag::err_invalid_string_udl);
1336 DiscardUntilEndOfDirective();
1337 return;
1338 } else {
1339 // Parse and validate the string, converting it into a unique ID.
1340 StringLiteralParser Literal(StrTok, *this);
1341 assert(Literal.isAscii() && "Didn't allow wide strings in");
1342 if (Literal.hadError) {
1343 DiscardUntilEndOfDirective();
1344 return;
1345 }
1346 if (Literal.Pascal) {
1347 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1348 DiscardUntilEndOfDirective();
1349 return;
1350 }
1351 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
1352
Chris Lattner76e68962009-01-26 06:19:46 +00001353 // If a filename was present, read any flags that are present.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001354 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
Chris Lattner76e68962009-01-26 06:19:46 +00001355 return;
Chris Lattner76e68962009-01-26 06:19:46 +00001356 }
Mike Stump11289f42009-09-09 15:08:12 +00001357
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001358 // Create a line note with this information.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001359 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1360 IsFileExit, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001361
Chris Lattner839150e2009-03-27 17:13:49 +00001362 // If the preprocessor has callbacks installed, notify them of the #line
1363 // change. This is used so that the line marker comes out in -E mode for
1364 // example.
1365 if (Callbacks) {
1366 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1367 if (IsFileEntry)
1368 Reason = PPCallbacks::EnterFile;
1369 else if (IsFileExit)
1370 Reason = PPCallbacks::ExitFile;
Mike Stump11289f42009-09-09 15:08:12 +00001371
Chris Lattnerc745cec2010-04-14 04:28:50 +00001372 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
Chris Lattner839150e2009-03-27 17:13:49 +00001373 }
Chris Lattner76e68962009-01-26 06:19:46 +00001374}
1375
Chris Lattner38d7fd22009-01-26 05:30:54 +00001376/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1377///
Mike Stump11289f42009-09-09 15:08:12 +00001378void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001379 bool isWarning) {
1380 // Read the rest of the line raw. We do this because we don't want macros
1381 // to be expanded and we don't require that the tokens be valid preprocessing
1382 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
Alexander Kornienko2a8c18d2018-04-06 15:14:32 +00001383 // collapse multiple consecutive white space between tokens, but this isn't
Chris Lattnerf64b3522008-03-09 01:54:53 +00001384 // specified by the standard.
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001385 SmallString<128> Message;
1386 CurLexer->ReadToEndOfLine(&Message);
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001387
1388 // Find the first non-whitespace character, so that we can make the
1389 // diagnostic more succinct.
David Majnemerbf7e0c62016-02-24 22:07:26 +00001390 StringRef Msg = StringRef(Message).ltrim(' ');
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001391
Chris Lattner100c65e2009-01-26 05:29:08 +00001392 if (isWarning)
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001393 Diag(Tok, diag::pp_hash_warning) << Msg;
Chris Lattner100c65e2009-01-26 05:29:08 +00001394 else
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001395 Diag(Tok, diag::err_pp_hash_error) << Msg;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001396}
1397
1398/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1399///
1400void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1401 // Yes, this directive is an extension.
1402 Diag(Tok, diag::ext_pp_ident_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001403
Chris Lattnerf64b3522008-03-09 01:54:53 +00001404 // Read the string argument.
1405 Token StrTok;
1406 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001407
Chris Lattnerf64b3522008-03-09 01:54:53 +00001408 // If the token kind isn't a string, it's a malformed directive.
1409 if (StrTok.isNot(tok::string_literal) &&
Chris Lattner907dfe92008-11-18 07:59:24 +00001410 StrTok.isNot(tok::wide_string_literal)) {
1411 Diag(StrTok, diag::err_pp_malformed_ident);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001412 if (StrTok.isNot(tok::eod))
Chris Lattner38d7fd22009-01-26 05:30:54 +00001413 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +00001414 return;
1415 }
Chandler Carruthd92d70b2019-01-19 06:36:00 +00001416
1417 if (StrTok.hasUDSuffix()) {
1418 Diag(StrTok, diag::err_invalid_string_udl);
1419 DiscardUntilEndOfDirective();
1420 return;
1421 }
1422
1423 // Verify that there is nothing after the string, other than EOD.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00001424 CheckEndOfDirective("ident");
Chris Lattnerf64b3522008-03-09 01:54:53 +00001425
Douglas Gregordc970f02010-03-16 22:30:13 +00001426 if (Callbacks) {
1427 bool Invalid = false;
1428 std::string Str = getSpelling(StrTok, &Invalid);
1429 if (!Invalid)
1430 Callbacks->Ident(Tok.getLocation(), Str);
1431 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00001432}
1433
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001434/// Handle a #public directive.
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001435void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001436 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001437 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001438
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001439 // Error reading macro name? If so, diagnostic already issued.
1440 if (MacroNameTok.is(tok::eod))
1441 return;
1442
Douglas Gregor663b48f2012-01-03 19:48:16 +00001443 // Check to see if this is the last token on the #__public_macro line.
1444 CheckEndOfDirective("__public_macro");
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001445
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001446 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001447 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001448 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001449
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001450 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001451 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001452 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001453 return;
1454 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001455
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001456 // Note that this macro has now been exported.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001457 appendMacroDirective(II, AllocateVisibilityMacroDirective(
Rui Ueyama49a3ad22019-07-16 04:46:31 +00001458 MacroNameTok.getLocation(), /*isPublic=*/true));
Douglas Gregorebf00492011-10-17 15:32:29 +00001459}
1460
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001461/// Handle a #private directive.
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001462void Preprocessor::HandleMacroPrivateDirective() {
Douglas Gregorebf00492011-10-17 15:32:29 +00001463 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001464 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001465
Douglas Gregorebf00492011-10-17 15:32:29 +00001466 // Error reading macro name? If so, diagnostic already issued.
1467 if (MacroNameTok.is(tok::eod))
1468 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001469
Douglas Gregor663b48f2012-01-03 19:48:16 +00001470 // Check to see if this is the last token on the #__private_macro line.
1471 CheckEndOfDirective("__private_macro");
Taewook Oh755e4d22016-06-13 21:55:33 +00001472
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001473 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregorebf00492011-10-17 15:32:29 +00001474 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001475 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001476
Douglas Gregorebf00492011-10-17 15:32:29 +00001477 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001478 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001479 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregorebf00492011-10-17 15:32:29 +00001480 return;
1481 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001482
Douglas Gregorebf00492011-10-17 15:32:29 +00001483 // Note that this macro has now been marked private.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001484 appendMacroDirective(II, AllocateVisibilityMacroDirective(
Rui Ueyama49a3ad22019-07-16 04:46:31 +00001485 MacroNameTok.getLocation(), /*isPublic=*/false));
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001486}
1487
Chris Lattnerf64b3522008-03-09 01:54:53 +00001488//===----------------------------------------------------------------------===//
1489// Preprocessor Include Directive Handling.
1490//===----------------------------------------------------------------------===//
1491
1492/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
James Dennettf6333ac2012-06-22 05:46:07 +00001493/// checked and spelled filename, e.g. as an operand of \#include. This returns
Chris Lattnerf64b3522008-03-09 01:54:53 +00001494/// true if the input filename was in <>'s or false if it were in ""'s. The
1495/// caller is expected to provide a buffer that is large enough to hold the
1496/// spelling of the filename, but is also expected to handle the case when
1497/// this method decides to use a different buffer.
1498bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001499 StringRef &Buffer) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001500 // Get the text form of the filename.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001501 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
Mike Stump11289f42009-09-09 15:08:12 +00001502
Richard Smith91e150d2019-03-19 22:09:55 +00001503 // FIXME: Consider warning on some of the cases described in C11 6.4.7/3 and
1504 // C++20 [lex.header]/2:
1505 //
1506 // If `"`, `'`, `\`, `/*`, or `//` appears in a header-name, then
1507 // in C: behavior is undefined
1508 // in C++: program is conditionally-supported with implementation-defined
1509 // semantics
1510
Chris Lattnerf64b3522008-03-09 01:54:53 +00001511 // Make sure the filename is <x> or "x".
1512 bool isAngled;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001513 if (Buffer[0] == '<') {
1514 if (Buffer.back() != '>') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001515 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001516 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001517 return true;
1518 }
1519 isAngled = true;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001520 } else if (Buffer[0] == '"') {
1521 if (Buffer.back() != '"') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001522 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001523 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001524 return true;
1525 }
1526 isAngled = false;
1527 } else {
1528 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001529 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001530 return true;
1531 }
Mike Stump11289f42009-09-09 15:08:12 +00001532
Chris Lattnerf64b3522008-03-09 01:54:53 +00001533 // Diagnose #include "" as invalid.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001534 if (Buffer.size() <= 2) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001535 Diag(Loc, diag::err_pp_empty_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001536 Buffer = StringRef();
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001537 return true;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001538 }
Mike Stump11289f42009-09-09 15:08:12 +00001539
Chris Lattnerf64b3522008-03-09 01:54:53 +00001540 // Skip the brackets.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001541 Buffer = Buffer.substr(1, Buffer.size()-2);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001542 return isAngled;
1543}
1544
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001545/// Push a token onto the token stream containing an annotation.
Richard Smithc51c38b2017-04-29 00:34:47 +00001546void Preprocessor::EnterAnnotationToken(SourceRange Range,
1547 tok::TokenKind Kind,
1548 void *AnnotationVal) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001549 // FIXME: Produce this as the current token directly, rather than
1550 // allocating a new token for it.
Jonas Devlieghere2b3d49b2019-08-14 23:04:18 +00001551 auto Tok = std::make_unique<Token[]>(1);
Richard Smith34f30512013-11-23 04:06:09 +00001552 Tok[0].startToken();
1553 Tok[0].setKind(Kind);
Richard Smithc51c38b2017-04-29 00:34:47 +00001554 Tok[0].setLocation(Range.getBegin());
1555 Tok[0].setAnnotationEndLoc(Range.getEnd());
Richard Smith34f30512013-11-23 04:06:09 +00001556 Tok[0].setAnnotationValue(AnnotationVal);
Ilya Biryukov929af672019-05-17 09:32:05 +00001557 EnterTokenStream(std::move(Tok), 1, true, /*IsReinject*/ false);
Richard Smith34f30512013-11-23 04:06:09 +00001558}
1559
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001560/// Produce a diagnostic informing the user that a #include or similar
Richard Smith63b6fce2015-05-18 04:45:41 +00001561/// was implicitly treated as a module import.
1562static void diagnoseAutoModuleImport(
1563 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1564 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1565 SourceLocation PathEnd) {
Richard Smith8af8b862019-04-11 21:18:23 +00001566 StringRef ImportKeyword;
1567 if (PP.getLangOpts().ObjC)
1568 ImportKeyword = "@import";
1569 else if (PP.getLangOpts().ModulesTS || PP.getLangOpts().CPlusPlusModules)
1570 ImportKeyword = "import";
1571 else
1572 return; // no import syntax available
Richard Smith63b6fce2015-05-18 04:45:41 +00001573
1574 SmallString<128> PathString;
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001575 for (size_t I = 0, N = Path.size(); I != N; ++I) {
Richard Smith63b6fce2015-05-18 04:45:41 +00001576 if (I)
1577 PathString += '.';
1578 PathString += Path[I].first->getName();
1579 }
1580 int IncludeKind = 0;
Taewook Oh755e4d22016-06-13 21:55:33 +00001581
Richard Smith63b6fce2015-05-18 04:45:41 +00001582 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1583 case tok::pp_include:
1584 IncludeKind = 0;
1585 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001586
Richard Smith63b6fce2015-05-18 04:45:41 +00001587 case tok::pp_import:
1588 IncludeKind = 1;
Taewook Oh755e4d22016-06-13 21:55:33 +00001589 break;
1590
Richard Smith63b6fce2015-05-18 04:45:41 +00001591 case tok::pp_include_next:
1592 IncludeKind = 2;
1593 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001594
Richard Smith63b6fce2015-05-18 04:45:41 +00001595 case tok::pp___include_macros:
1596 IncludeKind = 3;
1597 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001598
Richard Smith63b6fce2015-05-18 04:45:41 +00001599 default:
1600 llvm_unreachable("unknown include directive kind");
1601 }
1602
1603 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1604 /*IsTokenRange=*/false);
1605 PP.Diag(HashLoc, diag::warn_auto_module_import)
1606 << IncludeKind << PathString
Richard Smith8af8b862019-04-11 21:18:23 +00001607 << FixItHint::CreateReplacement(
1608 ReplaceRange, (ImportKeyword + " " + PathString + ";").str());
Richard Smith63b6fce2015-05-18 04:45:41 +00001609}
1610
Taewook Ohf42103c2016-06-13 20:40:21 +00001611// Given a vector of path components and a string containing the real
1612// path to the file, build a properly-cased replacement in the vector,
1613// and return true if the replacement should be suggested.
1614static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1615 StringRef RealPathName) {
1616 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1617 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1618 int Cnt = 0;
1619 bool SuggestReplacement = false;
1620 // Below is a best-effort to handle ".." in paths. It is admittedly
1621 // not 100% correct in the presence of symlinks.
1622 for (auto &Component : llvm::reverse(Components)) {
1623 if ("." == Component) {
1624 } else if (".." == Component) {
1625 ++Cnt;
1626 } else if (Cnt) {
1627 --Cnt;
1628 } else if (RealPathComponentIter != RealPathComponentEnd) {
1629 if (Component != *RealPathComponentIter) {
1630 // If these path components differ by more than just case, then we
1631 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1632 // noisy false positives.
1633 SuggestReplacement = RealPathComponentIter->equals_lower(Component);
1634 if (!SuggestReplacement)
1635 break;
1636 Component = *RealPathComponentIter;
1637 }
1638 ++RealPathComponentIter;
1639 }
1640 }
1641 return SuggestReplacement;
1642}
1643
Richard Smith27e5aa02017-06-05 18:57:56 +00001644bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1645 const TargetInfo &TargetInfo,
1646 DiagnosticsEngine &Diags, Module *M) {
1647 Module::Requirement Requirement;
1648 Module::UnresolvedHeaderDirective MissingHeader;
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00001649 Module *ShadowingModule = nullptr;
1650 if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,
1651 ShadowingModule))
Richard Smith27e5aa02017-06-05 18:57:56 +00001652 return false;
1653
1654 if (MissingHeader.FileNameLoc.isValid()) {
1655 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1656 << MissingHeader.IsUmbrella << MissingHeader.FileName;
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00001657 } else if (ShadowingModule) {
1658 Diags.Report(M->DefinitionLoc, diag::err_module_shadowed) << M->Name;
1659 Diags.Report(ShadowingModule->DefinitionLoc,
1660 diag::note_previous_definition);
Richard Smith27e5aa02017-06-05 18:57:56 +00001661 } else {
1662 // FIXME: Track the location at which the requirement was specified, and
1663 // use it here.
1664 Diags.Report(M->DefinitionLoc, diag::err_module_unavailable)
1665 << M->getFullModuleName() << Requirement.second << Requirement.first;
1666 }
1667 return true;
1668}
1669
James Dennettf6333ac2012-06-22 05:46:07 +00001670/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1671/// the file to be included from the lexer, then include it! This is a common
1672/// routine with functionality shared between \#include, \#include_next and
1673/// \#import. LookupFrom is set when this is a \#include_next directive, it
Mike Stump11289f42009-09-09 15:08:12 +00001674/// specifies the file to start searching from.
Taewook Oh755e4d22016-06-13 21:55:33 +00001675void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001676 Token &IncludeTok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001677 const DirectoryLookup *LookupFrom,
Richard Smith8af8b862019-04-11 21:18:23 +00001678 const FileEntry *LookupFromFile) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001679 Token FilenameTok;
Richard Smithb9b05102019-03-19 01:51:19 +00001680 if (LexHeaderName(FilenameTok))
Chris Lattnerf64b3522008-03-09 01:54:53 +00001681 return;
Mike Stump11289f42009-09-09 15:08:12 +00001682
Richard Smith91e150d2019-03-19 22:09:55 +00001683 if (FilenameTok.isNot(tok::header_name)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001684 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
Richard Smithb9b05102019-03-19 01:51:19 +00001685 if (FilenameTok.isNot(tok::eod))
1686 DiscardUntilEndOfDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001687 return;
1688 }
Mike Stump11289f42009-09-09 15:08:12 +00001689
Richard Smith8af8b862019-04-11 21:18:23 +00001690 // Verify that there is nothing after the filename, other than EOD. Note
1691 // that we allow macros that expand to nothing after the filename, because
1692 // this falls into the category of "#include pp-tokens new-line" specified
1693 // in C99 6.10.2p4.
1694 SourceLocation EndLoc =
1695 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
1696
1697 auto Action = HandleHeaderIncludeOrImport(HashLoc, IncludeTok, FilenameTok,
1698 EndLoc, LookupFrom, LookupFromFile);
1699 switch (Action.Kind) {
1700 case ImportAction::None:
Richard Smithd652bdd2019-04-14 08:06:59 +00001701 case ImportAction::SkippedModuleImport:
Richard Smith8af8b862019-04-11 21:18:23 +00001702 break;
1703 case ImportAction::ModuleBegin:
1704 EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
1705 tok::annot_module_begin, Action.ModuleForHeader);
1706 break;
1707 case ImportAction::ModuleImport:
1708 EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
1709 tok::annot_module_include, Action.ModuleForHeader);
1710 break;
1711 }
1712}
1713
Alex Lorenz4dc55732019-08-22 18:15:50 +00001714Optional<FileEntryRef> Preprocessor::LookupHeaderIncludeOrImport(
1715 const DirectoryLookup *&CurDir, StringRef Filename,
1716 SourceLocation FilenameLoc, CharSourceRange FilenameRange,
1717 const Token &FilenameTok, bool &IsFrameworkFound, bool IsImportDecl,
1718 bool &IsMapped, const DirectoryLookup *LookupFrom,
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00001719 const FileEntry *LookupFromFile, StringRef LookupFilename,
Alex Lorenz4dc55732019-08-22 18:15:50 +00001720 SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath,
1721 ModuleMap::KnownHeader &SuggestedModule, bool isAngled) {
1722 Optional<FileEntryRef> File = LookupFile(
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00001723 FilenameLoc, LookupFilename,
Alex Lorenz4dc55732019-08-22 18:15:50 +00001724 isAngled, LookupFrom, LookupFromFile, CurDir,
1725 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
1726 &SuggestedModule, &IsMapped, &IsFrameworkFound);
1727 if (File)
1728 return File;
1729
1730 if (Callbacks) {
1731 // Give the clients a chance to recover.
1732 SmallString<128> RecoveryPath;
1733 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
Alex Lorenz0377ca62019-08-31 01:26:04 +00001734 if (auto DE = FileMgr.getOptionalDirectoryRef(RecoveryPath)) {
Alex Lorenz4dc55732019-08-22 18:15:50 +00001735 // Add the recovery path to the list of search paths.
1736 DirectoryLookup DL(*DE, SrcMgr::C_User, false);
1737 HeaderInfo.AddSearchPath(DL, isAngled);
1738
1739 // Try the lookup again, skipping the cache.
1740 Optional<FileEntryRef> File = LookupFile(
1741 FilenameLoc,
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00001742 LookupFilename, isAngled,
Alex Lorenz4dc55732019-08-22 18:15:50 +00001743 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
1744 &SuggestedModule, &IsMapped, /*IsFrameworkFound=*/nullptr,
1745 /*SkipCache*/ true);
1746 if (File)
1747 return File;
1748 }
1749 }
1750 }
1751
1752 if (SuppressIncludeNotFoundError)
1753 return None;
1754
1755 // If the file could not be located and it was included via angle
1756 // brackets, we can attempt a lookup as though it were a quoted path to
1757 // provide the user with a possible fixit.
1758 if (isAngled) {
1759 Optional<FileEntryRef> File = LookupFile(
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00001760 FilenameLoc, LookupFilename,
Alex Lorenz4dc55732019-08-22 18:15:50 +00001761 false, LookupFrom, LookupFromFile, CurDir,
1762 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
1763 &SuggestedModule, &IsMapped,
1764 /*IsFrameworkFound=*/nullptr);
1765 if (File) {
1766 Diag(FilenameTok, diag::err_pp_file_not_found_angled_include_not_fatal)
1767 << Filename << IsImportDecl
1768 << FixItHint::CreateReplacement(FilenameRange,
1769 "\"" + Filename.str() + "\"");
1770 return File;
1771 }
1772 }
1773
1774 // Check for likely typos due to leading or trailing non-isAlphanumeric
1775 // characters
1776 StringRef OriginalFilename = Filename;
1777 if (LangOpts.SpellChecking) {
1778 // A heuristic to correct a typo file name by removing leading and
1779 // trailing non-isAlphanumeric characters.
1780 auto CorrectTypoFilename = [](llvm::StringRef Filename) {
1781 Filename = Filename.drop_until(isAlphanumeric);
1782 while (!Filename.empty() && !isAlphanumeric(Filename.back())) {
1783 Filename = Filename.drop_back();
1784 }
1785 return Filename;
1786 };
1787 StringRef TypoCorrectionName = CorrectTypoFilename(Filename);
Reid Kleckneradc18302019-09-26 17:19:22 +00001788
Alex Lorenz4dc55732019-08-22 18:15:50 +00001789#ifndef _WIN32
Reid Kleckneradc18302019-09-26 17:19:22 +00001790 // Normalize slashes when compiling with -fms-extensions on non-Windows.
1791 // This is unnecessary on Windows since the filesystem there handles
1792 // backslashes.
1793 SmallString<128> NormalizedTypoCorrectionPath;
1794 if (LangOpts.MicrosoftExt) {
1795 NormalizedTypoCorrectionPath = TypoCorrectionName;
Alex Lorenz4dc55732019-08-22 18:15:50 +00001796 llvm::sys::path::native(NormalizedTypoCorrectionPath);
Reid Kleckneradc18302019-09-26 17:19:22 +00001797 TypoCorrectionName = NormalizedTypoCorrectionPath;
Alex Lorenz4dc55732019-08-22 18:15:50 +00001798 }
Reid Kleckneradc18302019-09-26 17:19:22 +00001799#endif
1800
Alex Lorenz4dc55732019-08-22 18:15:50 +00001801 Optional<FileEntryRef> File = LookupFile(
Reid Kleckneradc18302019-09-26 17:19:22 +00001802 FilenameLoc, TypoCorrectionName, isAngled, LookupFrom, LookupFromFile,
1803 CurDir, Callbacks ? &SearchPath : nullptr,
1804 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped,
Alex Lorenz4dc55732019-08-22 18:15:50 +00001805 /*IsFrameworkFound=*/nullptr);
1806 if (File) {
1807 auto Hint =
1808 isAngled ? FixItHint::CreateReplacement(
1809 FilenameRange, "<" + TypoCorrectionName.str() + ">")
1810 : FixItHint::CreateReplacement(
1811 FilenameRange, "\"" + TypoCorrectionName.str() + "\"");
1812 Diag(FilenameTok, diag::err_pp_file_not_found_typo_not_fatal)
1813 << OriginalFilename << TypoCorrectionName << Hint;
1814 // We found the file, so set the Filename to the name after typo
1815 // correction.
1816 Filename = TypoCorrectionName;
1817 return File;
1818 }
1819 }
1820
1821 // If the file is still not found, just go with the vanilla diagnostic
1822 assert(!File.hasValue() && "expected missing file");
1823 Diag(FilenameTok, diag::err_pp_file_not_found)
1824 << OriginalFilename << FilenameRange;
1825 if (IsFrameworkFound) {
1826 size_t SlashPos = OriginalFilename.find('/');
1827 assert(SlashPos != StringRef::npos &&
1828 "Include with framework name should have '/' in the filename");
1829 StringRef FrameworkName = OriginalFilename.substr(0, SlashPos);
1830 FrameworkCacheEntry &CacheEntry =
1831 HeaderInfo.LookupFrameworkCache(FrameworkName);
1832 assert(CacheEntry.Directory && "Found framework should be in cache");
1833 Diag(FilenameTok, diag::note_pp_framework_without_header)
1834 << OriginalFilename.substr(SlashPos + 1) << FrameworkName
1835 << CacheEntry.Directory->getName();
1836 }
1837
1838 return None;
1839}
1840
Richard Smith8af8b862019-04-11 21:18:23 +00001841/// Handle either a #include-like directive or an import declaration that names
1842/// a header file.
1843///
1844/// \param HashLoc The location of the '#' token for an include, or
1845/// SourceLocation() for an import declaration.
1846/// \param IncludeTok The include / include_next / import token.
1847/// \param FilenameTok The header-name token.
1848/// \param EndLoc The location at which any imported macros become visible.
1849/// \param LookupFrom For #include_next, the starting directory for the
1850/// directory lookup.
1851/// \param LookupFromFile For #include_next, the starting file for the directory
1852/// lookup.
1853Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport(
1854 SourceLocation HashLoc, Token &IncludeTok, Token &FilenameTok,
1855 SourceLocation EndLoc, const DirectoryLookup *LookupFrom,
1856 const FileEntry *LookupFromFile) {
Richard Smithb9b05102019-03-19 01:51:19 +00001857 SmallString<128> FilenameBuffer;
1858 StringRef Filename = getSpelling(FilenameTok, FilenameBuffer);
1859 SourceLocation CharEnd = FilenameTok.getEndLoc();
1860
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001861 CharSourceRange FilenameRange
1862 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
Aaron Ballman611306e2012-03-02 22:51:54 +00001863 StringRef OriginalFilename = Filename;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001864 bool isAngled =
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001865 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
Richard Smith8af8b862019-04-11 21:18:23 +00001866
Chris Lattnerf64b3522008-03-09 01:54:53 +00001867 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1868 // error.
Richard Smith8af8b862019-04-11 21:18:23 +00001869 if (Filename.empty())
1870 return {ImportAction::None};
Mike Stump11289f42009-09-09 15:08:12 +00001871
Richard Smith8af8b862019-04-11 21:18:23 +00001872 bool IsImportDecl = HashLoc.isInvalid();
1873 SourceLocation StartLoc = IsImportDecl ? IncludeTok.getLocation() : HashLoc;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001874
John McCall32f5fe12011-09-30 05:12:12 +00001875 // Complain about attempts to #include files in an audit pragma.
Erich Keane6a24e802019-09-13 17:39:31 +00001876 if (PragmaARCCFCodeAuditedInfo.second.isValid()) {
Richard Smith8af8b862019-04-11 21:18:23 +00001877 Diag(StartLoc, diag::err_pp_include_in_arc_cf_code_audited) << IsImportDecl;
Erich Keane6a24e802019-09-13 17:39:31 +00001878 Diag(PragmaARCCFCodeAuditedInfo.second, diag::note_pragma_entered_here);
John McCall32f5fe12011-09-30 05:12:12 +00001879
1880 // Immediately leave the pragma.
Erich Keane6a24e802019-09-13 17:39:31 +00001881 PragmaARCCFCodeAuditedInfo = {nullptr, SourceLocation()};
John McCall32f5fe12011-09-30 05:12:12 +00001882 }
1883
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001884 // Complain about attempts to #include files in an assume-nonnull pragma.
1885 if (PragmaAssumeNonNullLoc.isValid()) {
Richard Smith8af8b862019-04-11 21:18:23 +00001886 Diag(StartLoc, diag::err_pp_include_in_assume_nonnull) << IsImportDecl;
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001887 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1888
1889 // Immediately leave the pragma.
1890 PragmaAssumeNonNullLoc = SourceLocation();
1891 }
1892
Aaron Ballman611306e2012-03-02 22:51:54 +00001893 if (HeaderInfo.HasIncludeAliasMap()) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001894 // Map the filename with the brackets still attached. If the name doesn't
1895 // map to anything, fall back on the filename we've already gotten the
Aaron Ballman611306e2012-03-02 22:51:54 +00001896 // spelling for.
1897 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1898 if (!NewName.empty())
1899 Filename = NewName;
1900 }
1901
Chris Lattnerf64b3522008-03-09 01:54:53 +00001902 // Search include directories.
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001903 bool IsMapped = false;
Volodymyr Sapsai421380a2019-02-05 22:34:55 +00001904 bool IsFrameworkFound = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001905 const DirectoryLookup *CurDir;
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001906 SmallString<1024> SearchPath;
1907 SmallString<1024> RelativePath;
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001908 // We get the raw path only if we have 'Callbacks' to which we later pass
1909 // the path.
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001910 ModuleMap::KnownHeader SuggestedModule;
1911 SourceLocation FilenameLoc = FilenameTok.getLocation();
Reid Kleckneradc18302019-09-26 17:19:22 +00001912 StringRef LookupFilename = Filename;
1913
Nico Weber1865df42018-04-27 19:11:14 +00001914#ifndef _WIN32
Reid Kleckneradc18302019-09-26 17:19:22 +00001915 // Normalize slashes when compiling with -fms-extensions on non-Windows. This
1916 // is unnecessary on Windows since the filesystem there handles backslashes.
1917 SmallString<128> NormalizedPath;
1918 if (LangOpts.MicrosoftExt) {
1919 NormalizedPath = Filename.str();
Rafael Espindolaf6002232014-08-08 21:31:04 +00001920 llvm::sys::path::native(NormalizedPath);
Reid Kleckneradc18302019-09-26 17:19:22 +00001921 LookupFilename = NormalizedPath;
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001922 }
Reid Kleckneradc18302019-09-26 17:19:22 +00001923#endif
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001924
Alex Lorenz4dc55732019-08-22 18:15:50 +00001925 Optional<FileEntryRef> File = LookupHeaderIncludeOrImport(
1926 CurDir, Filename, FilenameLoc, FilenameRange, FilenameTok,
1927 IsFrameworkFound, IsImportDecl, IsMapped, LookupFrom, LookupFromFile,
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00001928 LookupFilename, RelativePath, SearchPath, SuggestedModule, isAngled);
Douglas Gregor11729f02011-11-30 18:12:06 +00001929
Erich Keane76675de2018-07-05 17:22:13 +00001930 if (usingPCHWithThroughHeader() && SkippingUntilPCHThroughHeader) {
Alex Lorenz4dc55732019-08-22 18:15:50 +00001931 if (File && isPCHThroughHeader(&File->getFileEntry()))
Erich Keane76675de2018-07-05 17:22:13 +00001932 SkippingUntilPCHThroughHeader = false;
Richard Smith8af8b862019-04-11 21:18:23 +00001933 return {ImportAction::None};
Erich Keane76675de2018-07-05 17:22:13 +00001934 }
1935
Nikolai Kosjar3c28a2d2019-05-10 10:25:35 +00001936 // Check for circular inclusion of the main file.
1937 // We can't generate a consistent preamble with regard to the conditional
1938 // stack if the main file is included again as due to the preamble bounds
1939 // some directives (e.g. #endif of a header guard) will never be seen.
1940 // Since this will lead to confusing errors, avoid the inclusion.
1941 if (File && PreambleConditionalStack.isRecording() &&
Alex Lorenz4dc55732019-08-22 18:15:50 +00001942 SourceMgr.translateFile(&File->getFileEntry()) ==
1943 SourceMgr.getMainFileID()) {
Nikolai Kosjar3c28a2d2019-05-10 10:25:35 +00001944 Diag(FilenameTok.getLocation(),
1945 diag::err_pp_including_mainfile_in_preamble);
1946 return {ImportAction::None};
1947 }
1948
Richard Smith86559dc2019-03-21 19:44:17 +00001949 // Should we enter the source file? Set to Skip if either the source file is
Richard Smith63b6fce2015-05-18 04:45:41 +00001950 // known to have no effect beyond its effect on module visibility -- that is,
Richard Smith86559dc2019-03-21 19:44:17 +00001951 // if it's got an include guard that is already defined, set to Import if it
1952 // is a modular header we've already built and should import.
1953 enum { Enter, Import, Skip, IncludeLimitReached } Action = Enter;
Richard Smithdbbc5232015-05-14 02:25:44 +00001954
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001955 if (PPOpts->SingleFileParseMode)
Richard Smith86559dc2019-03-21 19:44:17 +00001956 Action = IncludeLimitReached;
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001957
Volodymyr Sapsai978be4c12018-12-07 20:29:54 +00001958 // If we've reached the max allowed include depth, it is usually due to an
1959 // include cycle. Don't enter already processed files again as it can lead to
1960 // reaching the max allowed include depth again.
Richard Smith86559dc2019-03-21 19:44:17 +00001961 if (Action == Enter && HasReachedMaxIncludeDepth && File &&
Alex Lorenz4dc55732019-08-22 18:15:50 +00001962 HeaderInfo.getFileInfo(&File->getFileEntry()).NumIncludes)
Richard Smith86559dc2019-03-21 19:44:17 +00001963 Action = IncludeLimitReached;
Volodymyr Sapsai482070b2018-07-25 19:16:26 +00001964
Richard Smith63b6fce2015-05-18 04:45:41 +00001965 // Determine whether we should try to import the module for this #include, if
1966 // there is one. Don't do so if precompiled module support is disabled or we
1967 // are processing this module textually (because we're building the module).
Richard Smith86559dc2019-03-21 19:44:17 +00001968 if (Action == Enter && File && SuggestedModule && getLangOpts().Modules &&
Bruno Cardoso Lopes5bccc522018-02-16 00:12:57 +00001969 !isForModuleBuilding(SuggestedModule.getModule(),
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +00001970 getLangOpts().CurrentModule,
1971 getLangOpts().ModuleName)) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001972 // If this include corresponds to a module but that module is
1973 // unavailable, diagnose the situation and bail out.
Richard Smith58df3432016-04-12 19:58:30 +00001974 // FIXME: Remove this; loadModule does the same check (but produces
1975 // slightly worse diagnostics).
Richard Smith27e5aa02017-06-05 18:57:56 +00001976 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), getDiagnostics(),
1977 SuggestedModule.getModule())) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001978 Diag(FilenameTok.getLocation(),
1979 diag::note_implicit_top_level_module_import_here)
Richard Smith27e5aa02017-06-05 18:57:56 +00001980 << SuggestedModule.getModule()->getTopLevelModuleName();
Richard Smith8af8b862019-04-11 21:18:23 +00001981 return {ImportAction::None};
Sean Silva8b7c0392015-08-17 16:39:30 +00001982 }
1983
Douglas Gregor71944202011-11-30 00:36:36 +00001984 // Compute the module access path corresponding to this module.
1985 // FIXME: Should we have a second loadModule() overload to avoid this
1986 // extra lookup step?
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001987 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001988 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
Douglas Gregor71944202011-11-30 00:36:36 +00001989 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
1990 FilenameTok.getLocation()));
1991 std::reverse(Path.begin(), Path.end());
1992
Douglas Gregor41e115a2011-11-30 18:02:36 +00001993 // Warn that we're replacing the include/import with a module import.
Richard Smith8af8b862019-04-11 21:18:23 +00001994 if (!IsImportDecl)
1995 diagnoseAutoModuleImport(*this, StartLoc, IncludeTok, Path, CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001996
Richard Smith10434f32015-05-02 02:08:26 +00001997 // Load the module to import its macros. We'll make the declarations
Richard Smithce587f52013-11-15 04:24:58 +00001998 // visible when the parser gets here.
Richard Smithdbbc5232015-05-14 02:25:44 +00001999 // FIXME: Pass SuggestedModule in here rather than converting it to a path
2000 // and making the module loader convert it back again.
Richard Smith10434f32015-05-02 02:08:26 +00002001 ModuleLoadResult Imported = TheModuleLoader.loadModule(
2002 IncludeTok.getLocation(), Path, Module::Hidden,
Rui Ueyama49a3ad22019-07-16 04:46:31 +00002003 /*IsInclusionDirective=*/true);
Craig Topperd2d442c2014-05-17 23:10:59 +00002004 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
Argyrios Kyrtzidis051b4432012-09-29 01:06:01 +00002005 "the imported module is different than the suggested one");
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00002006
Richard Smith86559dc2019-03-21 19:44:17 +00002007 if (Imported) {
2008 Action = Import;
2009 } else if (Imported.isMissingExpected()) {
Richard Smith63b6fce2015-05-18 04:45:41 +00002010 // We failed to find a submodule that we assumed would exist (because it
2011 // was in the directory of an umbrella header, for instance), but no
Richard Smitha114c462016-12-06 00:40:17 +00002012 // actual module containing it exists (because the umbrella header is
Richard Smith63b6fce2015-05-18 04:45:41 +00002013 // incomplete). Treat this as a textual inclusion.
2014 SuggestedModule = ModuleMap::KnownHeader();
Richard Smitha114c462016-12-06 00:40:17 +00002015 } else if (Imported.isConfigMismatch()) {
2016 // On a configuration mismatch, enter the header textually. We still know
2017 // that it's part of the corresponding module.
Richard Smith63b6fce2015-05-18 04:45:41 +00002018 } else {
2019 // We hit an error processing the import. Bail out.
2020 if (hadModuleLoaderFatalFailure()) {
2021 // With a fatal failure in the module loader, we abort parsing.
2022 Token &Result = IncludeTok;
Erich Keane0a6b5b62018-12-04 14:34:09 +00002023 assert(CurLexer && "#include but no current lexer set!");
2024 Result.startToken();
2025 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
2026 CurLexer->cutOffLexing();
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00002027 }
Richard Smith8af8b862019-04-11 21:18:23 +00002028 return {ImportAction::None};
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00002029 }
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00002030 }
2031
Richard Smithc5247e62017-05-30 02:03:19 +00002032 // The #included file will be considered to be a system header if either it is
2033 // in a system include directory, or if the #includer is a system include
2034 // header.
2035 SrcMgr::CharacteristicKind FileCharacter =
2036 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
2037 if (File)
Alex Lorenz4dc55732019-08-22 18:15:50 +00002038 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(&File->getFileEntry()),
2039 FileCharacter);
Richard Smithc5247e62017-05-30 02:03:19 +00002040
Richard Smith8af8b862019-04-11 21:18:23 +00002041 // If this is a '#import' or an import-declaration, don't re-enter the file.
2042 //
2043 // FIXME: If we have a suggested module for a '#include', and we've already
2044 // visited this file, don't bother entering it again. We know it has no
2045 // further effect.
2046 bool EnterOnce =
2047 IsImportDecl ||
2048 IncludeTok.getIdentifierInfo()->getPPKeywordID() == tok::pp_import;
2049
Richard Smithc5247e62017-05-30 02:03:19 +00002050 // Ask HeaderInfo if we should enter this #include file. If not, #including
2051 // this file will have no effect.
Richard Smith86559dc2019-03-21 19:44:17 +00002052 if (Action == Enter && File &&
Alex Lorenz4dc55732019-08-22 18:15:50 +00002053 !HeaderInfo.ShouldEnterIncludeFile(*this, &File->getFileEntry(),
2054 EnterOnce, getLangOpts().Modules,
Richard Smithc5247e62017-05-30 02:03:19 +00002055 SuggestedModule.getModule())) {
Richard Smith86559dc2019-03-21 19:44:17 +00002056 // Even if we've already preprocessed this header once and know that we
2057 // don't need to see its contents again, we still need to import it if it's
2058 // modular because we might not have imported it from this submodule before.
2059 //
2060 // FIXME: We don't do this when compiling a PCH because the AST
2061 // serialization layer can't cope with it. This means we get local
2062 // submodule visibility semantics wrong in that case.
2063 Action = (SuggestedModule && !getLangOpts().CompilingPCH) ? Import : Skip;
Richard Smithc5247e62017-05-30 02:03:19 +00002064 }
2065
Richard Smith8af8b862019-04-11 21:18:23 +00002066 if (Callbacks && !IsImportDecl) {
Richard Smith63b6fce2015-05-18 04:45:41 +00002067 // Notify the callback object that we've seen an inclusion directive.
Richard Smith8af8b862019-04-11 21:18:23 +00002068 // FIXME: Use a different callback for a pp-import?
Richard Smith63b6fce2015-05-18 04:45:41 +00002069 Callbacks->InclusionDirective(
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00002070 HashLoc, IncludeTok, LookupFilename, isAngled, FilenameRange,
2071 File ? &File->getFileEntry() : nullptr, SearchPath, RelativePath,
2072 Action == Import ? SuggestedModule.getModule() : nullptr,
Richard Smith86559dc2019-03-21 19:44:17 +00002073 FileCharacter);
Alex Lorenz4dc55732019-08-22 18:15:50 +00002074 if (Action == Skip && File)
Alex Lorenz67d25fe2019-08-27 01:03:25 +00002075 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
Douglas Gregor97eec242011-09-15 22:00:41 +00002076 }
Richard Smith63b6fce2015-05-18 04:45:41 +00002077
2078 if (!File)
Richard Smith8af8b862019-04-11 21:18:23 +00002079 return {ImportAction::None};
Taewook Oh755e4d22016-06-13 21:55:33 +00002080
Richard Smith8af8b862019-04-11 21:18:23 +00002081 // If this is a C++20 pp-import declaration, diagnose if we didn't find any
2082 // module corresponding to the named header.
2083 if (IsImportDecl && !SuggestedModule) {
2084 Diag(FilenameTok, diag::err_header_import_not_header_unit)
2085 << OriginalFilename << File->getName();
2086 return {ImportAction::None};
2087 }
Richard Smith54ef4c32015-05-19 19:58:11 +00002088
Taewook Ohf42103c2016-06-13 20:40:21 +00002089 // Issue a diagnostic if the name of the file on disk has a different case
2090 // than the one we're about to open.
2091 const bool CheckIncludePathPortability =
Alex Lorenz4dc55732019-08-22 18:15:50 +00002092 !IsMapped && !File->getFileEntry().tryGetRealPathName().empty();
Taewook Ohf42103c2016-06-13 20:40:21 +00002093
2094 if (CheckIncludePathPortability) {
Reid Kleckner9aeae9f2019-09-25 22:50:50 +00002095 StringRef Name = LookupFilename;
Alex Lorenz4dc55732019-08-22 18:15:50 +00002096 StringRef RealPathName = File->getFileEntry().tryGetRealPathName();
Taewook Ohf42103c2016-06-13 20:40:21 +00002097 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
2098 llvm::sys::path::end(Name));
2099
2100 if (trySimplifyPath(Components, RealPathName)) {
2101 SmallString<128> Path;
2102 Path.reserve(Name.size()+2);
2103 Path.push_back(isAngled ? '<' : '"');
Taewook Ohcc89bac2017-02-21 22:30:55 +00002104 bool isLeadingSeparator = llvm::sys::path::is_absolute(Name);
Taewook Ohf42103c2016-06-13 20:40:21 +00002105 for (auto Component : Components) {
Taewook Ohcc89bac2017-02-21 22:30:55 +00002106 if (isLeadingSeparator)
2107 isLeadingSeparator = false;
2108 else
2109 Path.append(Component);
Taewook Ohf42103c2016-06-13 20:40:21 +00002110 // Append the separator the user used, or the close quote
2111 Path.push_back(
2112 Path.size() <= Filename.size() ? Filename[Path.size()-1] :
2113 (isAngled ? '>' : '"'));
2114 }
Taewook Ohf42103c2016-06-13 20:40:21 +00002115 // For user files and known standard headers, by default we issue a diagnostic.
2116 // For other system headers, we don't. They can be controlled separately.
2117 auto DiagId = (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name)) ?
2118 diag::pp_nonportable_path : diag::pp_nonportable_system_path;
Reid Kleckner273895b2017-02-14 18:38:40 +00002119 Diag(FilenameTok, DiagId) << Path <<
Richard Smithb9b05102019-03-19 01:51:19 +00002120 FixItHint::CreateReplacement(FilenameRange, Path);
Taewook Ohf42103c2016-06-13 20:40:21 +00002121 }
2122 }
2123
Richard Smith86559dc2019-03-21 19:44:17 +00002124 switch (Action) {
2125 case Skip:
2126 // If we don't need to enter the file, stop now.
Richard Smithd652bdd2019-04-14 08:06:59 +00002127 if (Module *M = SuggestedModule.getModule())
2128 return {ImportAction::SkippedModuleImport, M};
Richard Smith8af8b862019-04-11 21:18:23 +00002129 return {ImportAction::None};
Richard Smith86559dc2019-03-21 19:44:17 +00002130
2131 case IncludeLimitReached:
2132 // If we reached our include limit and don't want to enter any more files,
2133 // don't go any further.
Richard Smith8af8b862019-04-11 21:18:23 +00002134 return {ImportAction::None};
Richard Smith86559dc2019-03-21 19:44:17 +00002135
2136 case Import: {
2137 // If this is a module import, make it visible if needed.
2138 Module *M = SuggestedModule.getModule();
2139 assert(M && "no module to import");
2140
Richard Smith8af8b862019-04-11 21:18:23 +00002141 makeModuleVisible(M, EndLoc);
Richard Smith86559dc2019-03-21 19:44:17 +00002142
Richard Smith8af8b862019-04-11 21:18:23 +00002143 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() ==
Richard Smith86559dc2019-03-21 19:44:17 +00002144 tok::pp___include_macros)
Richard Smith8af8b862019-04-11 21:18:23 +00002145 return {ImportAction::None};
2146
2147 return {ImportAction::ModuleImport, M};
Richard Smith86559dc2019-03-21 19:44:17 +00002148 }
2149
2150 case Enter:
2151 break;
Chris Lattner72286d62010-04-19 20:44:31 +00002152 }
2153
Richard Smith5a8ea4c2019-03-19 01:51:17 +00002154 // Check that we don't have infinite #include recursion.
2155 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
2156 Diag(FilenameTok, diag::err_pp_include_too_deep);
2157 HasReachedMaxIncludeDepth = true;
Richard Smith8af8b862019-04-11 21:18:23 +00002158 return {ImportAction::None};
Richard Smith5a8ea4c2019-03-19 01:51:17 +00002159 }
2160
Chris Lattnerf64b3522008-03-09 01:54:53 +00002161 // Look up the file, create a File ID for it.
Richard Smithb9b05102019-03-19 01:51:19 +00002162 SourceLocation IncludePos = FilenameTok.getLocation();
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002163 // If the filename string was the result of macro expansions, set the include
2164 // position on the file where it will be included and after the expansions.
2165 if (IncludePos.isMacroID())
Richard Smithb5f81712018-04-30 05:25:48 +00002166 IncludePos = SourceMgr.getExpansionRange(IncludePos).getEnd();
Alex Lorenz4dc55732019-08-22 18:15:50 +00002167 FileID FID = SourceMgr.createFileID(*File, IncludePos, FileCharacter);
Yaron Keren8b563662015-10-03 10:46:20 +00002168 assert(FID.isValid() && "Expected valid file ID");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002169
Richard Smith34f30512013-11-23 04:06:09 +00002170 // If all is good, enter the new file!
Richard Smith67294e22014-01-31 20:47:44 +00002171 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
Richard Smith8af8b862019-04-11 21:18:23 +00002172 return {ImportAction::None};
Richard Smith34f30512013-11-23 04:06:09 +00002173
Richard Smitha0aafa32015-05-18 03:52:30 +00002174 // Determine if we're switching to building a new submodule, and which one.
Richard Smitha0aafa32015-05-18 03:52:30 +00002175 if (auto *M = SuggestedModule.getModule()) {
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00002176 if (M->getTopLevelModule()->ShadowingModule) {
2177 // We are building a submodule that belongs to a shadowed module. This
2178 // means we find header files in the shadowed module.
2179 Diag(M->DefinitionLoc, diag::err_module_build_shadowed_submodule)
2180 << M->getFullModuleName();
2181 Diag(M->getTopLevelModule()->ShadowingModule->DefinitionLoc,
2182 diag::note_previous_definition);
Richard Smith8af8b862019-04-11 21:18:23 +00002183 return {ImportAction::None};
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00002184 }
Manman Renffd3e9d2017-01-09 19:20:18 +00002185 // When building a pch, -fmodule-name tells the compiler to textually
2186 // include headers in the specified module. We are not building the
2187 // specified module.
Richard Smith86559dc2019-03-21 19:44:17 +00002188 //
2189 // FIXME: This is the wrong way to handle this. We should produce a PCH
2190 // that behaves the same as the header would behave in a compilation using
2191 // that PCH, which means we should enter the submodule. We need to teach
2192 // the AST serialization layer to deal with the resulting AST.
Manman Renffd3e9d2017-01-09 19:20:18 +00002193 if (getLangOpts().CompilingPCH &&
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +00002194 isForModuleBuilding(M, getLangOpts().CurrentModule,
2195 getLangOpts().ModuleName))
Richard Smith8af8b862019-04-11 21:18:23 +00002196 return {ImportAction::None};
Manman Renffd3e9d2017-01-09 19:20:18 +00002197
Richard Smithd1386302017-05-04 00:29:54 +00002198 assert(!CurLexerSubmodule && "should not have marked this as a module yet");
2199 CurLexerSubmodule = M;
Richard Smith67294e22014-01-31 20:47:44 +00002200
Richard Smitha0aafa32015-05-18 03:52:30 +00002201 // Let the macro handling code know that any future macros are within
2202 // the new submodule.
Richard Smith8af8b862019-04-11 21:18:23 +00002203 EnterSubmodule(M, EndLoc, /*ForPragma*/false);
Richard Smithb8b2ed62015-04-23 18:18:26 +00002204
Richard Smitha0aafa32015-05-18 03:52:30 +00002205 // Let the parser know that any future declarations are within the new
2206 // submodule.
2207 // FIXME: There's no point doing this if we're handling a #__include_macros
2208 // directive.
Richard Smith8af8b862019-04-11 21:18:23 +00002209 return {ImportAction::ModuleBegin, M};
Richard Smith67294e22014-01-31 20:47:44 +00002210 }
Richard Smith8af8b862019-04-11 21:18:23 +00002211
Richard Smithd652bdd2019-04-14 08:06:59 +00002212 assert(!IsImportDecl && "failed to diagnose missing module for import decl");
Richard Smith8af8b862019-04-11 21:18:23 +00002213 return {ImportAction::None};
Chris Lattnerf64b3522008-03-09 01:54:53 +00002214}
2215
James Dennettf6333ac2012-06-22 05:46:07 +00002216/// HandleIncludeNextDirective - Implements \#include_next.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002217///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002218void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2219 Token &IncludeNextTok) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002220 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
Mike Stump11289f42009-09-09 15:08:12 +00002221
Chris Lattnerf64b3522008-03-09 01:54:53 +00002222 // #include_next is like #include, except that we start searching after
2223 // the current found directory. If we can't do this, issue a
2224 // diagnostic.
2225 const DirectoryLookup *Lookup = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +00002226 const FileEntry *LookupFromFile = nullptr;
Erik Verbruggene0bde752016-10-27 14:17:10 +00002227 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2228 // If the main file is a header, then it's either for PCH/AST generation,
2229 // or libclang opened it. Either way, handle it as a normal include below
2230 // and do not complain about include_next.
2231 } else if (isInPrimaryFile()) {
Craig Topperd2d442c2014-05-17 23:10:59 +00002232 Lookup = nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002233 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
Richard Smithd1386302017-05-04 00:29:54 +00002234 } else if (CurLexerSubmodule) {
Richard Smith25d50752014-10-20 00:15:49 +00002235 // Start looking up in the directory *after* the one in which the current
2236 // file would be found, if any.
2237 assert(CurPPLexer && "#include_next directive in macro?");
2238 LookupFromFile = CurPPLexer->getFileEntry();
2239 Lookup = nullptr;
Craig Topperd2d442c2014-05-17 23:10:59 +00002240 } else if (!Lookup) {
Richard Smith6d69fec2019-03-21 20:42:13 +00002241 // The current file was not found by walking the include path. Either it
2242 // is the primary file (handled above), or it was found by absolute path,
2243 // or it was found relative to such a file.
2244 // FIXME: Track enough information so we know which case we're in.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002245 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2246 } else {
2247 // Start looking up in the next directory.
2248 ++Lookup;
2249 }
Mike Stump11289f42009-09-09 15:08:12 +00002250
Richard Smith25d50752014-10-20 00:15:49 +00002251 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2252 LookupFromFile);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002253}
2254
James Dennettf6333ac2012-06-22 05:46:07 +00002255/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
Aaron Ballman0467f552012-03-18 03:10:37 +00002256void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2257 // The Microsoft #import directive takes a type library and generates header
2258 // files from it, and includes those. This is beyond the scope of what clang
2259 // does, so we ignore it and error out. However, #import can optionally have
2260 // trailing attributes that span multiple lines. We're going to eat those
2261 // so we can continue processing from there.
2262 Diag(Tok, diag::err_pp_import_directive_ms );
2263
Taewook Oh755e4d22016-06-13 21:55:33 +00002264 // Read tokens until we get to the end of the directive. Note that the
Aaron Ballman0467f552012-03-18 03:10:37 +00002265 // directive can be split over multiple lines using the backslash character.
2266 DiscardUntilEndOfDirective();
2267}
2268
James Dennettf6333ac2012-06-22 05:46:07 +00002269/// HandleImportDirective - Implements \#import.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002270///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002271void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2272 Token &ImportTok) {
Erik Pilkingtonfa983902018-10-30 20:31:30 +00002273 if (!LangOpts.ObjC) { // #import is standard for ObjC.
Alp Tokerbfa39342014-01-14 12:51:41 +00002274 if (LangOpts.MSVCCompat)
Aaron Ballman0467f552012-03-18 03:10:37 +00002275 return HandleMicrosoftImportDirective(ImportTok);
Chris Lattnerd4a96732009-03-06 04:28:03 +00002276 Diag(ImportTok, diag::ext_pp_import_directive);
Aaron Ballman0467f552012-03-18 03:10:37 +00002277 }
Richard Smith8af8b862019-04-11 21:18:23 +00002278 return HandleIncludeDirective(HashLoc, ImportTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002279}
2280
Chris Lattner58a1eb02009-04-08 18:46:40 +00002281/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2282/// pseudo directive in the predefines buffer. This handles it by sucking all
2283/// tokens through the preprocessor and discarding them (only keeping the side
2284/// effects on the preprocessor).
Douglas Gregor796d76a2010-10-20 22:00:55 +00002285void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2286 Token &IncludeMacrosTok) {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002287 // This directive should only occur in the predefines buffer. If not, emit an
2288 // error and reject it.
2289 SourceLocation Loc = IncludeMacrosTok.getLocation();
Mehdi Amini99d1b292016-10-01 16:38:28 +00002290 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002291 Diag(IncludeMacrosTok.getLocation(),
2292 diag::pp_include_macros_out_of_predefines);
2293 DiscardUntilEndOfDirective();
2294 return;
2295 }
Mike Stump11289f42009-09-09 15:08:12 +00002296
Chris Lattnere01d82b2009-04-08 20:53:24 +00002297 // Treat this as a normal #include for checking purposes. If this is
2298 // successful, it will push a new lexer onto the include stack.
Richard Smith25d50752014-10-20 00:15:49 +00002299 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
Mike Stump11289f42009-09-09 15:08:12 +00002300
Chris Lattnere01d82b2009-04-08 20:53:24 +00002301 Token TmpTok;
2302 do {
2303 Lex(TmpTok);
2304 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2305 } while (TmpTok.isNot(tok::hashhash));
Chris Lattner58a1eb02009-04-08 18:46:40 +00002306}
2307
Chris Lattnerf64b3522008-03-09 01:54:53 +00002308//===----------------------------------------------------------------------===//
2309// Preprocessor Macro Directive Handling.
2310//===----------------------------------------------------------------------===//
2311
Faisal Valie8f430a2017-09-29 02:43:22 +00002312/// ReadMacroParameterList - The ( starting a parameter list of a macro
2313/// definition has just been read. Lex the rest of the parameters and the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002314/// closing ), updating MI with what we learn. Return true if an error occurs
Faisal Valie8f430a2017-09-29 02:43:22 +00002315/// parsing the param list.
Faisal Valiac506d72017-07-17 17:18:43 +00002316bool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {
Faisal Vali33df3912017-09-29 02:17:31 +00002317 SmallVector<IdentifierInfo*, 32> Parameters;
Mike Stump11289f42009-09-09 15:08:12 +00002318
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002319 while (true) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002320 LexUnexpandedToken(Tok);
2321 switch (Tok.getKind()) {
2322 case tok::r_paren:
Faisal Valie8f430a2017-09-29 02:43:22 +00002323 // Found the end of the parameter list.
Faisal Vali33df3912017-09-29 02:17:31 +00002324 if (Parameters.empty()) // #define FOO()
Chris Lattnerf64b3522008-03-09 01:54:53 +00002325 return false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002326 // Otherwise we have #define FOO(A,)
2327 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2328 return true;
2329 case tok::ellipsis: // #define X(... -> C99 varargs
David Blaikiebbafb8a2012-03-11 07:00:24 +00002330 if (!LangOpts.C99)
Taewook Oh755e4d22016-06-13 21:55:33 +00002331 Diag(Tok, LangOpts.CPlusPlus11 ?
Richard Smithacd4d3d2011-10-15 01:18:56 +00002332 diag::warn_cxx98_compat_variadic_macro :
2333 diag::ext_variadic_macro);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002334
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002335 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2336 if (LangOpts.OpenCL) {
Anastasia Stulova545652b2019-03-26 11:22:37 +00002337 Diag(Tok, diag::ext_pp_opencl_variadic_macros);
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002338 }
2339
Chris Lattnerf64b3522008-03-09 01:54:53 +00002340 // Lex the token after the identifier.
2341 LexUnexpandedToken(Tok);
2342 if (Tok.isNot(tok::r_paren)) {
2343 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2344 return true;
2345 }
Faisal Valie8f430a2017-09-29 02:43:22 +00002346 // Add the __VA_ARGS__ identifier as a parameter.
Faisal Vali33df3912017-09-29 02:17:31 +00002347 Parameters.push_back(Ident__VA_ARGS__);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002348 MI->setIsC99Varargs();
Faisal Vali33df3912017-09-29 02:17:31 +00002349 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002350 return false;
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002351 case tok::eod: // #define X(
Chris Lattnerf64b3522008-03-09 01:54:53 +00002352 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2353 return true;
2354 default:
2355 // Handle keywords and identifiers here to accept things like
2356 // #define Foo(for) for.
2357 IdentifierInfo *II = Tok.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +00002358 if (!II) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002359 // #define X(1
2360 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2361 return true;
2362 }
2363
Faisal Valie8f430a2017-09-29 02:43:22 +00002364 // If this is already used as a parameter, it is used multiple times (e.g.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002365 // #define X(A,A.
Fangrui Song75e74e02019-03-31 08:48:19 +00002366 if (llvm::find(Parameters, II) != Parameters.end()) { // C99 6.10.3p6
Chris Lattnerc5cdade2008-11-19 07:33:58 +00002367 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002368 return true;
2369 }
Mike Stump11289f42009-09-09 15:08:12 +00002370
Faisal Valie8f430a2017-09-29 02:43:22 +00002371 // Add the parameter to the macro info.
Faisal Vali33df3912017-09-29 02:17:31 +00002372 Parameters.push_back(II);
Mike Stump11289f42009-09-09 15:08:12 +00002373
Chris Lattnerf64b3522008-03-09 01:54:53 +00002374 // Lex the token after the identifier.
2375 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002376
Chris Lattnerf64b3522008-03-09 01:54:53 +00002377 switch (Tok.getKind()) {
2378 default: // #define X(A B
2379 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2380 return true;
2381 case tok::r_paren: // #define X(A)
Faisal Vali33df3912017-09-29 02:17:31 +00002382 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002383 return false;
2384 case tok::comma: // #define X(A,
2385 break;
2386 case tok::ellipsis: // #define X(A... -> GCC extension
2387 // Diagnose extension.
2388 Diag(Tok, diag::ext_named_variadic_macro);
Mike Stump11289f42009-09-09 15:08:12 +00002389
Chris Lattnerf64b3522008-03-09 01:54:53 +00002390 // Lex the token after the identifier.
2391 LexUnexpandedToken(Tok);
2392 if (Tok.isNot(tok::r_paren)) {
2393 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2394 return true;
2395 }
Mike Stump11289f42009-09-09 15:08:12 +00002396
Chris Lattnerf64b3522008-03-09 01:54:53 +00002397 MI->setIsGNUVarargs();
Faisal Vali33df3912017-09-29 02:17:31 +00002398 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002399 return false;
2400 }
2401 }
2402 }
2403}
2404
Serge Pavlov07c0f042014-12-18 11:14:21 +00002405static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2406 const LangOptions &LOptions) {
2407 if (MI->getNumTokens() == 1) {
2408 const Token &Value = MI->getReplacementToken(0);
2409
2410 // Macro that is identity, like '#define inline inline' is a valid pattern.
2411 if (MacroName.getKind() == Value.getKind())
2412 return true;
2413
2414 // Macro that maps a keyword to the same keyword decorated with leading/
2415 // trailing underscores is a valid pattern:
2416 // #define inline __inline
2417 // #define inline __inline__
2418 // #define inline _inline (in MS compatibility mode)
2419 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2420 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2421 if (!II->isKeyword(LOptions))
2422 return false;
2423 StringRef ValueText = II->getName();
2424 StringRef TrimmedValue = ValueText;
2425 if (!ValueText.startswith("__")) {
2426 if (ValueText.startswith("_"))
2427 TrimmedValue = TrimmedValue.drop_front(1);
2428 else
2429 return false;
2430 } else {
2431 TrimmedValue = TrimmedValue.drop_front(2);
2432 if (TrimmedValue.endswith("__"))
2433 TrimmedValue = TrimmedValue.drop_back(2);
2434 }
2435 return TrimmedValue.equals(MacroText);
2436 } else {
2437 return false;
2438 }
2439 }
2440
2441 // #define inline
Alexander Kornienkoa26c4952015-12-28 15:30:42 +00002442 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2443 tok::kw_const) &&
2444 MI->getNumTokens() == 0;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002445}
2446
Faisal Valiac506d72017-07-17 17:18:43 +00002447// ReadOptionalMacroParameterListAndBody - This consumes all (i.e. the
2448// entire line) of the macro's tokens and adds them to MacroInfo, and while
2449// doing so performs certain validity checks including (but not limited to):
2450// - # (stringization) is followed by a macro parameter
2451//
2452// Returns a nullptr if an invalid sequence of tokens is encountered or returns
2453// a pointer to a MacroInfo object.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002454
Faisal Valiac506d72017-07-17 17:18:43 +00002455MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(
2456 const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002457
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002458 Token LastTok = MacroNameTok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002459 // Create the new macro.
Faisal Valiac506d72017-07-17 17:18:43 +00002460 MacroInfo *const MI = AllocateMacroInfo(MacroNameTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002461
Chris Lattnerf64b3522008-03-09 01:54:53 +00002462 Token Tok;
2463 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002464
Ilya Biryukovb455fc42019-08-01 09:10:37 +00002465 // Ensure we consume the rest of the macro body if errors occur.
2466 auto _ = llvm::make_scope_exit([&]() {
2467 // The flag indicates if we are still waiting for 'eod'.
2468 if (CurLexer->ParsingPreprocessorDirective)
2469 DiscardUntilEndOfDirective();
2470 });
2471
Faisal Vali6bf67912017-07-25 03:15:36 +00002472 // Used to un-poison and then re-poison identifiers of the __VA_ARGS__ ilk
2473 // within their appropriate context.
2474 VariadicMacroScopeGuard VariadicMacroScopeGuard(*this);
2475
Chris Lattnerf64b3522008-03-09 01:54:53 +00002476 // If this is a function-like macro definition, parse the argument list,
2477 // marking each of the identifiers as being used as macro arguments. Also,
2478 // check other constraints on the first token of the macro body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002479 if (Tok.is(tok::eod)) {
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002480 if (ImmediatelyAfterHeaderGuard) {
2481 // Save this macro information since it may part of a header guard.
2482 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2483 MacroNameTok.getLocation());
2484 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002485 // If there is no body to this macro, we have no special handling here.
Chris Lattner2425bcb2009-04-18 02:23:25 +00002486 } else if (Tok.hasLeadingSpace()) {
2487 // This is a normal token with leading space. Clear the leading space
2488 // marker on the first token to get proper expansion.
2489 Tok.clearFlag(Token::LeadingSpace);
2490 } else if (Tok.is(tok::l_paren)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002491 // This is a function-like macro definition. Read the argument list.
2492 MI->setIsFunctionLike();
Ilya Biryukovb455fc42019-08-01 09:10:37 +00002493 if (ReadMacroParameterList(MI, LastTok))
Faisal Valiac506d72017-07-17 17:18:43 +00002494 return nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002495
Faisal Vali6bf67912017-07-25 03:15:36 +00002496 // If this is a definition of an ISO C/C++ variadic function-like macro (not
2497 // using the GNU named varargs extension) inform our variadic scope guard
2498 // which un-poisons and re-poisons certain identifiers (e.g. __VA_ARGS__)
2499 // allowed only within the definition of a variadic macro.
Mike Stump11289f42009-09-09 15:08:12 +00002500
Faisal Vali6bf67912017-07-25 03:15:36 +00002501 if (MI->isC99Varargs()) {
2502 VariadicMacroScopeGuard.enterScope();
2503 }
Mike Stump11289f42009-09-09 15:08:12 +00002504
Chris Lattnerf64b3522008-03-09 01:54:53 +00002505 // Read the first token after the arg list for down below.
2506 LexUnexpandedToken(Tok);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00002507 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002508 // C99 requires whitespace between the macro definition and the body. Emit
2509 // a diagnostic for something like "#define X+".
Chris Lattner2425bcb2009-04-18 02:23:25 +00002510 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002511 } else {
Chris Lattner2425bcb2009-04-18 02:23:25 +00002512 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2513 // first character of a replacement list is not a character required by
2514 // subclause 5.2.1, then there shall be white-space separation between the
2515 // identifier and the replacement list.". 5.2.1 lists this set:
2516 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2517 // is irrelevant here.
2518 bool isInvalid = false;
2519 if (Tok.is(tok::at)) // @ is not in the list above.
2520 isInvalid = true;
2521 else if (Tok.is(tok::unknown)) {
2522 // If we have an unknown token, it is something strange like "`". Since
2523 // all of valid characters would have lexed into a single character
2524 // token of some sort, we know this is not a valid case.
2525 isInvalid = true;
2526 }
2527 if (isInvalid)
2528 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2529 else
2530 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002531 }
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002532
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002533 if (!Tok.is(tok::eod))
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002534 LastTok = Tok;
2535
Chris Lattnerf64b3522008-03-09 01:54:53 +00002536 // Read the rest of the macro body.
2537 if (MI->isObjectLike()) {
2538 // Object-like macros are very simple, just read their body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002539 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002540 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002541 MI->AddTokenToBody(Tok);
2542 // Get the next token of the macro.
2543 LexUnexpandedToken(Tok);
2544 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002545 } else {
Chris Lattner83bd8282009-05-25 17:16:10 +00002546 // Otherwise, read the body of a function-like macro. While we are at it,
2547 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2548 // parameters in function-like macro expansions.
Faisal Vali18268422017-10-15 01:26:26 +00002549
2550 VAOptDefinitionContext VAOCtx(*this);
2551
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002552 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002553 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002554
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002555 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002556 MI->AddTokenToBody(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002557
Faisal Vali18268422017-10-15 01:26:26 +00002558 if (VAOCtx.isVAOptToken(Tok)) {
2559 // If we're already within a VAOPT, emit an error.
2560 if (VAOCtx.isInVAOpt()) {
2561 Diag(Tok, diag::err_pp_vaopt_nested_use);
2562 return nullptr;
2563 }
2564 // Ensure VAOPT is followed by a '(' .
2565 LexUnexpandedToken(Tok);
2566 if (Tok.isNot(tok::l_paren)) {
2567 Diag(Tok, diag::err_pp_missing_lparen_in_vaopt_use);
2568 return nullptr;
2569 }
2570 MI->AddTokenToBody(Tok);
2571 VAOCtx.sawVAOptFollowedByOpeningParens(Tok.getLocation());
2572 LexUnexpandedToken(Tok);
2573 if (Tok.is(tok::hashhash)) {
2574 Diag(Tok, diag::err_vaopt_paste_at_start);
2575 return nullptr;
2576 }
2577 continue;
2578 } else if (VAOCtx.isInVAOpt()) {
2579 if (Tok.is(tok::r_paren)) {
2580 if (VAOCtx.sawClosingParen()) {
2581 const unsigned NumTokens = MI->getNumTokens();
2582 assert(NumTokens >= 3 && "Must have seen at least __VA_OPT__( "
2583 "and a subsequent tok::r_paren");
2584 if (MI->getReplacementToken(NumTokens - 2).is(tok::hashhash)) {
2585 Diag(Tok, diag::err_vaopt_paste_at_end);
2586 return nullptr;
2587 }
2588 }
2589 } else if (Tok.is(tok::l_paren)) {
2590 VAOCtx.sawOpeningParen(Tok.getLocation());
2591 }
2592 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002593 // Get the next token of the macro.
2594 LexUnexpandedToken(Tok);
2595 continue;
2596 }
Mike Stump11289f42009-09-09 15:08:12 +00002597
Richard Smith701a3522013-07-09 01:00:29 +00002598 // If we're in -traditional mode, then we should ignore stringification
2599 // and token pasting. Mark the tokens as unknown so as not to confuse
2600 // things.
2601 if (getLangOpts().TraditionalCPP) {
2602 Tok.setKind(tok::unknown);
2603 MI->AddTokenToBody(Tok);
2604
2605 // Get the next token of the macro.
2606 LexUnexpandedToken(Tok);
2607 continue;
2608 }
2609
Eli Friedman14d3c792012-11-14 02:18:46 +00002610 if (Tok.is(tok::hashhash)) {
Eli Friedman14d3c792012-11-14 02:18:46 +00002611 // If we see token pasting, check if it looks like the gcc comma
2612 // pasting extension. We'll use this information to suppress
2613 // diagnostics later on.
Taewook Oh755e4d22016-06-13 21:55:33 +00002614
Eli Friedman14d3c792012-11-14 02:18:46 +00002615 // Get the next token of the macro.
2616 LexUnexpandedToken(Tok);
2617
2618 if (Tok.is(tok::eod)) {
2619 MI->AddTokenToBody(LastTok);
2620 break;
2621 }
2622
2623 unsigned NumTokens = MI->getNumTokens();
2624 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2625 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2626 MI->setHasCommaPasting();
2627
David Majnemer76faf1f2013-11-05 09:30:17 +00002628 // Things look ok, add the '##' token to the macro.
Eli Friedman14d3c792012-11-14 02:18:46 +00002629 MI->AddTokenToBody(LastTok);
Eli Friedman14d3c792012-11-14 02:18:46 +00002630 continue;
2631 }
2632
Faisal Vali18268422017-10-15 01:26:26 +00002633 // Our Token is a stringization operator.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002634 // Get the next token of the macro.
2635 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002636
Faisal Vali18268422017-10-15 01:26:26 +00002637 // Check for a valid macro arg identifier or __VA_OPT__.
2638 if (!VAOCtx.isVAOptToken(Tok) &&
2639 (Tok.getIdentifierInfo() == nullptr ||
2640 MI->getParameterNum(Tok.getIdentifierInfo()) == -1)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002641
2642 // If this is assembler-with-cpp mode, we accept random gibberish after
2643 // the '#' because '#' is often a comment character. However, change
2644 // the kind of the token to tok::unknown so that the preprocessor isn't
2645 // confused.
David Blaikiebbafb8a2012-03-11 07:00:24 +00002646 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002647 LastTok.setKind(tok::unknown);
Eli Friedmancdf8b882013-06-18 21:33:38 +00002648 MI->AddTokenToBody(LastTok);
2649 continue;
Chris Lattner83bd8282009-05-25 17:16:10 +00002650 } else {
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002651 Diag(Tok, diag::err_pp_stringize_not_parameter)
2652 << LastTok.is(tok::hashat);
Faisal Valiac506d72017-07-17 17:18:43 +00002653 return nullptr;
Chris Lattner83bd8282009-05-25 17:16:10 +00002654 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002655 }
Mike Stump11289f42009-09-09 15:08:12 +00002656
Chris Lattner83bd8282009-05-25 17:16:10 +00002657 // Things look ok, add the '#' and param name tokens to the macro.
2658 MI->AddTokenToBody(LastTok);
Mike Stump11289f42009-09-09 15:08:12 +00002659
Faisal Vali18268422017-10-15 01:26:26 +00002660 // If the token following '#' is VAOPT, let the next iteration handle it
2661 // and check it for correctness, otherwise add the token and prime the
2662 // loop with the next one.
2663 if (!VAOCtx.isVAOptToken(Tok)) {
2664 MI->AddTokenToBody(Tok);
2665 LastTok = Tok;
2666
2667 // Get the next token of the macro.
2668 LexUnexpandedToken(Tok);
2669 }
2670 }
2671 if (VAOCtx.isInVAOpt()) {
2672 assert(Tok.is(tok::eod) && "Must be at End Of preprocessing Directive");
2673 Diag(Tok, diag::err_pp_expected_after)
2674 << LastTok.getKind() << tok::r_paren;
2675 Diag(VAOCtx.getUnmatchedOpeningParenLoc(), diag::note_matching) << tok::l_paren;
2676 return nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002677 }
2678 }
Faisal Valiac506d72017-07-17 17:18:43 +00002679 MI->setDefinitionEndLoc(LastTok.getLocation());
Faisal Valiac506d72017-07-17 17:18:43 +00002680 return MI;
2681}
2682/// HandleDefineDirective - Implements \#define. This consumes the entire macro
2683/// line then lets the caller lex the next real token.
2684void Preprocessor::HandleDefineDirective(
2685 Token &DefineTok, const bool ImmediatelyAfterHeaderGuard) {
2686 ++NumDefined;
2687
2688 Token MacroNameTok;
2689 bool MacroShadowsKeyword;
2690 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
2691
2692 // Error reading macro name? If so, diagnostic already issued.
2693 if (MacroNameTok.is(tok::eod))
2694 return;
2695
2696 // If we are supposed to keep comments in #defines, reenable comment saving
2697 // mode.
2698 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
2699
2700 MacroInfo *const MI = ReadOptionalMacroParameterListAndBody(
2701 MacroNameTok, ImmediatelyAfterHeaderGuard);
Fangrui Song6907ce22018-07-30 19:24:48 +00002702
Faisal Valiac506d72017-07-17 17:18:43 +00002703 if (!MI) return;
Mike Stump11289f42009-09-09 15:08:12 +00002704
Serge Pavlov07c0f042014-12-18 11:14:21 +00002705 if (MacroShadowsKeyword &&
2706 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2707 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
Fangrui Song6907ce22018-07-30 19:24:48 +00002708 }
Chris Lattner57540c52011-04-15 05:22:18 +00002709 // Check that there is no paste (##) operator at the beginning or end of the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002710 // replacement list.
2711 unsigned NumTokens = MI->getNumTokens();
2712 if (NumTokens != 0) {
2713 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2714 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002715 return;
2716 }
2717 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2718 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002719 return;
2720 }
2721 }
Mike Stump11289f42009-09-09 15:08:12 +00002722
Erich Keane76675de2018-07-05 17:22:13 +00002723 // When skipping just warn about macros that do not match.
2724 if (SkippingUntilPCHThroughHeader) {
2725 const MacroInfo *OtherMI = getMacroInfo(MacroNameTok.getIdentifierInfo());
2726 if (!OtherMI || !MI->isIdenticalTo(*OtherMI, *this,
2727 /*Syntactic=*/LangOpts.MicrosoftExt))
2728 Diag(MI->getDefinitionLoc(), diag::warn_pp_macro_def_mismatch_with_pch)
2729 << MacroNameTok.getIdentifierInfo();
2730 return;
2731 }
Mike Stump11289f42009-09-09 15:08:12 +00002732
Chris Lattnerf64b3522008-03-09 01:54:53 +00002733 // Finally, if this identifier already had a macro defined for it, verify that
Alexander Kornienko8b3f6232012-08-29 00:20:03 +00002734 // the macro bodies are identical, and issue diagnostics if they are not.
Argyrios Kyrtzidis09c9e812013-02-20 00:54:57 +00002735 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
John McCall83760372015-12-10 23:31:01 +00002736 // In Objective-C, ignore attempts to directly redefine the builtin
2737 // definitions of the ownership qualifiers. It's still possible to
2738 // #undef them.
2739 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2740 return II->isStr("__strong") ||
2741 II->isStr("__weak") ||
2742 II->isStr("__unsafe_unretained") ||
2743 II->isStr("__autoreleasing");
2744 };
Erik Pilkingtonfa983902018-10-30 20:31:30 +00002745 if (getLangOpts().ObjC &&
John McCall83760372015-12-10 23:31:01 +00002746 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2747 == getPredefinesFileID() &&
2748 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2749 // Warn if it changes the tokens.
2750 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2751 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2752 !MI->isIdenticalTo(*OtherMI, *this,
2753 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2754 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2755 }
2756 assert(!OtherMI->isWarnIfUnused());
2757 return;
2758 }
2759
Chris Lattner5244f342009-01-16 19:50:11 +00002760 // It is very common for system headers to have tons of macro redefinitions
2761 // and for warnings to be disabled in system headers. If this is the case,
2762 // then don't bother calling MacroInfo::isIdenticalTo.
Chris Lattner80c21df2009-03-13 21:17:23 +00002763 if (!getDiagnostics().getSuppressSystemWarnings() ||
Chris Lattner5244f342009-01-16 19:50:11 +00002764 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002765 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
Chris Lattner5244f342009-01-16 19:50:11 +00002766 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002767
Taewook Oh755e4d22016-06-13 21:55:33 +00002768 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
Richard Smith7b242542013-03-06 00:46:00 +00002769 // C++ [cpp.predefined]p4, but allow it as an extension.
2770 if (OtherMI->isBuiltinMacro())
2771 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
Chris Lattnerc0a585d2010-08-17 15:55:45 +00002772 // Macros must be identical. This means all tokens and whitespace
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002773 // separation must be the same. C99 6.10.3p2.
Richard Smith7b242542013-03-06 00:46:00 +00002774 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002775 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
Chris Lattner5244f342009-01-16 19:50:11 +00002776 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2777 << MacroNameTok.getIdentifierInfo();
2778 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2779 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002780 }
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002781 if (OtherMI->isWarnIfUnused())
2782 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002783 }
Mike Stump11289f42009-09-09 15:08:12 +00002784
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002785 DefMacroDirective *MD =
2786 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
Mike Stump11289f42009-09-09 15:08:12 +00002787
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002788 assert(!MI->isUsed());
2789 // If we need warning for not using the macro, add its location in the
2790 // warn-because-unused-macro set. If it gets used it will be removed from set.
Eli Friedman5ba37d52013-08-22 00:27:10 +00002791 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
Lubos Lunaka507a5e2019-09-16 19:18:37 +00002792 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc()) &&
2793 !MacroExpansionInDirectivesOverride) {
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002794 MI->setIsWarnIfUnused(true);
2795 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2796 }
2797
Chris Lattner928e9092009-04-12 01:39:54 +00002798 // If the callbacks want to know, tell them about the macro definition.
2799 if (Callbacks)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002800 Callbacks->MacroDefined(MacroNameTok, MD);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002801}
2802
James Dennettf6333ac2012-06-22 05:46:07 +00002803/// HandleUndefDirective - Implements \#undef.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002804///
Erik Verbruggen4bddef92016-10-26 08:52:41 +00002805void Preprocessor::HandleUndefDirective() {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002806 ++NumUndefined;
2807
2808 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00002809 ReadMacroName(MacroNameTok, MU_Undef);
Mike Stump11289f42009-09-09 15:08:12 +00002810
Chris Lattnerf64b3522008-03-09 01:54:53 +00002811 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002812 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002813 return;
Mike Stump11289f42009-09-09 15:08:12 +00002814
Chris Lattnerf64b3522008-03-09 01:54:53 +00002815 // Check to see if this is the last token on the #undef line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002816 CheckEndOfDirective("undef");
Mike Stump11289f42009-09-09 15:08:12 +00002817
Richard Smith20e883e2015-04-29 23:20:19 +00002818 // Okay, we have a valid identifier to undef.
2819 auto *II = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002820 auto MD = getMacroDefinition(II);
Vedant Kumar349a6242017-04-26 21:05:44 +00002821 UndefMacroDirective *Undef = nullptr;
Fangrui Song6907ce22018-07-30 19:24:48 +00002822
Vedant Kumar349a6242017-04-26 21:05:44 +00002823 // If the macro is not defined, this is a noop undef.
2824 if (const MacroInfo *MI = MD.getMacroInfo()) {
2825 if (!MI->isUsed() && MI->isWarnIfUnused())
2826 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
2827
2828 if (MI->isWarnIfUnused())
2829 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
2830
2831 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
2832 }
Mike Stump11289f42009-09-09 15:08:12 +00002833
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002834 // If the callbacks want to know, tell them about the macro #undef.
2835 // Note: no matter if the macro was defined or not.
Richard Smith36bd40d2015-05-04 03:15:40 +00002836 if (Callbacks)
Vedant Kumar349a6242017-04-26 21:05:44 +00002837 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002838
Vedant Kumar349a6242017-04-26 21:05:44 +00002839 if (Undef)
2840 appendMacroDirective(II, Undef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002841}
2842
Chris Lattnerf64b3522008-03-09 01:54:53 +00002843//===----------------------------------------------------------------------===//
2844// Preprocessor Conditional Directive Handling.
2845//===----------------------------------------------------------------------===//
2846
James Dennettf6333ac2012-06-22 05:46:07 +00002847/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
2848/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
2849/// true if any tokens have been returned or pp-directives activated before this
2850/// \#ifndef has been lexed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002851///
Vedant Kumar3919a502017-09-11 20:47:42 +00002852void Preprocessor::HandleIfdefDirective(Token &Result,
2853 const Token &HashToken,
2854 bool isIfndef,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002855 bool ReadAnyTokensBeforeDirective) {
2856 ++NumIf;
2857 Token DirectiveTok = Result;
2858
2859 Token MacroNameTok;
2860 ReadMacroName(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +00002861
Chris Lattnerf64b3522008-03-09 01:54:53 +00002862 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002863 if (MacroNameTok.is(tok::eod)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002864 // Skip code until we get to #endif. This helps with recovery by not
2865 // emitting an error when the #endif is reached.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002866 SkipExcludedConditionalBlock(HashToken.getLocation(),
2867 DirectiveTok.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002868 /*Foundnonskip*/ false, /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002869 return;
2870 }
Mike Stump11289f42009-09-09 15:08:12 +00002871
Chris Lattnerf64b3522008-03-09 01:54:53 +00002872 // Check to see if this is the last token on the #if[n]def line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002873 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002874
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002875 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002876 auto MD = getMacroDefinition(MII);
2877 MacroInfo *MI = MD.getMacroInfo();
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00002878
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002879 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002880 // If the start of a top-level #ifdef and if the macro is not defined,
2881 // inform MIOpt that this might be the start of a proper include guard.
2882 // Otherwise it is some other form of unknown conditional which we can't
2883 // handle.
Craig Topperd2d442c2014-05-17 23:10:59 +00002884 if (!ReadAnyTokensBeforeDirective && !MI) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002885 assert(isIfndef && "#ifdef shouldn't reach here");
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002886 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002887 } else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002888 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002889 }
2890
Chris Lattnerf64b3522008-03-09 01:54:53 +00002891 // If there is a macro, process it.
2892 if (MI) // Mark it used.
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002893 markMacroAsUsed(MI);
Mike Stump11289f42009-09-09 15:08:12 +00002894
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002895 if (Callbacks) {
2896 if (isIfndef)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002897 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002898 else
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002899 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002900 }
2901
Evgeny Mankov2ed2e622019-08-27 22:15:32 +00002902 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
2903 getSourceManager().isInMainFile(DirectiveTok.getLocation());
2904
Chris Lattnerf64b3522008-03-09 01:54:53 +00002905 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002906 if (PPOpts->SingleFileParseMode && !MI) {
2907 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2908 // the directive blocks.
2909 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002910 /*wasskip*/false, /*foundnonskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002911 /*foundelse*/false);
Evgeny Mankov2ed2e622019-08-27 22:15:32 +00002912 } else if (!MI == isIfndef || RetainExcludedCB) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002913 // Yes, remember that we are inside a conditional, then lex the next token.
Chris Lattner8cf1f932009-12-14 04:54:40 +00002914 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
2915 /*wasskip*/false, /*foundnonskip*/true,
2916 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002917 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002918 // No, skip the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002919 SkipExcludedConditionalBlock(HashToken.getLocation(),
2920 DirectiveTok.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002921 /*Foundnonskip*/ false,
2922 /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002923 }
2924}
2925
James Dennettf6333ac2012-06-22 05:46:07 +00002926/// HandleIfDirective - Implements the \#if directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002927///
2928void Preprocessor::HandleIfDirective(Token &IfToken,
Vedant Kumar3919a502017-09-11 20:47:42 +00002929 const Token &HashToken,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002930 bool ReadAnyTokensBeforeDirective) {
2931 ++NumIf;
Chandler Carruthd92d70b2019-01-19 06:36:00 +00002932
2933 // Parse and evaluate the conditional expression.
2934 IdentifierInfo *IfNDefMacro = nullptr;
2935 const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
2936 const bool ConditionalTrue = DER.Conditional;
2937
2938 // If this condition is equivalent to #ifndef X, and if this is the first
2939 // directive seen, handle it for the multiple-include optimization.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002940 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002941 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
Richard Smith089ee152013-06-16 05:05:39 +00002942 // FIXME: Pass in the location of the macro name, not the 'if' token.
2943 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
Nuno Lopes363212b2008-06-01 18:31:24 +00002944 else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002945 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chandler Carruthd92d70b2019-01-19 06:36:00 +00002946 }
2947
2948 if (Callbacks)
2949 Callbacks->If(
2950 IfToken.getLocation(), DER.ExprRange,
2951 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
2952
Evgeny Mankov2ed2e622019-08-27 22:15:32 +00002953 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
2954 getSourceManager().isInMainFile(IfToken.getLocation());
2955
Chandler Carruthd92d70b2019-01-19 06:36:00 +00002956 // Should we include the stuff contained by this directive?
2957 if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002958 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2959 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002960 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002961 /*foundnonskip*/false, /*foundelse*/false);
Evgeny Mankov2ed2e622019-08-27 22:15:32 +00002962 } else if (ConditionalTrue || RetainExcludedCB) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002963 // Yes, remember that we are inside a conditional, then lex the next token.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002964 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002965 /*foundnonskip*/true, /*foundelse*/false);
2966 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002967 // No, skip the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002968 SkipExcludedConditionalBlock(HashToken.getLocation(), IfToken.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002969 /*Foundnonskip*/ false,
2970 /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002971 }
2972}
2973
James Dennettf6333ac2012-06-22 05:46:07 +00002974/// HandleEndifDirective - Implements the \#endif directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002975///
2976void Preprocessor::HandleEndifDirective(Token &EndifToken) {
2977 ++NumEndif;
Mike Stump11289f42009-09-09 15:08:12 +00002978
Chris Lattnerf64b3522008-03-09 01:54:53 +00002979 // Check that this is the whole directive.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002980 CheckEndOfDirective("endif");
Mike Stump11289f42009-09-09 15:08:12 +00002981
Chris Lattnerf64b3522008-03-09 01:54:53 +00002982 PPConditionalInfo CondInfo;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002983 if (CurPPLexer->popConditionalLevel(CondInfo)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002984 // No conditionals on the stack: this is an #endif without an #if.
Chris Lattner907dfe92008-11-18 07:59:24 +00002985 Diag(EndifToken, diag::err_pp_endif_without_if);
2986 return;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002987 }
Mike Stump11289f42009-09-09 15:08:12 +00002988
Chris Lattnerf64b3522008-03-09 01:54:53 +00002989 // If this the end of a top-level #endif, inform MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002990 if (CurPPLexer->getConditionalStackDepth() == 0)
2991 CurPPLexer->MIOpt.ExitTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002992
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002993 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&
Chris Lattnerf64b3522008-03-09 01:54:53 +00002994 "This code should only be reachable in the non-skipping case!");
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002995
2996 if (Callbacks)
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002997 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002998}
2999
James Dennettf6333ac2012-06-22 05:46:07 +00003000/// HandleElseDirective - Implements the \#else directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00003001///
Vedant Kumar3919a502017-09-11 20:47:42 +00003002void Preprocessor::HandleElseDirective(Token &Result, const Token &HashToken) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00003003 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00003004
Chris Lattnerf64b3522008-03-09 01:54:53 +00003005 // #else directive in a non-skipping conditional... start skipping.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00003006 CheckEndOfDirective("else");
Mike Stump11289f42009-09-09 15:08:12 +00003007
Chris Lattnerf64b3522008-03-09 01:54:53 +00003008 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00003009 if (CurPPLexer->popConditionalLevel(CI)) {
3010 Diag(Result, diag::pp_err_else_without_if);
3011 return;
3012 }
Mike Stump11289f42009-09-09 15:08:12 +00003013
Chris Lattnerf64b3522008-03-09 01:54:53 +00003014 // If this is a top-level #else, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00003015 if (CurPPLexer->getConditionalStackDepth() == 0)
3016 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00003017
3018 // If this is a #else with a #else before it, report the error.
3019 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +00003020
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00003021 if (Callbacks)
3022 Callbacks->Else(Result.getLocation(), CI.IfLoc);
3023
Evgeny Mankov2ed2e622019-08-27 22:15:32 +00003024 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3025 getSourceManager().isInMainFile(Result.getLocation());
3026
3027 if ((PPOpts->SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00003028 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3029 // the directive blocks.
3030 CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00003031 /*foundnonskip*/false, /*foundelse*/true);
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00003032 return;
3033 }
3034
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00003035 // Finally, skip the rest of the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00003036 SkipExcludedConditionalBlock(HashToken.getLocation(), CI.IfLoc,
3037 /*Foundnonskip*/ true,
Vedant Kumar3919a502017-09-11 20:47:42 +00003038 /*FoundElse*/ true, Result.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00003039}
3040
James Dennettf6333ac2012-06-22 05:46:07 +00003041/// HandleElifDirective - Implements the \#elif directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00003042///
Vedant Kumar3919a502017-09-11 20:47:42 +00003043void Preprocessor::HandleElifDirective(Token &ElifToken,
3044 const Token &HashToken) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00003045 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00003046
Chandler Carruthd92d70b2019-01-19 06:36:00 +00003047 // #elif directive in a non-skipping conditional... start skipping.
3048 // We don't care what the condition is, because we will always skip it (since
3049 // the block immediately before it was included).
3050 SourceRange ConditionRange = DiscardUntilEndOfDirective();
3051
3052 PPConditionalInfo CI;
3053 if (CurPPLexer->popConditionalLevel(CI)) {
Chris Lattner907dfe92008-11-18 07:59:24 +00003054 Diag(ElifToken, diag::pp_err_elif_without_if);
3055 return;
3056 }
Mike Stump11289f42009-09-09 15:08:12 +00003057
Chris Lattnerf64b3522008-03-09 01:54:53 +00003058 // If this is a top-level #elif, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00003059 if (CurPPLexer->getConditionalStackDepth() == 0)
3060 CurPPLexer->MIOpt.EnterTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00003061
Chris Lattnerf64b3522008-03-09 01:54:53 +00003062 // If this is a #elif with a #else before it, report the error.
Chandler Carruthd92d70b2019-01-19 06:36:00 +00003063 if (CI.FoundElse) Diag(ElifToken, diag::pp_err_elif_after_else);
3064
3065 if (Callbacks)
3066 Callbacks->Elif(ElifToken.getLocation(), ConditionRange,
3067 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
3068
Evgeny Mankov2ed2e622019-08-27 22:15:32 +00003069 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3070 getSourceManager().isInMainFile(ElifToken.getLocation());
3071
3072 if ((PPOpts->SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00003073 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3074 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00003075 CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00003076 /*foundnonskip*/false, /*foundelse*/false);
3077 return;
3078 }
3079
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00003080 // Finally, skip the rest of the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00003081 SkipExcludedConditionalBlock(
3082 HashToken.getLocation(), CI.IfLoc, /*Foundnonskip*/ true,
3083 /*FoundElse*/ CI.FoundElse, ElifToken.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00003084}