blob: e47735e627c77819965d244736378d6c3cdc5aed [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//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
James Dennettf6333ac2012-06-22 05:46:07 +00009///
10/// \file
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000011/// Implements # directive processing for the Preprocessor.
James Dennettf6333ac2012-06-22 05:46:07 +000012///
Chris Lattnerf64b3522008-03-09 01:54:53 +000013//===----------------------------------------------------------------------===//
14
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000015#include "clang/Basic/CharInfo.h"
Chris Lattner710bb872009-11-30 04:18:44 +000016#include "clang/Basic/FileManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000017#include "clang/Basic/IdentifierTable.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/Module.h"
20#include "clang/Basic/SourceLocation.h"
Chris Lattnerf64b3522008-03-09 01:54:53 +000021#include "clang/Basic/SourceManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000022#include "clang/Basic/TokenKinds.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000023#include "clang/Lex/CodeCompletionHandler.h"
24#include "clang/Lex/HeaderSearch.h"
25#include "clang/Lex/LexDiagnostic.h"
26#include "clang/Lex/LiteralSupport.h"
27#include "clang/Lex/MacroInfo.h"
28#include "clang/Lex/ModuleLoader.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000029#include "clang/Lex/ModuleMap.h"
30#include "clang/Lex/PPCallbacks.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000031#include "clang/Lex/Pragma.h"
Mehdi Amini9670f842016-07-18 19:02:11 +000032#include "clang/Lex/Preprocessor.h"
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +000033#include "clang/Lex/PreprocessorOptions.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000034#include "clang/Lex/PTHLexer.h"
35#include "clang/Lex/Token.h"
Faisal Vali6bf67912017-07-25 03:15:36 +000036#include "clang/Lex/VariadicMacroSupport.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000037#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/SmallString.h"
39#include "llvm/ADT/SmallVector.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000040#include "llvm/ADT/STLExtras.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000041#include "llvm/ADT/StringSwitch.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000042#include "llvm/ADT/StringRef.h"
43#include "llvm/Support/AlignOf.h"
Douglas Gregor41e115a2011-11-30 18:02:36 +000044#include "llvm/Support/ErrorHandling.h"
Rafael Espindolaf6002232014-08-08 21:31:04 +000045#include "llvm/Support/Path.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000046#include <algorithm>
47#include <cassert>
48#include <cstring>
49#include <new>
50#include <string>
51#include <utility>
Eugene Zelenko1ced5092016-02-12 22:53:10 +000052
Chris Lattnerf64b3522008-03-09 01:54:53 +000053using namespace clang;
54
55//===----------------------------------------------------------------------===//
56// Utility Methods for Preprocessor Directive Handling.
57//===----------------------------------------------------------------------===//
58
Richard Smith3f6dd7a2017-05-12 23:40:52 +000059MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
60 auto *MIChain = new (BP) MacroInfoChain{L, MIChainHead};
Ted Kremenekc8456f82010-10-19 22:15:20 +000061 MIChainHead = MIChain;
Richard Smithee0c4c12014-07-24 01:13:23 +000062 return &MIChain->MI;
Chris Lattnerc0a585d2010-08-17 15:55:45 +000063}
64
Richard Smith50474bf2015-04-23 23:29:05 +000065DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
66 SourceLocation Loc) {
Richard Smith713369b2015-04-23 20:40:50 +000067 return new (BP) DefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000068}
69
70UndefMacroDirective *
Richard Smith50474bf2015-04-23 23:29:05 +000071Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
Richard Smith713369b2015-04-23 20:40:50 +000072 return new (BP) UndefMacroDirective(UndefLoc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000073}
74
75VisibilityMacroDirective *
76Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
77 bool isPublic) {
Richard Smithdaa69e02014-07-25 04:40:03 +000078 return new (BP) VisibilityMacroDirective(Loc, isPublic);
Chris Lattnerc0a585d2010-08-17 15:55:45 +000079}
80
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000081/// Read and discard all tokens remaining on the current line until
Vedant Kumar403822d2017-09-16 06:26:51 +000082/// the tok::eod token is found.
Chris Lattnerf64b3522008-03-09 01:54:53 +000083void Preprocessor::DiscardUntilEndOfDirective() {
84 Token Tmp;
85 do {
86 LexUnexpandedToken(Tmp);
Peter Collingbournef29ce972011-02-22 13:49:06 +000087 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +000088 } while (Tmp.isNot(tok::eod));
Chris Lattnerf64b3522008-03-09 01:54:53 +000089}
90
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000091/// Enumerates possible cases of #define/#undef a reserved identifier.
Serge Pavlov07c0f042014-12-18 11:14:21 +000092enum MacroDiag {
93 MD_NoWarn, //> Not a reserved identifier
94 MD_KeywordDef, //> Macro hides keyword, enabled by default
95 MD_ReservedMacro //> #define of #undef reserved id, disabled by default
96};
97
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000098/// Checks if the specified identifier is reserved in the specified
Serge Pavlov07c0f042014-12-18 11:14:21 +000099/// language.
100/// This function does not check if the identifier is a keyword.
101static bool isReservedId(StringRef Text, const LangOptions &Lang) {
102 // C++ [macro.names], C11 7.1.3:
103 // All identifiers that begin with an underscore and either an uppercase
104 // letter or another underscore are always reserved for any use.
105 if (Text.size() >= 2 && Text[0] == '_' &&
106 (isUppercase(Text[1]) || Text[1] == '_'))
107 return true;
108 // C++ [global.names]
109 // Each name that contains a double underscore ... is reserved to the
110 // implementation for any use.
111 if (Lang.CPlusPlus) {
112 if (Text.find("__") != StringRef::npos)
113 return true;
114 }
Nico Weber92c14bb2014-12-16 21:16:10 +0000115 return false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000116}
117
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +0000118// The -fmodule-name option tells the compiler to textually include headers in
119// the specified module, meaning clang won't build the specified module. This is
120// useful in a number of situations, for instance, when building a library that
121// vends a module map, one might want to avoid hitting intermediate build
122// products containig the the module map or avoid finding the system installed
123// modulemap for that library.
124static bool isForModuleBuilding(Module *M, StringRef CurrentModule,
125 StringRef ModuleName) {
Bruno Cardoso Lopes5bccc522018-02-16 00:12:57 +0000126 StringRef TopLevelName = M->getTopLevelModuleName();
127
128 // When building framework Foo, we wanna make sure that Foo *and* Foo_Private
129 // are textually included and no modules are built for both.
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +0000130 if (M->getTopLevelModule()->IsFramework && CurrentModule == ModuleName &&
Bruno Cardoso Lopes5bccc522018-02-16 00:12:57 +0000131 !CurrentModule.endswith("_Private") && TopLevelName.endswith("_Private"))
132 TopLevelName = TopLevelName.drop_back(8);
133
134 return TopLevelName == CurrentModule;
135}
136
Serge Pavlov07c0f042014-12-18 11:14:21 +0000137static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
138 const LangOptions &Lang = PP.getLangOpts();
139 StringRef Text = II->getName();
140 if (isReservedId(Text, Lang))
141 return MD_ReservedMacro;
142 if (II->isKeyword(Lang))
143 return MD_KeywordDef;
144 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
145 return MD_KeywordDef;
146 return MD_NoWarn;
147}
148
149static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
150 const LangOptions &Lang = PP.getLangOpts();
151 StringRef Text = II->getName();
152 // Do not warn on keyword undef. It is generally harmless and widely used.
153 if (isReservedId(Text, Lang))
154 return MD_ReservedMacro;
155 return MD_NoWarn;
156}
157
Taewook Ohf42103c2016-06-13 20:40:21 +0000158// Return true if we want to issue a diagnostic by default if we
159// encounter this name in a #include with the wrong case. For now,
160// this includes the standard C and C++ headers, Posix headers,
161// and Boost headers. Improper case for these #includes is a
162// potential portability issue.
163static bool warnByDefaultOnWrongCase(StringRef Include) {
164 // If the first component of the path is "boost", treat this like a standard header
165 // for the purposes of diagnostics.
166 if (::llvm::sys::path::begin(Include)->equals_lower("boost"))
167 return true;
168
169 // "condition_variable" is the longest standard header name at 18 characters.
170 // If the include file name is longer than that, it can't be a standard header.
Taewook Oh755e4d22016-06-13 21:55:33 +0000171 static const size_t MaxStdHeaderNameLen = 18u;
Taewook Ohf42103c2016-06-13 20:40:21 +0000172 if (Include.size() > MaxStdHeaderNameLen)
173 return false;
174
175 // Lowercase and normalize the search string.
176 SmallString<32> LowerInclude{Include};
177 for (char &Ch : LowerInclude) {
178 // In the ASCII range?
George Burgess IV5d3bd932016-06-16 02:30:33 +0000179 if (static_cast<unsigned char>(Ch) > 0x7f)
Taewook Ohf42103c2016-06-13 20:40:21 +0000180 return false; // Can't be a standard header
181 // ASCII lowercase:
182 if (Ch >= 'A' && Ch <= 'Z')
183 Ch += 'a' - 'A';
184 // Normalize path separators for comparison purposes.
185 else if (::llvm::sys::path::is_separator(Ch))
186 Ch = '/';
187 }
188
189 // The standard C/C++ and Posix headers
190 return llvm::StringSwitch<bool>(LowerInclude)
191 // C library headers
192 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
193 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
194 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
195 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
196 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
197 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
198
199 // C++ headers for C library facilities
200 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
201 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
202 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
203 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
204 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
205 .Case("cwctype", true)
206
207 // C++ library headers
208 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
209 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
210 .Cases("atomic", "future", "map", "set", "type_traits", true)
211 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
212 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
213 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
214 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
215 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
216 .Cases("deque", "istream", "queue", "string", "valarray", true)
217 .Cases("exception", "iterator", "random", "strstream", "vector", true)
218 .Cases("forward_list", "limits", "ratio", "system_error", true)
219
220 // POSIX headers (which aren't also C headers)
221 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
222 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
223 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
224 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
225 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
226 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
227 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
228 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
229 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
230 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
231 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
232 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
233 .Default(false);
234}
235
Serge Pavlov07c0f042014-12-18 11:14:21 +0000236bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
237 bool *ShadowFlag) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000238 // Missing macro name?
239 if (MacroNameTok.is(tok::eod))
240 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
241
242 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Olivier Goffart90f981b2017-07-14 09:23:40 +0000243 if (!II)
244 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000245
Olivier Goffart90f981b2017-07-14 09:23:40 +0000246 if (II->isCPlusPlusOperatorKeyword()) {
Alp Tokere03e9e12014-05-31 16:32:22 +0000247 // C++ 2.5p2: Alternative tokens behave the same as its primary token
248 // except for their spellings.
249 Diag(MacroNameTok, getLangOpts().MicrosoftExt
250 ? diag::ext_pp_operator_used_as_macro_name
251 : diag::err_pp_operator_used_as_macro_name)
252 << II << MacroNameTok.getKind();
Alp Tokerc5d194fc2014-05-31 03:38:17 +0000253 // Allow #defining |and| and friends for Microsoft compatibility or
254 // recovery when legacy C headers are included in C++.
Alp Tokerb05e0b52014-05-21 06:13:51 +0000255 }
256
Serge Pavlovd024f522014-10-24 17:31:32 +0000257 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000258 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
259 return Diag(MacroNameTok, diag::err_defined_macro_name);
260 }
261
Richard Smith20e883e2015-04-29 23:20:19 +0000262 if (isDefineUndef == MU_Undef) {
263 auto *MI = getMacroInfo(II);
264 if (MI && MI->isBuiltinMacro()) {
265 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
266 // and C++ [cpp.predefined]p4], but allow it as an extension.
267 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
268 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000269 }
270
Serge Pavlov07c0f042014-12-18 11:14:21 +0000271 // If defining/undefining reserved identifier or a keyword, we need to issue
272 // a warning.
Serge Pavlov83cf0782014-12-11 12:18:08 +0000273 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
Serge Pavlov07c0f042014-12-18 11:14:21 +0000274 if (ShadowFlag)
275 *ShadowFlag = false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000276 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
Mehdi Amini99d1b292016-10-01 16:38:28 +0000277 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
Serge Pavlov07c0f042014-12-18 11:14:21 +0000278 MacroDiag D = MD_NoWarn;
279 if (isDefineUndef == MU_Define) {
280 D = shouldWarnOnMacroDef(*this, II);
281 }
282 else if (isDefineUndef == MU_Undef)
283 D = shouldWarnOnMacroUndef(*this, II);
284 if (D == MD_KeywordDef) {
285 // We do not want to warn on some patterns widely used in configuration
286 // scripts. This requires analyzing next tokens, so do not issue warnings
287 // now, only inform caller.
288 if (ShadowFlag)
289 *ShadowFlag = true;
290 }
291 if (D == MD_ReservedMacro)
292 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
Serge Pavlov83cf0782014-12-11 12:18:08 +0000293 }
294
Alp Tokerb05e0b52014-05-21 06:13:51 +0000295 // Okay, we got a good identifier.
296 return false;
297}
298
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000299/// Lex and validate a macro name, which occurs after a
James Dennettf6333ac2012-06-22 05:46:07 +0000300/// \#define or \#undef.
301///
Serge Pavlovd024f522014-10-24 17:31:32 +0000302/// This sets the token kind to eod and discards the rest of the macro line if
303/// the macro name is invalid.
304///
305/// \param MacroNameTok Token that is expected to be a macro name.
Serge Pavlov07c0f042014-12-18 11:14:21 +0000306/// \param isDefineUndef Context in which macro is used.
307/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
308void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
309 bool *ShadowFlag) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000310 // Read the token, don't allow macro expansion on it.
311 LexUnexpandedToken(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +0000312
Douglas Gregor12785102010-08-24 20:21:13 +0000313 if (MacroNameTok.is(tok::code_completion)) {
314 if (CodeComplete)
Serge Pavlovd024f522014-10-24 17:31:32 +0000315 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000316 setCodeCompletionReached();
Douglas Gregor12785102010-08-24 20:21:13 +0000317 LexUnexpandedToken(MacroNameTok);
Douglas Gregor12785102010-08-24 20:21:13 +0000318 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000319
Serge Pavlov07c0f042014-12-18 11:14:21 +0000320 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
Chris Lattner907dfe92008-11-18 07:59:24 +0000321 return;
Alp Tokerb05e0b52014-05-21 06:13:51 +0000322
323 // Invalid macro name, read and discard the rest of the line and set the
324 // token kind to tok::eod if necessary.
325 if (MacroNameTok.isNot(tok::eod)) {
326 MacroNameTok.setKind(tok::eod);
327 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +0000328 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000329}
330
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000331/// Ensure that the next token is a tok::eod token.
James Dennettf6333ac2012-06-22 05:46:07 +0000332///
333/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
Chris Lattner0003c272009-04-17 23:30:53 +0000334/// true, then we consider macros that expand to zero tokens as being ok.
335void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000336 Token Tmp;
Chris Lattner0003c272009-04-17 23:30:53 +0000337 // Lex unexpanded tokens for most directives: macros might expand to zero
338 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
339 // #line) allow empty macros.
340 if (EnableMacros)
341 Lex(Tmp);
342 else
343 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000344
Chris Lattnerf64b3522008-03-09 01:54:53 +0000345 // There should be no tokens after the directive, but we allow them as an
346 // extension.
347 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
348 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000349
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000350 if (Tmp.isNot(tok::eod)) {
Chris Lattner825676a2009-04-14 05:15:20 +0000351 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000352 // or if this is a macro-style preprocessing directive, because it is more
353 // trouble than it is worth to insert /**/ and check that there is no /**/
354 // in the range also.
Douglas Gregora771f462010-03-31 17:46:05 +0000355 FixItHint Hint;
David Blaikiebbafb8a2012-03-11 07:00:24 +0000356 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000357 !CurTokenLexer)
Douglas Gregora771f462010-03-31 17:46:05 +0000358 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
359 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000360 DiscardUntilEndOfDirective();
361 }
362}
363
James Dennettf6333ac2012-06-22 05:46:07 +0000364/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
365/// decided that the subsequent tokens are in the \#if'd out portion of the
366/// file. Lex the rest of the file, until we see an \#endif. If
Chris Lattnerf64b3522008-03-09 01:54:53 +0000367/// FoundNonSkipPortion is true, then we have already emitted code for part of
James Dennettf6333ac2012-06-22 05:46:07 +0000368/// this \#if directive, so \#else/\#elif blocks should never be entered.
369/// If ElseOk is true, then \#else directives are ok, if not, then we have
370/// already seen one so a \#else directive is a duplicate. When this returns,
371/// the caller can lex the first valid token.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000372void Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
Vedant Kumar3919a502017-09-11 20:47:42 +0000373 SourceLocation IfTokenLoc,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000374 bool FoundNonSkipPortion,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000375 bool FoundElse,
376 SourceLocation ElseLoc) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000377 ++NumSkipped;
David Blaikie7d170102013-05-15 07:37:26 +0000378 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?");
Chris Lattnerf64b3522008-03-09 01:54:53 +0000379
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000380 if (PreambleConditionalStack.reachedEOFWhileSkipping())
381 PreambleConditionalStack.clearSkipInfo();
382 else
383 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/ false,
384 FoundNonSkipPortion, FoundElse);
Mike Stump11289f42009-09-09 15:08:12 +0000385
Ted Kremenek56572ab2008-12-12 18:34:08 +0000386 if (CurPTHLexer) {
387 PTHSkipExcludedConditionalBlock();
388 return;
389 }
Mike Stump11289f42009-09-09 15:08:12 +0000390
Chris Lattnerf64b3522008-03-09 01:54:53 +0000391 // Enter raw mode to disable identifier lookup (and thus macro expansion),
392 // disabling warnings, etc.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000393 CurPPLexer->LexingRawMode = true;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000394 Token Tok;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000395 while (true) {
Chris Lattnerf406b242010-01-18 22:33:01 +0000396 CurLexer->Lex(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000397
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000398 if (Tok.is(tok::code_completion)) {
399 if (CodeComplete)
400 CodeComplete->CodeCompleteInConditionalExclusion();
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000401 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000402 continue;
403 }
Taewook Oh755e4d22016-06-13 21:55:33 +0000404
Chris Lattnerf64b3522008-03-09 01:54:53 +0000405 // If this is the end of the buffer, we have an error.
406 if (Tok.is(tok::eof)) {
Ilya Biryukov8f738ac2017-09-12 08:35:57 +0000407 // We don't emit errors for unterminated conditionals here,
408 // Lexer::LexEndOfFile can do that propertly.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000409 // Just return and let the caller lex after this #include.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000410 if (PreambleConditionalStack.isRecording())
411 PreambleConditionalStack.SkipInfo.emplace(
412 HashTokenLoc, IfTokenLoc, FoundNonSkipPortion, FoundElse, ElseLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000413 break;
414 }
Mike Stump11289f42009-09-09 15:08:12 +0000415
Chris Lattnerf64b3522008-03-09 01:54:53 +0000416 // If this token is not a preprocessor directive, just skip it.
417 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
418 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000419
Chris Lattnerf64b3522008-03-09 01:54:53 +0000420 // We just parsed a # character at the start of a line, so we're in
421 // directive mode. Tell the lexer this so any newlines we see will be
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000422 // converted into an EOD token (this terminates the macro).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000423 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rose176057b2013-02-22 00:32:00 +0000424 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000425
Mike Stump11289f42009-09-09 15:08:12 +0000426
Chris Lattnerf64b3522008-03-09 01:54:53 +0000427 // Read the next token, the directive flavor.
428 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000429
Chris Lattnerf64b3522008-03-09 01:54:53 +0000430 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
431 // something bogus), skip it.
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000432 if (Tok.isNot(tok::raw_identifier)) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000433 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000434 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000435 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000436 continue;
437 }
438
439 // If the first letter isn't i or e, it isn't intesting to us. We know that
440 // this is safe in the face of spelling differences, because there is no way
441 // to spell an i/e in a strange way that is another letter. Skipping this
442 // allows us to avoid looking up the identifier info for #define/#undef and
443 // other common directives.
Alp Toker2d57cea2014-05-17 04:53:25 +0000444 StringRef RI = Tok.getRawIdentifier();
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000445
Alp Toker2d57cea2014-05-17 04:53:25 +0000446 char FirstChar = RI[0];
Mike Stump11289f42009-09-09 15:08:12 +0000447 if (FirstChar >= 'a' && FirstChar <= 'z' &&
Chris Lattnerf64b3522008-03-09 01:54:53 +0000448 FirstChar != 'i' && FirstChar != 'e') {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000449 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000450 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000451 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000452 continue;
453 }
Mike Stump11289f42009-09-09 15:08:12 +0000454
Chris Lattnerf64b3522008-03-09 01:54:53 +0000455 // Get the identifier name without trigraphs or embedded newlines. Note
456 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
457 // when skipping.
Benjamin Kramer144884642009-12-31 13:32:38 +0000458 char DirectiveBuf[20];
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000459 StringRef Directive;
Alp Toker2d57cea2014-05-17 04:53:25 +0000460 if (!Tok.needsCleaning() && RI.size() < 20) {
461 Directive = RI;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000462 } else {
463 std::string DirectiveStr = getSpelling(Tok);
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000464 size_t IdLen = DirectiveStr.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000465 if (IdLen >= 20) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000466 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000467 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000468 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000469 continue;
470 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000471 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000472 Directive = StringRef(DirectiveBuf, IdLen);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000473 }
Mike Stump11289f42009-09-09 15:08:12 +0000474
Benjamin Kramer144884642009-12-31 13:32:38 +0000475 if (Directive.startswith("if")) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000476 StringRef Sub = Directive.substr(2);
Benjamin Kramer144884642009-12-31 13:32:38 +0000477 if (Sub.empty() || // "if"
478 Sub == "def" || // "ifdef"
479 Sub == "ndef") { // "ifndef"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000480 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
481 // bother parsing the condition.
482 DiscardUntilEndOfDirective();
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000483 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000484 /*foundnonskip*/false,
Chandler Carruth540960f2011-01-03 17:40:17 +0000485 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000486 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000487 } else if (Directive[0] == 'e') {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000488 StringRef Sub = Directive.substr(1);
Benjamin Kramer144884642009-12-31 13:32:38 +0000489 if (Sub == "ndif") { // "endif"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000490 PPConditionalInfo CondInfo;
491 CondInfo.WasSkipping = true; // Silence bogus warning.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000492 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000493 (void)InCond; // Silence warning in no-asserts mode.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000494 assert(!InCond && "Can't be skipping if not in a conditional!");
Mike Stump11289f42009-09-09 15:08:12 +0000495
Chris Lattnerf64b3522008-03-09 01:54:53 +0000496 // If we popped the outermost skipping block, we're done skipping!
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000497 if (!CondInfo.WasSkipping) {
Richard Smith87d8fb92012-06-24 23:56:26 +0000498 // Restore the value of LexingRawMode so that trailing comments
499 // are handled correctly, if we've reached the outermost block.
500 CurPPLexer->LexingRawMode = false;
Richard Smithd0124572012-06-21 00:35:03 +0000501 CheckEndOfDirective("endif");
Richard Smith87d8fb92012-06-24 23:56:26 +0000502 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000503 if (Callbacks)
504 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000505 break;
Richard Smithd0124572012-06-21 00:35:03 +0000506 } else {
507 DiscardUntilEndOfDirective();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000508 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000509 } else if (Sub == "lse") { // "else".
Chris Lattnerf64b3522008-03-09 01:54:53 +0000510 // #else directive in a skipping conditional. If not in some other
511 // skipping conditional, and if #else hasn't already been seen, enter it
512 // as a non-skipping conditional.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000513 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Mike Stump11289f42009-09-09 15:08:12 +0000514
Chris Lattnerf64b3522008-03-09 01:54:53 +0000515 // If this is a #else with a #else before it, report the error.
516 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000517
Chris Lattnerf64b3522008-03-09 01:54:53 +0000518 // Note that we've seen a #else in this conditional.
519 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000520
Chris Lattnerf64b3522008-03-09 01:54:53 +0000521 // If the conditional is at the top level, and the #if block wasn't
522 // entered, enter the #else block now.
523 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
524 CondInfo.FoundNonSkip = true;
Richard Smith87d8fb92012-06-24 23:56:26 +0000525 // Restore the value of LexingRawMode so that trailing comments
526 // are handled correctly.
527 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000528 CheckEndOfDirective("else");
Richard Smith87d8fb92012-06-24 23:56:26 +0000529 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000530 if (Callbacks)
531 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000532 break;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000533 } else {
534 DiscardUntilEndOfDirective(); // C99 6.10p4.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000535 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000536 } else if (Sub == "lif") { // "elif".
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000537 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000538
John Thompson17c35732013-12-04 20:19:30 +0000539 // If this is a #elif with a #else before it, report the error.
540 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_elif_after_else);
541
Chris Lattnerf64b3522008-03-09 01:54:53 +0000542 // If this is in a skipping block or if we're already handled this #if
543 // block, don't bother parsing the condition.
544 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
545 DiscardUntilEndOfDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000546 } else {
John Thompson17c35732013-12-04 20:19:30 +0000547 const SourceLocation CondBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000548 // Restore the value of LexingRawMode so that identifiers are
549 // looked up, etc, inside the #elif expression.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000550 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
551 CurPPLexer->LexingRawMode = false;
Craig Topperd2d442c2014-05-17 23:10:59 +0000552 IdentifierInfo *IfNDefMacro = nullptr;
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +0000553 const bool CondValue = EvaluateDirectiveExpression(IfNDefMacro).Conditional;
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000554 CurPPLexer->LexingRawMode = true;
John Thompson17c35732013-12-04 20:19:30 +0000555 if (Callbacks) {
556 const SourceLocation CondEnd = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000557 Callbacks->Elif(Tok.getLocation(),
John Thompson17c35732013-12-04 20:19:30 +0000558 SourceRange(CondBegin, CondEnd),
John Thompson87f9fef2013-12-07 08:41:15 +0000559 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False), CondInfo.IfLoc);
John Thompson17c35732013-12-04 20:19:30 +0000560 }
561 // If this condition is true, enter it!
562 if (CondValue) {
563 CondInfo.FoundNonSkip = true;
564 break;
565 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000566 }
567 }
568 }
Mike Stump11289f42009-09-09 15:08:12 +0000569
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000570 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000571 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000572 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000573 }
574
575 // Finally, if we are out of the conditional (saw an #endif or ran off the end
576 // of the file, just stop skipping and return to lexing whatever came after
577 // the #if block.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000578 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000579
Cameron Desrochersb60f1b62018-01-15 19:14:16 +0000580 // The last skipped range isn't actually skipped yet if it's truncated
581 // by the end of the preamble; we'll resume parsing after the preamble.
582 if (Callbacks && (Tok.isNot(tok::eof) || !isRecordingPreamble()))
Vedant Kumar3919a502017-09-11 20:47:42 +0000583 Callbacks->SourceRangeSkipped(
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000584 SourceRange(HashTokenLoc, CurPPLexer->getSourceLocation()),
Vedant Kumar3919a502017-09-11 20:47:42 +0000585 Tok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +0000586}
587
Ted Kremenek56572ab2008-12-12 18:34:08 +0000588void Preprocessor::PTHSkipExcludedConditionalBlock() {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000589 while (true) {
Ted Kremenek56572ab2008-12-12 18:34:08 +0000590 assert(CurPTHLexer);
591 assert(CurPTHLexer->LexingRawMode == false);
Mike Stump11289f42009-09-09 15:08:12 +0000592
Ted Kremenek56572ab2008-12-12 18:34:08 +0000593 // Skip to the next '#else', '#elif', or #endif.
594 if (CurPTHLexer->SkipBlock()) {
595 // We have reached an #endif. Both the '#' and 'endif' tokens
596 // have been consumed by the PTHLexer. Just pop off the condition level.
597 PPConditionalInfo CondInfo;
598 bool InCond = CurPTHLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000599 (void)InCond; // Silence warning in no-asserts mode.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000600 assert(!InCond && "Can't be skipping if not in a conditional!");
601 break;
602 }
Mike Stump11289f42009-09-09 15:08:12 +0000603
Ted Kremenek56572ab2008-12-12 18:34:08 +0000604 // We have reached a '#else' or '#elif'. Lex the next token to get
605 // the directive flavor.
606 Token Tok;
607 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000608
Ted Kremenek56572ab2008-12-12 18:34:08 +0000609 // We can actually look up the IdentifierInfo here since we aren't in
610 // raw mode.
611 tok::PPKeywordKind K = Tok.getIdentifierInfo()->getPPKeywordID();
612
613 if (K == tok::pp_else) {
614 // #else: Enter the else condition. We aren't in a nested condition
615 // since we skip those. We're always in the one matching the last
616 // blocked we skipped.
617 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
618 // Note that we've seen a #else in this conditional.
619 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000620
Ted Kremenek56572ab2008-12-12 18:34:08 +0000621 // If the #if block wasn't entered then enter the #else block now.
622 if (!CondInfo.FoundNonSkip) {
623 CondInfo.FoundNonSkip = true;
Mike Stump11289f42009-09-09 15:08:12 +0000624
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000625 // Scan until the eod token.
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000626 CurPTHLexer->ParsingPreprocessorDirective = true;
Daniel Dunbar2cba6be2009-04-13 17:57:49 +0000627 DiscardUntilEndOfDirective();
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000628 CurPTHLexer->ParsingPreprocessorDirective = false;
Mike Stump11289f42009-09-09 15:08:12 +0000629
Ted Kremenek56572ab2008-12-12 18:34:08 +0000630 break;
631 }
Mike Stump11289f42009-09-09 15:08:12 +0000632
Ted Kremenek56572ab2008-12-12 18:34:08 +0000633 // Otherwise skip this block.
634 continue;
635 }
Mike Stump11289f42009-09-09 15:08:12 +0000636
Ted Kremenek56572ab2008-12-12 18:34:08 +0000637 assert(K == tok::pp_elif);
638 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
639
640 // If this is a #elif with a #else before it, report the error.
641 if (CondInfo.FoundElse)
642 Diag(Tok, diag::pp_err_elif_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000643
Ted Kremenek56572ab2008-12-12 18:34:08 +0000644 // If this is in a skipping block or if we're already handled this #if
Mike Stump11289f42009-09-09 15:08:12 +0000645 // block, don't bother parsing the condition. We just skip this block.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000646 if (CondInfo.FoundNonSkip)
647 continue;
648
649 // Evaluate the condition of the #elif.
Craig Topperd2d442c2014-05-17 23:10:59 +0000650 IdentifierInfo *IfNDefMacro = nullptr;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000651 CurPTHLexer->ParsingPreprocessorDirective = true;
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +0000652 bool ShouldEnter = EvaluateDirectiveExpression(IfNDefMacro).Conditional;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000653 CurPTHLexer->ParsingPreprocessorDirective = false;
654
655 // If this condition is true, enter it!
656 if (ShouldEnter) {
657 CondInfo.FoundNonSkip = true;
658 break;
659 }
660
661 // Otherwise, skip this block and go to the next one.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000662 }
663}
664
Richard Smith2a553082015-04-23 22:58:06 +0000665Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
Richard Smith7e82e012016-02-19 22:25:36 +0000666 if (!SourceMgr.isInMainFile(Loc)) {
667 // Try to determine the module of the include directive.
668 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
669 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
670 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
671 // The include comes from an included file.
672 return HeaderInfo.getModuleMap()
673 .findModuleForHeader(EntryOfIncl)
674 .getModule();
675 }
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000676 }
Richard Smith7e82e012016-02-19 22:25:36 +0000677
678 // This is either in the main file or not in a file at all. It belongs
679 // to the current module, if there is one.
680 return getLangOpts().CurrentModule.empty()
681 ? nullptr
682 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000683}
684
Richard Smith4eb83932016-04-27 21:57:05 +0000685const FileEntry *
686Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000687 Module *M,
Richard Smith4eb83932016-04-27 21:57:05 +0000688 SourceLocation Loc) {
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000689 assert(M && "no module to include");
690
Richard Smith4eb83932016-04-27 21:57:05 +0000691 // If we have a module import syntax, we shouldn't include a header to
692 // make a particular module visible.
Erik Pilkingtonfa983902018-10-30 20:31:30 +0000693 if (getLangOpts().ObjC)
Richard Smith4eb83932016-04-27 21:57:05 +0000694 return nullptr;
695
Richard Smith4eb83932016-04-27 21:57:05 +0000696 Module *TopM = M->getTopLevelModule();
697 Module *IncM = getModuleForLocation(IncLoc);
698
699 // Walk up through the include stack, looking through textual headers of M
700 // until we hit a non-textual header that we can #include. (We assume textual
701 // headers of a module with non-textual headers aren't meant to be used to
702 // import entities from the module.)
703 auto &SM = getSourceManager();
704 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
705 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
706 auto *FE = SM.getFileEntryForID(ID);
Richard Smith040e1262017-06-02 01:55:39 +0000707 if (!FE)
708 break;
Richard Smith4eb83932016-04-27 21:57:05 +0000709
710 bool InTextualHeader = false;
711 for (auto Header : HeaderInfo.getModuleMap().findAllModulesForHeader(FE)) {
712 if (!Header.getModule()->isSubModuleOf(TopM))
713 continue;
714
715 if (!(Header.getRole() & ModuleMap::TextualHeader)) {
716 // If this is an accessible, non-textual header of M's top-level module
717 // that transitively includes the given location and makes the
718 // corresponding module visible, this is the thing to #include.
719 if (Header.isAccessibleFrom(IncM))
720 return FE;
721
722 // It's in a private header; we can't #include it.
723 // FIXME: If there's a public header in some module that re-exports it,
724 // then we could suggest including that, but it's not clear that's the
725 // expected way to make this entity visible.
726 continue;
727 }
728
729 InTextualHeader = true;
730 }
731
732 if (!InTextualHeader)
733 break;
734
735 Loc = SM.getIncludeLoc(ID);
736 }
737
738 return nullptr;
739}
740
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000741const FileEntry *Preprocessor::LookupFile(
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000742 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
743 const DirectoryLookup *FromDir, const FileEntry *FromFile,
744 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
Douglas Gregor97eec242011-09-15 22:00:41 +0000745 SmallVectorImpl<char> *RelativePath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000746 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool SkipCache) {
Taewook Oh755e4d22016-06-13 21:55:33 +0000747 Module *RequestingModule = getModuleForLocation(FilenameLoc);
Richard Smith8d4e90b2016-03-14 17:52:37 +0000748 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
Richard Smith3d5b48c2015-10-16 21:42:56 +0000749
Will Wilson0fafd342013-12-27 19:46:16 +0000750 // If the header lookup mechanism may be relative to the current inclusion
751 // stack, record the parent #includes.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000752 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
753 Includers;
Manman Rene4a5d372016-05-17 02:15:12 +0000754 bool BuildSystemModule = false;
Richard Smith25d50752014-10-20 00:15:49 +0000755 if (!FromDir && !FromFile) {
Chris Lattnerd32480d2009-01-17 06:22:33 +0000756 FileID FID = getCurrentFileLexer()->getFileID();
Will Wilson0fafd342013-12-27 19:46:16 +0000757 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
Mike Stump11289f42009-09-09 15:08:12 +0000758
Chris Lattner022923a2009-02-04 19:45:07 +0000759 // If there is no file entry associated with this file, it must be the
Richard Smith3c1a41a2014-12-02 00:08:08 +0000760 // predefines buffer or the module includes buffer. Any other file is not
761 // lexed with a normal lexer, so it won't be scanned for preprocessor
762 // directives.
763 //
764 // If we have the predefines buffer, resolve #include references (which come
765 // from the -include command line argument) from the current working
766 // directory instead of relative to the main file.
767 //
768 // If we have the module includes buffer, resolve #include references (which
769 // come from header declarations in the module map) relative to the module
770 // map file.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000771 if (!FileEnt) {
Manman Rene4a5d372016-05-17 02:15:12 +0000772 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Richard Smith3c1a41a2014-12-02 00:08:08 +0000773 Includers.push_back(std::make_pair(nullptr, MainFileDir));
Manman Rene4a5d372016-05-17 02:15:12 +0000774 BuildSystemModule = getCurrentModule()->IsSystem;
775 } else if ((FileEnt =
Richard Smith3c1a41a2014-12-02 00:08:08 +0000776 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000777 Includers.push_back(std::make_pair(FileEnt, FileMgr.getDirectory(".")));
778 } else {
779 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
780 }
Will Wilson0fafd342013-12-27 19:46:16 +0000781
782 // MSVC searches the current include stack from top to bottom for
783 // headers included by quoted include directives.
784 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
Alp Tokerbfa39342014-01-14 12:51:41 +0000785 if (LangOpts.MSVCCompat && !isAngled) {
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000786 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Will Wilson0fafd342013-12-27 19:46:16 +0000787 if (IsFileLexer(ISEntry))
Yaron Keren65224612015-12-18 10:30:12 +0000788 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000789 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
Will Wilson0fafd342013-12-27 19:46:16 +0000790 }
Chris Lattner022923a2009-02-04 19:45:07 +0000791 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000792 }
Mike Stump11289f42009-09-09 15:08:12 +0000793
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000794 CurDir = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +0000795
796 if (FromFile) {
797 // We're supposed to start looking from after a particular file. Search
798 // the include path until we find that file or run out of files.
799 const DirectoryLookup *TmpCurDir = CurDir;
800 const DirectoryLookup *TmpFromDir = nullptr;
801 while (const FileEntry *FE = HeaderInfo.LookupFile(
802 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000803 Includers, SearchPath, RelativePath, RequestingModule,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000804 SuggestedModule, /*IsMapped=*/nullptr, SkipCache)) {
Richard Smith25d50752014-10-20 00:15:49 +0000805 // Keep looking as if this file did a #include_next.
806 TmpFromDir = TmpCurDir;
807 ++TmpFromDir;
808 if (FE == FromFile) {
809 // Found it.
810 FromDir = TmpFromDir;
811 CurDir = TmpCurDir;
812 break;
813 }
814 }
815 }
816
817 // Do a standard file entry lookup.
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000818 const FileEntry *FE = HeaderInfo.LookupFile(
Will Wilson0fafd342013-12-27 19:46:16 +0000819 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000820 RelativePath, RequestingModule, SuggestedModule, IsMapped, SkipCache,
Manman Rene4a5d372016-05-17 02:15:12 +0000821 BuildSystemModule);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000822 if (FE) {
Daniel Jasper5c77e392014-03-14 14:53:17 +0000823 if (SuggestedModule && !LangOpts.AsmPreprocessor)
Daniel Jasper92669ee2013-12-20 12:09:36 +0000824 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000825 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
826 Filename, FE);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000827 return FE;
828 }
Mike Stump11289f42009-09-09 15:08:12 +0000829
Will Wilson0fafd342013-12-27 19:46:16 +0000830 const FileEntry *CurFileEnt;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000831 // Otherwise, see if this is a subframework header. If so, this is relative
832 // to one of the headers on the #include stack. Walk the list of the current
833 // headers on the #include stack and pass them to HeaderInfo.
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000834 if (IsFileLexer()) {
Yaron Keren65224612015-12-18 10:30:12 +0000835 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000836 if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt,
Douglas Gregorf5f94522013-02-08 00:10:48 +0000837 SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000838 RequestingModule,
Ben Langmuir71e1a642014-05-05 21:44:13 +0000839 SuggestedModule))) {
840 if (SuggestedModule && !LangOpts.AsmPreprocessor)
841 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000842 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
843 Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000844 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000845 }
846 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000847 }
Mike Stump11289f42009-09-09 15:08:12 +0000848
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000849 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000850 if (IsFileLexer(ISEntry)) {
Yaron Keren65224612015-12-18 10:30:12 +0000851 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
Manuel Klimek0c69fd22011-04-26 21:50:03 +0000852 if ((FE = HeaderInfo.LookupSubframeworkHeader(
Douglas Gregorf5f94522013-02-08 00:10:48 +0000853 Filename, CurFileEnt, SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000854 RequestingModule, SuggestedModule))) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000855 if (SuggestedModule && !LangOpts.AsmPreprocessor)
856 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000857 RequestingModule, RequestingModuleIsModuleInterface,
858 FilenameLoc, Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000859 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000860 }
861 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000862 }
863 }
Mike Stump11289f42009-09-09 15:08:12 +0000864
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000865 // Otherwise, we really couldn't find the file.
Craig Topperd2d442c2014-05-17 23:10:59 +0000866 return nullptr;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000867}
868
Chris Lattnerf64b3522008-03-09 01:54:53 +0000869//===----------------------------------------------------------------------===//
870// Preprocessor Directive Handling.
871//===----------------------------------------------------------------------===//
872
David Blaikied5321242012-06-06 18:52:13 +0000873class Preprocessor::ResetMacroExpansionHelper {
874public:
875 ResetMacroExpansionHelper(Preprocessor *pp)
876 : PP(pp), save(pp->DisableMacroExpansion) {
877 if (pp->MacroExpansionInDirectivesOverride)
878 pp->DisableMacroExpansion = false;
879 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000880
David Blaikied5321242012-06-06 18:52:13 +0000881 ~ResetMacroExpansionHelper() {
882 PP->DisableMacroExpansion = save;
883 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000884
David Blaikied5321242012-06-06 18:52:13 +0000885private:
886 Preprocessor *PP;
887 bool save;
888};
889
Mike Rice58df1af2018-09-11 17:10:44 +0000890/// Process a directive while looking for the through header or a #pragma
891/// hdrstop. The following directives are handled:
892/// #include (to check if it is the through header)
893/// #define (to warn about macros that don't match the PCH)
894/// #pragma (to check for pragma hdrstop).
895/// All other directives are completely discarded.
896void Preprocessor::HandleSkippedDirectiveWhileUsingPCH(Token &Result,
Erich Keane76675de2018-07-05 17:22:13 +0000897 SourceLocation HashLoc) {
898 if (const IdentifierInfo *II = Result.getIdentifierInfo()) {
Mike Rice58df1af2018-09-11 17:10:44 +0000899 if (II->getPPKeywordID() == tok::pp_define) {
Erich Keane76675de2018-07-05 17:22:13 +0000900 return HandleDefineDirective(Result,
901 /*ImmediatelyAfterHeaderGuard=*/false);
Mike Rice58df1af2018-09-11 17:10:44 +0000902 }
903 if (SkippingUntilPCHThroughHeader &&
904 II->getPPKeywordID() == tok::pp_include) {
905 return HandleIncludeDirective(HashLoc, Result);
906 }
907 if (SkippingUntilPragmaHdrStop && II->getPPKeywordID() == tok::pp_pragma) {
908 Token P = LookAhead(0);
909 auto *II = P.getIdentifierInfo();
910 if (II && II->getName() == "hdrstop")
911 return HandlePragmaDirective(HashLoc, PIK_HashPragma);
912 }
Erich Keane76675de2018-07-05 17:22:13 +0000913 }
914 DiscardUntilEndOfDirective();
915}
916
Chris Lattnerf64b3522008-03-09 01:54:53 +0000917/// HandleDirective - This callback is invoked when the lexer sees a # token
Mike Stump11289f42009-09-09 15:08:12 +0000918/// at the start of a line. This consumes the directive, modifies the
Chris Lattnerf64b3522008-03-09 01:54:53 +0000919/// lexer/preprocessor state, and advances the lexer(s) so that the next token
920/// read is the correct one.
921void Preprocessor::HandleDirective(Token &Result) {
922 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
Mike Stump11289f42009-09-09 15:08:12 +0000923
Chris Lattnerf64b3522008-03-09 01:54:53 +0000924 // We just parsed a # character at the start of a line, so we're in directive
925 // mode. Tell the lexer this so any newlines we see will be converted into an
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000926 // EOD token (which terminates the directive).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000927 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000928 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Mike Stump11289f42009-09-09 15:08:12 +0000929
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000930 bool ImmediatelyAfterTopLevelIfndef =
931 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
932 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
933
Chris Lattnerf64b3522008-03-09 01:54:53 +0000934 ++NumDirectives;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +0000935
Chris Lattnerf64b3522008-03-09 01:54:53 +0000936 // We are about to read a token. For the multiple-include optimization FA to
Mike Stump11289f42009-09-09 15:08:12 +0000937 // work, we have to remember if we had read any tokens *before* this
Chris Lattnerf64b3522008-03-09 01:54:53 +0000938 // pp-directive.
Chris Lattner8cf1f932009-12-14 04:54:40 +0000939 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
Mike Stump11289f42009-09-09 15:08:12 +0000940
Chris Lattner2d17ab72009-03-18 21:00:25 +0000941 // Save the '#' token in case we need to return it later.
942 Token SavedHash = Result;
Mike Stump11289f42009-09-09 15:08:12 +0000943
Chris Lattnerf64b3522008-03-09 01:54:53 +0000944 // Read the next token, the directive flavor. This isn't expanded due to
945 // C99 6.10.3p8.
946 LexUnexpandedToken(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000947
Chris Lattnerf64b3522008-03-09 01:54:53 +0000948 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
949 // #define A(x) #x
950 // A(abc
951 // #warning blah
952 // def)
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000953 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
954 // not support this for #include-like directives, since that can result in
955 // terrible diagnostics, and does not work in GCC.
956 if (InMacroArgs) {
957 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
958 switch (II->getPPKeywordID()) {
959 case tok::pp_include:
960 case tok::pp_import:
961 case tok::pp_include_next:
962 case tok::pp___include_macros:
David Majnemerf2d3bc02014-12-28 07:42:49 +0000963 case tok::pp_pragma:
964 Diag(Result, diag::err_embedded_directive) << II->getName();
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000965 DiscardUntilEndOfDirective();
966 return;
967 default:
968 break;
969 }
970 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000971 Diag(Result, diag::ext_embedded_directive);
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000972 }
Mike Stump11289f42009-09-09 15:08:12 +0000973
David Blaikied5321242012-06-06 18:52:13 +0000974 // Temporarily enable macro expansion if set so
975 // and reset to previous state when returning from this function.
976 ResetMacroExpansionHelper helper(this);
977
Mike Rice58df1af2018-09-11 17:10:44 +0000978 if (SkippingUntilPCHThroughHeader || SkippingUntilPragmaHdrStop)
979 return HandleSkippedDirectiveWhileUsingPCH(Result, SavedHash.getLocation());
Erich Keane76675de2018-07-05 17:22:13 +0000980
Chris Lattnerf64b3522008-03-09 01:54:53 +0000981 switch (Result.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000982 case tok::eod:
Chris Lattnerf64b3522008-03-09 01:54:53 +0000983 return; // null directive.
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000984 case tok::code_completion:
985 if (CodeComplete)
986 CodeComplete->CodeCompleteDirective(
987 CurPPLexer->getConditionalStackDepth() > 0);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000988 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000989 return;
Chris Lattner76e68962009-01-26 06:19:46 +0000990 case tok::numeric_constant: // # 7 GNU line marker directive.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000991 if (getLangOpts().AsmPreprocessor)
Chris Lattner5eb8ae22009-03-18 20:41:10 +0000992 break; // # 4 is not a preprocessor directive in .S files.
Chris Lattner76e68962009-01-26 06:19:46 +0000993 return HandleDigitDirective(Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000994 default:
995 IdentifierInfo *II = Result.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +0000996 if (!II) break; // Not an identifier.
Mike Stump11289f42009-09-09 15:08:12 +0000997
Chris Lattnerf64b3522008-03-09 01:54:53 +0000998 // Ask what the preprocessor keyword ID is.
999 switch (II->getPPKeywordID()) {
1000 default: break;
1001 // C99 6.10.1 - Conditional Inclusion.
1002 case tok::pp_if:
Vedant Kumar3919a502017-09-11 20:47:42 +00001003 return HandleIfDirective(Result, SavedHash, ReadAnyTokensBeforeDirective);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001004 case tok::pp_ifdef:
Vedant Kumar3919a502017-09-11 20:47:42 +00001005 return HandleIfdefDirective(Result, SavedHash, false,
1006 true /*not valid for miopt*/);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001007 case tok::pp_ifndef:
Vedant Kumar3919a502017-09-11 20:47:42 +00001008 return HandleIfdefDirective(Result, SavedHash, true,
1009 ReadAnyTokensBeforeDirective);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001010 case tok::pp_elif:
Vedant Kumar3919a502017-09-11 20:47:42 +00001011 return HandleElifDirective(Result, SavedHash);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001012 case tok::pp_else:
Vedant Kumar3919a502017-09-11 20:47:42 +00001013 return HandleElseDirective(Result, SavedHash);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001014 case tok::pp_endif:
1015 return HandleEndifDirective(Result);
Mike Stump11289f42009-09-09 15:08:12 +00001016
Chris Lattnerf64b3522008-03-09 01:54:53 +00001017 // C99 6.10.2 - Source File Inclusion.
1018 case tok::pp_include:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001019 // Handle #include.
1020 return HandleIncludeDirective(SavedHash.getLocation(), Result);
Chris Lattner14a7f392009-04-08 18:24:34 +00001021 case tok::pp___include_macros:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001022 // Handle -imacros.
Taewook Oh755e4d22016-06-13 21:55:33 +00001023 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001024
Chris Lattnerf64b3522008-03-09 01:54:53 +00001025 // C99 6.10.3 - Macro Replacement.
1026 case tok::pp_define:
Richard Trieu33a4b3d2013-06-12 21:20:57 +00001027 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001028 case tok::pp_undef:
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001029 return HandleUndefDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001030
1031 // C99 6.10.4 - Line Control.
1032 case tok::pp_line:
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001033 return HandleLineDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001034
Chris Lattnerf64b3522008-03-09 01:54:53 +00001035 // C99 6.10.5 - Error Directive.
1036 case tok::pp_error:
1037 return HandleUserDiagnosticDirective(Result, false);
Mike Stump11289f42009-09-09 15:08:12 +00001038
Chris Lattnerf64b3522008-03-09 01:54:53 +00001039 // C99 6.10.6 - Pragma Directive.
1040 case tok::pp_pragma:
Enea Zaffanella5afb04a2013-07-20 20:09:11 +00001041 return HandlePragmaDirective(SavedHash.getLocation(), PIK_HashPragma);
Mike Stump11289f42009-09-09 15:08:12 +00001042
Chris Lattnerf64b3522008-03-09 01:54:53 +00001043 // GNU Extensions.
1044 case tok::pp_import:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001045 return HandleImportDirective(SavedHash.getLocation(), Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001046 case tok::pp_include_next:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001047 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001048
Chris Lattnerf64b3522008-03-09 01:54:53 +00001049 case tok::pp_warning:
1050 Diag(Result, diag::ext_pp_warning_directive);
1051 return HandleUserDiagnosticDirective(Result, true);
1052 case tok::pp_ident:
1053 return HandleIdentSCCSDirective(Result);
1054 case tok::pp_sccs:
1055 return HandleIdentSCCSDirective(Result);
1056 case tok::pp_assert:
1057 //isExtension = true; // FIXME: implement #assert
1058 break;
1059 case tok::pp_unassert:
1060 //isExtension = true; // FIXME: implement #unassert
1061 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001062
Douglas Gregor663b48f2012-01-03 19:48:16 +00001063 case tok::pp___public_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001064 if (getLangOpts().Modules)
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001065 return HandleMacroPublicDirective(Result);
1066 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001067
Douglas Gregor663b48f2012-01-03 19:48:16 +00001068 case tok::pp___private_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001069 if (getLangOpts().Modules)
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001070 return HandleMacroPrivateDirective();
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001071 break;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001072 }
1073 break;
1074 }
Mike Stump11289f42009-09-09 15:08:12 +00001075
Chris Lattner2d17ab72009-03-18 21:00:25 +00001076 // If this is a .S file, treat unknown # directives as non-preprocessor
1077 // directives. This is important because # may be a comment or introduce
1078 // various pseudo-ops. Just return the # token and push back the following
1079 // token to be lexed next time.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001080 if (getLangOpts().AsmPreprocessor) {
David Blaikie2eabcc92016-02-09 18:52:09 +00001081 auto Toks = llvm::make_unique<Token[]>(2);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001082 // Return the # and the token after it.
Mike Stump11289f42009-09-09 15:08:12 +00001083 Toks[0] = SavedHash;
Chris Lattner2d17ab72009-03-18 21:00:25 +00001084 Toks[1] = Result;
Taewook Oh755e4d22016-06-13 21:55:33 +00001085
Chris Lattner56f64c12011-01-06 05:01:51 +00001086 // If the second token is a hashhash token, then we need to translate it to
1087 // unknown so the token lexer doesn't try to perform token pasting.
1088 if (Result.is(tok::hashhash))
1089 Toks[1].setKind(tok::unknown);
Taewook Oh755e4d22016-06-13 21:55:33 +00001090
Chris Lattner2d17ab72009-03-18 21:00:25 +00001091 // Enter this token stream so that we re-lex the tokens. Make sure to
1092 // enable macro expansion, in case the token after the # is an identifier
1093 // that is expanded.
David Blaikie2eabcc92016-02-09 18:52:09 +00001094 EnterTokenStream(std::move(Toks), 2, false);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001095 return;
1096 }
Mike Stump11289f42009-09-09 15:08:12 +00001097
Chris Lattnerf64b3522008-03-09 01:54:53 +00001098 // If we reached here, the preprocessing token is not valid!
1099 Diag(Result, diag::err_pp_invalid_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001100
Chris Lattnerf64b3522008-03-09 01:54:53 +00001101 // Read the rest of the PP line.
1102 DiscardUntilEndOfDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001103
Chris Lattnerf64b3522008-03-09 01:54:53 +00001104 // Okay, we're done parsing the directive.
1105}
1106
Chris Lattner76e68962009-01-26 06:19:46 +00001107/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1108/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1109static bool GetLineValue(Token &DigitTok, unsigned &Val,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001110 unsigned DiagID, Preprocessor &PP,
1111 bool IsGNULineDirective=false) {
Chris Lattner76e68962009-01-26 06:19:46 +00001112 if (DigitTok.isNot(tok::numeric_constant)) {
1113 PP.Diag(DigitTok, DiagID);
Mike Stump11289f42009-09-09 15:08:12 +00001114
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001115 if (DigitTok.isNot(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001116 PP.DiscardUntilEndOfDirective();
1117 return true;
1118 }
Mike Stump11289f42009-09-09 15:08:12 +00001119
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001120 SmallString<64> IntegerBuffer;
Chris Lattner76e68962009-01-26 06:19:46 +00001121 IntegerBuffer.resize(DigitTok.getLength());
1122 const char *DigitTokBegin = &IntegerBuffer[0];
Douglas Gregordc970f02010-03-16 22:30:13 +00001123 bool Invalid = false;
1124 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1125 if (Invalid)
1126 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001127
Chris Lattnerd66f1722009-04-18 18:35:15 +00001128 // Verify that we have a simple digit-sequence, and compute the value. This
1129 // is always a simple digit string computed in decimal, so we do this manually
1130 // here.
1131 Val = 0;
1132 for (unsigned i = 0; i != ActualLength; ++i) {
Richard Smith7f2707a2013-09-26 18:13:20 +00001133 // C++1y [lex.fcon]p1:
1134 // Optional separating single quotes in a digit-sequence are ignored
1135 if (DigitTokBegin[i] == '\'')
1136 continue;
1137
Jordan Rosea7d03842013-02-08 22:30:41 +00001138 if (!isDigit(DigitTokBegin[i])) {
Chris Lattnerd66f1722009-04-18 18:35:15 +00001139 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
Michael Ilsemane910cc82013-04-10 01:04:18 +00001140 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001141 PP.DiscardUntilEndOfDirective();
1142 return true;
1143 }
Mike Stump11289f42009-09-09 15:08:12 +00001144
Chris Lattnerd66f1722009-04-18 18:35:15 +00001145 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1146 if (NextVal < Val) { // overflow.
1147 PP.Diag(DigitTok, DiagID);
1148 PP.DiscardUntilEndOfDirective();
1149 return true;
1150 }
1151 Val = NextVal;
Chris Lattner76e68962009-01-26 06:19:46 +00001152 }
Mike Stump11289f42009-09-09 15:08:12 +00001153
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001154 if (DigitTokBegin[0] == '0' && Val)
Michael Ilsemane910cc82013-04-10 01:04:18 +00001155 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1156 << IsGNULineDirective;
Mike Stump11289f42009-09-09 15:08:12 +00001157
Chris Lattner76e68962009-01-26 06:19:46 +00001158 return false;
1159}
1160
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001161/// Handle a \#line directive: C99 6.10.4.
James Dennettf6333ac2012-06-22 05:46:07 +00001162///
1163/// The two acceptable forms are:
1164/// \verbatim
Chris Lattner100c65e2009-01-26 05:29:08 +00001165/// # line digit-sequence
1166/// # line digit-sequence "s-char-sequence"
James Dennettf6333ac2012-06-22 05:46:07 +00001167/// \endverbatim
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001168void Preprocessor::HandleLineDirective() {
Chris Lattner100c65e2009-01-26 05:29:08 +00001169 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1170 // expanded.
1171 Token DigitTok;
1172 Lex(DigitTok);
1173
Chris Lattner100c65e2009-01-26 05:29:08 +00001174 // Validate the number and convert it to an unsigned.
Chris Lattner76e68962009-01-26 06:19:46 +00001175 unsigned LineNo;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001176 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
Chris Lattner100c65e2009-01-26 05:29:08 +00001177 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001178
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001179 if (LineNo == 0)
1180 Diag(DigitTok, diag::ext_pp_line_zero);
Chris Lattner100c65e2009-01-26 05:29:08 +00001181
Chris Lattner76e68962009-01-26 06:19:46 +00001182 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1183 // number greater than 2147483647". C90 requires that the line # be <= 32767.
Eli Friedman192e0342011-10-10 23:35:28 +00001184 unsigned LineLimit = 32768U;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001185 if (LangOpts.C99 || LangOpts.CPlusPlus11)
Eli Friedman192e0342011-10-10 23:35:28 +00001186 LineLimit = 2147483648U;
Chris Lattner100c65e2009-01-26 05:29:08 +00001187 if (LineNo >= LineLimit)
1188 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001189 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
Richard Smithacd4d3d2011-10-15 01:18:56 +00001190 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
Mike Stump11289f42009-09-09 15:08:12 +00001191
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001192 int FilenameID = -1;
Chris Lattner100c65e2009-01-26 05:29:08 +00001193 Token StrTok;
1194 Lex(StrTok);
1195
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001196 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1197 // string followed by eod.
1198 if (StrTok.is(tok::eod))
Chris Lattner100c65e2009-01-26 05:29:08 +00001199 ; // ok
1200 else if (StrTok.isNot(tok::string_literal)) {
1201 Diag(StrTok, diag::err_pp_line_invalid_filename);
Richard Smithd67aea22012-03-06 03:21:47 +00001202 return DiscardUntilEndOfDirective();
1203 } else if (StrTok.hasUDSuffix()) {
1204 Diag(StrTok, diag::err_invalid_string_udl);
1205 return DiscardUntilEndOfDirective();
Chris Lattner100c65e2009-01-26 05:29:08 +00001206 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001207 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001208 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001209 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001210 if (Literal.hadError)
1211 return DiscardUntilEndOfDirective();
1212 if (Literal.Pascal) {
1213 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1214 return DiscardUntilEndOfDirective();
1215 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001216 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001217
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001218 // Verify that there is nothing after the string, other than EOD. Because
Chris Lattner0003c272009-04-17 23:30:53 +00001219 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1220 CheckEndOfDirective("line", true);
Chris Lattner100c65e2009-01-26 05:29:08 +00001221 }
Mike Stump11289f42009-09-09 15:08:12 +00001222
Reid Klecknereb00ee02017-05-22 21:42:58 +00001223 // Take the file kind of the file containing the #line directive. #line
1224 // directives are often used for generated sources from the same codebase, so
1225 // the new file should generally be classified the same way as the current
1226 // file. This is visible in GCC's pre-processed output, which rewrites #line
1227 // to GNU line markers.
1228 SrcMgr::CharacteristicKind FileKind =
1229 SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1230
1231 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1232 false, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001233
Chris Lattner839150e2009-03-27 17:13:49 +00001234 if (Callbacks)
Chris Lattnerc745cec2010-04-14 04:28:50 +00001235 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
Reid Klecknereb00ee02017-05-22 21:42:58 +00001236 PPCallbacks::RenameFile, FileKind);
Chris Lattner100c65e2009-01-26 05:29:08 +00001237}
1238
Chris Lattner76e68962009-01-26 06:19:46 +00001239/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1240/// marker directive.
1241static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
Reid Klecknereb00ee02017-05-22 21:42:58 +00001242 SrcMgr::CharacteristicKind &FileKind,
Chris Lattner76e68962009-01-26 06:19:46 +00001243 Preprocessor &PP) {
1244 unsigned FlagVal;
1245 Token FlagTok;
1246 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001247 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001248 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1249 return true;
1250
1251 if (FlagVal == 1) {
1252 IsFileEntry = true;
Mike Stump11289f42009-09-09 15:08:12 +00001253
Chris Lattner76e68962009-01-26 06:19:46 +00001254 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001255 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001256 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1257 return true;
1258 } else if (FlagVal == 2) {
1259 IsFileExit = true;
Mike Stump11289f42009-09-09 15:08:12 +00001260
Chris Lattner1c967782009-02-04 06:25:26 +00001261 SourceManager &SM = PP.getSourceManager();
1262 // If we are leaving the current presumed file, check to make sure the
1263 // presumed include stack isn't empty!
1264 FileID CurFileID =
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001265 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
Chris Lattner1c967782009-02-04 06:25:26 +00001266 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
Douglas Gregor453b0122010-11-12 07:15:47 +00001267 if (PLoc.isInvalid())
1268 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001269
Chris Lattner1c967782009-02-04 06:25:26 +00001270 // If there is no include loc (main file) or if the include loc is in a
1271 // different physical file, then we aren't in a "1" line marker flag region.
1272 SourceLocation IncLoc = PLoc.getIncludeLoc();
1273 if (IncLoc.isInvalid() ||
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001274 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
Chris Lattner1c967782009-02-04 06:25:26 +00001275 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1276 PP.DiscardUntilEndOfDirective();
1277 return true;
1278 }
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 Lattner76e68962009-01-26 06:19:46 +00001282 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1283 return true;
1284 }
1285
1286 // We must have 3 if there are still flags.
1287 if (FlagVal != 3) {
1288 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001289 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001290 return true;
1291 }
Mike Stump11289f42009-09-09 15:08:12 +00001292
Reid Klecknereb00ee02017-05-22 21:42:58 +00001293 FileKind = SrcMgr::C_System;
Mike Stump11289f42009-09-09 15:08:12 +00001294
Chris Lattner76e68962009-01-26 06:19:46 +00001295 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001296 if (FlagTok.is(tok::eod)) return false;
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001297 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
Chris Lattner76e68962009-01-26 06:19:46 +00001298 return true;
1299
1300 // We must have 4 if there is yet another flag.
1301 if (FlagVal != 4) {
1302 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001303 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001304 return true;
1305 }
Mike Stump11289f42009-09-09 15:08:12 +00001306
Reid Klecknereb00ee02017-05-22 21:42:58 +00001307 FileKind = SrcMgr::C_ExternCSystem;
Mike Stump11289f42009-09-09 15:08:12 +00001308
Chris Lattner76e68962009-01-26 06:19:46 +00001309 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001310 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001311
1312 // There are no more valid flags here.
1313 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001314 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001315 return true;
1316}
1317
1318/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1319/// one of the following forms:
1320///
1321/// # 42
Mike Stump11289f42009-09-09 15:08:12 +00001322/// # 42 "file" ('1' | '2')?
Chris Lattner76e68962009-01-26 06:19:46 +00001323/// # 42 "file" ('1' | '2')? '3' '4'?
1324///
1325void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1326 // Validate the number and convert it to an unsigned. GNU does not have a
1327 // line # limit other than it fit in 32-bits.
1328 unsigned LineNo;
1329 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001330 *this, true))
Chris Lattner76e68962009-01-26 06:19:46 +00001331 return;
Mike Stump11289f42009-09-09 15:08:12 +00001332
Chris Lattner76e68962009-01-26 06:19:46 +00001333 Token StrTok;
1334 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001335
Chris Lattner76e68962009-01-26 06:19:46 +00001336 bool IsFileEntry = false, IsFileExit = false;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001337 int FilenameID = -1;
Reid Klecknereb00ee02017-05-22 21:42:58 +00001338 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001339
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001340 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1341 // string followed by eod.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001342 if (StrTok.is(tok::eod)) {
1343 // Treat this like "#line NN", which doesn't change file characteristics.
1344 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1345 } else if (StrTok.isNot(tok::string_literal)) {
Chris Lattner76e68962009-01-26 06:19:46 +00001346 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001347 return DiscardUntilEndOfDirective();
Richard Smithd67aea22012-03-06 03:21:47 +00001348 } else if (StrTok.hasUDSuffix()) {
1349 Diag(StrTok, diag::err_invalid_string_udl);
1350 return DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001351 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001352 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001353 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001354 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001355 if (Literal.hadError)
1356 return DiscardUntilEndOfDirective();
1357 if (Literal.Pascal) {
1358 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1359 return DiscardUntilEndOfDirective();
1360 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001361 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001362
Chris Lattner76e68962009-01-26 06:19:46 +00001363 // If a filename was present, read any flags that are present.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001364 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
Chris Lattner76e68962009-01-26 06:19:46 +00001365 return;
Chris Lattner76e68962009-01-26 06:19:46 +00001366 }
Mike Stump11289f42009-09-09 15:08:12 +00001367
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001368 // Create a line note with this information.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001369 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1370 IsFileExit, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001371
Chris Lattner839150e2009-03-27 17:13:49 +00001372 // If the preprocessor has callbacks installed, notify them of the #line
1373 // change. This is used so that the line marker comes out in -E mode for
1374 // example.
1375 if (Callbacks) {
1376 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1377 if (IsFileEntry)
1378 Reason = PPCallbacks::EnterFile;
1379 else if (IsFileExit)
1380 Reason = PPCallbacks::ExitFile;
Mike Stump11289f42009-09-09 15:08:12 +00001381
Chris Lattnerc745cec2010-04-14 04:28:50 +00001382 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
Chris Lattner839150e2009-03-27 17:13:49 +00001383 }
Chris Lattner76e68962009-01-26 06:19:46 +00001384}
1385
Chris Lattner38d7fd22009-01-26 05:30:54 +00001386/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1387///
Mike Stump11289f42009-09-09 15:08:12 +00001388void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001389 bool isWarning) {
Chris Lattner38d7fd22009-01-26 05:30:54 +00001390 // PTH doesn't emit #warning or #error directives.
1391 if (CurPTHLexer)
Chris Lattner100c65e2009-01-26 05:29:08 +00001392 return CurPTHLexer->DiscardToEndOfLine();
1393
Chris Lattnerf64b3522008-03-09 01:54:53 +00001394 // Read the rest of the line raw. We do this because we don't want macros
1395 // to be expanded and we don't require that the tokens be valid preprocessing
1396 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
Alexander Kornienko2a8c18d2018-04-06 15:14:32 +00001397 // collapse multiple consecutive white space between tokens, but this isn't
Chris Lattnerf64b3522008-03-09 01:54:53 +00001398 // specified by the standard.
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001399 SmallString<128> Message;
1400 CurLexer->ReadToEndOfLine(&Message);
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001401
1402 // Find the first non-whitespace character, so that we can make the
1403 // diagnostic more succinct.
David Majnemerbf7e0c62016-02-24 22:07:26 +00001404 StringRef Msg = StringRef(Message).ltrim(' ');
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001405
Chris Lattner100c65e2009-01-26 05:29:08 +00001406 if (isWarning)
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001407 Diag(Tok, diag::pp_hash_warning) << Msg;
Chris Lattner100c65e2009-01-26 05:29:08 +00001408 else
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001409 Diag(Tok, diag::err_pp_hash_error) << Msg;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001410}
1411
1412/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1413///
1414void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1415 // Yes, this directive is an extension.
1416 Diag(Tok, diag::ext_pp_ident_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001417
Chris Lattnerf64b3522008-03-09 01:54:53 +00001418 // Read the string argument.
1419 Token StrTok;
1420 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001421
Chris Lattnerf64b3522008-03-09 01:54:53 +00001422 // If the token kind isn't a string, it's a malformed directive.
1423 if (StrTok.isNot(tok::string_literal) &&
Chris Lattner907dfe92008-11-18 07:59:24 +00001424 StrTok.isNot(tok::wide_string_literal)) {
1425 Diag(StrTok, diag::err_pp_malformed_ident);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001426 if (StrTok.isNot(tok::eod))
Chris Lattner38d7fd22009-01-26 05:30:54 +00001427 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +00001428 return;
1429 }
Mike Stump11289f42009-09-09 15:08:12 +00001430
Richard Smithd67aea22012-03-06 03:21:47 +00001431 if (StrTok.hasUDSuffix()) {
1432 Diag(StrTok, diag::err_invalid_string_udl);
1433 return DiscardUntilEndOfDirective();
1434 }
1435
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001436 // Verify that there is nothing after the string, other than EOD.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00001437 CheckEndOfDirective("ident");
Chris Lattnerf64b3522008-03-09 01:54:53 +00001438
Douglas Gregordc970f02010-03-16 22:30:13 +00001439 if (Callbacks) {
1440 bool Invalid = false;
1441 std::string Str = getSpelling(StrTok, &Invalid);
1442 if (!Invalid)
1443 Callbacks->Ident(Tok.getLocation(), Str);
1444 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00001445}
1446
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001447/// Handle a #public directive.
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001448void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001449 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001450 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001451
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001452 // Error reading macro name? If so, diagnostic already issued.
1453 if (MacroNameTok.is(tok::eod))
1454 return;
1455
Douglas Gregor663b48f2012-01-03 19:48:16 +00001456 // Check to see if this is the last token on the #__public_macro line.
1457 CheckEndOfDirective("__public_macro");
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001458
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001459 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001460 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001461 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001462
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001463 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001464 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001465 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001466 return;
1467 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001468
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001469 // Note that this macro has now been exported.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001470 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1471 MacroNameTok.getLocation(), /*IsPublic=*/true));
Douglas Gregorebf00492011-10-17 15:32:29 +00001472}
1473
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001474/// Handle a #private directive.
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001475void Preprocessor::HandleMacroPrivateDirective() {
Douglas Gregorebf00492011-10-17 15:32:29 +00001476 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001477 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001478
Douglas Gregorebf00492011-10-17 15:32:29 +00001479 // Error reading macro name? If so, diagnostic already issued.
1480 if (MacroNameTok.is(tok::eod))
1481 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001482
Douglas Gregor663b48f2012-01-03 19:48:16 +00001483 // Check to see if this is the last token on the #__private_macro line.
1484 CheckEndOfDirective("__private_macro");
Taewook Oh755e4d22016-06-13 21:55:33 +00001485
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001486 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregorebf00492011-10-17 15:32:29 +00001487 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001488 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001489
Douglas Gregorebf00492011-10-17 15:32:29 +00001490 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001491 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001492 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregorebf00492011-10-17 15:32:29 +00001493 return;
1494 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001495
Douglas Gregorebf00492011-10-17 15:32:29 +00001496 // Note that this macro has now been marked private.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001497 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1498 MacroNameTok.getLocation(), /*IsPublic=*/false));
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001499}
1500
Chris Lattnerf64b3522008-03-09 01:54:53 +00001501//===----------------------------------------------------------------------===//
1502// Preprocessor Include Directive Handling.
1503//===----------------------------------------------------------------------===//
1504
1505/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
James Dennettf6333ac2012-06-22 05:46:07 +00001506/// checked and spelled filename, e.g. as an operand of \#include. This returns
Chris Lattnerf64b3522008-03-09 01:54:53 +00001507/// true if the input filename was in <>'s or false if it were in ""'s. The
1508/// caller is expected to provide a buffer that is large enough to hold the
1509/// spelling of the filename, but is also expected to handle the case when
1510/// this method decides to use a different buffer.
1511bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001512 StringRef &Buffer) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001513 // Get the text form of the filename.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001514 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
Mike Stump11289f42009-09-09 15:08:12 +00001515
Chris Lattnerf64b3522008-03-09 01:54:53 +00001516 // Make sure the filename is <x> or "x".
1517 bool isAngled;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001518 if (Buffer[0] == '<') {
1519 if (Buffer.back() != '>') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001520 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001521 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001522 return true;
1523 }
1524 isAngled = true;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001525 } else if (Buffer[0] == '"') {
1526 if (Buffer.back() != '"') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001527 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001528 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001529 return true;
1530 }
1531 isAngled = false;
1532 } else {
1533 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001534 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001535 return true;
1536 }
Mike Stump11289f42009-09-09 15:08:12 +00001537
Chris Lattnerf64b3522008-03-09 01:54:53 +00001538 // Diagnose #include "" as invalid.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001539 if (Buffer.size() <= 2) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001540 Diag(Loc, diag::err_pp_empty_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001541 Buffer = StringRef();
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001542 return true;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001543 }
Mike Stump11289f42009-09-09 15:08:12 +00001544
Chris Lattnerf64b3522008-03-09 01:54:53 +00001545 // Skip the brackets.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001546 Buffer = Buffer.substr(1, Buffer.size()-2);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001547 return isAngled;
1548}
1549
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001550// Handle cases where the \#include name is expanded from a macro
James Dennett4a4f72d2013-11-27 01:27:40 +00001551// as multiple tokens, which need to be glued together.
1552//
1553// This occurs for code like:
1554// \code
1555// \#define FOO <a/b.h>
1556// \#include FOO
1557// \endcode
1558// because in this case, "<a/b.h>" is returned as 7 tokens, not one.
1559//
1560// This code concatenates and consumes tokens up to the '>' token. It returns
1561// false if the > was found, otherwise it returns true if it finds and consumes
1562// the EOD marker.
1563bool Preprocessor::ConcatenateIncludeName(SmallString<128> &FilenameBuffer,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001564 SourceLocation &End) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001565 Token CurTok;
Mike Stump11289f42009-09-09 15:08:12 +00001566
John Thompsonb5353522009-10-30 13:49:06 +00001567 Lex(CurTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001568 while (CurTok.isNot(tok::eod)) {
Douglas Gregor796d76a2010-10-20 22:00:55 +00001569 End = CurTok.getLocation();
Taewook Oh755e4d22016-06-13 21:55:33 +00001570
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001571 // FIXME: Provide code completion for #includes.
1572 if (CurTok.is(tok::code_completion)) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +00001573 setCodeCompletionReached();
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001574 Lex(CurTok);
1575 continue;
1576 }
1577
Chris Lattnerf64b3522008-03-09 01:54:53 +00001578 // Append the spelling of this token to the buffer. If there was a space
1579 // before it, add it now.
1580 if (CurTok.hasLeadingSpace())
1581 FilenameBuffer.push_back(' ');
Mike Stump11289f42009-09-09 15:08:12 +00001582
Chris Lattnerf64b3522008-03-09 01:54:53 +00001583 // Get the spelling of the token, directly into FilenameBuffer if possible.
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001584 size_t PreAppendSize = FilenameBuffer.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001585 FilenameBuffer.resize(PreAppendSize+CurTok.getLength());
Mike Stump11289f42009-09-09 15:08:12 +00001586
Chris Lattnerf64b3522008-03-09 01:54:53 +00001587 const char *BufPtr = &FilenameBuffer[PreAppendSize];
John Thompsonb5353522009-10-30 13:49:06 +00001588 unsigned ActualLen = getSpelling(CurTok, BufPtr);
Mike Stump11289f42009-09-09 15:08:12 +00001589
Chris Lattnerf64b3522008-03-09 01:54:53 +00001590 // If the token was spelled somewhere else, copy it into FilenameBuffer.
1591 if (BufPtr != &FilenameBuffer[PreAppendSize])
1592 memcpy(&FilenameBuffer[PreAppendSize], BufPtr, ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001593
Chris Lattnerf64b3522008-03-09 01:54:53 +00001594 // Resize FilenameBuffer to the correct size.
1595 if (CurTok.getLength() != ActualLen)
1596 FilenameBuffer.resize(PreAppendSize+ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001597
Chris Lattnerf64b3522008-03-09 01:54:53 +00001598 // If we found the '>' marker, return success.
1599 if (CurTok.is(tok::greater))
1600 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001601
John Thompsonb5353522009-10-30 13:49:06 +00001602 Lex(CurTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001603 }
1604
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001605 // If we hit the eod marker, emit an error and return true so that the caller
1606 // knows the EOD has been read.
John Thompsonb5353522009-10-30 13:49:06 +00001607 Diag(CurTok.getLocation(), diag::err_pp_expects_filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001608 return true;
1609}
1610
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001611/// Push a token onto the token stream containing an annotation.
Richard Smithc51c38b2017-04-29 00:34:47 +00001612void Preprocessor::EnterAnnotationToken(SourceRange Range,
1613 tok::TokenKind Kind,
1614 void *AnnotationVal) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001615 // FIXME: Produce this as the current token directly, rather than
1616 // allocating a new token for it.
David Blaikie2eabcc92016-02-09 18:52:09 +00001617 auto Tok = llvm::make_unique<Token[]>(1);
Richard Smith34f30512013-11-23 04:06:09 +00001618 Tok[0].startToken();
1619 Tok[0].setKind(Kind);
Richard Smithc51c38b2017-04-29 00:34:47 +00001620 Tok[0].setLocation(Range.getBegin());
1621 Tok[0].setAnnotationEndLoc(Range.getEnd());
Richard Smith34f30512013-11-23 04:06:09 +00001622 Tok[0].setAnnotationValue(AnnotationVal);
Richard Smithc51c38b2017-04-29 00:34:47 +00001623 EnterTokenStream(std::move(Tok), 1, true);
Richard Smith34f30512013-11-23 04:06:09 +00001624}
1625
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001626/// Produce a diagnostic informing the user that a #include or similar
Richard Smith63b6fce2015-05-18 04:45:41 +00001627/// was implicitly treated as a module import.
1628static void diagnoseAutoModuleImport(
1629 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1630 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1631 SourceLocation PathEnd) {
Erik Pilkingtonfa983902018-10-30 20:31:30 +00001632 assert(PP.getLangOpts().ObjC && "no import syntax available");
Richard Smith63b6fce2015-05-18 04:45:41 +00001633
1634 SmallString<128> PathString;
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001635 for (size_t I = 0, N = Path.size(); I != N; ++I) {
Richard Smith63b6fce2015-05-18 04:45:41 +00001636 if (I)
1637 PathString += '.';
1638 PathString += Path[I].first->getName();
1639 }
1640 int IncludeKind = 0;
Taewook Oh755e4d22016-06-13 21:55:33 +00001641
Richard Smith63b6fce2015-05-18 04:45:41 +00001642 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1643 case tok::pp_include:
1644 IncludeKind = 0;
1645 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001646
Richard Smith63b6fce2015-05-18 04:45:41 +00001647 case tok::pp_import:
1648 IncludeKind = 1;
Taewook Oh755e4d22016-06-13 21:55:33 +00001649 break;
1650
Richard Smith63b6fce2015-05-18 04:45:41 +00001651 case tok::pp_include_next:
1652 IncludeKind = 2;
1653 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001654
Richard Smith63b6fce2015-05-18 04:45:41 +00001655 case tok::pp___include_macros:
1656 IncludeKind = 3;
1657 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001658
Richard Smith63b6fce2015-05-18 04:45:41 +00001659 default:
1660 llvm_unreachable("unknown include directive kind");
1661 }
1662
1663 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1664 /*IsTokenRange=*/false);
1665 PP.Diag(HashLoc, diag::warn_auto_module_import)
1666 << IncludeKind << PathString
1667 << FixItHint::CreateReplacement(ReplaceRange,
1668 ("@import " + PathString + ";").str());
1669}
1670
Taewook Ohf42103c2016-06-13 20:40:21 +00001671// Given a vector of path components and a string containing the real
1672// path to the file, build a properly-cased replacement in the vector,
1673// and return true if the replacement should be suggested.
1674static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1675 StringRef RealPathName) {
1676 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1677 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1678 int Cnt = 0;
1679 bool SuggestReplacement = false;
1680 // Below is a best-effort to handle ".." in paths. It is admittedly
1681 // not 100% correct in the presence of symlinks.
1682 for (auto &Component : llvm::reverse(Components)) {
1683 if ("." == Component) {
1684 } else if (".." == Component) {
1685 ++Cnt;
1686 } else if (Cnt) {
1687 --Cnt;
1688 } else if (RealPathComponentIter != RealPathComponentEnd) {
1689 if (Component != *RealPathComponentIter) {
1690 // If these path components differ by more than just case, then we
1691 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1692 // noisy false positives.
1693 SuggestReplacement = RealPathComponentIter->equals_lower(Component);
1694 if (!SuggestReplacement)
1695 break;
1696 Component = *RealPathComponentIter;
1697 }
1698 ++RealPathComponentIter;
1699 }
1700 }
1701 return SuggestReplacement;
1702}
1703
Richard Smith27e5aa02017-06-05 18:57:56 +00001704bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1705 const TargetInfo &TargetInfo,
1706 DiagnosticsEngine &Diags, Module *M) {
1707 Module::Requirement Requirement;
1708 Module::UnresolvedHeaderDirective MissingHeader;
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00001709 Module *ShadowingModule = nullptr;
1710 if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,
1711 ShadowingModule))
Richard Smith27e5aa02017-06-05 18:57:56 +00001712 return false;
1713
1714 if (MissingHeader.FileNameLoc.isValid()) {
1715 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1716 << MissingHeader.IsUmbrella << MissingHeader.FileName;
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00001717 } else if (ShadowingModule) {
1718 Diags.Report(M->DefinitionLoc, diag::err_module_shadowed) << M->Name;
1719 Diags.Report(ShadowingModule->DefinitionLoc,
1720 diag::note_previous_definition);
Richard Smith27e5aa02017-06-05 18:57:56 +00001721 } else {
1722 // FIXME: Track the location at which the requirement was specified, and
1723 // use it here.
1724 Diags.Report(M->DefinitionLoc, diag::err_module_unavailable)
1725 << M->getFullModuleName() << Requirement.second << Requirement.first;
1726 }
1727 return true;
1728}
1729
James Dennettf6333ac2012-06-22 05:46:07 +00001730/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1731/// the file to be included from the lexer, then include it! This is a common
1732/// routine with functionality shared between \#include, \#include_next and
1733/// \#import. LookupFrom is set when this is a \#include_next directive, it
Mike Stump11289f42009-09-09 15:08:12 +00001734/// specifies the file to start searching from.
Taewook Oh755e4d22016-06-13 21:55:33 +00001735void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001736 Token &IncludeTok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001737 const DirectoryLookup *LookupFrom,
Richard Smith25d50752014-10-20 00:15:49 +00001738 const FileEntry *LookupFromFile,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001739 bool isImport) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001740 Token FilenameTok;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00001741 CurPPLexer->LexIncludeFilename(FilenameTok);
Mike Stump11289f42009-09-09 15:08:12 +00001742
Chris Lattnerf64b3522008-03-09 01:54:53 +00001743 // Reserve a buffer to get the spelling.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001744 SmallString<128> FilenameBuffer;
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001745 StringRef Filename;
Douglas Gregor796d76a2010-10-20 22:00:55 +00001746 SourceLocation End;
Douglas Gregor41e115a2011-11-30 18:02:36 +00001747 SourceLocation CharEnd; // the end of this directive, in characters
Taewook Oh755e4d22016-06-13 21:55:33 +00001748
Chris Lattnerf64b3522008-03-09 01:54:53 +00001749 switch (FilenameTok.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001750 case tok::eod:
1751 // If the token kind is EOD, the error has already been diagnosed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00001752 return;
Mike Stump11289f42009-09-09 15:08:12 +00001753
Chris Lattnerf64b3522008-03-09 01:54:53 +00001754 case tok::angle_string_literal:
Benjamin Kramer0a1abd42010-02-27 13:44:12 +00001755 case tok::string_literal:
1756 Filename = getSpelling(FilenameTok, FilenameBuffer);
Douglas Gregor796d76a2010-10-20 22:00:55 +00001757 End = FilenameTok.getLocation();
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001758 CharEnd = End.getLocWithOffset(FilenameTok.getLength());
Chris Lattnerf64b3522008-03-09 01:54:53 +00001759 break;
Mike Stump11289f42009-09-09 15:08:12 +00001760
Chris Lattnerf64b3522008-03-09 01:54:53 +00001761 case tok::less:
1762 // This could be a <foo/bar.h> file coming from a macro expansion. In this
1763 // case, glue the tokens together into FilenameBuffer and interpret those.
1764 FilenameBuffer.push_back('<');
Douglas Gregor796d76a2010-10-20 22:00:55 +00001765 if (ConcatenateIncludeName(FilenameBuffer, End))
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001766 return; // Found <eod> but no ">"? Diagnostic already emitted.
Yaron Keren92e1b622015-03-18 10:17:07 +00001767 Filename = FilenameBuffer;
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001768 CharEnd = End.getLocWithOffset(1);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001769 break;
1770 default:
1771 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1772 DiscardUntilEndOfDirective();
1773 return;
1774 }
Mike Stump11289f42009-09-09 15:08:12 +00001775
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001776 CharSourceRange FilenameRange
1777 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
Aaron Ballman611306e2012-03-02 22:51:54 +00001778 StringRef OriginalFilename = Filename;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001779 bool isAngled =
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001780 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001781 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1782 // error.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001783 if (Filename.empty()) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001784 DiscardUntilEndOfDirective();
1785 return;
1786 }
Mike Stump11289f42009-09-09 15:08:12 +00001787
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001788 // Verify that there is nothing after the filename, other than EOD. Note that
Chris Lattnerb40289b2009-04-17 23:56:52 +00001789 // we allow macros that expand to nothing after the filename, because this
1790 // falls into the category of "#include pp-tokens new-line" specified in
1791 // C99 6.10.2p4.
Daniel Dunbar2c422dc92009-10-18 20:26:12 +00001792 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001793
1794 // Check that we don't have infinite #include recursion.
Chris Lattner907dfe92008-11-18 07:59:24 +00001795 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
1796 Diag(FilenameTok, diag::err_pp_include_too_deep);
1797 return;
1798 }
Mike Stump11289f42009-09-09 15:08:12 +00001799
John McCall32f5fe12011-09-30 05:12:12 +00001800 // Complain about attempts to #include files in an audit pragma.
1801 if (PragmaARCCFCodeAuditedLoc.isValid()) {
1802 Diag(HashLoc, diag::err_pp_include_in_arc_cf_code_audited);
1803 Diag(PragmaARCCFCodeAuditedLoc, diag::note_pragma_entered_here);
1804
1805 // Immediately leave the pragma.
1806 PragmaARCCFCodeAuditedLoc = SourceLocation();
1807 }
1808
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001809 // Complain about attempts to #include files in an assume-nonnull pragma.
1810 if (PragmaAssumeNonNullLoc.isValid()) {
1811 Diag(HashLoc, diag::err_pp_include_in_assume_nonnull);
1812 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1813
1814 // Immediately leave the pragma.
1815 PragmaAssumeNonNullLoc = SourceLocation();
1816 }
1817
Aaron Ballman611306e2012-03-02 22:51:54 +00001818 if (HeaderInfo.HasIncludeAliasMap()) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001819 // Map the filename with the brackets still attached. If the name doesn't
1820 // map to anything, fall back on the filename we've already gotten the
Aaron Ballman611306e2012-03-02 22:51:54 +00001821 // spelling for.
1822 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1823 if (!NewName.empty())
1824 Filename = NewName;
1825 }
1826
Chris Lattnerf64b3522008-03-09 01:54:53 +00001827 // Search include directories.
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001828 bool IsMapped = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001829 const DirectoryLookup *CurDir;
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001830 SmallString<1024> SearchPath;
1831 SmallString<1024> RelativePath;
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001832 // We get the raw path only if we have 'Callbacks' to which we later pass
1833 // the path.
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001834 ModuleMap::KnownHeader SuggestedModule;
1835 SourceLocation FilenameLoc = FilenameTok.getLocation();
Saleem Abdulrasool729b7d32014-03-12 02:26:08 +00001836 SmallString<128> NormalizedPath;
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001837 if (LangOpts.MSVCCompat) {
1838 NormalizedPath = Filename.str();
Nico Weber1865df42018-04-27 19:11:14 +00001839#ifndef _WIN32
Rafael Espindolaf6002232014-08-08 21:31:04 +00001840 llvm::sys::path::native(NormalizedPath);
Yaron Keren1801d1b2014-08-09 18:13:01 +00001841#endif
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001842 }
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001843 const FileEntry *File = LookupFile(
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001844 FilenameLoc, LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename,
Richard Smith25d50752014-10-20 00:15:49 +00001845 isAngled, LookupFrom, LookupFromFile, CurDir,
1846 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001847 &SuggestedModule, &IsMapped);
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001848
Richard Smithdbbc5232015-05-14 02:25:44 +00001849 if (!File) {
1850 if (Callbacks) {
Douglas Gregor11729f02011-11-30 18:12:06 +00001851 // Give the clients a chance to recover.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001852 SmallString<128> RecoveryPath;
Douglas Gregor11729f02011-11-30 18:12:06 +00001853 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
1854 if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) {
1855 // Add the recovery path to the list of search paths.
Daniel Dunbarae4feb62013-01-25 01:50:28 +00001856 DirectoryLookup DL(DE, SrcMgr::C_User, false);
Douglas Gregor11729f02011-11-30 18:12:06 +00001857 HeaderInfo.AddSearchPath(DL, isAngled);
Taewook Oh755e4d22016-06-13 21:55:33 +00001858
Douglas Gregor11729f02011-11-30 18:12:06 +00001859 // Try the lookup again, skipping the cache.
Richard Smith25d50752014-10-20 00:15:49 +00001860 File = LookupFile(
1861 FilenameLoc,
1862 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1863 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001864 &SuggestedModule, &IsMapped, /*SkipCache*/ true);
Douglas Gregor11729f02011-11-30 18:12:06 +00001865 }
1866 }
1867 }
Craig Topperd2d442c2014-05-17 23:10:59 +00001868
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001869 if (!SuppressIncludeNotFoundError) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001870 // If the file could not be located and it was included via angle
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001871 // brackets, we can attempt a lookup as though it were a quoted path to
1872 // provide the user with a possible fixit.
1873 if (isAngled) {
Daniel Jasper07e6c402013-08-05 20:26:17 +00001874 File = LookupFile(
Richard Smith25d50752014-10-20 00:15:49 +00001875 FilenameLoc,
1876 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, false,
1877 LookupFrom, LookupFromFile, CurDir,
1878 Callbacks ? &SearchPath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001879 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped);
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001880 if (File) {
1881 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Richard Smith2ce63b42018-09-13 21:10:08 +00001882 Diag(FilenameTok, diag::err_pp_file_not_found_angled_include_not_fatal) <<
Taewook Oh755e4d22016-06-13 21:55:33 +00001883 Filename <<
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001884 FixItHint::CreateReplacement(Range, "\"" + Filename.str() + "\"");
1885 }
1886 }
Richard Smithdbbc5232015-05-14 02:25:44 +00001887
Richard Smith2ce63b42018-09-13 21:10:08 +00001888 // Check for likely typos due to leading or trailing non-isAlphanumeric
1889 // characters
Eric Christopher918b47f2018-09-20 17:21:56 +00001890 StringRef OriginalFilename = Filename;
Haojian Wudea57712018-10-02 13:59:49 +00001891 if (LangOpts.SpellChecking && !File) {
Haojian Wu1743ebe2018-10-01 14:38:43 +00001892 // A heuristic to correct a typo file name by removing leading and
1893 // trailing non-isAlphanumeric characters.
1894 auto CorrectTypoFilename = [](llvm::StringRef Filename) {
1895 Filename = Filename.drop_until(isAlphanumeric);
1896 while (!Filename.empty() && !isAlphanumeric(Filename.back())) {
1897 Filename = Filename.drop_back();
1898 }
1899 return Filename;
1900 };
Haojian Wu714e9712018-10-02 14:42:51 +00001901 StringRef TypoCorrectionName = CorrectTypoFilename(Filename);
Richard Smith2ce63b42018-09-13 21:10:08 +00001902 File = LookupFile(
1903 FilenameLoc,
Haojian Wu714e9712018-10-02 14:42:51 +00001904 LangOpts.MSVCCompat ? NormalizedPath.c_str() : TypoCorrectionName,
1905 isAngled, LookupFrom, LookupFromFile, CurDir,
Richard Smith2ce63b42018-09-13 21:10:08 +00001906 Callbacks ? &SearchPath : nullptr,
1907 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped);
1908 if (File) {
1909 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Haojian Wu714e9712018-10-02 14:42:51 +00001910 auto Hint = isAngled
1911 ? FixItHint::CreateReplacement(
1912 Range, "<" + TypoCorrectionName.str() + ">")
1913 : FixItHint::CreateReplacement(
1914 Range, "\"" + TypoCorrectionName.str() + "\"");
Richard Smith2ce63b42018-09-13 21:10:08 +00001915 Diag(FilenameTok, diag::err_pp_file_not_found_typo_not_fatal)
Haojian Wu714e9712018-10-02 14:42:51 +00001916 << OriginalFilename << TypoCorrectionName << Hint;
1917 // We found the file, so set the Filename to the name after typo
1918 // correction.
1919 Filename = TypoCorrectionName;
Richard Smith2ce63b42018-09-13 21:10:08 +00001920 }
1921 }
1922
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001923 // If the file is still not found, just go with the vanilla diagnostic
1924 if (!File)
Eric Christopher918b47f2018-09-20 17:21:56 +00001925 Diag(FilenameTok, diag::err_pp_file_not_found) << OriginalFilename
Erik Verbruggen45449542016-10-25 10:13:10 +00001926 << FilenameRange;
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001927 }
Douglas Gregor11729f02011-11-30 18:12:06 +00001928 }
1929
Erich Keane76675de2018-07-05 17:22:13 +00001930 if (usingPCHWithThroughHeader() && SkippingUntilPCHThroughHeader) {
1931 if (isPCHThroughHeader(File))
1932 SkippingUntilPCHThroughHeader = false;
1933 return;
1934 }
1935
Richard Smith63b6fce2015-05-18 04:45:41 +00001936 // Should we enter the source file? Set to false if either the source file is
1937 // known to have no effect beyond its effect on module visibility -- that is,
1938 // if it's got an include guard that is already defined or is a modular header
1939 // we've imported or already built.
1940 bool ShouldEnter = true;
Richard Smithdbbc5232015-05-14 02:25:44 +00001941
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001942 if (PPOpts->SingleFileParseMode)
1943 ShouldEnter = false;
1944
Volodymyr Sapsai482070b2018-07-25 19:16:26 +00001945 // Any diagnostics after the fatal error will not be visible. As the
1946 // compilation failed already and errors in subsequently included files won't
1947 // be visible, avoid preprocessing those files.
1948 if (ShouldEnter && Diags->hasFatalErrorOccurred())
1949 ShouldEnter = false;
1950
Richard Smith63b6fce2015-05-18 04:45:41 +00001951 // Determine whether we should try to import the module for this #include, if
1952 // there is one. Don't do so if precompiled module support is disabled or we
1953 // are processing this module textually (because we're building the module).
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001954 if (ShouldEnter && File && SuggestedModule && getLangOpts().Modules &&
Bruno Cardoso Lopes5bccc522018-02-16 00:12:57 +00001955 !isForModuleBuilding(SuggestedModule.getModule(),
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +00001956 getLangOpts().CurrentModule,
1957 getLangOpts().ModuleName)) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001958 // If this include corresponds to a module but that module is
1959 // unavailable, diagnose the situation and bail out.
Richard Smith58df3432016-04-12 19:58:30 +00001960 // FIXME: Remove this; loadModule does the same check (but produces
1961 // slightly worse diagnostics).
Richard Smith27e5aa02017-06-05 18:57:56 +00001962 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), getDiagnostics(),
1963 SuggestedModule.getModule())) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001964 Diag(FilenameTok.getLocation(),
1965 diag::note_implicit_top_level_module_import_here)
Richard Smith27e5aa02017-06-05 18:57:56 +00001966 << SuggestedModule.getModule()->getTopLevelModuleName();
Sean Silva8b7c0392015-08-17 16:39:30 +00001967 return;
1968 }
1969
Douglas Gregor71944202011-11-30 00:36:36 +00001970 // Compute the module access path corresponding to this module.
1971 // FIXME: Should we have a second loadModule() overload to avoid this
1972 // extra lookup step?
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001973 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001974 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
Douglas Gregor71944202011-11-30 00:36:36 +00001975 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
1976 FilenameTok.getLocation()));
1977 std::reverse(Path.begin(), Path.end());
1978
Douglas Gregor41e115a2011-11-30 18:02:36 +00001979 // Warn that we're replacing the include/import with a module import.
Richard Smith63b6fce2015-05-18 04:45:41 +00001980 // We only do this in Objective-C, where we have a module-import syntax.
Erik Pilkingtonfa983902018-10-30 20:31:30 +00001981 if (getLangOpts().ObjC)
Richard Smith63b6fce2015-05-18 04:45:41 +00001982 diagnoseAutoModuleImport(*this, HashLoc, IncludeTok, Path, CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001983
Richard Smith10434f32015-05-02 02:08:26 +00001984 // Load the module to import its macros. We'll make the declarations
Richard Smithce587f52013-11-15 04:24:58 +00001985 // visible when the parser gets here.
Richard Smithdbbc5232015-05-14 02:25:44 +00001986 // FIXME: Pass SuggestedModule in here rather than converting it to a path
1987 // and making the module loader convert it back again.
Richard Smith10434f32015-05-02 02:08:26 +00001988 ModuleLoadResult Imported = TheModuleLoader.loadModule(
1989 IncludeTok.getLocation(), Path, Module::Hidden,
1990 /*IsIncludeDirective=*/true);
Craig Topperd2d442c2014-05-17 23:10:59 +00001991 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
Argyrios Kyrtzidis051b4432012-09-29 01:06:01 +00001992 "the imported module is different than the suggested one");
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001993
Richard Smith63b6fce2015-05-18 04:45:41 +00001994 if (Imported)
1995 ShouldEnter = false;
1996 else if (Imported.isMissingExpected()) {
1997 // We failed to find a submodule that we assumed would exist (because it
1998 // was in the directory of an umbrella header, for instance), but no
Richard Smitha114c462016-12-06 00:40:17 +00001999 // actual module containing it exists (because the umbrella header is
Richard Smith63b6fce2015-05-18 04:45:41 +00002000 // incomplete). Treat this as a textual inclusion.
2001 SuggestedModule = ModuleMap::KnownHeader();
Richard Smitha114c462016-12-06 00:40:17 +00002002 } else if (Imported.isConfigMismatch()) {
2003 // On a configuration mismatch, enter the header textually. We still know
2004 // that it's part of the corresponding module.
Richard Smith63b6fce2015-05-18 04:45:41 +00002005 } else {
2006 // We hit an error processing the import. Bail out.
2007 if (hadModuleLoaderFatalFailure()) {
2008 // With a fatal failure in the module loader, we abort parsing.
2009 Token &Result = IncludeTok;
2010 if (CurLexer) {
2011 Result.startToken();
2012 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
2013 CurLexer->cutOffLexing();
2014 } else {
2015 assert(CurPTHLexer && "#include but no current lexer set!");
2016 CurPTHLexer->getEOF(Result);
2017 }
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00002018 }
2019 return;
2020 }
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00002021 }
2022
Richard Smithc5247e62017-05-30 02:03:19 +00002023 // The #included file will be considered to be a system header if either it is
2024 // in a system include directory, or if the #includer is a system include
2025 // header.
2026 SrcMgr::CharacteristicKind FileCharacter =
2027 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
2028 if (File)
2029 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(File), FileCharacter);
2030
2031 // Ask HeaderInfo if we should enter this #include file. If not, #including
2032 // this file will have no effect.
2033 bool SkipHeader = false;
2034 if (ShouldEnter && File &&
2035 !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport,
2036 getLangOpts().Modules,
2037 SuggestedModule.getModule())) {
2038 ShouldEnter = false;
2039 SkipHeader = true;
2040 }
2041
Richard Smith63b6fce2015-05-18 04:45:41 +00002042 if (Callbacks) {
2043 // Notify the callback object that we've seen an inclusion directive.
2044 Callbacks->InclusionDirective(
2045 HashLoc, IncludeTok,
2046 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
2047 FilenameRange, File, SearchPath, RelativePath,
Julie Hockett96fbe582018-05-10 19:05:36 +00002048 ShouldEnter ? nullptr : SuggestedModule.getModule(), FileCharacter);
Richard Smithc5247e62017-05-30 02:03:19 +00002049 if (SkipHeader && !SuggestedModule.getModule())
2050 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
Douglas Gregor97eec242011-09-15 22:00:41 +00002051 }
Richard Smith63b6fce2015-05-18 04:45:41 +00002052
2053 if (!File)
2054 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00002055
Richard Smith54ef4c32015-05-19 19:58:11 +00002056 // FIXME: If we have a suggested module, and we've already visited this file,
2057 // don't bother entering it again. We know it has no further effect.
2058
Taewook Ohf42103c2016-06-13 20:40:21 +00002059 // Issue a diagnostic if the name of the file on disk has a different case
2060 // than the one we're about to open.
2061 const bool CheckIncludePathPortability =
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00002062 !IsMapped && File && !File->tryGetRealPathName().empty();
Taewook Ohf42103c2016-06-13 20:40:21 +00002063
2064 if (CheckIncludePathPortability) {
2065 StringRef Name = LangOpts.MSVCCompat ? NormalizedPath.str() : Filename;
2066 StringRef RealPathName = File->tryGetRealPathName();
2067 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
2068 llvm::sys::path::end(Name));
2069
2070 if (trySimplifyPath(Components, RealPathName)) {
2071 SmallString<128> Path;
2072 Path.reserve(Name.size()+2);
2073 Path.push_back(isAngled ? '<' : '"');
Taewook Ohcc89bac2017-02-21 22:30:55 +00002074 bool isLeadingSeparator = llvm::sys::path::is_absolute(Name);
Taewook Ohf42103c2016-06-13 20:40:21 +00002075 for (auto Component : Components) {
Taewook Ohcc89bac2017-02-21 22:30:55 +00002076 if (isLeadingSeparator)
2077 isLeadingSeparator = false;
2078 else
2079 Path.append(Component);
Taewook Ohf42103c2016-06-13 20:40:21 +00002080 // Append the separator the user used, or the close quote
2081 Path.push_back(
2082 Path.size() <= Filename.size() ? Filename[Path.size()-1] :
2083 (isAngled ? '>' : '"'));
2084 }
Taewook Ohf42103c2016-06-13 20:40:21 +00002085 // For user files and known standard headers, by default we issue a diagnostic.
2086 // For other system headers, we don't. They can be controlled separately.
2087 auto DiagId = (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name)) ?
2088 diag::pp_nonportable_path : diag::pp_nonportable_system_path;
2089 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Reid Kleckner273895b2017-02-14 18:38:40 +00002090 Diag(FilenameTok, DiagId) << Path <<
2091 FixItHint::CreateReplacement(Range, Path);
Taewook Ohf42103c2016-06-13 20:40:21 +00002092 }
2093 }
2094
Richard Smith63b6fce2015-05-18 04:45:41 +00002095 // If we don't need to enter the file, stop now.
2096 if (!ShouldEnter) {
Richard Smithdbbc5232015-05-14 02:25:44 +00002097 // If this is a module import, make it visible if needed.
Richard Smitha0aafa32015-05-18 03:52:30 +00002098 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00002099 // When building a pch, -fmodule-name tells the compiler to textually
2100 // include headers in the specified module. But it is possible that
2101 // ShouldEnter is false because we are skipping the header. In that
2102 // case, We are not importing the specified module.
2103 if (SkipHeader && getLangOpts().CompilingPCH &&
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +00002104 isForModuleBuilding(M, getLangOpts().CurrentModule,
2105 getLangOpts().ModuleName))
Manman Renffd3e9d2017-01-09 19:20:18 +00002106 return;
2107
Richard Smitha0aafa32015-05-18 03:52:30 +00002108 makeModuleVisible(M, HashLoc);
Richard Smithdbbc5232015-05-14 02:25:44 +00002109
2110 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() !=
2111 tok::pp___include_macros)
Richard Smithc51c38b2017-04-29 00:34:47 +00002112 EnterAnnotationToken(SourceRange(HashLoc, End),
2113 tok::annot_module_include, M);
Richard Smithdbbc5232015-05-14 02:25:44 +00002114 }
Chris Lattner72286d62010-04-19 20:44:31 +00002115 return;
2116 }
2117
Chris Lattnerf64b3522008-03-09 01:54:53 +00002118 // Look up the file, create a File ID for it.
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002119 SourceLocation IncludePos = End;
2120 // If the filename string was the result of macro expansions, set the include
2121 // position on the file where it will be included and after the expansions.
2122 if (IncludePos.isMacroID())
Richard Smithb5f81712018-04-30 05:25:48 +00002123 IncludePos = SourceMgr.getExpansionRange(IncludePos).getEnd();
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002124 FileID FID = SourceMgr.createFileID(File, IncludePos, FileCharacter);
Yaron Keren8b563662015-10-03 10:46:20 +00002125 assert(FID.isValid() && "Expected valid file ID");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002126
Richard Smith34f30512013-11-23 04:06:09 +00002127 // If all is good, enter the new file!
Richard Smith67294e22014-01-31 20:47:44 +00002128 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
2129 return;
Richard Smith34f30512013-11-23 04:06:09 +00002130
Richard Smitha0aafa32015-05-18 03:52:30 +00002131 // Determine if we're switching to building a new submodule, and which one.
Richard Smitha0aafa32015-05-18 03:52:30 +00002132 if (auto *M = SuggestedModule.getModule()) {
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00002133 if (M->getTopLevelModule()->ShadowingModule) {
2134 // We are building a submodule that belongs to a shadowed module. This
2135 // means we find header files in the shadowed module.
2136 Diag(M->DefinitionLoc, diag::err_module_build_shadowed_submodule)
2137 << M->getFullModuleName();
2138 Diag(M->getTopLevelModule()->ShadowingModule->DefinitionLoc,
2139 diag::note_previous_definition);
2140 return;
2141 }
Manman Renffd3e9d2017-01-09 19:20:18 +00002142 // When building a pch, -fmodule-name tells the compiler to textually
2143 // include headers in the specified module. We are not building the
2144 // specified module.
2145 if (getLangOpts().CompilingPCH &&
Bruno Cardoso Lopes970b2812018-03-20 22:36:39 +00002146 isForModuleBuilding(M, getLangOpts().CurrentModule,
2147 getLangOpts().ModuleName))
Manman Renffd3e9d2017-01-09 19:20:18 +00002148 return;
2149
Richard Smithd1386302017-05-04 00:29:54 +00002150 assert(!CurLexerSubmodule && "should not have marked this as a module yet");
2151 CurLexerSubmodule = M;
Richard Smith67294e22014-01-31 20:47:44 +00002152
Richard Smitha0aafa32015-05-18 03:52:30 +00002153 // Let the macro handling code know that any future macros are within
2154 // the new submodule.
Richard Smithd1386302017-05-04 00:29:54 +00002155 EnterSubmodule(M, HashLoc, /*ForPragma*/false);
Richard Smithb8b2ed62015-04-23 18:18:26 +00002156
Richard Smitha0aafa32015-05-18 03:52:30 +00002157 // Let the parser know that any future declarations are within the new
2158 // submodule.
2159 // FIXME: There's no point doing this if we're handling a #__include_macros
2160 // directive.
Richard Smithc51c38b2017-04-29 00:34:47 +00002161 EnterAnnotationToken(SourceRange(HashLoc, End), tok::annot_module_begin, M);
Richard Smith67294e22014-01-31 20:47:44 +00002162 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002163}
2164
James Dennettf6333ac2012-06-22 05:46:07 +00002165/// HandleIncludeNextDirective - Implements \#include_next.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002166///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002167void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2168 Token &IncludeNextTok) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002169 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
Mike Stump11289f42009-09-09 15:08:12 +00002170
Chris Lattnerf64b3522008-03-09 01:54:53 +00002171 // #include_next is like #include, except that we start searching after
2172 // the current found directory. If we can't do this, issue a
2173 // diagnostic.
2174 const DirectoryLookup *Lookup = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +00002175 const FileEntry *LookupFromFile = nullptr;
Erik Verbruggene0bde752016-10-27 14:17:10 +00002176 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2177 // If the main file is a header, then it's either for PCH/AST generation,
2178 // or libclang opened it. Either way, handle it as a normal include below
2179 // and do not complain about include_next.
2180 } else if (isInPrimaryFile()) {
Craig Topperd2d442c2014-05-17 23:10:59 +00002181 Lookup = nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002182 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
Richard Smithd1386302017-05-04 00:29:54 +00002183 } else if (CurLexerSubmodule) {
Richard Smith25d50752014-10-20 00:15:49 +00002184 // Start looking up in the directory *after* the one in which the current
2185 // file would be found, if any.
2186 assert(CurPPLexer && "#include_next directive in macro?");
2187 LookupFromFile = CurPPLexer->getFileEntry();
2188 Lookup = nullptr;
Craig Topperd2d442c2014-05-17 23:10:59 +00002189 } else if (!Lookup) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002190 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2191 } else {
2192 // Start looking up in the next directory.
2193 ++Lookup;
2194 }
Mike Stump11289f42009-09-09 15:08:12 +00002195
Richard Smith25d50752014-10-20 00:15:49 +00002196 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2197 LookupFromFile);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002198}
2199
James Dennettf6333ac2012-06-22 05:46:07 +00002200/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
Aaron Ballman0467f552012-03-18 03:10:37 +00002201void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2202 // The Microsoft #import directive takes a type library and generates header
2203 // files from it, and includes those. This is beyond the scope of what clang
2204 // does, so we ignore it and error out. However, #import can optionally have
2205 // trailing attributes that span multiple lines. We're going to eat those
2206 // so we can continue processing from there.
2207 Diag(Tok, diag::err_pp_import_directive_ms );
2208
Taewook Oh755e4d22016-06-13 21:55:33 +00002209 // Read tokens until we get to the end of the directive. Note that the
Aaron Ballman0467f552012-03-18 03:10:37 +00002210 // directive can be split over multiple lines using the backslash character.
2211 DiscardUntilEndOfDirective();
2212}
2213
James Dennettf6333ac2012-06-22 05:46:07 +00002214/// HandleImportDirective - Implements \#import.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002215///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002216void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2217 Token &ImportTok) {
Erik Pilkingtonfa983902018-10-30 20:31:30 +00002218 if (!LangOpts.ObjC) { // #import is standard for ObjC.
Alp Tokerbfa39342014-01-14 12:51:41 +00002219 if (LangOpts.MSVCCompat)
Aaron Ballman0467f552012-03-18 03:10:37 +00002220 return HandleMicrosoftImportDirective(ImportTok);
Chris Lattnerd4a96732009-03-06 04:28:03 +00002221 Diag(ImportTok, diag::ext_pp_import_directive);
Aaron Ballman0467f552012-03-18 03:10:37 +00002222 }
Richard Smith25d50752014-10-20 00:15:49 +00002223 return HandleIncludeDirective(HashLoc, ImportTok, nullptr, nullptr, true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002224}
2225
Chris Lattner58a1eb02009-04-08 18:46:40 +00002226/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2227/// pseudo directive in the predefines buffer. This handles it by sucking all
2228/// tokens through the preprocessor and discarding them (only keeping the side
2229/// effects on the preprocessor).
Douglas Gregor796d76a2010-10-20 22:00:55 +00002230void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2231 Token &IncludeMacrosTok) {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002232 // This directive should only occur in the predefines buffer. If not, emit an
2233 // error and reject it.
2234 SourceLocation Loc = IncludeMacrosTok.getLocation();
Mehdi Amini99d1b292016-10-01 16:38:28 +00002235 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002236 Diag(IncludeMacrosTok.getLocation(),
2237 diag::pp_include_macros_out_of_predefines);
2238 DiscardUntilEndOfDirective();
2239 return;
2240 }
Mike Stump11289f42009-09-09 15:08:12 +00002241
Chris Lattnere01d82b2009-04-08 20:53:24 +00002242 // Treat this as a normal #include for checking purposes. If this is
2243 // successful, it will push a new lexer onto the include stack.
Richard Smith25d50752014-10-20 00:15:49 +00002244 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
Mike Stump11289f42009-09-09 15:08:12 +00002245
Chris Lattnere01d82b2009-04-08 20:53:24 +00002246 Token TmpTok;
2247 do {
2248 Lex(TmpTok);
2249 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2250 } while (TmpTok.isNot(tok::hashhash));
Chris Lattner58a1eb02009-04-08 18:46:40 +00002251}
2252
Chris Lattnerf64b3522008-03-09 01:54:53 +00002253//===----------------------------------------------------------------------===//
2254// Preprocessor Macro Directive Handling.
2255//===----------------------------------------------------------------------===//
2256
Faisal Valie8f430a2017-09-29 02:43:22 +00002257/// ReadMacroParameterList - The ( starting a parameter list of a macro
2258/// definition has just been read. Lex the rest of the parameters and the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002259/// closing ), updating MI with what we learn. Return true if an error occurs
Faisal Valie8f430a2017-09-29 02:43:22 +00002260/// parsing the param list.
Faisal Valiac506d72017-07-17 17:18:43 +00002261bool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {
Faisal Vali33df3912017-09-29 02:17:31 +00002262 SmallVector<IdentifierInfo*, 32> Parameters;
Mike Stump11289f42009-09-09 15:08:12 +00002263
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002264 while (true) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002265 LexUnexpandedToken(Tok);
2266 switch (Tok.getKind()) {
2267 case tok::r_paren:
Faisal Valie8f430a2017-09-29 02:43:22 +00002268 // Found the end of the parameter list.
Faisal Vali33df3912017-09-29 02:17:31 +00002269 if (Parameters.empty()) // #define FOO()
Chris Lattnerf64b3522008-03-09 01:54:53 +00002270 return false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002271 // Otherwise we have #define FOO(A,)
2272 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2273 return true;
2274 case tok::ellipsis: // #define X(... -> C99 varargs
David Blaikiebbafb8a2012-03-11 07:00:24 +00002275 if (!LangOpts.C99)
Taewook Oh755e4d22016-06-13 21:55:33 +00002276 Diag(Tok, LangOpts.CPlusPlus11 ?
Richard Smithacd4d3d2011-10-15 01:18:56 +00002277 diag::warn_cxx98_compat_variadic_macro :
2278 diag::ext_variadic_macro);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002279
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002280 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2281 if (LangOpts.OpenCL) {
2282 Diag(Tok, diag::err_pp_opencl_variadic_macros);
2283 return true;
2284 }
2285
Chris Lattnerf64b3522008-03-09 01:54:53 +00002286 // Lex the token after the identifier.
2287 LexUnexpandedToken(Tok);
2288 if (Tok.isNot(tok::r_paren)) {
2289 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2290 return true;
2291 }
Faisal Valie8f430a2017-09-29 02:43:22 +00002292 // Add the __VA_ARGS__ identifier as a parameter.
Faisal Vali33df3912017-09-29 02:17:31 +00002293 Parameters.push_back(Ident__VA_ARGS__);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002294 MI->setIsC99Varargs();
Faisal Vali33df3912017-09-29 02:17:31 +00002295 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002296 return false;
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002297 case tok::eod: // #define X(
Chris Lattnerf64b3522008-03-09 01:54:53 +00002298 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2299 return true;
2300 default:
2301 // Handle keywords and identifiers here to accept things like
2302 // #define Foo(for) for.
2303 IdentifierInfo *II = Tok.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +00002304 if (!II) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002305 // #define X(1
2306 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2307 return true;
2308 }
2309
Faisal Valie8f430a2017-09-29 02:43:22 +00002310 // If this is already used as a parameter, it is used multiple times (e.g.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002311 // #define X(A,A.
Faisal Vali33df3912017-09-29 02:17:31 +00002312 if (std::find(Parameters.begin(), Parameters.end(), II) !=
2313 Parameters.end()) { // C99 6.10.3p6
Chris Lattnerc5cdade2008-11-19 07:33:58 +00002314 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002315 return true;
2316 }
Mike Stump11289f42009-09-09 15:08:12 +00002317
Faisal Valie8f430a2017-09-29 02:43:22 +00002318 // Add the parameter to the macro info.
Faisal Vali33df3912017-09-29 02:17:31 +00002319 Parameters.push_back(II);
Mike Stump11289f42009-09-09 15:08:12 +00002320
Chris Lattnerf64b3522008-03-09 01:54:53 +00002321 // Lex the token after the identifier.
2322 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002323
Chris Lattnerf64b3522008-03-09 01:54:53 +00002324 switch (Tok.getKind()) {
2325 default: // #define X(A B
2326 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2327 return true;
2328 case tok::r_paren: // #define X(A)
Faisal Vali33df3912017-09-29 02:17:31 +00002329 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002330 return false;
2331 case tok::comma: // #define X(A,
2332 break;
2333 case tok::ellipsis: // #define X(A... -> GCC extension
2334 // Diagnose extension.
2335 Diag(Tok, diag::ext_named_variadic_macro);
Mike Stump11289f42009-09-09 15:08:12 +00002336
Chris Lattnerf64b3522008-03-09 01:54:53 +00002337 // Lex the token after the identifier.
2338 LexUnexpandedToken(Tok);
2339 if (Tok.isNot(tok::r_paren)) {
2340 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2341 return true;
2342 }
Mike Stump11289f42009-09-09 15:08:12 +00002343
Chris Lattnerf64b3522008-03-09 01:54:53 +00002344 MI->setIsGNUVarargs();
Faisal Vali33df3912017-09-29 02:17:31 +00002345 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002346 return false;
2347 }
2348 }
2349 }
2350}
2351
Serge Pavlov07c0f042014-12-18 11:14:21 +00002352static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2353 const LangOptions &LOptions) {
2354 if (MI->getNumTokens() == 1) {
2355 const Token &Value = MI->getReplacementToken(0);
2356
2357 // Macro that is identity, like '#define inline inline' is a valid pattern.
2358 if (MacroName.getKind() == Value.getKind())
2359 return true;
2360
2361 // Macro that maps a keyword to the same keyword decorated with leading/
2362 // trailing underscores is a valid pattern:
2363 // #define inline __inline
2364 // #define inline __inline__
2365 // #define inline _inline (in MS compatibility mode)
2366 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2367 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2368 if (!II->isKeyword(LOptions))
2369 return false;
2370 StringRef ValueText = II->getName();
2371 StringRef TrimmedValue = ValueText;
2372 if (!ValueText.startswith("__")) {
2373 if (ValueText.startswith("_"))
2374 TrimmedValue = TrimmedValue.drop_front(1);
2375 else
2376 return false;
2377 } else {
2378 TrimmedValue = TrimmedValue.drop_front(2);
2379 if (TrimmedValue.endswith("__"))
2380 TrimmedValue = TrimmedValue.drop_back(2);
2381 }
2382 return TrimmedValue.equals(MacroText);
2383 } else {
2384 return false;
2385 }
2386 }
2387
2388 // #define inline
Alexander Kornienkoa26c4952015-12-28 15:30:42 +00002389 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2390 tok::kw_const) &&
2391 MI->getNumTokens() == 0;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002392}
2393
Faisal Valiac506d72017-07-17 17:18:43 +00002394// ReadOptionalMacroParameterListAndBody - This consumes all (i.e. the
2395// entire line) of the macro's tokens and adds them to MacroInfo, and while
2396// doing so performs certain validity checks including (but not limited to):
2397// - # (stringization) is followed by a macro parameter
2398//
2399// Returns a nullptr if an invalid sequence of tokens is encountered or returns
2400// a pointer to a MacroInfo object.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002401
Faisal Valiac506d72017-07-17 17:18:43 +00002402MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(
2403 const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002404
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002405 Token LastTok = MacroNameTok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002406 // Create the new macro.
Faisal Valiac506d72017-07-17 17:18:43 +00002407 MacroInfo *const MI = AllocateMacroInfo(MacroNameTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002408
Chris Lattnerf64b3522008-03-09 01:54:53 +00002409 Token Tok;
2410 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002411
Faisal Vali6bf67912017-07-25 03:15:36 +00002412 // Used to un-poison and then re-poison identifiers of the __VA_ARGS__ ilk
2413 // within their appropriate context.
2414 VariadicMacroScopeGuard VariadicMacroScopeGuard(*this);
2415
Chris Lattnerf64b3522008-03-09 01:54:53 +00002416 // If this is a function-like macro definition, parse the argument list,
2417 // marking each of the identifiers as being used as macro arguments. Also,
2418 // check other constraints on the first token of the macro body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002419 if (Tok.is(tok::eod)) {
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002420 if (ImmediatelyAfterHeaderGuard) {
2421 // Save this macro information since it may part of a header guard.
2422 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2423 MacroNameTok.getLocation());
2424 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002425 // If there is no body to this macro, we have no special handling here.
Chris Lattner2425bcb2009-04-18 02:23:25 +00002426 } else if (Tok.hasLeadingSpace()) {
2427 // This is a normal token with leading space. Clear the leading space
2428 // marker on the first token to get proper expansion.
2429 Tok.clearFlag(Token::LeadingSpace);
2430 } else if (Tok.is(tok::l_paren)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002431 // This is a function-like macro definition. Read the argument list.
2432 MI->setIsFunctionLike();
Faisal Valiac506d72017-07-17 17:18:43 +00002433 if (ReadMacroParameterList(MI, LastTok)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002434 // Throw away the rest of the line.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002435 if (CurPPLexer->ParsingPreprocessorDirective)
Chris Lattnerf64b3522008-03-09 01:54:53 +00002436 DiscardUntilEndOfDirective();
Faisal Valiac506d72017-07-17 17:18:43 +00002437 return nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002438 }
2439
Faisal Vali6bf67912017-07-25 03:15:36 +00002440 // If this is a definition of an ISO C/C++ variadic function-like macro (not
2441 // using the GNU named varargs extension) inform our variadic scope guard
2442 // which un-poisons and re-poisons certain identifiers (e.g. __VA_ARGS__)
2443 // allowed only within the definition of a variadic macro.
Mike Stump11289f42009-09-09 15:08:12 +00002444
Faisal Vali6bf67912017-07-25 03:15:36 +00002445 if (MI->isC99Varargs()) {
2446 VariadicMacroScopeGuard.enterScope();
2447 }
Mike Stump11289f42009-09-09 15:08:12 +00002448
Chris Lattnerf64b3522008-03-09 01:54:53 +00002449 // Read the first token after the arg list for down below.
2450 LexUnexpandedToken(Tok);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00002451 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002452 // C99 requires whitespace between the macro definition and the body. Emit
2453 // a diagnostic for something like "#define X+".
Chris Lattner2425bcb2009-04-18 02:23:25 +00002454 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002455 } else {
Chris Lattner2425bcb2009-04-18 02:23:25 +00002456 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2457 // first character of a replacement list is not a character required by
2458 // subclause 5.2.1, then there shall be white-space separation between the
2459 // identifier and the replacement list.". 5.2.1 lists this set:
2460 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2461 // is irrelevant here.
2462 bool isInvalid = false;
2463 if (Tok.is(tok::at)) // @ is not in the list above.
2464 isInvalid = true;
2465 else if (Tok.is(tok::unknown)) {
2466 // If we have an unknown token, it is something strange like "`". Since
2467 // all of valid characters would have lexed into a single character
2468 // token of some sort, we know this is not a valid case.
2469 isInvalid = true;
2470 }
2471 if (isInvalid)
2472 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2473 else
2474 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002475 }
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002476
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002477 if (!Tok.is(tok::eod))
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002478 LastTok = Tok;
2479
Chris Lattnerf64b3522008-03-09 01:54:53 +00002480 // Read the rest of the macro body.
2481 if (MI->isObjectLike()) {
2482 // Object-like macros are very simple, just read their body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002483 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002484 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002485 MI->AddTokenToBody(Tok);
2486 // Get the next token of the macro.
2487 LexUnexpandedToken(Tok);
2488 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002489 } else {
Chris Lattner83bd8282009-05-25 17:16:10 +00002490 // Otherwise, read the body of a function-like macro. While we are at it,
2491 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2492 // parameters in function-like macro expansions.
Faisal Vali18268422017-10-15 01:26:26 +00002493
2494 VAOptDefinitionContext VAOCtx(*this);
2495
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002496 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002497 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002498
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002499 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002500 MI->AddTokenToBody(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002501
Faisal Vali18268422017-10-15 01:26:26 +00002502 if (VAOCtx.isVAOptToken(Tok)) {
2503 // If we're already within a VAOPT, emit an error.
2504 if (VAOCtx.isInVAOpt()) {
2505 Diag(Tok, diag::err_pp_vaopt_nested_use);
2506 return nullptr;
2507 }
2508 // Ensure VAOPT is followed by a '(' .
2509 LexUnexpandedToken(Tok);
2510 if (Tok.isNot(tok::l_paren)) {
2511 Diag(Tok, diag::err_pp_missing_lparen_in_vaopt_use);
2512 return nullptr;
2513 }
2514 MI->AddTokenToBody(Tok);
2515 VAOCtx.sawVAOptFollowedByOpeningParens(Tok.getLocation());
2516 LexUnexpandedToken(Tok);
2517 if (Tok.is(tok::hashhash)) {
2518 Diag(Tok, diag::err_vaopt_paste_at_start);
2519 return nullptr;
2520 }
2521 continue;
2522 } else if (VAOCtx.isInVAOpt()) {
2523 if (Tok.is(tok::r_paren)) {
2524 if (VAOCtx.sawClosingParen()) {
2525 const unsigned NumTokens = MI->getNumTokens();
2526 assert(NumTokens >= 3 && "Must have seen at least __VA_OPT__( "
2527 "and a subsequent tok::r_paren");
2528 if (MI->getReplacementToken(NumTokens - 2).is(tok::hashhash)) {
2529 Diag(Tok, diag::err_vaopt_paste_at_end);
2530 return nullptr;
2531 }
2532 }
2533 } else if (Tok.is(tok::l_paren)) {
2534 VAOCtx.sawOpeningParen(Tok.getLocation());
2535 }
2536 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002537 // Get the next token of the macro.
2538 LexUnexpandedToken(Tok);
2539 continue;
2540 }
Mike Stump11289f42009-09-09 15:08:12 +00002541
Richard Smith701a3522013-07-09 01:00:29 +00002542 // If we're in -traditional mode, then we should ignore stringification
2543 // and token pasting. Mark the tokens as unknown so as not to confuse
2544 // things.
2545 if (getLangOpts().TraditionalCPP) {
2546 Tok.setKind(tok::unknown);
2547 MI->AddTokenToBody(Tok);
2548
2549 // Get the next token of the macro.
2550 LexUnexpandedToken(Tok);
2551 continue;
2552 }
2553
Eli Friedman14d3c792012-11-14 02:18:46 +00002554 if (Tok.is(tok::hashhash)) {
Eli Friedman14d3c792012-11-14 02:18:46 +00002555 // If we see token pasting, check if it looks like the gcc comma
2556 // pasting extension. We'll use this information to suppress
2557 // diagnostics later on.
Taewook Oh755e4d22016-06-13 21:55:33 +00002558
Eli Friedman14d3c792012-11-14 02:18:46 +00002559 // Get the next token of the macro.
2560 LexUnexpandedToken(Tok);
2561
2562 if (Tok.is(tok::eod)) {
2563 MI->AddTokenToBody(LastTok);
2564 break;
2565 }
2566
2567 unsigned NumTokens = MI->getNumTokens();
2568 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2569 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2570 MI->setHasCommaPasting();
2571
David Majnemer76faf1f2013-11-05 09:30:17 +00002572 // Things look ok, add the '##' token to the macro.
Eli Friedman14d3c792012-11-14 02:18:46 +00002573 MI->AddTokenToBody(LastTok);
Eli Friedman14d3c792012-11-14 02:18:46 +00002574 continue;
2575 }
2576
Faisal Vali18268422017-10-15 01:26:26 +00002577 // Our Token is a stringization operator.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002578 // Get the next token of the macro.
2579 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002580
Faisal Vali18268422017-10-15 01:26:26 +00002581 // Check for a valid macro arg identifier or __VA_OPT__.
2582 if (!VAOCtx.isVAOptToken(Tok) &&
2583 (Tok.getIdentifierInfo() == nullptr ||
2584 MI->getParameterNum(Tok.getIdentifierInfo()) == -1)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002585
2586 // If this is assembler-with-cpp mode, we accept random gibberish after
2587 // the '#' because '#' is often a comment character. However, change
2588 // the kind of the token to tok::unknown so that the preprocessor isn't
2589 // confused.
David Blaikiebbafb8a2012-03-11 07:00:24 +00002590 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002591 LastTok.setKind(tok::unknown);
Eli Friedmancdf8b882013-06-18 21:33:38 +00002592 MI->AddTokenToBody(LastTok);
2593 continue;
Chris Lattner83bd8282009-05-25 17:16:10 +00002594 } else {
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002595 Diag(Tok, diag::err_pp_stringize_not_parameter)
2596 << LastTok.is(tok::hashat);
Faisal Valiac506d72017-07-17 17:18:43 +00002597 return nullptr;
Chris Lattner83bd8282009-05-25 17:16:10 +00002598 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002599 }
Mike Stump11289f42009-09-09 15:08:12 +00002600
Chris Lattner83bd8282009-05-25 17:16:10 +00002601 // Things look ok, add the '#' and param name tokens to the macro.
2602 MI->AddTokenToBody(LastTok);
Mike Stump11289f42009-09-09 15:08:12 +00002603
Faisal Vali18268422017-10-15 01:26:26 +00002604 // If the token following '#' is VAOPT, let the next iteration handle it
2605 // and check it for correctness, otherwise add the token and prime the
2606 // loop with the next one.
2607 if (!VAOCtx.isVAOptToken(Tok)) {
2608 MI->AddTokenToBody(Tok);
2609 LastTok = Tok;
2610
2611 // Get the next token of the macro.
2612 LexUnexpandedToken(Tok);
2613 }
2614 }
2615 if (VAOCtx.isInVAOpt()) {
2616 assert(Tok.is(tok::eod) && "Must be at End Of preprocessing Directive");
2617 Diag(Tok, diag::err_pp_expected_after)
2618 << LastTok.getKind() << tok::r_paren;
2619 Diag(VAOCtx.getUnmatchedOpeningParenLoc(), diag::note_matching) << tok::l_paren;
2620 return nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002621 }
2622 }
Faisal Valiac506d72017-07-17 17:18:43 +00002623 MI->setDefinitionEndLoc(LastTok.getLocation());
Faisal Valiac506d72017-07-17 17:18:43 +00002624 return MI;
2625}
2626/// HandleDefineDirective - Implements \#define. This consumes the entire macro
2627/// line then lets the caller lex the next real token.
2628void Preprocessor::HandleDefineDirective(
2629 Token &DefineTok, const bool ImmediatelyAfterHeaderGuard) {
2630 ++NumDefined;
2631
2632 Token MacroNameTok;
2633 bool MacroShadowsKeyword;
2634 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
2635
2636 // Error reading macro name? If so, diagnostic already issued.
2637 if (MacroNameTok.is(tok::eod))
2638 return;
2639
2640 // If we are supposed to keep comments in #defines, reenable comment saving
2641 // mode.
2642 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
2643
2644 MacroInfo *const MI = ReadOptionalMacroParameterListAndBody(
2645 MacroNameTok, ImmediatelyAfterHeaderGuard);
Fangrui Song6907ce22018-07-30 19:24:48 +00002646
Faisal Valiac506d72017-07-17 17:18:43 +00002647 if (!MI) return;
Mike Stump11289f42009-09-09 15:08:12 +00002648
Serge Pavlov07c0f042014-12-18 11:14:21 +00002649 if (MacroShadowsKeyword &&
2650 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2651 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
Fangrui Song6907ce22018-07-30 19:24:48 +00002652 }
Chris Lattner57540c52011-04-15 05:22:18 +00002653 // Check that there is no paste (##) operator at the beginning or end of the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002654 // replacement list.
2655 unsigned NumTokens = MI->getNumTokens();
2656 if (NumTokens != 0) {
2657 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2658 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002659 return;
2660 }
2661 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2662 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002663 return;
2664 }
2665 }
Mike Stump11289f42009-09-09 15:08:12 +00002666
Erich Keane76675de2018-07-05 17:22:13 +00002667 // When skipping just warn about macros that do not match.
2668 if (SkippingUntilPCHThroughHeader) {
2669 const MacroInfo *OtherMI = getMacroInfo(MacroNameTok.getIdentifierInfo());
2670 if (!OtherMI || !MI->isIdenticalTo(*OtherMI, *this,
2671 /*Syntactic=*/LangOpts.MicrosoftExt))
2672 Diag(MI->getDefinitionLoc(), diag::warn_pp_macro_def_mismatch_with_pch)
2673 << MacroNameTok.getIdentifierInfo();
2674 return;
2675 }
Mike Stump11289f42009-09-09 15:08:12 +00002676
Chris Lattnerf64b3522008-03-09 01:54:53 +00002677 // Finally, if this identifier already had a macro defined for it, verify that
Alexander Kornienko8b3f6232012-08-29 00:20:03 +00002678 // the macro bodies are identical, and issue diagnostics if they are not.
Argyrios Kyrtzidis09c9e812013-02-20 00:54:57 +00002679 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
John McCall83760372015-12-10 23:31:01 +00002680 // In Objective-C, ignore attempts to directly redefine the builtin
2681 // definitions of the ownership qualifiers. It's still possible to
2682 // #undef them.
2683 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2684 return II->isStr("__strong") ||
2685 II->isStr("__weak") ||
2686 II->isStr("__unsafe_unretained") ||
2687 II->isStr("__autoreleasing");
2688 };
Erik Pilkingtonfa983902018-10-30 20:31:30 +00002689 if (getLangOpts().ObjC &&
John McCall83760372015-12-10 23:31:01 +00002690 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2691 == getPredefinesFileID() &&
2692 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2693 // Warn if it changes the tokens.
2694 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2695 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2696 !MI->isIdenticalTo(*OtherMI, *this,
2697 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2698 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2699 }
2700 assert(!OtherMI->isWarnIfUnused());
2701 return;
2702 }
2703
Chris Lattner5244f342009-01-16 19:50:11 +00002704 // It is very common for system headers to have tons of macro redefinitions
2705 // and for warnings to be disabled in system headers. If this is the case,
2706 // then don't bother calling MacroInfo::isIdenticalTo.
Chris Lattner80c21df2009-03-13 21:17:23 +00002707 if (!getDiagnostics().getSuppressSystemWarnings() ||
Chris Lattner5244f342009-01-16 19:50:11 +00002708 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002709 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
Chris Lattner5244f342009-01-16 19:50:11 +00002710 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002711
Taewook Oh755e4d22016-06-13 21:55:33 +00002712 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
Richard Smith7b242542013-03-06 00:46:00 +00002713 // C++ [cpp.predefined]p4, but allow it as an extension.
2714 if (OtherMI->isBuiltinMacro())
2715 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
Chris Lattnerc0a585d2010-08-17 15:55:45 +00002716 // Macros must be identical. This means all tokens and whitespace
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002717 // separation must be the same. C99 6.10.3p2.
Richard Smith7b242542013-03-06 00:46:00 +00002718 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002719 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
Chris Lattner5244f342009-01-16 19:50:11 +00002720 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2721 << MacroNameTok.getIdentifierInfo();
2722 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2723 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002724 }
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002725 if (OtherMI->isWarnIfUnused())
2726 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002727 }
Mike Stump11289f42009-09-09 15:08:12 +00002728
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002729 DefMacroDirective *MD =
2730 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
Mike Stump11289f42009-09-09 15:08:12 +00002731
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002732 assert(!MI->isUsed());
2733 // If we need warning for not using the macro, add its location in the
2734 // warn-because-unused-macro set. If it gets used it will be removed from set.
Eli Friedman5ba37d52013-08-22 00:27:10 +00002735 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
Alp Tokerd4a3f0e2014-06-15 23:30:39 +00002736 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc())) {
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002737 MI->setIsWarnIfUnused(true);
2738 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2739 }
2740
Chris Lattner928e9092009-04-12 01:39:54 +00002741 // If the callbacks want to know, tell them about the macro definition.
2742 if (Callbacks)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002743 Callbacks->MacroDefined(MacroNameTok, MD);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002744}
2745
James Dennettf6333ac2012-06-22 05:46:07 +00002746/// HandleUndefDirective - Implements \#undef.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002747///
Erik Verbruggen4bddef92016-10-26 08:52:41 +00002748void Preprocessor::HandleUndefDirective() {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002749 ++NumUndefined;
2750
2751 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00002752 ReadMacroName(MacroNameTok, MU_Undef);
Mike Stump11289f42009-09-09 15:08:12 +00002753
Chris Lattnerf64b3522008-03-09 01:54:53 +00002754 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002755 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002756 return;
Mike Stump11289f42009-09-09 15:08:12 +00002757
Chris Lattnerf64b3522008-03-09 01:54:53 +00002758 // Check to see if this is the last token on the #undef line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002759 CheckEndOfDirective("undef");
Mike Stump11289f42009-09-09 15:08:12 +00002760
Richard Smith20e883e2015-04-29 23:20:19 +00002761 // Okay, we have a valid identifier to undef.
2762 auto *II = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002763 auto MD = getMacroDefinition(II);
Vedant Kumar349a6242017-04-26 21:05:44 +00002764 UndefMacroDirective *Undef = nullptr;
Fangrui Song6907ce22018-07-30 19:24:48 +00002765
Vedant Kumar349a6242017-04-26 21:05:44 +00002766 // If the macro is not defined, this is a noop undef.
2767 if (const MacroInfo *MI = MD.getMacroInfo()) {
2768 if (!MI->isUsed() && MI->isWarnIfUnused())
2769 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
2770
2771 if (MI->isWarnIfUnused())
2772 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
2773
2774 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
2775 }
Mike Stump11289f42009-09-09 15:08:12 +00002776
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002777 // If the callbacks want to know, tell them about the macro #undef.
2778 // Note: no matter if the macro was defined or not.
Richard Smith36bd40d2015-05-04 03:15:40 +00002779 if (Callbacks)
Vedant Kumar349a6242017-04-26 21:05:44 +00002780 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002781
Vedant Kumar349a6242017-04-26 21:05:44 +00002782 if (Undef)
2783 appendMacroDirective(II, Undef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002784}
2785
Chris Lattnerf64b3522008-03-09 01:54:53 +00002786//===----------------------------------------------------------------------===//
2787// Preprocessor Conditional Directive Handling.
2788//===----------------------------------------------------------------------===//
2789
James Dennettf6333ac2012-06-22 05:46:07 +00002790/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
2791/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
2792/// true if any tokens have been returned or pp-directives activated before this
2793/// \#ifndef has been lexed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002794///
Vedant Kumar3919a502017-09-11 20:47:42 +00002795void Preprocessor::HandleIfdefDirective(Token &Result,
2796 const Token &HashToken,
2797 bool isIfndef,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002798 bool ReadAnyTokensBeforeDirective) {
2799 ++NumIf;
2800 Token DirectiveTok = Result;
2801
2802 Token MacroNameTok;
2803 ReadMacroName(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +00002804
Chris Lattnerf64b3522008-03-09 01:54:53 +00002805 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002806 if (MacroNameTok.is(tok::eod)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002807 // Skip code until we get to #endif. This helps with recovery by not
2808 // emitting an error when the #endif is reached.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002809 SkipExcludedConditionalBlock(HashToken.getLocation(),
2810 DirectiveTok.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002811 /*Foundnonskip*/ false, /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002812 return;
2813 }
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 #if[n]def line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002816 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002817
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002818 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002819 auto MD = getMacroDefinition(MII);
2820 MacroInfo *MI = MD.getMacroInfo();
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00002821
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002822 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002823 // If the start of a top-level #ifdef and if the macro is not defined,
2824 // inform MIOpt that this might be the start of a proper include guard.
2825 // Otherwise it is some other form of unknown conditional which we can't
2826 // handle.
Craig Topperd2d442c2014-05-17 23:10:59 +00002827 if (!ReadAnyTokensBeforeDirective && !MI) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002828 assert(isIfndef && "#ifdef shouldn't reach here");
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002829 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002830 } else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002831 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002832 }
2833
Chris Lattnerf64b3522008-03-09 01:54:53 +00002834 // If there is a macro, process it.
2835 if (MI) // Mark it used.
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002836 markMacroAsUsed(MI);
Mike Stump11289f42009-09-09 15:08:12 +00002837
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002838 if (Callbacks) {
2839 if (isIfndef)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002840 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002841 else
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002842 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002843 }
2844
Chris Lattnerf64b3522008-03-09 01:54:53 +00002845 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002846 if (PPOpts->SingleFileParseMode && !MI) {
2847 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2848 // the directive blocks.
2849 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002850 /*wasskip*/false, /*foundnonskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002851 /*foundelse*/false);
2852 } else if (!MI == isIfndef) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002853 // Yes, remember that we are inside a conditional, then lex the next token.
Chris Lattner8cf1f932009-12-14 04:54:40 +00002854 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
2855 /*wasskip*/false, /*foundnonskip*/true,
2856 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002857 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002858 // No, skip the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002859 SkipExcludedConditionalBlock(HashToken.getLocation(),
2860 DirectiveTok.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002861 /*Foundnonskip*/ false,
2862 /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002863 }
2864}
2865
James Dennettf6333ac2012-06-22 05:46:07 +00002866/// HandleIfDirective - Implements the \#if directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002867///
2868void Preprocessor::HandleIfDirective(Token &IfToken,
Vedant Kumar3919a502017-09-11 20:47:42 +00002869 const Token &HashToken,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002870 bool ReadAnyTokensBeforeDirective) {
2871 ++NumIf;
Mike Stump11289f42009-09-09 15:08:12 +00002872
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002873 // Parse and evaluate the conditional expression.
Craig Topperd2d442c2014-05-17 23:10:59 +00002874 IdentifierInfo *IfNDefMacro = nullptr;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002875 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002876 const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
2877 const bool ConditionalTrue = DER.Conditional;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002878 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Nuno Lopes363212b2008-06-01 18:31:24 +00002879
2880 // If this condition is equivalent to #ifndef X, and if this is the first
2881 // directive seen, handle it for the multiple-include optimization.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002882 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002883 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
Richard Smith089ee152013-06-16 05:05:39 +00002884 // FIXME: Pass in the location of the macro name, not the 'if' token.
2885 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
Nuno Lopes363212b2008-06-01 18:31:24 +00002886 else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002887 CurPPLexer->MIOpt.EnterTopLevelConditional();
Nuno Lopes363212b2008-06-01 18:31:24 +00002888 }
2889
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002890 if (Callbacks)
2891 Callbacks->If(IfToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002892 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002893 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002894
Chris Lattnerf64b3522008-03-09 01:54:53 +00002895 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002896 if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
2897 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2898 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002899 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002900 /*foundnonskip*/false, /*foundelse*/false);
2901 } else if (ConditionalTrue) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002902 // Yes, remember that we are inside a conditional, then lex the next token.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002903 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002904 /*foundnonskip*/true, /*foundelse*/false);
2905 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002906 // No, skip the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002907 SkipExcludedConditionalBlock(HashToken.getLocation(), IfToken.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002908 /*Foundnonskip*/ false,
2909 /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002910 }
2911}
2912
James Dennettf6333ac2012-06-22 05:46:07 +00002913/// HandleEndifDirective - Implements the \#endif directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002914///
2915void Preprocessor::HandleEndifDirective(Token &EndifToken) {
2916 ++NumEndif;
Mike Stump11289f42009-09-09 15:08:12 +00002917
Chris Lattnerf64b3522008-03-09 01:54:53 +00002918 // Check that this is the whole directive.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002919 CheckEndOfDirective("endif");
Mike Stump11289f42009-09-09 15:08:12 +00002920
Chris Lattnerf64b3522008-03-09 01:54:53 +00002921 PPConditionalInfo CondInfo;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002922 if (CurPPLexer->popConditionalLevel(CondInfo)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002923 // No conditionals on the stack: this is an #endif without an #if.
Chris Lattner907dfe92008-11-18 07:59:24 +00002924 Diag(EndifToken, diag::err_pp_endif_without_if);
2925 return;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002926 }
Mike Stump11289f42009-09-09 15:08:12 +00002927
Chris Lattnerf64b3522008-03-09 01:54:53 +00002928 // If this the end of a top-level #endif, inform MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002929 if (CurPPLexer->getConditionalStackDepth() == 0)
2930 CurPPLexer->MIOpt.ExitTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002931
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002932 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&
Chris Lattnerf64b3522008-03-09 01:54:53 +00002933 "This code should only be reachable in the non-skipping case!");
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002934
2935 if (Callbacks)
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002936 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002937}
2938
James Dennettf6333ac2012-06-22 05:46:07 +00002939/// HandleElseDirective - Implements the \#else directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002940///
Vedant Kumar3919a502017-09-11 20:47:42 +00002941void Preprocessor::HandleElseDirective(Token &Result, const Token &HashToken) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002942 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002943
Chris Lattnerf64b3522008-03-09 01:54:53 +00002944 // #else directive in a non-skipping conditional... start skipping.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002945 CheckEndOfDirective("else");
Mike Stump11289f42009-09-09 15:08:12 +00002946
Chris Lattnerf64b3522008-03-09 01:54:53 +00002947 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002948 if (CurPPLexer->popConditionalLevel(CI)) {
2949 Diag(Result, diag::pp_err_else_without_if);
2950 return;
2951 }
Mike Stump11289f42009-09-09 15:08:12 +00002952
Chris Lattnerf64b3522008-03-09 01:54:53 +00002953 // If this is a top-level #else, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002954 if (CurPPLexer->getConditionalStackDepth() == 0)
2955 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002956
2957 // If this is a #else with a #else before it, report the error.
2958 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +00002959
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002960 if (Callbacks)
2961 Callbacks->Else(Result.getLocation(), CI.IfLoc);
2962
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002963 if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002964 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2965 // the directive blocks.
2966 CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002967 /*foundnonskip*/false, /*foundelse*/true);
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002968 return;
2969 }
2970
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002971 // Finally, skip the rest of the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002972 SkipExcludedConditionalBlock(HashToken.getLocation(), CI.IfLoc,
2973 /*Foundnonskip*/ true,
Vedant Kumar3919a502017-09-11 20:47:42 +00002974 /*FoundElse*/ true, Result.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002975}
2976
James Dennettf6333ac2012-06-22 05:46:07 +00002977/// HandleElifDirective - Implements the \#elif directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002978///
Vedant Kumar3919a502017-09-11 20:47:42 +00002979void Preprocessor::HandleElifDirective(Token &ElifToken,
2980 const Token &HashToken) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002981 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002982
Chris Lattnerf64b3522008-03-09 01:54:53 +00002983 // #elif directive in a non-skipping conditional... start skipping.
2984 // We don't care what the condition is, because we will always skip it (since
2985 // the block immediately before it was included).
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002986 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002987 DiscardUntilEndOfDirective();
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002988 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002989
2990 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002991 if (CurPPLexer->popConditionalLevel(CI)) {
2992 Diag(ElifToken, diag::pp_err_elif_without_if);
2993 return;
2994 }
Mike Stump11289f42009-09-09 15:08:12 +00002995
Chris Lattnerf64b3522008-03-09 01:54:53 +00002996 // If this is a top-level #elif, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002997 if (CurPPLexer->getConditionalStackDepth() == 0)
2998 CurPPLexer->MIOpt.EnterTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002999
Chris Lattnerf64b3522008-03-09 01:54:53 +00003000 // If this is a #elif with a #else before it, report the error.
3001 if (CI.FoundElse) Diag(ElifToken, diag::pp_err_elif_after_else);
Taewook Oh755e4d22016-06-13 21:55:33 +00003002
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00003003 if (Callbacks)
3004 Callbacks->Elif(ElifToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00003005 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00003006 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00003007
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00003008 if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00003009 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3010 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00003011 CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00003012 /*foundnonskip*/false, /*foundelse*/false);
3013 return;
3014 }
3015
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00003016 // Finally, skip the rest of the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00003017 SkipExcludedConditionalBlock(
3018 HashToken.getLocation(), CI.IfLoc, /*Foundnonskip*/ true,
3019 /*FoundElse*/ CI.FoundElse, ElifToken.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00003020}