blob: 77ee1faf283f14765c185312a7dafef5f503b3fe [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
11/// \brief Implements # directive processing for the Preprocessor.
12///
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
James Dennettf6333ac2012-06-22 05:46:07 +000081/// \brief 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
Serge Pavlov07c0f042014-12-18 11:14:21 +000091/// \brief Enumerates possible cases of #define/#undef a reserved identifier.
92enum 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
98/// \brief Checks if the specified identifier is reserved in the specified
99/// 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
Serge Pavlov07c0f042014-12-18 11:14:21 +0000118static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
119 const LangOptions &Lang = PP.getLangOpts();
120 StringRef Text = II->getName();
121 if (isReservedId(Text, Lang))
122 return MD_ReservedMacro;
123 if (II->isKeyword(Lang))
124 return MD_KeywordDef;
125 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
126 return MD_KeywordDef;
127 return MD_NoWarn;
128}
129
130static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
131 const LangOptions &Lang = PP.getLangOpts();
132 StringRef Text = II->getName();
133 // Do not warn on keyword undef. It is generally harmless and widely used.
134 if (isReservedId(Text, Lang))
135 return MD_ReservedMacro;
136 return MD_NoWarn;
137}
138
Taewook Ohf42103c2016-06-13 20:40:21 +0000139// Return true if we want to issue a diagnostic by default if we
140// encounter this name in a #include with the wrong case. For now,
141// this includes the standard C and C++ headers, Posix headers,
142// and Boost headers. Improper case for these #includes is a
143// potential portability issue.
144static bool warnByDefaultOnWrongCase(StringRef Include) {
145 // If the first component of the path is "boost", treat this like a standard header
146 // for the purposes of diagnostics.
147 if (::llvm::sys::path::begin(Include)->equals_lower("boost"))
148 return true;
149
150 // "condition_variable" is the longest standard header name at 18 characters.
151 // If the include file name is longer than that, it can't be a standard header.
Taewook Oh755e4d22016-06-13 21:55:33 +0000152 static const size_t MaxStdHeaderNameLen = 18u;
Taewook Ohf42103c2016-06-13 20:40:21 +0000153 if (Include.size() > MaxStdHeaderNameLen)
154 return false;
155
156 // Lowercase and normalize the search string.
157 SmallString<32> LowerInclude{Include};
158 for (char &Ch : LowerInclude) {
159 // In the ASCII range?
George Burgess IV5d3bd932016-06-16 02:30:33 +0000160 if (static_cast<unsigned char>(Ch) > 0x7f)
Taewook Ohf42103c2016-06-13 20:40:21 +0000161 return false; // Can't be a standard header
162 // ASCII lowercase:
163 if (Ch >= 'A' && Ch <= 'Z')
164 Ch += 'a' - 'A';
165 // Normalize path separators for comparison purposes.
166 else if (::llvm::sys::path::is_separator(Ch))
167 Ch = '/';
168 }
169
170 // The standard C/C++ and Posix headers
171 return llvm::StringSwitch<bool>(LowerInclude)
172 // C library headers
173 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
174 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
175 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
176 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
177 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
178 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
179
180 // C++ headers for C library facilities
181 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
182 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
183 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
184 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
185 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
186 .Case("cwctype", true)
187
188 // C++ library headers
189 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
190 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
191 .Cases("atomic", "future", "map", "set", "type_traits", true)
192 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
193 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
194 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
195 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
196 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
197 .Cases("deque", "istream", "queue", "string", "valarray", true)
198 .Cases("exception", "iterator", "random", "strstream", "vector", true)
199 .Cases("forward_list", "limits", "ratio", "system_error", true)
200
201 // POSIX headers (which aren't also C headers)
202 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
203 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
204 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
205 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
206 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
207 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
208 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
209 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
210 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
211 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
212 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
213 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
214 .Default(false);
215}
216
Serge Pavlov07c0f042014-12-18 11:14:21 +0000217bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
218 bool *ShadowFlag) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000219 // Missing macro name?
220 if (MacroNameTok.is(tok::eod))
221 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
222
223 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Olivier Goffart90f981b2017-07-14 09:23:40 +0000224 if (!II)
225 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000226
Olivier Goffart90f981b2017-07-14 09:23:40 +0000227 if (II->isCPlusPlusOperatorKeyword()) {
Alp Tokere03e9e12014-05-31 16:32:22 +0000228 // C++ 2.5p2: Alternative tokens behave the same as its primary token
229 // except for their spellings.
230 Diag(MacroNameTok, getLangOpts().MicrosoftExt
231 ? diag::ext_pp_operator_used_as_macro_name
232 : diag::err_pp_operator_used_as_macro_name)
233 << II << MacroNameTok.getKind();
Alp Tokerc5d194fc2014-05-31 03:38:17 +0000234 // Allow #defining |and| and friends for Microsoft compatibility or
235 // recovery when legacy C headers are included in C++.
Alp Tokerb05e0b52014-05-21 06:13:51 +0000236 }
237
Serge Pavlovd024f522014-10-24 17:31:32 +0000238 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000239 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
240 return Diag(MacroNameTok, diag::err_defined_macro_name);
241 }
242
Richard Smith20e883e2015-04-29 23:20:19 +0000243 if (isDefineUndef == MU_Undef) {
244 auto *MI = getMacroInfo(II);
245 if (MI && MI->isBuiltinMacro()) {
246 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
247 // and C++ [cpp.predefined]p4], but allow it as an extension.
248 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
249 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000250 }
251
Serge Pavlov07c0f042014-12-18 11:14:21 +0000252 // If defining/undefining reserved identifier or a keyword, we need to issue
253 // a warning.
Serge Pavlov83cf0782014-12-11 12:18:08 +0000254 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
Serge Pavlov07c0f042014-12-18 11:14:21 +0000255 if (ShadowFlag)
256 *ShadowFlag = false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000257 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
Mehdi Amini99d1b292016-10-01 16:38:28 +0000258 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
Serge Pavlov07c0f042014-12-18 11:14:21 +0000259 MacroDiag D = MD_NoWarn;
260 if (isDefineUndef == MU_Define) {
261 D = shouldWarnOnMacroDef(*this, II);
262 }
263 else if (isDefineUndef == MU_Undef)
264 D = shouldWarnOnMacroUndef(*this, II);
265 if (D == MD_KeywordDef) {
266 // We do not want to warn on some patterns widely used in configuration
267 // scripts. This requires analyzing next tokens, so do not issue warnings
268 // now, only inform caller.
269 if (ShadowFlag)
270 *ShadowFlag = true;
271 }
272 if (D == MD_ReservedMacro)
273 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
Serge Pavlov83cf0782014-12-11 12:18:08 +0000274 }
275
Alp Tokerb05e0b52014-05-21 06:13:51 +0000276 // Okay, we got a good identifier.
277 return false;
278}
279
James Dennettf6333ac2012-06-22 05:46:07 +0000280/// \brief Lex and validate a macro name, which occurs after a
281/// \#define or \#undef.
282///
Serge Pavlovd024f522014-10-24 17:31:32 +0000283/// This sets the token kind to eod and discards the rest of the macro line if
284/// the macro name is invalid.
285///
286/// \param MacroNameTok Token that is expected to be a macro name.
Serge Pavlov07c0f042014-12-18 11:14:21 +0000287/// \param isDefineUndef Context in which macro is used.
288/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
289void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
290 bool *ShadowFlag) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000291 // Read the token, don't allow macro expansion on it.
292 LexUnexpandedToken(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +0000293
Douglas Gregor12785102010-08-24 20:21:13 +0000294 if (MacroNameTok.is(tok::code_completion)) {
295 if (CodeComplete)
Serge Pavlovd024f522014-10-24 17:31:32 +0000296 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000297 setCodeCompletionReached();
Douglas Gregor12785102010-08-24 20:21:13 +0000298 LexUnexpandedToken(MacroNameTok);
Douglas Gregor12785102010-08-24 20:21:13 +0000299 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000300
Serge Pavlov07c0f042014-12-18 11:14:21 +0000301 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
Chris Lattner907dfe92008-11-18 07:59:24 +0000302 return;
Alp Tokerb05e0b52014-05-21 06:13:51 +0000303
304 // Invalid macro name, read and discard the rest of the line and set the
305 // token kind to tok::eod if necessary.
306 if (MacroNameTok.isNot(tok::eod)) {
307 MacroNameTok.setKind(tok::eod);
308 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +0000309 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000310}
311
James Dennettf6333ac2012-06-22 05:46:07 +0000312/// \brief Ensure that the next token is a tok::eod token.
313///
314/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
Chris Lattner0003c272009-04-17 23:30:53 +0000315/// true, then we consider macros that expand to zero tokens as being ok.
316void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000317 Token Tmp;
Chris Lattner0003c272009-04-17 23:30:53 +0000318 // Lex unexpanded tokens for most directives: macros might expand to zero
319 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
320 // #line) allow empty macros.
321 if (EnableMacros)
322 Lex(Tmp);
323 else
324 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000325
Chris Lattnerf64b3522008-03-09 01:54:53 +0000326 // There should be no tokens after the directive, but we allow them as an
327 // extension.
328 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
329 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000330
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000331 if (Tmp.isNot(tok::eod)) {
Chris Lattner825676a2009-04-14 05:15:20 +0000332 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000333 // or if this is a macro-style preprocessing directive, because it is more
334 // trouble than it is worth to insert /**/ and check that there is no /**/
335 // in the range also.
Douglas Gregora771f462010-03-31 17:46:05 +0000336 FixItHint Hint;
David Blaikiebbafb8a2012-03-11 07:00:24 +0000337 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000338 !CurTokenLexer)
Douglas Gregora771f462010-03-31 17:46:05 +0000339 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
340 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000341 DiscardUntilEndOfDirective();
342 }
343}
344
James Dennettf6333ac2012-06-22 05:46:07 +0000345/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
346/// decided that the subsequent tokens are in the \#if'd out portion of the
347/// file. Lex the rest of the file, until we see an \#endif. If
Chris Lattnerf64b3522008-03-09 01:54:53 +0000348/// FoundNonSkipPortion is true, then we have already emitted code for part of
James Dennettf6333ac2012-06-22 05:46:07 +0000349/// this \#if directive, so \#else/\#elif blocks should never be entered.
350/// If ElseOk is true, then \#else directives are ok, if not, then we have
351/// already seen one so a \#else directive is a duplicate. When this returns,
352/// the caller can lex the first valid token.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000353void Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
Vedant Kumar3919a502017-09-11 20:47:42 +0000354 SourceLocation IfTokenLoc,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000355 bool FoundNonSkipPortion,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000356 bool FoundElse,
357 SourceLocation ElseLoc) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000358 ++NumSkipped;
David Blaikie7d170102013-05-15 07:37:26 +0000359 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?");
Chris Lattnerf64b3522008-03-09 01:54:53 +0000360
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000361 if (PreambleConditionalStack.reachedEOFWhileSkipping())
362 PreambleConditionalStack.clearSkipInfo();
363 else
364 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/ false,
365 FoundNonSkipPortion, FoundElse);
Mike Stump11289f42009-09-09 15:08:12 +0000366
Ted Kremenek56572ab2008-12-12 18:34:08 +0000367 if (CurPTHLexer) {
368 PTHSkipExcludedConditionalBlock();
369 return;
370 }
Mike Stump11289f42009-09-09 15:08:12 +0000371
Chris Lattnerf64b3522008-03-09 01:54:53 +0000372 // Enter raw mode to disable identifier lookup (and thus macro expansion),
373 // disabling warnings, etc.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000374 CurPPLexer->LexingRawMode = true;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000375 Token Tok;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000376 while (true) {
Chris Lattnerf406b242010-01-18 22:33:01 +0000377 CurLexer->Lex(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000378
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000379 if (Tok.is(tok::code_completion)) {
380 if (CodeComplete)
381 CodeComplete->CodeCompleteInConditionalExclusion();
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000382 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000383 continue;
384 }
Taewook Oh755e4d22016-06-13 21:55:33 +0000385
Chris Lattnerf64b3522008-03-09 01:54:53 +0000386 // If this is the end of the buffer, we have an error.
387 if (Tok.is(tok::eof)) {
Ilya Biryukov8f738ac2017-09-12 08:35:57 +0000388 // We don't emit errors for unterminated conditionals here,
389 // Lexer::LexEndOfFile can do that propertly.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000390 // Just return and let the caller lex after this #include.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000391 if (PreambleConditionalStack.isRecording())
392 PreambleConditionalStack.SkipInfo.emplace(
393 HashTokenLoc, IfTokenLoc, FoundNonSkipPortion, FoundElse, ElseLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000394 break;
395 }
Mike Stump11289f42009-09-09 15:08:12 +0000396
Chris Lattnerf64b3522008-03-09 01:54:53 +0000397 // If this token is not a preprocessor directive, just skip it.
398 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
399 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000400
Chris Lattnerf64b3522008-03-09 01:54:53 +0000401 // We just parsed a # character at the start of a line, so we're in
402 // directive mode. Tell the lexer this so any newlines we see will be
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000403 // converted into an EOD token (this terminates the macro).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000404 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rose176057b2013-02-22 00:32:00 +0000405 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000406
Mike Stump11289f42009-09-09 15:08:12 +0000407
Chris Lattnerf64b3522008-03-09 01:54:53 +0000408 // Read the next token, the directive flavor.
409 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000410
Chris Lattnerf64b3522008-03-09 01:54:53 +0000411 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
412 // something bogus), skip it.
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000413 if (Tok.isNot(tok::raw_identifier)) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000414 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000415 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000416 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000417 continue;
418 }
419
420 // If the first letter isn't i or e, it isn't intesting to us. We know that
421 // this is safe in the face of spelling differences, because there is no way
422 // to spell an i/e in a strange way that is another letter. Skipping this
423 // allows us to avoid looking up the identifier info for #define/#undef and
424 // other common directives.
Alp Toker2d57cea2014-05-17 04:53:25 +0000425 StringRef RI = Tok.getRawIdentifier();
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000426
Alp Toker2d57cea2014-05-17 04:53:25 +0000427 char FirstChar = RI[0];
Mike Stump11289f42009-09-09 15:08:12 +0000428 if (FirstChar >= 'a' && FirstChar <= 'z' &&
Chris Lattnerf64b3522008-03-09 01:54:53 +0000429 FirstChar != 'i' && FirstChar != 'e') {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000430 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000431 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000432 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000433 continue;
434 }
Mike Stump11289f42009-09-09 15:08:12 +0000435
Chris Lattnerf64b3522008-03-09 01:54:53 +0000436 // Get the identifier name without trigraphs or embedded newlines. Note
437 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
438 // when skipping.
Benjamin Kramer144884642009-12-31 13:32:38 +0000439 char DirectiveBuf[20];
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000440 StringRef Directive;
Alp Toker2d57cea2014-05-17 04:53:25 +0000441 if (!Tok.needsCleaning() && RI.size() < 20) {
442 Directive = RI;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000443 } else {
444 std::string DirectiveStr = getSpelling(Tok);
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000445 size_t IdLen = DirectiveStr.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000446 if (IdLen >= 20) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000447 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000448 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000449 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000450 continue;
451 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000452 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000453 Directive = StringRef(DirectiveBuf, IdLen);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000454 }
Mike Stump11289f42009-09-09 15:08:12 +0000455
Benjamin Kramer144884642009-12-31 13:32:38 +0000456 if (Directive.startswith("if")) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000457 StringRef Sub = Directive.substr(2);
Benjamin Kramer144884642009-12-31 13:32:38 +0000458 if (Sub.empty() || // "if"
459 Sub == "def" || // "ifdef"
460 Sub == "ndef") { // "ifndef"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000461 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
462 // bother parsing the condition.
463 DiscardUntilEndOfDirective();
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000464 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000465 /*foundnonskip*/false,
Chandler Carruth540960f2011-01-03 17:40:17 +0000466 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000467 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000468 } else if (Directive[0] == 'e') {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000469 StringRef Sub = Directive.substr(1);
Benjamin Kramer144884642009-12-31 13:32:38 +0000470 if (Sub == "ndif") { // "endif"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000471 PPConditionalInfo CondInfo;
472 CondInfo.WasSkipping = true; // Silence bogus warning.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000473 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000474 (void)InCond; // Silence warning in no-asserts mode.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000475 assert(!InCond && "Can't be skipping if not in a conditional!");
Mike Stump11289f42009-09-09 15:08:12 +0000476
Chris Lattnerf64b3522008-03-09 01:54:53 +0000477 // If we popped the outermost skipping block, we're done skipping!
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000478 if (!CondInfo.WasSkipping) {
Richard Smith87d8fb92012-06-24 23:56:26 +0000479 // Restore the value of LexingRawMode so that trailing comments
480 // are handled correctly, if we've reached the outermost block.
481 CurPPLexer->LexingRawMode = false;
Richard Smithd0124572012-06-21 00:35:03 +0000482 CheckEndOfDirective("endif");
Richard Smith87d8fb92012-06-24 23:56:26 +0000483 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000484 if (Callbacks)
485 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000486 break;
Richard Smithd0124572012-06-21 00:35:03 +0000487 } else {
488 DiscardUntilEndOfDirective();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000489 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000490 } else if (Sub == "lse") { // "else".
Chris Lattnerf64b3522008-03-09 01:54:53 +0000491 // #else directive in a skipping conditional. If not in some other
492 // skipping conditional, and if #else hasn't already been seen, enter it
493 // as a non-skipping conditional.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000494 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Mike Stump11289f42009-09-09 15:08:12 +0000495
Chris Lattnerf64b3522008-03-09 01:54:53 +0000496 // If this is a #else with a #else before it, report the error.
497 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000498
Chris Lattnerf64b3522008-03-09 01:54:53 +0000499 // Note that we've seen a #else in this conditional.
500 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000501
Chris Lattnerf64b3522008-03-09 01:54:53 +0000502 // If the conditional is at the top level, and the #if block wasn't
503 // entered, enter the #else block now.
504 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
505 CondInfo.FoundNonSkip = true;
Richard Smith87d8fb92012-06-24 23:56:26 +0000506 // Restore the value of LexingRawMode so that trailing comments
507 // are handled correctly.
508 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000509 CheckEndOfDirective("else");
Richard Smith87d8fb92012-06-24 23:56:26 +0000510 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000511 if (Callbacks)
512 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000513 break;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000514 } else {
515 DiscardUntilEndOfDirective(); // C99 6.10p4.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000516 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000517 } else if (Sub == "lif") { // "elif".
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000518 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000519
John Thompson17c35732013-12-04 20:19:30 +0000520 // If this is a #elif with a #else before it, report the error.
521 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_elif_after_else);
522
Chris Lattnerf64b3522008-03-09 01:54:53 +0000523 // If this is in a skipping block or if we're already handled this #if
524 // block, don't bother parsing the condition.
525 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
526 DiscardUntilEndOfDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000527 } else {
John Thompson17c35732013-12-04 20:19:30 +0000528 const SourceLocation CondBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000529 // Restore the value of LexingRawMode so that identifiers are
530 // looked up, etc, inside the #elif expression.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000531 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
532 CurPPLexer->LexingRawMode = false;
Craig Topperd2d442c2014-05-17 23:10:59 +0000533 IdentifierInfo *IfNDefMacro = nullptr;
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +0000534 const bool CondValue = EvaluateDirectiveExpression(IfNDefMacro).Conditional;
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000535 CurPPLexer->LexingRawMode = true;
John Thompson17c35732013-12-04 20:19:30 +0000536 if (Callbacks) {
537 const SourceLocation CondEnd = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000538 Callbacks->Elif(Tok.getLocation(),
John Thompson17c35732013-12-04 20:19:30 +0000539 SourceRange(CondBegin, CondEnd),
John Thompson87f9fef2013-12-07 08:41:15 +0000540 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False), CondInfo.IfLoc);
John Thompson17c35732013-12-04 20:19:30 +0000541 }
542 // If this condition is true, enter it!
543 if (CondValue) {
544 CondInfo.FoundNonSkip = true;
545 break;
546 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000547 }
548 }
549 }
Mike Stump11289f42009-09-09 15:08:12 +0000550
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000551 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000552 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000553 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000554 }
555
556 // Finally, if we are out of the conditional (saw an #endif or ran off the end
557 // of the file, just stop skipping and return to lexing whatever came after
558 // the #if block.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000559 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000560
Vedant Kumar3919a502017-09-11 20:47:42 +0000561 if (Callbacks)
562 Callbacks->SourceRangeSkipped(
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +0000563 SourceRange(HashTokenLoc, CurPPLexer->getSourceLocation()),
Vedant Kumar3919a502017-09-11 20:47:42 +0000564 Tok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +0000565}
566
Ted Kremenek56572ab2008-12-12 18:34:08 +0000567void Preprocessor::PTHSkipExcludedConditionalBlock() {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000568 while (true) {
Ted Kremenek56572ab2008-12-12 18:34:08 +0000569 assert(CurPTHLexer);
570 assert(CurPTHLexer->LexingRawMode == false);
Mike Stump11289f42009-09-09 15:08:12 +0000571
Ted Kremenek56572ab2008-12-12 18:34:08 +0000572 // Skip to the next '#else', '#elif', or #endif.
573 if (CurPTHLexer->SkipBlock()) {
574 // We have reached an #endif. Both the '#' and 'endif' tokens
575 // have been consumed by the PTHLexer. Just pop off the condition level.
576 PPConditionalInfo CondInfo;
577 bool InCond = CurPTHLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000578 (void)InCond; // Silence warning in no-asserts mode.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000579 assert(!InCond && "Can't be skipping if not in a conditional!");
580 break;
581 }
Mike Stump11289f42009-09-09 15:08:12 +0000582
Ted Kremenek56572ab2008-12-12 18:34:08 +0000583 // We have reached a '#else' or '#elif'. Lex the next token to get
584 // the directive flavor.
585 Token Tok;
586 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000587
Ted Kremenek56572ab2008-12-12 18:34:08 +0000588 // We can actually look up the IdentifierInfo here since we aren't in
589 // raw mode.
590 tok::PPKeywordKind K = Tok.getIdentifierInfo()->getPPKeywordID();
591
592 if (K == tok::pp_else) {
593 // #else: Enter the else condition. We aren't in a nested condition
594 // since we skip those. We're always in the one matching the last
595 // blocked we skipped.
596 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
597 // Note that we've seen a #else in this conditional.
598 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000599
Ted Kremenek56572ab2008-12-12 18:34:08 +0000600 // If the #if block wasn't entered then enter the #else block now.
601 if (!CondInfo.FoundNonSkip) {
602 CondInfo.FoundNonSkip = true;
Mike Stump11289f42009-09-09 15:08:12 +0000603
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000604 // Scan until the eod token.
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000605 CurPTHLexer->ParsingPreprocessorDirective = true;
Daniel Dunbar2cba6be2009-04-13 17:57:49 +0000606 DiscardUntilEndOfDirective();
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000607 CurPTHLexer->ParsingPreprocessorDirective = false;
Mike Stump11289f42009-09-09 15:08:12 +0000608
Ted Kremenek56572ab2008-12-12 18:34:08 +0000609 break;
610 }
Mike Stump11289f42009-09-09 15:08:12 +0000611
Ted Kremenek56572ab2008-12-12 18:34:08 +0000612 // Otherwise skip this block.
613 continue;
614 }
Mike Stump11289f42009-09-09 15:08:12 +0000615
Ted Kremenek56572ab2008-12-12 18:34:08 +0000616 assert(K == tok::pp_elif);
617 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
618
619 // If this is a #elif with a #else before it, report the error.
620 if (CondInfo.FoundElse)
621 Diag(Tok, diag::pp_err_elif_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000622
Ted Kremenek56572ab2008-12-12 18:34:08 +0000623 // If this is in a skipping block or if we're already handled this #if
Mike Stump11289f42009-09-09 15:08:12 +0000624 // block, don't bother parsing the condition. We just skip this block.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000625 if (CondInfo.FoundNonSkip)
626 continue;
627
628 // Evaluate the condition of the #elif.
Craig Topperd2d442c2014-05-17 23:10:59 +0000629 IdentifierInfo *IfNDefMacro = nullptr;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000630 CurPTHLexer->ParsingPreprocessorDirective = true;
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +0000631 bool ShouldEnter = EvaluateDirectiveExpression(IfNDefMacro).Conditional;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000632 CurPTHLexer->ParsingPreprocessorDirective = false;
633
634 // If this condition is true, enter it!
635 if (ShouldEnter) {
636 CondInfo.FoundNonSkip = true;
637 break;
638 }
639
640 // Otherwise, skip this block and go to the next one.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000641 }
642}
643
Richard Smith2a553082015-04-23 22:58:06 +0000644Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
Richard Smith7e82e012016-02-19 22:25:36 +0000645 if (!SourceMgr.isInMainFile(Loc)) {
646 // Try to determine the module of the include directive.
647 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
648 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
649 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
650 // The include comes from an included file.
651 return HeaderInfo.getModuleMap()
652 .findModuleForHeader(EntryOfIncl)
653 .getModule();
654 }
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000655 }
Richard Smith7e82e012016-02-19 22:25:36 +0000656
657 // This is either in the main file or not in a file at all. It belongs
658 // to the current module, if there is one.
659 return getLangOpts().CurrentModule.empty()
660 ? nullptr
661 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000662}
663
Richard Smith4eb83932016-04-27 21:57:05 +0000664const FileEntry *
665Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000666 Module *M,
Richard Smith4eb83932016-04-27 21:57:05 +0000667 SourceLocation Loc) {
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000668 assert(M && "no module to include");
669
Richard Smith4eb83932016-04-27 21:57:05 +0000670 // If we have a module import syntax, we shouldn't include a header to
671 // make a particular module visible.
672 if (getLangOpts().ObjC2)
673 return nullptr;
674
Richard Smith4eb83932016-04-27 21:57:05 +0000675 Module *TopM = M->getTopLevelModule();
676 Module *IncM = getModuleForLocation(IncLoc);
677
678 // Walk up through the include stack, looking through textual headers of M
679 // until we hit a non-textual header that we can #include. (We assume textual
680 // headers of a module with non-textual headers aren't meant to be used to
681 // import entities from the module.)
682 auto &SM = getSourceManager();
683 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
684 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
685 auto *FE = SM.getFileEntryForID(ID);
Richard Smith040e1262017-06-02 01:55:39 +0000686 if (!FE)
687 break;
Richard Smith4eb83932016-04-27 21:57:05 +0000688
689 bool InTextualHeader = false;
690 for (auto Header : HeaderInfo.getModuleMap().findAllModulesForHeader(FE)) {
691 if (!Header.getModule()->isSubModuleOf(TopM))
692 continue;
693
694 if (!(Header.getRole() & ModuleMap::TextualHeader)) {
695 // If this is an accessible, non-textual header of M's top-level module
696 // that transitively includes the given location and makes the
697 // corresponding module visible, this is the thing to #include.
698 if (Header.isAccessibleFrom(IncM))
699 return FE;
700
701 // It's in a private header; we can't #include it.
702 // FIXME: If there's a public header in some module that re-exports it,
703 // then we could suggest including that, but it's not clear that's the
704 // expected way to make this entity visible.
705 continue;
706 }
707
708 InTextualHeader = true;
709 }
710
711 if (!InTextualHeader)
712 break;
713
714 Loc = SM.getIncludeLoc(ID);
715 }
716
717 return nullptr;
718}
719
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000720const FileEntry *Preprocessor::LookupFile(
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000721 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
722 const DirectoryLookup *FromDir, const FileEntry *FromFile,
723 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
Douglas Gregor97eec242011-09-15 22:00:41 +0000724 SmallVectorImpl<char> *RelativePath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000725 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool SkipCache) {
Taewook Oh755e4d22016-06-13 21:55:33 +0000726 Module *RequestingModule = getModuleForLocation(FilenameLoc);
Richard Smith8d4e90b2016-03-14 17:52:37 +0000727 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
Richard Smith3d5b48c2015-10-16 21:42:56 +0000728
Will Wilson0fafd342013-12-27 19:46:16 +0000729 // If the header lookup mechanism may be relative to the current inclusion
730 // stack, record the parent #includes.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000731 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
732 Includers;
Manman Rene4a5d372016-05-17 02:15:12 +0000733 bool BuildSystemModule = false;
Richard Smith25d50752014-10-20 00:15:49 +0000734 if (!FromDir && !FromFile) {
Chris Lattnerd32480d2009-01-17 06:22:33 +0000735 FileID FID = getCurrentFileLexer()->getFileID();
Will Wilson0fafd342013-12-27 19:46:16 +0000736 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
Mike Stump11289f42009-09-09 15:08:12 +0000737
Chris Lattner022923a2009-02-04 19:45:07 +0000738 // If there is no file entry associated with this file, it must be the
Richard Smith3c1a41a2014-12-02 00:08:08 +0000739 // predefines buffer or the module includes buffer. Any other file is not
740 // lexed with a normal lexer, so it won't be scanned for preprocessor
741 // directives.
742 //
743 // If we have the predefines buffer, resolve #include references (which come
744 // from the -include command line argument) from the current working
745 // directory instead of relative to the main file.
746 //
747 // If we have the module includes buffer, resolve #include references (which
748 // come from header declarations in the module map) relative to the module
749 // map file.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000750 if (!FileEnt) {
Manman Rene4a5d372016-05-17 02:15:12 +0000751 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Richard Smith3c1a41a2014-12-02 00:08:08 +0000752 Includers.push_back(std::make_pair(nullptr, MainFileDir));
Manman Rene4a5d372016-05-17 02:15:12 +0000753 BuildSystemModule = getCurrentModule()->IsSystem;
754 } else if ((FileEnt =
Richard Smith3c1a41a2014-12-02 00:08:08 +0000755 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000756 Includers.push_back(std::make_pair(FileEnt, FileMgr.getDirectory(".")));
757 } else {
758 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
759 }
Will Wilson0fafd342013-12-27 19:46:16 +0000760
761 // MSVC searches the current include stack from top to bottom for
762 // headers included by quoted include directives.
763 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
Alp Tokerbfa39342014-01-14 12:51:41 +0000764 if (LangOpts.MSVCCompat && !isAngled) {
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000765 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Will Wilson0fafd342013-12-27 19:46:16 +0000766 if (IsFileLexer(ISEntry))
Yaron Keren65224612015-12-18 10:30:12 +0000767 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000768 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
Will Wilson0fafd342013-12-27 19:46:16 +0000769 }
Chris Lattner022923a2009-02-04 19:45:07 +0000770 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000771 }
Mike Stump11289f42009-09-09 15:08:12 +0000772
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000773 CurDir = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +0000774
775 if (FromFile) {
776 // We're supposed to start looking from after a particular file. Search
777 // the include path until we find that file or run out of files.
778 const DirectoryLookup *TmpCurDir = CurDir;
779 const DirectoryLookup *TmpFromDir = nullptr;
780 while (const FileEntry *FE = HeaderInfo.LookupFile(
781 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000782 Includers, SearchPath, RelativePath, RequestingModule,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000783 SuggestedModule, /*IsMapped=*/nullptr, SkipCache)) {
Richard Smith25d50752014-10-20 00:15:49 +0000784 // Keep looking as if this file did a #include_next.
785 TmpFromDir = TmpCurDir;
786 ++TmpFromDir;
787 if (FE == FromFile) {
788 // Found it.
789 FromDir = TmpFromDir;
790 CurDir = TmpCurDir;
791 break;
792 }
793 }
794 }
795
796 // Do a standard file entry lookup.
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000797 const FileEntry *FE = HeaderInfo.LookupFile(
Will Wilson0fafd342013-12-27 19:46:16 +0000798 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000799 RelativePath, RequestingModule, SuggestedModule, IsMapped, SkipCache,
Manman Rene4a5d372016-05-17 02:15:12 +0000800 BuildSystemModule);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000801 if (FE) {
Daniel Jasper5c77e392014-03-14 14:53:17 +0000802 if (SuggestedModule && !LangOpts.AsmPreprocessor)
Daniel Jasper92669ee2013-12-20 12:09:36 +0000803 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000804 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
805 Filename, FE);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000806 return FE;
807 }
Mike Stump11289f42009-09-09 15:08:12 +0000808
Will Wilson0fafd342013-12-27 19:46:16 +0000809 const FileEntry *CurFileEnt;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000810 // Otherwise, see if this is a subframework header. If so, this is relative
811 // to one of the headers on the #include stack. Walk the list of the current
812 // headers on the #include stack and pass them to HeaderInfo.
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000813 if (IsFileLexer()) {
Yaron Keren65224612015-12-18 10:30:12 +0000814 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000815 if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt,
Douglas Gregorf5f94522013-02-08 00:10:48 +0000816 SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000817 RequestingModule,
Ben Langmuir71e1a642014-05-05 21:44:13 +0000818 SuggestedModule))) {
819 if (SuggestedModule && !LangOpts.AsmPreprocessor)
820 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000821 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
822 Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000823 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000824 }
825 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000826 }
Mike Stump11289f42009-09-09 15:08:12 +0000827
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000828 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000829 if (IsFileLexer(ISEntry)) {
Yaron Keren65224612015-12-18 10:30:12 +0000830 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
Manuel Klimek0c69fd22011-04-26 21:50:03 +0000831 if ((FE = HeaderInfo.LookupSubframeworkHeader(
Douglas Gregorf5f94522013-02-08 00:10:48 +0000832 Filename, CurFileEnt, SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000833 RequestingModule, SuggestedModule))) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000834 if (SuggestedModule && !LangOpts.AsmPreprocessor)
835 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000836 RequestingModule, RequestingModuleIsModuleInterface,
837 FilenameLoc, Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000838 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000839 }
840 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000841 }
842 }
Mike Stump11289f42009-09-09 15:08:12 +0000843
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000844 // Otherwise, we really couldn't find the file.
Craig Topperd2d442c2014-05-17 23:10:59 +0000845 return nullptr;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000846}
847
Chris Lattnerf64b3522008-03-09 01:54:53 +0000848//===----------------------------------------------------------------------===//
849// Preprocessor Directive Handling.
850//===----------------------------------------------------------------------===//
851
David Blaikied5321242012-06-06 18:52:13 +0000852class Preprocessor::ResetMacroExpansionHelper {
853public:
854 ResetMacroExpansionHelper(Preprocessor *pp)
855 : PP(pp), save(pp->DisableMacroExpansion) {
856 if (pp->MacroExpansionInDirectivesOverride)
857 pp->DisableMacroExpansion = false;
858 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000859
David Blaikied5321242012-06-06 18:52:13 +0000860 ~ResetMacroExpansionHelper() {
861 PP->DisableMacroExpansion = save;
862 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000863
David Blaikied5321242012-06-06 18:52:13 +0000864private:
865 Preprocessor *PP;
866 bool save;
867};
868
Chris Lattnerf64b3522008-03-09 01:54:53 +0000869/// HandleDirective - This callback is invoked when the lexer sees a # token
Mike Stump11289f42009-09-09 15:08:12 +0000870/// at the start of a line. This consumes the directive, modifies the
Chris Lattnerf64b3522008-03-09 01:54:53 +0000871/// lexer/preprocessor state, and advances the lexer(s) so that the next token
872/// read is the correct one.
873void Preprocessor::HandleDirective(Token &Result) {
874 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
Mike Stump11289f42009-09-09 15:08:12 +0000875
Chris Lattnerf64b3522008-03-09 01:54:53 +0000876 // We just parsed a # character at the start of a line, so we're in directive
877 // mode. Tell the lexer this so any newlines we see will be converted into an
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000878 // EOD token (which terminates the directive).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000879 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000880 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Mike Stump11289f42009-09-09 15:08:12 +0000881
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000882 bool ImmediatelyAfterTopLevelIfndef =
883 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
884 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
885
Chris Lattnerf64b3522008-03-09 01:54:53 +0000886 ++NumDirectives;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +0000887
Chris Lattnerf64b3522008-03-09 01:54:53 +0000888 // We are about to read a token. For the multiple-include optimization FA to
Mike Stump11289f42009-09-09 15:08:12 +0000889 // work, we have to remember if we had read any tokens *before* this
Chris Lattnerf64b3522008-03-09 01:54:53 +0000890 // pp-directive.
Chris Lattner8cf1f932009-12-14 04:54:40 +0000891 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
Mike Stump11289f42009-09-09 15:08:12 +0000892
Chris Lattner2d17ab72009-03-18 21:00:25 +0000893 // Save the '#' token in case we need to return it later.
894 Token SavedHash = Result;
Mike Stump11289f42009-09-09 15:08:12 +0000895
Chris Lattnerf64b3522008-03-09 01:54:53 +0000896 // Read the next token, the directive flavor. This isn't expanded due to
897 // C99 6.10.3p8.
898 LexUnexpandedToken(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000899
Chris Lattnerf64b3522008-03-09 01:54:53 +0000900 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
901 // #define A(x) #x
902 // A(abc
903 // #warning blah
904 // def)
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000905 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
906 // not support this for #include-like directives, since that can result in
907 // terrible diagnostics, and does not work in GCC.
908 if (InMacroArgs) {
909 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
910 switch (II->getPPKeywordID()) {
911 case tok::pp_include:
912 case tok::pp_import:
913 case tok::pp_include_next:
914 case tok::pp___include_macros:
David Majnemerf2d3bc02014-12-28 07:42:49 +0000915 case tok::pp_pragma:
916 Diag(Result, diag::err_embedded_directive) << II->getName();
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000917 DiscardUntilEndOfDirective();
918 return;
919 default:
920 break;
921 }
922 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000923 Diag(Result, diag::ext_embedded_directive);
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000924 }
Mike Stump11289f42009-09-09 15:08:12 +0000925
David Blaikied5321242012-06-06 18:52:13 +0000926 // Temporarily enable macro expansion if set so
927 // and reset to previous state when returning from this function.
928 ResetMacroExpansionHelper helper(this);
929
Chris Lattnerf64b3522008-03-09 01:54:53 +0000930 switch (Result.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000931 case tok::eod:
Chris Lattnerf64b3522008-03-09 01:54:53 +0000932 return; // null directive.
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000933 case tok::code_completion:
934 if (CodeComplete)
935 CodeComplete->CodeCompleteDirective(
936 CurPPLexer->getConditionalStackDepth() > 0);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000937 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000938 return;
Chris Lattner76e68962009-01-26 06:19:46 +0000939 case tok::numeric_constant: // # 7 GNU line marker directive.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000940 if (getLangOpts().AsmPreprocessor)
Chris Lattner5eb8ae22009-03-18 20:41:10 +0000941 break; // # 4 is not a preprocessor directive in .S files.
Chris Lattner76e68962009-01-26 06:19:46 +0000942 return HandleDigitDirective(Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000943 default:
944 IdentifierInfo *II = Result.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +0000945 if (!II) break; // Not an identifier.
Mike Stump11289f42009-09-09 15:08:12 +0000946
Chris Lattnerf64b3522008-03-09 01:54:53 +0000947 // Ask what the preprocessor keyword ID is.
948 switch (II->getPPKeywordID()) {
949 default: break;
950 // C99 6.10.1 - Conditional Inclusion.
951 case tok::pp_if:
Vedant Kumar3919a502017-09-11 20:47:42 +0000952 return HandleIfDirective(Result, SavedHash, ReadAnyTokensBeforeDirective);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000953 case tok::pp_ifdef:
Vedant Kumar3919a502017-09-11 20:47:42 +0000954 return HandleIfdefDirective(Result, SavedHash, false,
955 true /*not valid for miopt*/);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000956 case tok::pp_ifndef:
Vedant Kumar3919a502017-09-11 20:47:42 +0000957 return HandleIfdefDirective(Result, SavedHash, true,
958 ReadAnyTokensBeforeDirective);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000959 case tok::pp_elif:
Vedant Kumar3919a502017-09-11 20:47:42 +0000960 return HandleElifDirective(Result, SavedHash);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000961 case tok::pp_else:
Vedant Kumar3919a502017-09-11 20:47:42 +0000962 return HandleElseDirective(Result, SavedHash);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000963 case tok::pp_endif:
964 return HandleEndifDirective(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000965
Chris Lattnerf64b3522008-03-09 01:54:53 +0000966 // C99 6.10.2 - Source File Inclusion.
967 case tok::pp_include:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000968 // Handle #include.
969 return HandleIncludeDirective(SavedHash.getLocation(), Result);
Chris Lattner14a7f392009-04-08 18:24:34 +0000970 case tok::pp___include_macros:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000971 // Handle -imacros.
Taewook Oh755e4d22016-06-13 21:55:33 +0000972 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +0000973
Chris Lattnerf64b3522008-03-09 01:54:53 +0000974 // C99 6.10.3 - Macro Replacement.
975 case tok::pp_define:
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000976 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000977 case tok::pp_undef:
Erik Verbruggen4bddef92016-10-26 08:52:41 +0000978 return HandleUndefDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000979
980 // C99 6.10.4 - Line Control.
981 case tok::pp_line:
Erik Verbruggen4bddef92016-10-26 08:52:41 +0000982 return HandleLineDirective();
Mike Stump11289f42009-09-09 15:08:12 +0000983
Chris Lattnerf64b3522008-03-09 01:54:53 +0000984 // C99 6.10.5 - Error Directive.
985 case tok::pp_error:
986 return HandleUserDiagnosticDirective(Result, false);
Mike Stump11289f42009-09-09 15:08:12 +0000987
Chris Lattnerf64b3522008-03-09 01:54:53 +0000988 // C99 6.10.6 - Pragma Directive.
989 case tok::pp_pragma:
Enea Zaffanella5afb04a2013-07-20 20:09:11 +0000990 return HandlePragmaDirective(SavedHash.getLocation(), PIK_HashPragma);
Mike Stump11289f42009-09-09 15:08:12 +0000991
Chris Lattnerf64b3522008-03-09 01:54:53 +0000992 // GNU Extensions.
993 case tok::pp_import:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000994 return HandleImportDirective(SavedHash.getLocation(), Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000995 case tok::pp_include_next:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000996 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +0000997
Chris Lattnerf64b3522008-03-09 01:54:53 +0000998 case tok::pp_warning:
999 Diag(Result, diag::ext_pp_warning_directive);
1000 return HandleUserDiagnosticDirective(Result, true);
1001 case tok::pp_ident:
1002 return HandleIdentSCCSDirective(Result);
1003 case tok::pp_sccs:
1004 return HandleIdentSCCSDirective(Result);
1005 case tok::pp_assert:
1006 //isExtension = true; // FIXME: implement #assert
1007 break;
1008 case tok::pp_unassert:
1009 //isExtension = true; // FIXME: implement #unassert
1010 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001011
Douglas Gregor663b48f2012-01-03 19:48:16 +00001012 case tok::pp___public_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001013 if (getLangOpts().Modules)
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001014 return HandleMacroPublicDirective(Result);
1015 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001016
Douglas Gregor663b48f2012-01-03 19:48:16 +00001017 case tok::pp___private_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001018 if (getLangOpts().Modules)
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001019 return HandleMacroPrivateDirective();
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001020 break;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001021 }
1022 break;
1023 }
Mike Stump11289f42009-09-09 15:08:12 +00001024
Chris Lattner2d17ab72009-03-18 21:00:25 +00001025 // If this is a .S file, treat unknown # directives as non-preprocessor
1026 // directives. This is important because # may be a comment or introduce
1027 // various pseudo-ops. Just return the # token and push back the following
1028 // token to be lexed next time.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001029 if (getLangOpts().AsmPreprocessor) {
David Blaikie2eabcc92016-02-09 18:52:09 +00001030 auto Toks = llvm::make_unique<Token[]>(2);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001031 // Return the # and the token after it.
Mike Stump11289f42009-09-09 15:08:12 +00001032 Toks[0] = SavedHash;
Chris Lattner2d17ab72009-03-18 21:00:25 +00001033 Toks[1] = Result;
Taewook Oh755e4d22016-06-13 21:55:33 +00001034
Chris Lattner56f64c12011-01-06 05:01:51 +00001035 // If the second token is a hashhash token, then we need to translate it to
1036 // unknown so the token lexer doesn't try to perform token pasting.
1037 if (Result.is(tok::hashhash))
1038 Toks[1].setKind(tok::unknown);
Taewook Oh755e4d22016-06-13 21:55:33 +00001039
Chris Lattner2d17ab72009-03-18 21:00:25 +00001040 // Enter this token stream so that we re-lex the tokens. Make sure to
1041 // enable macro expansion, in case the token after the # is an identifier
1042 // that is expanded.
David Blaikie2eabcc92016-02-09 18:52:09 +00001043 EnterTokenStream(std::move(Toks), 2, false);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001044 return;
1045 }
Mike Stump11289f42009-09-09 15:08:12 +00001046
Chris Lattnerf64b3522008-03-09 01:54:53 +00001047 // If we reached here, the preprocessing token is not valid!
1048 Diag(Result, diag::err_pp_invalid_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001049
Chris Lattnerf64b3522008-03-09 01:54:53 +00001050 // Read the rest of the PP line.
1051 DiscardUntilEndOfDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001052
Chris Lattnerf64b3522008-03-09 01:54:53 +00001053 // Okay, we're done parsing the directive.
1054}
1055
Chris Lattner76e68962009-01-26 06:19:46 +00001056/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1057/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1058static bool GetLineValue(Token &DigitTok, unsigned &Val,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001059 unsigned DiagID, Preprocessor &PP,
1060 bool IsGNULineDirective=false) {
Chris Lattner76e68962009-01-26 06:19:46 +00001061 if (DigitTok.isNot(tok::numeric_constant)) {
1062 PP.Diag(DigitTok, DiagID);
Mike Stump11289f42009-09-09 15:08:12 +00001063
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001064 if (DigitTok.isNot(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001065 PP.DiscardUntilEndOfDirective();
1066 return true;
1067 }
Mike Stump11289f42009-09-09 15:08:12 +00001068
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001069 SmallString<64> IntegerBuffer;
Chris Lattner76e68962009-01-26 06:19:46 +00001070 IntegerBuffer.resize(DigitTok.getLength());
1071 const char *DigitTokBegin = &IntegerBuffer[0];
Douglas Gregordc970f02010-03-16 22:30:13 +00001072 bool Invalid = false;
1073 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1074 if (Invalid)
1075 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001076
Chris Lattnerd66f1722009-04-18 18:35:15 +00001077 // Verify that we have a simple digit-sequence, and compute the value. This
1078 // is always a simple digit string computed in decimal, so we do this manually
1079 // here.
1080 Val = 0;
1081 for (unsigned i = 0; i != ActualLength; ++i) {
Richard Smith7f2707a2013-09-26 18:13:20 +00001082 // C++1y [lex.fcon]p1:
1083 // Optional separating single quotes in a digit-sequence are ignored
1084 if (DigitTokBegin[i] == '\'')
1085 continue;
1086
Jordan Rosea7d03842013-02-08 22:30:41 +00001087 if (!isDigit(DigitTokBegin[i])) {
Chris Lattnerd66f1722009-04-18 18:35:15 +00001088 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
Michael Ilsemane910cc82013-04-10 01:04:18 +00001089 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001090 PP.DiscardUntilEndOfDirective();
1091 return true;
1092 }
Mike Stump11289f42009-09-09 15:08:12 +00001093
Chris Lattnerd66f1722009-04-18 18:35:15 +00001094 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1095 if (NextVal < Val) { // overflow.
1096 PP.Diag(DigitTok, DiagID);
1097 PP.DiscardUntilEndOfDirective();
1098 return true;
1099 }
1100 Val = NextVal;
Chris Lattner76e68962009-01-26 06:19:46 +00001101 }
Mike Stump11289f42009-09-09 15:08:12 +00001102
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001103 if (DigitTokBegin[0] == '0' && Val)
Michael Ilsemane910cc82013-04-10 01:04:18 +00001104 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1105 << IsGNULineDirective;
Mike Stump11289f42009-09-09 15:08:12 +00001106
Chris Lattner76e68962009-01-26 06:19:46 +00001107 return false;
1108}
1109
James Dennettf6333ac2012-06-22 05:46:07 +00001110/// \brief Handle a \#line directive: C99 6.10.4.
1111///
1112/// The two acceptable forms are:
1113/// \verbatim
Chris Lattner100c65e2009-01-26 05:29:08 +00001114/// # line digit-sequence
1115/// # line digit-sequence "s-char-sequence"
James Dennettf6333ac2012-06-22 05:46:07 +00001116/// \endverbatim
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001117void Preprocessor::HandleLineDirective() {
Chris Lattner100c65e2009-01-26 05:29:08 +00001118 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1119 // expanded.
1120 Token DigitTok;
1121 Lex(DigitTok);
1122
Chris Lattner100c65e2009-01-26 05:29:08 +00001123 // Validate the number and convert it to an unsigned.
Chris Lattner76e68962009-01-26 06:19:46 +00001124 unsigned LineNo;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001125 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
Chris Lattner100c65e2009-01-26 05:29:08 +00001126 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001127
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001128 if (LineNo == 0)
1129 Diag(DigitTok, diag::ext_pp_line_zero);
Chris Lattner100c65e2009-01-26 05:29:08 +00001130
Chris Lattner76e68962009-01-26 06:19:46 +00001131 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1132 // number greater than 2147483647". C90 requires that the line # be <= 32767.
Eli Friedman192e0342011-10-10 23:35:28 +00001133 unsigned LineLimit = 32768U;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001134 if (LangOpts.C99 || LangOpts.CPlusPlus11)
Eli Friedman192e0342011-10-10 23:35:28 +00001135 LineLimit = 2147483648U;
Chris Lattner100c65e2009-01-26 05:29:08 +00001136 if (LineNo >= LineLimit)
1137 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001138 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
Richard Smithacd4d3d2011-10-15 01:18:56 +00001139 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
Mike Stump11289f42009-09-09 15:08:12 +00001140
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001141 int FilenameID = -1;
Chris Lattner100c65e2009-01-26 05:29:08 +00001142 Token StrTok;
1143 Lex(StrTok);
1144
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001145 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1146 // string followed by eod.
1147 if (StrTok.is(tok::eod))
Chris Lattner100c65e2009-01-26 05:29:08 +00001148 ; // ok
1149 else if (StrTok.isNot(tok::string_literal)) {
1150 Diag(StrTok, diag::err_pp_line_invalid_filename);
Richard Smithd67aea22012-03-06 03:21:47 +00001151 return DiscardUntilEndOfDirective();
1152 } else if (StrTok.hasUDSuffix()) {
1153 Diag(StrTok, diag::err_invalid_string_udl);
1154 return DiscardUntilEndOfDirective();
Chris Lattner100c65e2009-01-26 05:29:08 +00001155 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001156 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001157 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001158 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001159 if (Literal.hadError)
1160 return DiscardUntilEndOfDirective();
1161 if (Literal.Pascal) {
1162 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1163 return DiscardUntilEndOfDirective();
1164 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001165 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001166
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001167 // Verify that there is nothing after the string, other than EOD. Because
Chris Lattner0003c272009-04-17 23:30:53 +00001168 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1169 CheckEndOfDirective("line", true);
Chris Lattner100c65e2009-01-26 05:29:08 +00001170 }
Mike Stump11289f42009-09-09 15:08:12 +00001171
Reid Klecknereb00ee02017-05-22 21:42:58 +00001172 // Take the file kind of the file containing the #line directive. #line
1173 // directives are often used for generated sources from the same codebase, so
1174 // the new file should generally be classified the same way as the current
1175 // file. This is visible in GCC's pre-processed output, which rewrites #line
1176 // to GNU line markers.
1177 SrcMgr::CharacteristicKind FileKind =
1178 SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1179
1180 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1181 false, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001182
Chris Lattner839150e2009-03-27 17:13:49 +00001183 if (Callbacks)
Chris Lattnerc745cec2010-04-14 04:28:50 +00001184 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
Reid Klecknereb00ee02017-05-22 21:42:58 +00001185 PPCallbacks::RenameFile, FileKind);
Chris Lattner100c65e2009-01-26 05:29:08 +00001186}
1187
Chris Lattner76e68962009-01-26 06:19:46 +00001188/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1189/// marker directive.
1190static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
Reid Klecknereb00ee02017-05-22 21:42:58 +00001191 SrcMgr::CharacteristicKind &FileKind,
Chris Lattner76e68962009-01-26 06:19:46 +00001192 Preprocessor &PP) {
1193 unsigned FlagVal;
1194 Token FlagTok;
1195 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001196 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001197 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1198 return true;
1199
1200 if (FlagVal == 1) {
1201 IsFileEntry = true;
Mike Stump11289f42009-09-09 15:08:12 +00001202
Chris Lattner76e68962009-01-26 06:19:46 +00001203 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001204 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001205 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1206 return true;
1207 } else if (FlagVal == 2) {
1208 IsFileExit = true;
Mike Stump11289f42009-09-09 15:08:12 +00001209
Chris Lattner1c967782009-02-04 06:25:26 +00001210 SourceManager &SM = PP.getSourceManager();
1211 // If we are leaving the current presumed file, check to make sure the
1212 // presumed include stack isn't empty!
1213 FileID CurFileID =
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001214 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
Chris Lattner1c967782009-02-04 06:25:26 +00001215 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
Douglas Gregor453b0122010-11-12 07:15:47 +00001216 if (PLoc.isInvalid())
1217 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001218
Chris Lattner1c967782009-02-04 06:25:26 +00001219 // If there is no include loc (main file) or if the include loc is in a
1220 // different physical file, then we aren't in a "1" line marker flag region.
1221 SourceLocation IncLoc = PLoc.getIncludeLoc();
1222 if (IncLoc.isInvalid() ||
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001223 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
Chris Lattner1c967782009-02-04 06:25:26 +00001224 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1225 PP.DiscardUntilEndOfDirective();
1226 return true;
1227 }
Mike Stump11289f42009-09-09 15:08:12 +00001228
Chris Lattner76e68962009-01-26 06:19:46 +00001229 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001230 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001231 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1232 return true;
1233 }
1234
1235 // We must have 3 if there are still flags.
1236 if (FlagVal != 3) {
1237 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001238 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001239 return true;
1240 }
Mike Stump11289f42009-09-09 15:08:12 +00001241
Reid Klecknereb00ee02017-05-22 21:42:58 +00001242 FileKind = SrcMgr::C_System;
Mike Stump11289f42009-09-09 15:08:12 +00001243
Chris Lattner76e68962009-01-26 06:19:46 +00001244 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001245 if (FlagTok.is(tok::eod)) return false;
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001246 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
Chris Lattner76e68962009-01-26 06:19:46 +00001247 return true;
1248
1249 // We must have 4 if there is yet another flag.
1250 if (FlagVal != 4) {
1251 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001252 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001253 return true;
1254 }
Mike Stump11289f42009-09-09 15:08:12 +00001255
Reid Klecknereb00ee02017-05-22 21:42:58 +00001256 FileKind = SrcMgr::C_ExternCSystem;
Mike Stump11289f42009-09-09 15:08:12 +00001257
Chris Lattner76e68962009-01-26 06:19:46 +00001258 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001259 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001260
1261 // There are no more valid flags here.
1262 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001263 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001264 return true;
1265}
1266
1267/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1268/// one of the following forms:
1269///
1270/// # 42
Mike Stump11289f42009-09-09 15:08:12 +00001271/// # 42 "file" ('1' | '2')?
Chris Lattner76e68962009-01-26 06:19:46 +00001272/// # 42 "file" ('1' | '2')? '3' '4'?
1273///
1274void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1275 // Validate the number and convert it to an unsigned. GNU does not have a
1276 // line # limit other than it fit in 32-bits.
1277 unsigned LineNo;
1278 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001279 *this, true))
Chris Lattner76e68962009-01-26 06:19:46 +00001280 return;
Mike Stump11289f42009-09-09 15:08:12 +00001281
Chris Lattner76e68962009-01-26 06:19:46 +00001282 Token StrTok;
1283 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001284
Chris Lattner76e68962009-01-26 06:19:46 +00001285 bool IsFileEntry = false, IsFileExit = false;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001286 int FilenameID = -1;
Reid Klecknereb00ee02017-05-22 21:42:58 +00001287 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001288
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001289 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1290 // string followed by eod.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001291 if (StrTok.is(tok::eod)) {
1292 // Treat this like "#line NN", which doesn't change file characteristics.
1293 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1294 } else if (StrTok.isNot(tok::string_literal)) {
Chris Lattner76e68962009-01-26 06:19:46 +00001295 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001296 return DiscardUntilEndOfDirective();
Richard Smithd67aea22012-03-06 03:21:47 +00001297 } else if (StrTok.hasUDSuffix()) {
1298 Diag(StrTok, diag::err_invalid_string_udl);
1299 return DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001300 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001301 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001302 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001303 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001304 if (Literal.hadError)
1305 return DiscardUntilEndOfDirective();
1306 if (Literal.Pascal) {
1307 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1308 return DiscardUntilEndOfDirective();
1309 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001310 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001311
Chris Lattner76e68962009-01-26 06:19:46 +00001312 // If a filename was present, read any flags that are present.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001313 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
Chris Lattner76e68962009-01-26 06:19:46 +00001314 return;
Chris Lattner76e68962009-01-26 06:19:46 +00001315 }
Mike Stump11289f42009-09-09 15:08:12 +00001316
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001317 // Create a line note with this information.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001318 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1319 IsFileExit, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001320
Chris Lattner839150e2009-03-27 17:13:49 +00001321 // If the preprocessor has callbacks installed, notify them of the #line
1322 // change. This is used so that the line marker comes out in -E mode for
1323 // example.
1324 if (Callbacks) {
1325 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1326 if (IsFileEntry)
1327 Reason = PPCallbacks::EnterFile;
1328 else if (IsFileExit)
1329 Reason = PPCallbacks::ExitFile;
Mike Stump11289f42009-09-09 15:08:12 +00001330
Chris Lattnerc745cec2010-04-14 04:28:50 +00001331 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
Chris Lattner839150e2009-03-27 17:13:49 +00001332 }
Chris Lattner76e68962009-01-26 06:19:46 +00001333}
1334
Chris Lattner38d7fd22009-01-26 05:30:54 +00001335/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1336///
Mike Stump11289f42009-09-09 15:08:12 +00001337void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001338 bool isWarning) {
Chris Lattner38d7fd22009-01-26 05:30:54 +00001339 // PTH doesn't emit #warning or #error directives.
1340 if (CurPTHLexer)
Chris Lattner100c65e2009-01-26 05:29:08 +00001341 return CurPTHLexer->DiscardToEndOfLine();
1342
Chris Lattnerf64b3522008-03-09 01:54:53 +00001343 // Read the rest of the line raw. We do this because we don't want macros
1344 // to be expanded and we don't require that the tokens be valid preprocessing
1345 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
1346 // collapse multiple consequtive white space between tokens, but this isn't
1347 // specified by the standard.
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001348 SmallString<128> Message;
1349 CurLexer->ReadToEndOfLine(&Message);
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001350
1351 // Find the first non-whitespace character, so that we can make the
1352 // diagnostic more succinct.
David Majnemerbf7e0c62016-02-24 22:07:26 +00001353 StringRef Msg = StringRef(Message).ltrim(' ');
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001354
Chris Lattner100c65e2009-01-26 05:29:08 +00001355 if (isWarning)
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001356 Diag(Tok, diag::pp_hash_warning) << Msg;
Chris Lattner100c65e2009-01-26 05:29:08 +00001357 else
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001358 Diag(Tok, diag::err_pp_hash_error) << Msg;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001359}
1360
1361/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1362///
1363void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1364 // Yes, this directive is an extension.
1365 Diag(Tok, diag::ext_pp_ident_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001366
Chris Lattnerf64b3522008-03-09 01:54:53 +00001367 // Read the string argument.
1368 Token StrTok;
1369 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001370
Chris Lattnerf64b3522008-03-09 01:54:53 +00001371 // If the token kind isn't a string, it's a malformed directive.
1372 if (StrTok.isNot(tok::string_literal) &&
Chris Lattner907dfe92008-11-18 07:59:24 +00001373 StrTok.isNot(tok::wide_string_literal)) {
1374 Diag(StrTok, diag::err_pp_malformed_ident);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001375 if (StrTok.isNot(tok::eod))
Chris Lattner38d7fd22009-01-26 05:30:54 +00001376 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +00001377 return;
1378 }
Mike Stump11289f42009-09-09 15:08:12 +00001379
Richard Smithd67aea22012-03-06 03:21:47 +00001380 if (StrTok.hasUDSuffix()) {
1381 Diag(StrTok, diag::err_invalid_string_udl);
1382 return DiscardUntilEndOfDirective();
1383 }
1384
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001385 // Verify that there is nothing after the string, other than EOD.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00001386 CheckEndOfDirective("ident");
Chris Lattnerf64b3522008-03-09 01:54:53 +00001387
Douglas Gregordc970f02010-03-16 22:30:13 +00001388 if (Callbacks) {
1389 bool Invalid = false;
1390 std::string Str = getSpelling(StrTok, &Invalid);
1391 if (!Invalid)
1392 Callbacks->Ident(Tok.getLocation(), Str);
1393 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00001394}
1395
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001396/// \brief Handle a #public directive.
1397void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001398 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001399 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001400
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001401 // Error reading macro name? If so, diagnostic already issued.
1402 if (MacroNameTok.is(tok::eod))
1403 return;
1404
Douglas Gregor663b48f2012-01-03 19:48:16 +00001405 // Check to see if this is the last token on the #__public_macro line.
1406 CheckEndOfDirective("__public_macro");
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001407
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001408 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001409 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001410 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001411
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001412 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001413 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001414 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001415 return;
1416 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001417
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001418 // Note that this macro has now been exported.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001419 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1420 MacroNameTok.getLocation(), /*IsPublic=*/true));
Douglas Gregorebf00492011-10-17 15:32:29 +00001421}
1422
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001423/// \brief Handle a #private directive.
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001424void Preprocessor::HandleMacroPrivateDirective() {
Douglas Gregorebf00492011-10-17 15:32:29 +00001425 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001426 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001427
Douglas Gregorebf00492011-10-17 15:32:29 +00001428 // Error reading macro name? If so, diagnostic already issued.
1429 if (MacroNameTok.is(tok::eod))
1430 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001431
Douglas Gregor663b48f2012-01-03 19:48:16 +00001432 // Check to see if this is the last token on the #__private_macro line.
1433 CheckEndOfDirective("__private_macro");
Taewook Oh755e4d22016-06-13 21:55:33 +00001434
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001435 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregorebf00492011-10-17 15:32:29 +00001436 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001437 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001438
Douglas Gregorebf00492011-10-17 15:32:29 +00001439 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001440 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001441 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregorebf00492011-10-17 15:32:29 +00001442 return;
1443 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001444
Douglas Gregorebf00492011-10-17 15:32:29 +00001445 // Note that this macro has now been marked private.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001446 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1447 MacroNameTok.getLocation(), /*IsPublic=*/false));
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001448}
1449
Chris Lattnerf64b3522008-03-09 01:54:53 +00001450//===----------------------------------------------------------------------===//
1451// Preprocessor Include Directive Handling.
1452//===----------------------------------------------------------------------===//
1453
1454/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
James Dennettf6333ac2012-06-22 05:46:07 +00001455/// checked and spelled filename, e.g. as an operand of \#include. This returns
Chris Lattnerf64b3522008-03-09 01:54:53 +00001456/// true if the input filename was in <>'s or false if it were in ""'s. The
1457/// caller is expected to provide a buffer that is large enough to hold the
1458/// spelling of the filename, but is also expected to handle the case when
1459/// this method decides to use a different buffer.
1460bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001461 StringRef &Buffer) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001462 // Get the text form of the filename.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001463 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
Mike Stump11289f42009-09-09 15:08:12 +00001464
Chris Lattnerf64b3522008-03-09 01:54:53 +00001465 // Make sure the filename is <x> or "x".
1466 bool isAngled;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001467 if (Buffer[0] == '<') {
1468 if (Buffer.back() != '>') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001469 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001470 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001471 return true;
1472 }
1473 isAngled = true;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001474 } else if (Buffer[0] == '"') {
1475 if (Buffer.back() != '"') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001476 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001477 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001478 return true;
1479 }
1480 isAngled = false;
1481 } else {
1482 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001483 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001484 return true;
1485 }
Mike Stump11289f42009-09-09 15:08:12 +00001486
Chris Lattnerf64b3522008-03-09 01:54:53 +00001487 // Diagnose #include "" as invalid.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001488 if (Buffer.size() <= 2) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001489 Diag(Loc, diag::err_pp_empty_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001490 Buffer = StringRef();
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001491 return true;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001492 }
Mike Stump11289f42009-09-09 15:08:12 +00001493
Chris Lattnerf64b3522008-03-09 01:54:53 +00001494 // Skip the brackets.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001495 Buffer = Buffer.substr(1, Buffer.size()-2);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001496 return isAngled;
1497}
1498
James Dennett4a4f72d2013-11-27 01:27:40 +00001499// \brief Handle cases where the \#include name is expanded from a macro
1500// as multiple tokens, which need to be glued together.
1501//
1502// This occurs for code like:
1503// \code
1504// \#define FOO <a/b.h>
1505// \#include FOO
1506// \endcode
1507// because in this case, "<a/b.h>" is returned as 7 tokens, not one.
1508//
1509// This code concatenates and consumes tokens up to the '>' token. It returns
1510// false if the > was found, otherwise it returns true if it finds and consumes
1511// the EOD marker.
1512bool Preprocessor::ConcatenateIncludeName(SmallString<128> &FilenameBuffer,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001513 SourceLocation &End) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001514 Token CurTok;
Mike Stump11289f42009-09-09 15:08:12 +00001515
John Thompsonb5353522009-10-30 13:49:06 +00001516 Lex(CurTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001517 while (CurTok.isNot(tok::eod)) {
Douglas Gregor796d76a2010-10-20 22:00:55 +00001518 End = CurTok.getLocation();
Taewook Oh755e4d22016-06-13 21:55:33 +00001519
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001520 // FIXME: Provide code completion for #includes.
1521 if (CurTok.is(tok::code_completion)) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +00001522 setCodeCompletionReached();
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001523 Lex(CurTok);
1524 continue;
1525 }
1526
Chris Lattnerf64b3522008-03-09 01:54:53 +00001527 // Append the spelling of this token to the buffer. If there was a space
1528 // before it, add it now.
1529 if (CurTok.hasLeadingSpace())
1530 FilenameBuffer.push_back(' ');
Mike Stump11289f42009-09-09 15:08:12 +00001531
Chris Lattnerf64b3522008-03-09 01:54:53 +00001532 // Get the spelling of the token, directly into FilenameBuffer if possible.
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001533 size_t PreAppendSize = FilenameBuffer.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001534 FilenameBuffer.resize(PreAppendSize+CurTok.getLength());
Mike Stump11289f42009-09-09 15:08:12 +00001535
Chris Lattnerf64b3522008-03-09 01:54:53 +00001536 const char *BufPtr = &FilenameBuffer[PreAppendSize];
John Thompsonb5353522009-10-30 13:49:06 +00001537 unsigned ActualLen = getSpelling(CurTok, BufPtr);
Mike Stump11289f42009-09-09 15:08:12 +00001538
Chris Lattnerf64b3522008-03-09 01:54:53 +00001539 // If the token was spelled somewhere else, copy it into FilenameBuffer.
1540 if (BufPtr != &FilenameBuffer[PreAppendSize])
1541 memcpy(&FilenameBuffer[PreAppendSize], BufPtr, ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001542
Chris Lattnerf64b3522008-03-09 01:54:53 +00001543 // Resize FilenameBuffer to the correct size.
1544 if (CurTok.getLength() != ActualLen)
1545 FilenameBuffer.resize(PreAppendSize+ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001546
Chris Lattnerf64b3522008-03-09 01:54:53 +00001547 // If we found the '>' marker, return success.
1548 if (CurTok.is(tok::greater))
1549 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001550
John Thompsonb5353522009-10-30 13:49:06 +00001551 Lex(CurTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001552 }
1553
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001554 // If we hit the eod marker, emit an error and return true so that the caller
1555 // knows the EOD has been read.
John Thompsonb5353522009-10-30 13:49:06 +00001556 Diag(CurTok.getLocation(), diag::err_pp_expects_filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001557 return true;
1558}
1559
Richard Smith34f30512013-11-23 04:06:09 +00001560/// \brief Push a token onto the token stream containing an annotation.
Richard Smithc51c38b2017-04-29 00:34:47 +00001561void Preprocessor::EnterAnnotationToken(SourceRange Range,
1562 tok::TokenKind Kind,
1563 void *AnnotationVal) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001564 // FIXME: Produce this as the current token directly, rather than
1565 // allocating a new token for it.
David Blaikie2eabcc92016-02-09 18:52:09 +00001566 auto Tok = llvm::make_unique<Token[]>(1);
Richard Smith34f30512013-11-23 04:06:09 +00001567 Tok[0].startToken();
1568 Tok[0].setKind(Kind);
Richard Smithc51c38b2017-04-29 00:34:47 +00001569 Tok[0].setLocation(Range.getBegin());
1570 Tok[0].setAnnotationEndLoc(Range.getEnd());
Richard Smith34f30512013-11-23 04:06:09 +00001571 Tok[0].setAnnotationValue(AnnotationVal);
Richard Smithc51c38b2017-04-29 00:34:47 +00001572 EnterTokenStream(std::move(Tok), 1, true);
Richard Smith34f30512013-11-23 04:06:09 +00001573}
1574
Richard Smith63b6fce2015-05-18 04:45:41 +00001575/// \brief Produce a diagnostic informing the user that a #include or similar
1576/// was implicitly treated as a module import.
1577static void diagnoseAutoModuleImport(
1578 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1579 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1580 SourceLocation PathEnd) {
1581 assert(PP.getLangOpts().ObjC2 && "no import syntax available");
1582
1583 SmallString<128> PathString;
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001584 for (size_t I = 0, N = Path.size(); I != N; ++I) {
Richard Smith63b6fce2015-05-18 04:45:41 +00001585 if (I)
1586 PathString += '.';
1587 PathString += Path[I].first->getName();
1588 }
1589 int IncludeKind = 0;
Taewook Oh755e4d22016-06-13 21:55:33 +00001590
Richard Smith63b6fce2015-05-18 04:45:41 +00001591 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1592 case tok::pp_include:
1593 IncludeKind = 0;
1594 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001595
Richard Smith63b6fce2015-05-18 04:45:41 +00001596 case tok::pp_import:
1597 IncludeKind = 1;
Taewook Oh755e4d22016-06-13 21:55:33 +00001598 break;
1599
Richard Smith63b6fce2015-05-18 04:45:41 +00001600 case tok::pp_include_next:
1601 IncludeKind = 2;
1602 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001603
Richard Smith63b6fce2015-05-18 04:45:41 +00001604 case tok::pp___include_macros:
1605 IncludeKind = 3;
1606 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001607
Richard Smith63b6fce2015-05-18 04:45:41 +00001608 default:
1609 llvm_unreachable("unknown include directive kind");
1610 }
1611
1612 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1613 /*IsTokenRange=*/false);
1614 PP.Diag(HashLoc, diag::warn_auto_module_import)
1615 << IncludeKind << PathString
1616 << FixItHint::CreateReplacement(ReplaceRange,
1617 ("@import " + PathString + ";").str());
1618}
1619
Taewook Ohf42103c2016-06-13 20:40:21 +00001620// Given a vector of path components and a string containing the real
1621// path to the file, build a properly-cased replacement in the vector,
1622// and return true if the replacement should be suggested.
1623static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1624 StringRef RealPathName) {
1625 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1626 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1627 int Cnt = 0;
1628 bool SuggestReplacement = false;
1629 // Below is a best-effort to handle ".." in paths. It is admittedly
1630 // not 100% correct in the presence of symlinks.
1631 for (auto &Component : llvm::reverse(Components)) {
1632 if ("." == Component) {
1633 } else if (".." == Component) {
1634 ++Cnt;
1635 } else if (Cnt) {
1636 --Cnt;
1637 } else if (RealPathComponentIter != RealPathComponentEnd) {
1638 if (Component != *RealPathComponentIter) {
1639 // If these path components differ by more than just case, then we
1640 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1641 // noisy false positives.
1642 SuggestReplacement = RealPathComponentIter->equals_lower(Component);
1643 if (!SuggestReplacement)
1644 break;
1645 Component = *RealPathComponentIter;
1646 }
1647 ++RealPathComponentIter;
1648 }
1649 }
1650 return SuggestReplacement;
1651}
1652
Richard Smith27e5aa02017-06-05 18:57:56 +00001653bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1654 const TargetInfo &TargetInfo,
1655 DiagnosticsEngine &Diags, Module *M) {
1656 Module::Requirement Requirement;
1657 Module::UnresolvedHeaderDirective MissingHeader;
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00001658 Module *ShadowingModule = nullptr;
1659 if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,
1660 ShadowingModule))
Richard Smith27e5aa02017-06-05 18:57:56 +00001661 return false;
1662
1663 if (MissingHeader.FileNameLoc.isValid()) {
1664 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1665 << MissingHeader.IsUmbrella << MissingHeader.FileName;
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00001666 } else if (ShadowingModule) {
1667 Diags.Report(M->DefinitionLoc, diag::err_module_shadowed) << M->Name;
1668 Diags.Report(ShadowingModule->DefinitionLoc,
1669 diag::note_previous_definition);
Richard Smith27e5aa02017-06-05 18:57:56 +00001670 } else {
1671 // FIXME: Track the location at which the requirement was specified, and
1672 // use it here.
1673 Diags.Report(M->DefinitionLoc, diag::err_module_unavailable)
1674 << M->getFullModuleName() << Requirement.second << Requirement.first;
1675 }
1676 return true;
1677}
1678
James Dennettf6333ac2012-06-22 05:46:07 +00001679/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1680/// the file to be included from the lexer, then include it! This is a common
1681/// routine with functionality shared between \#include, \#include_next and
1682/// \#import. LookupFrom is set when this is a \#include_next directive, it
Mike Stump11289f42009-09-09 15:08:12 +00001683/// specifies the file to start searching from.
Taewook Oh755e4d22016-06-13 21:55:33 +00001684void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001685 Token &IncludeTok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001686 const DirectoryLookup *LookupFrom,
Richard Smith25d50752014-10-20 00:15:49 +00001687 const FileEntry *LookupFromFile,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001688 bool isImport) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001689 Token FilenameTok;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00001690 CurPPLexer->LexIncludeFilename(FilenameTok);
Mike Stump11289f42009-09-09 15:08:12 +00001691
Chris Lattnerf64b3522008-03-09 01:54:53 +00001692 // Reserve a buffer to get the spelling.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001693 SmallString<128> FilenameBuffer;
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001694 StringRef Filename;
Douglas Gregor796d76a2010-10-20 22:00:55 +00001695 SourceLocation End;
Douglas Gregor41e115a2011-11-30 18:02:36 +00001696 SourceLocation CharEnd; // the end of this directive, in characters
Taewook Oh755e4d22016-06-13 21:55:33 +00001697
Chris Lattnerf64b3522008-03-09 01:54:53 +00001698 switch (FilenameTok.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001699 case tok::eod:
1700 // If the token kind is EOD, the error has already been diagnosed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00001701 return;
Mike Stump11289f42009-09-09 15:08:12 +00001702
Chris Lattnerf64b3522008-03-09 01:54:53 +00001703 case tok::angle_string_literal:
Benjamin Kramer0a1abd42010-02-27 13:44:12 +00001704 case tok::string_literal:
1705 Filename = getSpelling(FilenameTok, FilenameBuffer);
Douglas Gregor796d76a2010-10-20 22:00:55 +00001706 End = FilenameTok.getLocation();
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001707 CharEnd = End.getLocWithOffset(FilenameTok.getLength());
Chris Lattnerf64b3522008-03-09 01:54:53 +00001708 break;
Mike Stump11289f42009-09-09 15:08:12 +00001709
Chris Lattnerf64b3522008-03-09 01:54:53 +00001710 case tok::less:
1711 // This could be a <foo/bar.h> file coming from a macro expansion. In this
1712 // case, glue the tokens together into FilenameBuffer and interpret those.
1713 FilenameBuffer.push_back('<');
Douglas Gregor796d76a2010-10-20 22:00:55 +00001714 if (ConcatenateIncludeName(FilenameBuffer, End))
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001715 return; // Found <eod> but no ">"? Diagnostic already emitted.
Yaron Keren92e1b622015-03-18 10:17:07 +00001716 Filename = FilenameBuffer;
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001717 CharEnd = End.getLocWithOffset(1);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001718 break;
1719 default:
1720 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1721 DiscardUntilEndOfDirective();
1722 return;
1723 }
Mike Stump11289f42009-09-09 15:08:12 +00001724
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001725 CharSourceRange FilenameRange
1726 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
Aaron Ballman611306e2012-03-02 22:51:54 +00001727 StringRef OriginalFilename = Filename;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001728 bool isAngled =
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001729 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001730 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1731 // error.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001732 if (Filename.empty()) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001733 DiscardUntilEndOfDirective();
1734 return;
1735 }
Mike Stump11289f42009-09-09 15:08:12 +00001736
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001737 // Verify that there is nothing after the filename, other than EOD. Note that
Chris Lattnerb40289b2009-04-17 23:56:52 +00001738 // we allow macros that expand to nothing after the filename, because this
1739 // falls into the category of "#include pp-tokens new-line" specified in
1740 // C99 6.10.2p4.
Daniel Dunbar2c422dc92009-10-18 20:26:12 +00001741 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001742
1743 // Check that we don't have infinite #include recursion.
Chris Lattner907dfe92008-11-18 07:59:24 +00001744 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
1745 Diag(FilenameTok, diag::err_pp_include_too_deep);
1746 return;
1747 }
Mike Stump11289f42009-09-09 15:08:12 +00001748
John McCall32f5fe12011-09-30 05:12:12 +00001749 // Complain about attempts to #include files in an audit pragma.
1750 if (PragmaARCCFCodeAuditedLoc.isValid()) {
1751 Diag(HashLoc, diag::err_pp_include_in_arc_cf_code_audited);
1752 Diag(PragmaARCCFCodeAuditedLoc, diag::note_pragma_entered_here);
1753
1754 // Immediately leave the pragma.
1755 PragmaARCCFCodeAuditedLoc = SourceLocation();
1756 }
1757
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001758 // Complain about attempts to #include files in an assume-nonnull pragma.
1759 if (PragmaAssumeNonNullLoc.isValid()) {
1760 Diag(HashLoc, diag::err_pp_include_in_assume_nonnull);
1761 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1762
1763 // Immediately leave the pragma.
1764 PragmaAssumeNonNullLoc = SourceLocation();
1765 }
1766
Aaron Ballman611306e2012-03-02 22:51:54 +00001767 if (HeaderInfo.HasIncludeAliasMap()) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001768 // Map the filename with the brackets still attached. If the name doesn't
1769 // map to anything, fall back on the filename we've already gotten the
Aaron Ballman611306e2012-03-02 22:51:54 +00001770 // spelling for.
1771 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1772 if (!NewName.empty())
1773 Filename = NewName;
1774 }
1775
Chris Lattnerf64b3522008-03-09 01:54:53 +00001776 // Search include directories.
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001777 bool IsMapped = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001778 const DirectoryLookup *CurDir;
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001779 SmallString<1024> SearchPath;
1780 SmallString<1024> RelativePath;
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001781 // We get the raw path only if we have 'Callbacks' to which we later pass
1782 // the path.
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001783 ModuleMap::KnownHeader SuggestedModule;
1784 SourceLocation FilenameLoc = FilenameTok.getLocation();
Saleem Abdulrasool729b7d32014-03-12 02:26:08 +00001785 SmallString<128> NormalizedPath;
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001786 if (LangOpts.MSVCCompat) {
1787 NormalizedPath = Filename.str();
Yaron Keren1801d1b2014-08-09 18:13:01 +00001788#ifndef LLVM_ON_WIN32
Rafael Espindolaf6002232014-08-08 21:31:04 +00001789 llvm::sys::path::native(NormalizedPath);
Yaron Keren1801d1b2014-08-09 18:13:01 +00001790#endif
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001791 }
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001792 const FileEntry *File = LookupFile(
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001793 FilenameLoc, LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename,
Richard Smith25d50752014-10-20 00:15:49 +00001794 isAngled, LookupFrom, LookupFromFile, CurDir,
1795 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001796 &SuggestedModule, &IsMapped);
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001797
Richard Smithdbbc5232015-05-14 02:25:44 +00001798 if (!File) {
1799 if (Callbacks) {
Douglas Gregor11729f02011-11-30 18:12:06 +00001800 // Give the clients a chance to recover.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001801 SmallString<128> RecoveryPath;
Douglas Gregor11729f02011-11-30 18:12:06 +00001802 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
1803 if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) {
1804 // Add the recovery path to the list of search paths.
Daniel Dunbarae4feb62013-01-25 01:50:28 +00001805 DirectoryLookup DL(DE, SrcMgr::C_User, false);
Douglas Gregor11729f02011-11-30 18:12:06 +00001806 HeaderInfo.AddSearchPath(DL, isAngled);
Taewook Oh755e4d22016-06-13 21:55:33 +00001807
Douglas Gregor11729f02011-11-30 18:12:06 +00001808 // Try the lookup again, skipping the cache.
Richard Smith25d50752014-10-20 00:15:49 +00001809 File = LookupFile(
1810 FilenameLoc,
1811 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1812 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001813 &SuggestedModule, &IsMapped, /*SkipCache*/ true);
Douglas Gregor11729f02011-11-30 18:12:06 +00001814 }
1815 }
1816 }
Craig Topperd2d442c2014-05-17 23:10:59 +00001817
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001818 if (!SuppressIncludeNotFoundError) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001819 // If the file could not be located and it was included via angle
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001820 // brackets, we can attempt a lookup as though it were a quoted path to
1821 // provide the user with a possible fixit.
1822 if (isAngled) {
Daniel Jasper07e6c402013-08-05 20:26:17 +00001823 File = LookupFile(
Richard Smith25d50752014-10-20 00:15:49 +00001824 FilenameLoc,
1825 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, false,
1826 LookupFrom, LookupFromFile, CurDir,
1827 Callbacks ? &SearchPath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001828 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped);
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001829 if (File) {
1830 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001831 Diag(FilenameTok, diag::err_pp_file_not_found_not_fatal) <<
1832 Filename <<
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001833 FixItHint::CreateReplacement(Range, "\"" + Filename.str() + "\"");
1834 }
1835 }
Richard Smithdbbc5232015-05-14 02:25:44 +00001836
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001837 // If the file is still not found, just go with the vanilla diagnostic
1838 if (!File)
Erik Verbruggen45449542016-10-25 10:13:10 +00001839 Diag(FilenameTok, diag::err_pp_file_not_found) << Filename
1840 << FilenameRange;
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001841 }
Douglas Gregor11729f02011-11-30 18:12:06 +00001842 }
1843
Richard Smith63b6fce2015-05-18 04:45:41 +00001844 // Should we enter the source file? Set to false if either the source file is
1845 // known to have no effect beyond its effect on module visibility -- that is,
1846 // if it's got an include guard that is already defined or is a modular header
1847 // we've imported or already built.
1848 bool ShouldEnter = true;
Richard Smithdbbc5232015-05-14 02:25:44 +00001849
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001850 if (PPOpts->SingleFileParseMode)
1851 ShouldEnter = false;
1852
Richard Smith63b6fce2015-05-18 04:45:41 +00001853 // Determine whether we should try to import the module for this #include, if
1854 // there is one. Don't do so if precompiled module support is disabled or we
1855 // are processing this module textually (because we're building the module).
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001856 if (ShouldEnter && File && SuggestedModule && getLangOpts().Modules &&
Richard Smith63b6fce2015-05-18 04:45:41 +00001857 SuggestedModule.getModule()->getTopLevelModuleName() !=
Richard Smith7e82e012016-02-19 22:25:36 +00001858 getLangOpts().CurrentModule) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001859 // If this include corresponds to a module but that module is
1860 // unavailable, diagnose the situation and bail out.
Richard Smith58df3432016-04-12 19:58:30 +00001861 // FIXME: Remove this; loadModule does the same check (but produces
1862 // slightly worse diagnostics).
Richard Smith27e5aa02017-06-05 18:57:56 +00001863 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), getDiagnostics(),
1864 SuggestedModule.getModule())) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001865 Diag(FilenameTok.getLocation(),
1866 diag::note_implicit_top_level_module_import_here)
Richard Smith27e5aa02017-06-05 18:57:56 +00001867 << SuggestedModule.getModule()->getTopLevelModuleName();
Sean Silva8b7c0392015-08-17 16:39:30 +00001868 return;
1869 }
1870
Douglas Gregor71944202011-11-30 00:36:36 +00001871 // Compute the module access path corresponding to this module.
1872 // FIXME: Should we have a second loadModule() overload to avoid this
1873 // extra lookup step?
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001874 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001875 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
Douglas Gregor71944202011-11-30 00:36:36 +00001876 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
1877 FilenameTok.getLocation()));
1878 std::reverse(Path.begin(), Path.end());
1879
Douglas Gregor41e115a2011-11-30 18:02:36 +00001880 // Warn that we're replacing the include/import with a module import.
Richard Smith63b6fce2015-05-18 04:45:41 +00001881 // We only do this in Objective-C, where we have a module-import syntax.
1882 if (getLangOpts().ObjC2)
1883 diagnoseAutoModuleImport(*this, HashLoc, IncludeTok, Path, CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001884
Richard Smith10434f32015-05-02 02:08:26 +00001885 // Load the module to import its macros. We'll make the declarations
Richard Smithce587f52013-11-15 04:24:58 +00001886 // visible when the parser gets here.
Richard Smithdbbc5232015-05-14 02:25:44 +00001887 // FIXME: Pass SuggestedModule in here rather than converting it to a path
1888 // and making the module loader convert it back again.
Richard Smith10434f32015-05-02 02:08:26 +00001889 ModuleLoadResult Imported = TheModuleLoader.loadModule(
1890 IncludeTok.getLocation(), Path, Module::Hidden,
1891 /*IsIncludeDirective=*/true);
Craig Topperd2d442c2014-05-17 23:10:59 +00001892 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
Argyrios Kyrtzidis051b4432012-09-29 01:06:01 +00001893 "the imported module is different than the suggested one");
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001894
Richard Smith63b6fce2015-05-18 04:45:41 +00001895 if (Imported)
1896 ShouldEnter = false;
1897 else if (Imported.isMissingExpected()) {
1898 // We failed to find a submodule that we assumed would exist (because it
1899 // was in the directory of an umbrella header, for instance), but no
Richard Smitha114c462016-12-06 00:40:17 +00001900 // actual module containing it exists (because the umbrella header is
Richard Smith63b6fce2015-05-18 04:45:41 +00001901 // incomplete). Treat this as a textual inclusion.
1902 SuggestedModule = ModuleMap::KnownHeader();
Richard Smitha114c462016-12-06 00:40:17 +00001903 } else if (Imported.isConfigMismatch()) {
1904 // On a configuration mismatch, enter the header textually. We still know
1905 // that it's part of the corresponding module.
Richard Smith63b6fce2015-05-18 04:45:41 +00001906 } else {
1907 // We hit an error processing the import. Bail out.
1908 if (hadModuleLoaderFatalFailure()) {
1909 // With a fatal failure in the module loader, we abort parsing.
1910 Token &Result = IncludeTok;
1911 if (CurLexer) {
1912 Result.startToken();
1913 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
1914 CurLexer->cutOffLexing();
1915 } else {
1916 assert(CurPTHLexer && "#include but no current lexer set!");
1917 CurPTHLexer->getEOF(Result);
1918 }
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001919 }
1920 return;
1921 }
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001922 }
1923
Richard Smithc5247e62017-05-30 02:03:19 +00001924 // The #included file will be considered to be a system header if either it is
1925 // in a system include directory, or if the #includer is a system include
1926 // header.
1927 SrcMgr::CharacteristicKind FileCharacter =
1928 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
1929 if (File)
1930 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(File), FileCharacter);
1931
1932 // Ask HeaderInfo if we should enter this #include file. If not, #including
1933 // this file will have no effect.
1934 bool SkipHeader = false;
1935 if (ShouldEnter && File &&
1936 !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport,
1937 getLangOpts().Modules,
1938 SuggestedModule.getModule())) {
1939 ShouldEnter = false;
1940 SkipHeader = true;
1941 }
1942
Richard Smith63b6fce2015-05-18 04:45:41 +00001943 if (Callbacks) {
1944 // Notify the callback object that we've seen an inclusion directive.
1945 Callbacks->InclusionDirective(
1946 HashLoc, IncludeTok,
1947 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1948 FilenameRange, File, SearchPath, RelativePath,
1949 ShouldEnter ? nullptr : SuggestedModule.getModule());
Richard Smithc5247e62017-05-30 02:03:19 +00001950 if (SkipHeader && !SuggestedModule.getModule())
1951 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
Douglas Gregor97eec242011-09-15 22:00:41 +00001952 }
Richard Smith63b6fce2015-05-18 04:45:41 +00001953
1954 if (!File)
1955 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001956
Richard Smith54ef4c32015-05-19 19:58:11 +00001957 // FIXME: If we have a suggested module, and we've already visited this file,
1958 // don't bother entering it again. We know it has no further effect.
1959
Taewook Ohf42103c2016-06-13 20:40:21 +00001960 // Issue a diagnostic if the name of the file on disk has a different case
1961 // than the one we're about to open.
1962 const bool CheckIncludePathPortability =
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001963 !IsMapped && File && !File->tryGetRealPathName().empty();
Taewook Ohf42103c2016-06-13 20:40:21 +00001964
1965 if (CheckIncludePathPortability) {
1966 StringRef Name = LangOpts.MSVCCompat ? NormalizedPath.str() : Filename;
1967 StringRef RealPathName = File->tryGetRealPathName();
1968 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
1969 llvm::sys::path::end(Name));
1970
1971 if (trySimplifyPath(Components, RealPathName)) {
1972 SmallString<128> Path;
1973 Path.reserve(Name.size()+2);
1974 Path.push_back(isAngled ? '<' : '"');
Taewook Ohcc89bac2017-02-21 22:30:55 +00001975 bool isLeadingSeparator = llvm::sys::path::is_absolute(Name);
Taewook Ohf42103c2016-06-13 20:40:21 +00001976 for (auto Component : Components) {
Taewook Ohcc89bac2017-02-21 22:30:55 +00001977 if (isLeadingSeparator)
1978 isLeadingSeparator = false;
1979 else
1980 Path.append(Component);
Taewook Ohf42103c2016-06-13 20:40:21 +00001981 // Append the separator the user used, or the close quote
1982 Path.push_back(
1983 Path.size() <= Filename.size() ? Filename[Path.size()-1] :
1984 (isAngled ? '>' : '"'));
1985 }
Taewook Ohf42103c2016-06-13 20:40:21 +00001986 // For user files and known standard headers, by default we issue a diagnostic.
1987 // For other system headers, we don't. They can be controlled separately.
1988 auto DiagId = (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name)) ?
1989 diag::pp_nonportable_path : diag::pp_nonportable_system_path;
1990 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Reid Kleckner273895b2017-02-14 18:38:40 +00001991 Diag(FilenameTok, DiagId) << Path <<
1992 FixItHint::CreateReplacement(Range, Path);
Taewook Ohf42103c2016-06-13 20:40:21 +00001993 }
1994 }
1995
Richard Smith63b6fce2015-05-18 04:45:41 +00001996 // If we don't need to enter the file, stop now.
1997 if (!ShouldEnter) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001998 // If this is a module import, make it visible if needed.
Richard Smitha0aafa32015-05-18 03:52:30 +00001999 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00002000 // When building a pch, -fmodule-name tells the compiler to textually
2001 // include headers in the specified module. But it is possible that
2002 // ShouldEnter is false because we are skipping the header. In that
2003 // case, We are not importing the specified module.
2004 if (SkipHeader && getLangOpts().CompilingPCH &&
2005 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2006 return;
2007
Richard Smitha0aafa32015-05-18 03:52:30 +00002008 makeModuleVisible(M, HashLoc);
Richard Smithdbbc5232015-05-14 02:25:44 +00002009
2010 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() !=
2011 tok::pp___include_macros)
Richard Smithc51c38b2017-04-29 00:34:47 +00002012 EnterAnnotationToken(SourceRange(HashLoc, End),
2013 tok::annot_module_include, M);
Richard Smithdbbc5232015-05-14 02:25:44 +00002014 }
Chris Lattner72286d62010-04-19 20:44:31 +00002015 return;
2016 }
2017
Chris Lattnerf64b3522008-03-09 01:54:53 +00002018 // Look up the file, create a File ID for it.
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002019 SourceLocation IncludePos = End;
2020 // If the filename string was the result of macro expansions, set the include
2021 // position on the file where it will be included and after the expansions.
2022 if (IncludePos.isMacroID())
2023 IncludePos = SourceMgr.getExpansionRange(IncludePos).second;
2024 FileID FID = SourceMgr.createFileID(File, IncludePos, FileCharacter);
Yaron Keren8b563662015-10-03 10:46:20 +00002025 assert(FID.isValid() && "Expected valid file ID");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002026
Richard Smith34f30512013-11-23 04:06:09 +00002027 // If all is good, enter the new file!
Richard Smith67294e22014-01-31 20:47:44 +00002028 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
2029 return;
Richard Smith34f30512013-11-23 04:06:09 +00002030
Richard Smitha0aafa32015-05-18 03:52:30 +00002031 // Determine if we're switching to building a new submodule, and which one.
Richard Smitha0aafa32015-05-18 03:52:30 +00002032 if (auto *M = SuggestedModule.getModule()) {
Bruno Cardoso Lopes8587dfd2018-01-05 02:33:18 +00002033 if (M->getTopLevelModule()->ShadowingModule) {
2034 // We are building a submodule that belongs to a shadowed module. This
2035 // means we find header files in the shadowed module.
2036 Diag(M->DefinitionLoc, diag::err_module_build_shadowed_submodule)
2037 << M->getFullModuleName();
2038 Diag(M->getTopLevelModule()->ShadowingModule->DefinitionLoc,
2039 diag::note_previous_definition);
2040 return;
2041 }
Manman Renffd3e9d2017-01-09 19:20:18 +00002042 // When building a pch, -fmodule-name tells the compiler to textually
2043 // include headers in the specified module. We are not building the
2044 // specified module.
2045 if (getLangOpts().CompilingPCH &&
2046 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2047 return;
2048
Richard Smithd1386302017-05-04 00:29:54 +00002049 assert(!CurLexerSubmodule && "should not have marked this as a module yet");
2050 CurLexerSubmodule = M;
Richard Smith67294e22014-01-31 20:47:44 +00002051
Richard Smitha0aafa32015-05-18 03:52:30 +00002052 // Let the macro handling code know that any future macros are within
2053 // the new submodule.
Richard Smithd1386302017-05-04 00:29:54 +00002054 EnterSubmodule(M, HashLoc, /*ForPragma*/false);
Richard Smithb8b2ed62015-04-23 18:18:26 +00002055
Richard Smitha0aafa32015-05-18 03:52:30 +00002056 // Let the parser know that any future declarations are within the new
2057 // submodule.
2058 // FIXME: There's no point doing this if we're handling a #__include_macros
2059 // directive.
Richard Smithc51c38b2017-04-29 00:34:47 +00002060 EnterAnnotationToken(SourceRange(HashLoc, End), tok::annot_module_begin, M);
Richard Smith67294e22014-01-31 20:47:44 +00002061 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002062}
2063
James Dennettf6333ac2012-06-22 05:46:07 +00002064/// HandleIncludeNextDirective - Implements \#include_next.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002065///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002066void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2067 Token &IncludeNextTok) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002068 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
Mike Stump11289f42009-09-09 15:08:12 +00002069
Chris Lattnerf64b3522008-03-09 01:54:53 +00002070 // #include_next is like #include, except that we start searching after
2071 // the current found directory. If we can't do this, issue a
2072 // diagnostic.
2073 const DirectoryLookup *Lookup = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +00002074 const FileEntry *LookupFromFile = nullptr;
Erik Verbruggene0bde752016-10-27 14:17:10 +00002075 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2076 // If the main file is a header, then it's either for PCH/AST generation,
2077 // or libclang opened it. Either way, handle it as a normal include below
2078 // and do not complain about include_next.
2079 } else if (isInPrimaryFile()) {
Craig Topperd2d442c2014-05-17 23:10:59 +00002080 Lookup = nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002081 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
Richard Smithd1386302017-05-04 00:29:54 +00002082 } else if (CurLexerSubmodule) {
Richard Smith25d50752014-10-20 00:15:49 +00002083 // Start looking up in the directory *after* the one in which the current
2084 // file would be found, if any.
2085 assert(CurPPLexer && "#include_next directive in macro?");
2086 LookupFromFile = CurPPLexer->getFileEntry();
2087 Lookup = nullptr;
Craig Topperd2d442c2014-05-17 23:10:59 +00002088 } else if (!Lookup) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002089 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2090 } else {
2091 // Start looking up in the next directory.
2092 ++Lookup;
2093 }
Mike Stump11289f42009-09-09 15:08:12 +00002094
Richard Smith25d50752014-10-20 00:15:49 +00002095 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2096 LookupFromFile);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002097}
2098
James Dennettf6333ac2012-06-22 05:46:07 +00002099/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
Aaron Ballman0467f552012-03-18 03:10:37 +00002100void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2101 // The Microsoft #import directive takes a type library and generates header
2102 // files from it, and includes those. This is beyond the scope of what clang
2103 // does, so we ignore it and error out. However, #import can optionally have
2104 // trailing attributes that span multiple lines. We're going to eat those
2105 // so we can continue processing from there.
2106 Diag(Tok, diag::err_pp_import_directive_ms );
2107
Taewook Oh755e4d22016-06-13 21:55:33 +00002108 // Read tokens until we get to the end of the directive. Note that the
Aaron Ballman0467f552012-03-18 03:10:37 +00002109 // directive can be split over multiple lines using the backslash character.
2110 DiscardUntilEndOfDirective();
2111}
2112
James Dennettf6333ac2012-06-22 05:46:07 +00002113/// HandleImportDirective - Implements \#import.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002114///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002115void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2116 Token &ImportTok) {
Aaron Ballman0467f552012-03-18 03:10:37 +00002117 if (!LangOpts.ObjC1) { // #import is standard for ObjC.
Alp Tokerbfa39342014-01-14 12:51:41 +00002118 if (LangOpts.MSVCCompat)
Aaron Ballman0467f552012-03-18 03:10:37 +00002119 return HandleMicrosoftImportDirective(ImportTok);
Chris Lattnerd4a96732009-03-06 04:28:03 +00002120 Diag(ImportTok, diag::ext_pp_import_directive);
Aaron Ballman0467f552012-03-18 03:10:37 +00002121 }
Richard Smith25d50752014-10-20 00:15:49 +00002122 return HandleIncludeDirective(HashLoc, ImportTok, nullptr, nullptr, true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002123}
2124
Chris Lattner58a1eb02009-04-08 18:46:40 +00002125/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2126/// pseudo directive in the predefines buffer. This handles it by sucking all
2127/// tokens through the preprocessor and discarding them (only keeping the side
2128/// effects on the preprocessor).
Douglas Gregor796d76a2010-10-20 22:00:55 +00002129void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2130 Token &IncludeMacrosTok) {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002131 // This directive should only occur in the predefines buffer. If not, emit an
2132 // error and reject it.
2133 SourceLocation Loc = IncludeMacrosTok.getLocation();
Mehdi Amini99d1b292016-10-01 16:38:28 +00002134 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002135 Diag(IncludeMacrosTok.getLocation(),
2136 diag::pp_include_macros_out_of_predefines);
2137 DiscardUntilEndOfDirective();
2138 return;
2139 }
Mike Stump11289f42009-09-09 15:08:12 +00002140
Chris Lattnere01d82b2009-04-08 20:53:24 +00002141 // Treat this as a normal #include for checking purposes. If this is
2142 // successful, it will push a new lexer onto the include stack.
Richard Smith25d50752014-10-20 00:15:49 +00002143 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
Mike Stump11289f42009-09-09 15:08:12 +00002144
Chris Lattnere01d82b2009-04-08 20:53:24 +00002145 Token TmpTok;
2146 do {
2147 Lex(TmpTok);
2148 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2149 } while (TmpTok.isNot(tok::hashhash));
Chris Lattner58a1eb02009-04-08 18:46:40 +00002150}
2151
Chris Lattnerf64b3522008-03-09 01:54:53 +00002152//===----------------------------------------------------------------------===//
2153// Preprocessor Macro Directive Handling.
2154//===----------------------------------------------------------------------===//
2155
Faisal Valie8f430a2017-09-29 02:43:22 +00002156/// ReadMacroParameterList - The ( starting a parameter list of a macro
2157/// definition has just been read. Lex the rest of the parameters and the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002158/// closing ), updating MI with what we learn. Return true if an error occurs
Faisal Valie8f430a2017-09-29 02:43:22 +00002159/// parsing the param list.
Faisal Valiac506d72017-07-17 17:18:43 +00002160bool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {
Faisal Vali33df3912017-09-29 02:17:31 +00002161 SmallVector<IdentifierInfo*, 32> Parameters;
Mike Stump11289f42009-09-09 15:08:12 +00002162
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002163 while (true) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002164 LexUnexpandedToken(Tok);
2165 switch (Tok.getKind()) {
2166 case tok::r_paren:
Faisal Valie8f430a2017-09-29 02:43:22 +00002167 // Found the end of the parameter list.
Faisal Vali33df3912017-09-29 02:17:31 +00002168 if (Parameters.empty()) // #define FOO()
Chris Lattnerf64b3522008-03-09 01:54:53 +00002169 return false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002170 // Otherwise we have #define FOO(A,)
2171 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2172 return true;
2173 case tok::ellipsis: // #define X(... -> C99 varargs
David Blaikiebbafb8a2012-03-11 07:00:24 +00002174 if (!LangOpts.C99)
Taewook Oh755e4d22016-06-13 21:55:33 +00002175 Diag(Tok, LangOpts.CPlusPlus11 ?
Richard Smithacd4d3d2011-10-15 01:18:56 +00002176 diag::warn_cxx98_compat_variadic_macro :
2177 diag::ext_variadic_macro);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002178
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002179 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2180 if (LangOpts.OpenCL) {
2181 Diag(Tok, diag::err_pp_opencl_variadic_macros);
2182 return true;
2183 }
2184
Chris Lattnerf64b3522008-03-09 01:54:53 +00002185 // Lex the token after the identifier.
2186 LexUnexpandedToken(Tok);
2187 if (Tok.isNot(tok::r_paren)) {
2188 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2189 return true;
2190 }
Faisal Valie8f430a2017-09-29 02:43:22 +00002191 // Add the __VA_ARGS__ identifier as a parameter.
Faisal Vali33df3912017-09-29 02:17:31 +00002192 Parameters.push_back(Ident__VA_ARGS__);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002193 MI->setIsC99Varargs();
Faisal Vali33df3912017-09-29 02:17:31 +00002194 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002195 return false;
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002196 case tok::eod: // #define X(
Chris Lattnerf64b3522008-03-09 01:54:53 +00002197 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2198 return true;
2199 default:
2200 // Handle keywords and identifiers here to accept things like
2201 // #define Foo(for) for.
2202 IdentifierInfo *II = Tok.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +00002203 if (!II) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002204 // #define X(1
2205 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2206 return true;
2207 }
2208
Faisal Valie8f430a2017-09-29 02:43:22 +00002209 // If this is already used as a parameter, it is used multiple times (e.g.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002210 // #define X(A,A.
Faisal Vali33df3912017-09-29 02:17:31 +00002211 if (std::find(Parameters.begin(), Parameters.end(), II) !=
2212 Parameters.end()) { // C99 6.10.3p6
Chris Lattnerc5cdade2008-11-19 07:33:58 +00002213 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002214 return true;
2215 }
Mike Stump11289f42009-09-09 15:08:12 +00002216
Faisal Valie8f430a2017-09-29 02:43:22 +00002217 // Add the parameter to the macro info.
Faisal Vali33df3912017-09-29 02:17:31 +00002218 Parameters.push_back(II);
Mike Stump11289f42009-09-09 15:08:12 +00002219
Chris Lattnerf64b3522008-03-09 01:54:53 +00002220 // Lex the token after the identifier.
2221 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002222
Chris Lattnerf64b3522008-03-09 01:54:53 +00002223 switch (Tok.getKind()) {
2224 default: // #define X(A B
2225 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2226 return true;
2227 case tok::r_paren: // #define X(A)
Faisal Vali33df3912017-09-29 02:17:31 +00002228 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002229 return false;
2230 case tok::comma: // #define X(A,
2231 break;
2232 case tok::ellipsis: // #define X(A... -> GCC extension
2233 // Diagnose extension.
2234 Diag(Tok, diag::ext_named_variadic_macro);
Mike Stump11289f42009-09-09 15:08:12 +00002235
Chris Lattnerf64b3522008-03-09 01:54:53 +00002236 // Lex the token after the identifier.
2237 LexUnexpandedToken(Tok);
2238 if (Tok.isNot(tok::r_paren)) {
2239 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2240 return true;
2241 }
Mike Stump11289f42009-09-09 15:08:12 +00002242
Chris Lattnerf64b3522008-03-09 01:54:53 +00002243 MI->setIsGNUVarargs();
Faisal Vali33df3912017-09-29 02:17:31 +00002244 MI->setParameterList(Parameters, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002245 return false;
2246 }
2247 }
2248 }
2249}
2250
Serge Pavlov07c0f042014-12-18 11:14:21 +00002251static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2252 const LangOptions &LOptions) {
2253 if (MI->getNumTokens() == 1) {
2254 const Token &Value = MI->getReplacementToken(0);
2255
2256 // Macro that is identity, like '#define inline inline' is a valid pattern.
2257 if (MacroName.getKind() == Value.getKind())
2258 return true;
2259
2260 // Macro that maps a keyword to the same keyword decorated with leading/
2261 // trailing underscores is a valid pattern:
2262 // #define inline __inline
2263 // #define inline __inline__
2264 // #define inline _inline (in MS compatibility mode)
2265 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2266 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2267 if (!II->isKeyword(LOptions))
2268 return false;
2269 StringRef ValueText = II->getName();
2270 StringRef TrimmedValue = ValueText;
2271 if (!ValueText.startswith("__")) {
2272 if (ValueText.startswith("_"))
2273 TrimmedValue = TrimmedValue.drop_front(1);
2274 else
2275 return false;
2276 } else {
2277 TrimmedValue = TrimmedValue.drop_front(2);
2278 if (TrimmedValue.endswith("__"))
2279 TrimmedValue = TrimmedValue.drop_back(2);
2280 }
2281 return TrimmedValue.equals(MacroText);
2282 } else {
2283 return false;
2284 }
2285 }
2286
2287 // #define inline
Alexander Kornienkoa26c4952015-12-28 15:30:42 +00002288 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2289 tok::kw_const) &&
2290 MI->getNumTokens() == 0;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002291}
2292
Faisal Valiac506d72017-07-17 17:18:43 +00002293// ReadOptionalMacroParameterListAndBody - This consumes all (i.e. the
2294// entire line) of the macro's tokens and adds them to MacroInfo, and while
2295// doing so performs certain validity checks including (but not limited to):
2296// - # (stringization) is followed by a macro parameter
2297//
2298// Returns a nullptr if an invalid sequence of tokens is encountered or returns
2299// a pointer to a MacroInfo object.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002300
Faisal Valiac506d72017-07-17 17:18:43 +00002301MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(
2302 const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002303
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002304 Token LastTok = MacroNameTok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002305 // Create the new macro.
Faisal Valiac506d72017-07-17 17:18:43 +00002306 MacroInfo *const MI = AllocateMacroInfo(MacroNameTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002307
Chris Lattnerf64b3522008-03-09 01:54:53 +00002308 Token Tok;
2309 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002310
Faisal Vali6bf67912017-07-25 03:15:36 +00002311 // Used to un-poison and then re-poison identifiers of the __VA_ARGS__ ilk
2312 // within their appropriate context.
2313 VariadicMacroScopeGuard VariadicMacroScopeGuard(*this);
2314
Chris Lattnerf64b3522008-03-09 01:54:53 +00002315 // If this is a function-like macro definition, parse the argument list,
2316 // marking each of the identifiers as being used as macro arguments. Also,
2317 // check other constraints on the first token of the macro body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002318 if (Tok.is(tok::eod)) {
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002319 if (ImmediatelyAfterHeaderGuard) {
2320 // Save this macro information since it may part of a header guard.
2321 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2322 MacroNameTok.getLocation());
2323 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002324 // If there is no body to this macro, we have no special handling here.
Chris Lattner2425bcb2009-04-18 02:23:25 +00002325 } else if (Tok.hasLeadingSpace()) {
2326 // This is a normal token with leading space. Clear the leading space
2327 // marker on the first token to get proper expansion.
2328 Tok.clearFlag(Token::LeadingSpace);
2329 } else if (Tok.is(tok::l_paren)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002330 // This is a function-like macro definition. Read the argument list.
2331 MI->setIsFunctionLike();
Faisal Valiac506d72017-07-17 17:18:43 +00002332 if (ReadMacroParameterList(MI, LastTok)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002333 // Throw away the rest of the line.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002334 if (CurPPLexer->ParsingPreprocessorDirective)
Chris Lattnerf64b3522008-03-09 01:54:53 +00002335 DiscardUntilEndOfDirective();
Faisal Valiac506d72017-07-17 17:18:43 +00002336 return nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002337 }
2338
Faisal Vali6bf67912017-07-25 03:15:36 +00002339 // If this is a definition of an ISO C/C++ variadic function-like macro (not
2340 // using the GNU named varargs extension) inform our variadic scope guard
2341 // which un-poisons and re-poisons certain identifiers (e.g. __VA_ARGS__)
2342 // allowed only within the definition of a variadic macro.
Mike Stump11289f42009-09-09 15:08:12 +00002343
Faisal Vali6bf67912017-07-25 03:15:36 +00002344 if (MI->isC99Varargs()) {
2345 VariadicMacroScopeGuard.enterScope();
2346 }
Mike Stump11289f42009-09-09 15:08:12 +00002347
Chris Lattnerf64b3522008-03-09 01:54:53 +00002348 // Read the first token after the arg list for down below.
2349 LexUnexpandedToken(Tok);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00002350 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002351 // C99 requires whitespace between the macro definition and the body. Emit
2352 // a diagnostic for something like "#define X+".
Chris Lattner2425bcb2009-04-18 02:23:25 +00002353 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002354 } else {
Chris Lattner2425bcb2009-04-18 02:23:25 +00002355 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2356 // first character of a replacement list is not a character required by
2357 // subclause 5.2.1, then there shall be white-space separation between the
2358 // identifier and the replacement list.". 5.2.1 lists this set:
2359 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2360 // is irrelevant here.
2361 bool isInvalid = false;
2362 if (Tok.is(tok::at)) // @ is not in the list above.
2363 isInvalid = true;
2364 else if (Tok.is(tok::unknown)) {
2365 // If we have an unknown token, it is something strange like "`". Since
2366 // all of valid characters would have lexed into a single character
2367 // token of some sort, we know this is not a valid case.
2368 isInvalid = true;
2369 }
2370 if (isInvalid)
2371 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2372 else
2373 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002374 }
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002375
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002376 if (!Tok.is(tok::eod))
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002377 LastTok = Tok;
2378
Chris Lattnerf64b3522008-03-09 01:54:53 +00002379 // Read the rest of the macro body.
2380 if (MI->isObjectLike()) {
2381 // Object-like macros are very simple, just read their body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002382 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002383 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002384 MI->AddTokenToBody(Tok);
2385 // Get the next token of the macro.
2386 LexUnexpandedToken(Tok);
2387 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002388 } else {
Chris Lattner83bd8282009-05-25 17:16:10 +00002389 // Otherwise, read the body of a function-like macro. While we are at it,
2390 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2391 // parameters in function-like macro expansions.
Faisal Vali18268422017-10-15 01:26:26 +00002392
2393 VAOptDefinitionContext VAOCtx(*this);
2394
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002395 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002396 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002397
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002398 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002399 MI->AddTokenToBody(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002400
Faisal Vali18268422017-10-15 01:26:26 +00002401 if (VAOCtx.isVAOptToken(Tok)) {
2402 // If we're already within a VAOPT, emit an error.
2403 if (VAOCtx.isInVAOpt()) {
2404 Diag(Tok, diag::err_pp_vaopt_nested_use);
2405 return nullptr;
2406 }
2407 // Ensure VAOPT is followed by a '(' .
2408 LexUnexpandedToken(Tok);
2409 if (Tok.isNot(tok::l_paren)) {
2410 Diag(Tok, diag::err_pp_missing_lparen_in_vaopt_use);
2411 return nullptr;
2412 }
2413 MI->AddTokenToBody(Tok);
2414 VAOCtx.sawVAOptFollowedByOpeningParens(Tok.getLocation());
2415 LexUnexpandedToken(Tok);
2416 if (Tok.is(tok::hashhash)) {
2417 Diag(Tok, diag::err_vaopt_paste_at_start);
2418 return nullptr;
2419 }
2420 continue;
2421 } else if (VAOCtx.isInVAOpt()) {
2422 if (Tok.is(tok::r_paren)) {
2423 if (VAOCtx.sawClosingParen()) {
2424 const unsigned NumTokens = MI->getNumTokens();
2425 assert(NumTokens >= 3 && "Must have seen at least __VA_OPT__( "
2426 "and a subsequent tok::r_paren");
2427 if (MI->getReplacementToken(NumTokens - 2).is(tok::hashhash)) {
2428 Diag(Tok, diag::err_vaopt_paste_at_end);
2429 return nullptr;
2430 }
2431 }
2432 } else if (Tok.is(tok::l_paren)) {
2433 VAOCtx.sawOpeningParen(Tok.getLocation());
2434 }
2435 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002436 // Get the next token of the macro.
2437 LexUnexpandedToken(Tok);
2438 continue;
2439 }
Mike Stump11289f42009-09-09 15:08:12 +00002440
Richard Smith701a3522013-07-09 01:00:29 +00002441 // If we're in -traditional mode, then we should ignore stringification
2442 // and token pasting. Mark the tokens as unknown so as not to confuse
2443 // things.
2444 if (getLangOpts().TraditionalCPP) {
2445 Tok.setKind(tok::unknown);
2446 MI->AddTokenToBody(Tok);
2447
2448 // Get the next token of the macro.
2449 LexUnexpandedToken(Tok);
2450 continue;
2451 }
2452
Eli Friedman14d3c792012-11-14 02:18:46 +00002453 if (Tok.is(tok::hashhash)) {
Eli Friedman14d3c792012-11-14 02:18:46 +00002454 // If we see token pasting, check if it looks like the gcc comma
2455 // pasting extension. We'll use this information to suppress
2456 // diagnostics later on.
Taewook Oh755e4d22016-06-13 21:55:33 +00002457
Eli Friedman14d3c792012-11-14 02:18:46 +00002458 // Get the next token of the macro.
2459 LexUnexpandedToken(Tok);
2460
2461 if (Tok.is(tok::eod)) {
2462 MI->AddTokenToBody(LastTok);
2463 break;
2464 }
2465
2466 unsigned NumTokens = MI->getNumTokens();
2467 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2468 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2469 MI->setHasCommaPasting();
2470
David Majnemer76faf1f2013-11-05 09:30:17 +00002471 // Things look ok, add the '##' token to the macro.
Eli Friedman14d3c792012-11-14 02:18:46 +00002472 MI->AddTokenToBody(LastTok);
Eli Friedman14d3c792012-11-14 02:18:46 +00002473 continue;
2474 }
2475
Faisal Vali18268422017-10-15 01:26:26 +00002476 // Our Token is a stringization operator.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002477 // Get the next token of the macro.
2478 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002479
Faisal Vali18268422017-10-15 01:26:26 +00002480 // Check for a valid macro arg identifier or __VA_OPT__.
2481 if (!VAOCtx.isVAOptToken(Tok) &&
2482 (Tok.getIdentifierInfo() == nullptr ||
2483 MI->getParameterNum(Tok.getIdentifierInfo()) == -1)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002484
2485 // If this is assembler-with-cpp mode, we accept random gibberish after
2486 // the '#' because '#' is often a comment character. However, change
2487 // the kind of the token to tok::unknown so that the preprocessor isn't
2488 // confused.
David Blaikiebbafb8a2012-03-11 07:00:24 +00002489 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002490 LastTok.setKind(tok::unknown);
Eli Friedmancdf8b882013-06-18 21:33:38 +00002491 MI->AddTokenToBody(LastTok);
2492 continue;
Chris Lattner83bd8282009-05-25 17:16:10 +00002493 } else {
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002494 Diag(Tok, diag::err_pp_stringize_not_parameter)
2495 << LastTok.is(tok::hashat);
Faisal Valiac506d72017-07-17 17:18:43 +00002496 return nullptr;
Chris Lattner83bd8282009-05-25 17:16:10 +00002497 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002498 }
Mike Stump11289f42009-09-09 15:08:12 +00002499
Chris Lattner83bd8282009-05-25 17:16:10 +00002500 // Things look ok, add the '#' and param name tokens to the macro.
2501 MI->AddTokenToBody(LastTok);
Mike Stump11289f42009-09-09 15:08:12 +00002502
Faisal Vali18268422017-10-15 01:26:26 +00002503 // If the token following '#' is VAOPT, let the next iteration handle it
2504 // and check it for correctness, otherwise add the token and prime the
2505 // loop with the next one.
2506 if (!VAOCtx.isVAOptToken(Tok)) {
2507 MI->AddTokenToBody(Tok);
2508 LastTok = Tok;
2509
2510 // Get the next token of the macro.
2511 LexUnexpandedToken(Tok);
2512 }
2513 }
2514 if (VAOCtx.isInVAOpt()) {
2515 assert(Tok.is(tok::eod) && "Must be at End Of preprocessing Directive");
2516 Diag(Tok, diag::err_pp_expected_after)
2517 << LastTok.getKind() << tok::r_paren;
2518 Diag(VAOCtx.getUnmatchedOpeningParenLoc(), diag::note_matching) << tok::l_paren;
2519 return nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002520 }
2521 }
Faisal Valiac506d72017-07-17 17:18:43 +00002522 MI->setDefinitionEndLoc(LastTok.getLocation());
Faisal Valiac506d72017-07-17 17:18:43 +00002523 return MI;
2524}
2525/// HandleDefineDirective - Implements \#define. This consumes the entire macro
2526/// line then lets the caller lex the next real token.
2527void Preprocessor::HandleDefineDirective(
2528 Token &DefineTok, const bool ImmediatelyAfterHeaderGuard) {
2529 ++NumDefined;
2530
2531 Token MacroNameTok;
2532 bool MacroShadowsKeyword;
2533 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
2534
2535 // Error reading macro name? If so, diagnostic already issued.
2536 if (MacroNameTok.is(tok::eod))
2537 return;
2538
2539 // If we are supposed to keep comments in #defines, reenable comment saving
2540 // mode.
2541 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
2542
2543 MacroInfo *const MI = ReadOptionalMacroParameterListAndBody(
2544 MacroNameTok, ImmediatelyAfterHeaderGuard);
2545
2546 if (!MI) return;
Mike Stump11289f42009-09-09 15:08:12 +00002547
Serge Pavlov07c0f042014-12-18 11:14:21 +00002548 if (MacroShadowsKeyword &&
2549 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2550 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
Faisal Valiac506d72017-07-17 17:18:43 +00002551 }
Chris Lattner57540c52011-04-15 05:22:18 +00002552 // Check that there is no paste (##) operator at the beginning or end of the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002553 // replacement list.
2554 unsigned NumTokens = MI->getNumTokens();
2555 if (NumTokens != 0) {
2556 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2557 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002558 return;
2559 }
2560 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2561 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002562 return;
2563 }
2564 }
Mike Stump11289f42009-09-09 15:08:12 +00002565
Faisal Valiac506d72017-07-17 17:18:43 +00002566
Mike Stump11289f42009-09-09 15:08:12 +00002567
Chris Lattnerf64b3522008-03-09 01:54:53 +00002568 // Finally, if this identifier already had a macro defined for it, verify that
Alexander Kornienko8b3f6232012-08-29 00:20:03 +00002569 // the macro bodies are identical, and issue diagnostics if they are not.
Argyrios Kyrtzidis09c9e812013-02-20 00:54:57 +00002570 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
John McCall83760372015-12-10 23:31:01 +00002571 // In Objective-C, ignore attempts to directly redefine the builtin
2572 // definitions of the ownership qualifiers. It's still possible to
2573 // #undef them.
2574 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2575 return II->isStr("__strong") ||
2576 II->isStr("__weak") ||
2577 II->isStr("__unsafe_unretained") ||
2578 II->isStr("__autoreleasing");
2579 };
2580 if (getLangOpts().ObjC1 &&
2581 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2582 == getPredefinesFileID() &&
2583 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2584 // Warn if it changes the tokens.
2585 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2586 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2587 !MI->isIdenticalTo(*OtherMI, *this,
2588 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2589 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2590 }
2591 assert(!OtherMI->isWarnIfUnused());
2592 return;
2593 }
2594
Chris Lattner5244f342009-01-16 19:50:11 +00002595 // It is very common for system headers to have tons of macro redefinitions
2596 // and for warnings to be disabled in system headers. If this is the case,
2597 // then don't bother calling MacroInfo::isIdenticalTo.
Chris Lattner80c21df2009-03-13 21:17:23 +00002598 if (!getDiagnostics().getSuppressSystemWarnings() ||
Chris Lattner5244f342009-01-16 19:50:11 +00002599 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002600 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
Chris Lattner5244f342009-01-16 19:50:11 +00002601 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002602
Taewook Oh755e4d22016-06-13 21:55:33 +00002603 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
Richard Smith7b242542013-03-06 00:46:00 +00002604 // C++ [cpp.predefined]p4, but allow it as an extension.
2605 if (OtherMI->isBuiltinMacro())
2606 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
Chris Lattnerc0a585d2010-08-17 15:55:45 +00002607 // Macros must be identical. This means all tokens and whitespace
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002608 // separation must be the same. C99 6.10.3p2.
Richard Smith7b242542013-03-06 00:46:00 +00002609 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002610 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
Chris Lattner5244f342009-01-16 19:50:11 +00002611 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2612 << MacroNameTok.getIdentifierInfo();
2613 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2614 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002615 }
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002616 if (OtherMI->isWarnIfUnused())
2617 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002618 }
Mike Stump11289f42009-09-09 15:08:12 +00002619
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002620 DefMacroDirective *MD =
2621 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
Mike Stump11289f42009-09-09 15:08:12 +00002622
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002623 assert(!MI->isUsed());
2624 // If we need warning for not using the macro, add its location in the
2625 // warn-because-unused-macro set. If it gets used it will be removed from set.
Eli Friedman5ba37d52013-08-22 00:27:10 +00002626 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
Alp Tokerd4a3f0e2014-06-15 23:30:39 +00002627 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc())) {
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002628 MI->setIsWarnIfUnused(true);
2629 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2630 }
2631
Chris Lattner928e9092009-04-12 01:39:54 +00002632 // If the callbacks want to know, tell them about the macro definition.
2633 if (Callbacks)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002634 Callbacks->MacroDefined(MacroNameTok, MD);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002635}
2636
James Dennettf6333ac2012-06-22 05:46:07 +00002637/// HandleUndefDirective - Implements \#undef.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002638///
Erik Verbruggen4bddef92016-10-26 08:52:41 +00002639void Preprocessor::HandleUndefDirective() {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002640 ++NumUndefined;
2641
2642 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00002643 ReadMacroName(MacroNameTok, MU_Undef);
Mike Stump11289f42009-09-09 15:08:12 +00002644
Chris Lattnerf64b3522008-03-09 01:54:53 +00002645 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002646 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002647 return;
Mike Stump11289f42009-09-09 15:08:12 +00002648
Chris Lattnerf64b3522008-03-09 01:54:53 +00002649 // Check to see if this is the last token on the #undef line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002650 CheckEndOfDirective("undef");
Mike Stump11289f42009-09-09 15:08:12 +00002651
Richard Smith20e883e2015-04-29 23:20:19 +00002652 // Okay, we have a valid identifier to undef.
2653 auto *II = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002654 auto MD = getMacroDefinition(II);
Vedant Kumar349a6242017-04-26 21:05:44 +00002655 UndefMacroDirective *Undef = nullptr;
2656
2657 // If the macro is not defined, this is a noop undef.
2658 if (const MacroInfo *MI = MD.getMacroInfo()) {
2659 if (!MI->isUsed() && MI->isWarnIfUnused())
2660 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
2661
2662 if (MI->isWarnIfUnused())
2663 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
2664
2665 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
2666 }
Mike Stump11289f42009-09-09 15:08:12 +00002667
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002668 // If the callbacks want to know, tell them about the macro #undef.
2669 // Note: no matter if the macro was defined or not.
Richard Smith36bd40d2015-05-04 03:15:40 +00002670 if (Callbacks)
Vedant Kumar349a6242017-04-26 21:05:44 +00002671 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002672
Vedant Kumar349a6242017-04-26 21:05:44 +00002673 if (Undef)
2674 appendMacroDirective(II, Undef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002675}
2676
Chris Lattnerf64b3522008-03-09 01:54:53 +00002677//===----------------------------------------------------------------------===//
2678// Preprocessor Conditional Directive Handling.
2679//===----------------------------------------------------------------------===//
2680
James Dennettf6333ac2012-06-22 05:46:07 +00002681/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
2682/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
2683/// true if any tokens have been returned or pp-directives activated before this
2684/// \#ifndef has been lexed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002685///
Vedant Kumar3919a502017-09-11 20:47:42 +00002686void Preprocessor::HandleIfdefDirective(Token &Result,
2687 const Token &HashToken,
2688 bool isIfndef,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002689 bool ReadAnyTokensBeforeDirective) {
2690 ++NumIf;
2691 Token DirectiveTok = Result;
2692
2693 Token MacroNameTok;
2694 ReadMacroName(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +00002695
Chris Lattnerf64b3522008-03-09 01:54:53 +00002696 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002697 if (MacroNameTok.is(tok::eod)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002698 // Skip code until we get to #endif. This helps with recovery by not
2699 // emitting an error when the #endif is reached.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002700 SkipExcludedConditionalBlock(HashToken.getLocation(),
2701 DirectiveTok.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002702 /*Foundnonskip*/ false, /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002703 return;
2704 }
Mike Stump11289f42009-09-09 15:08:12 +00002705
Chris Lattnerf64b3522008-03-09 01:54:53 +00002706 // Check to see if this is the last token on the #if[n]def line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002707 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002708
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002709 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002710 auto MD = getMacroDefinition(MII);
2711 MacroInfo *MI = MD.getMacroInfo();
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00002712
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002713 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002714 // If the start of a top-level #ifdef and if the macro is not defined,
2715 // inform MIOpt that this might be the start of a proper include guard.
2716 // Otherwise it is some other form of unknown conditional which we can't
2717 // handle.
Craig Topperd2d442c2014-05-17 23:10:59 +00002718 if (!ReadAnyTokensBeforeDirective && !MI) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002719 assert(isIfndef && "#ifdef shouldn't reach here");
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002720 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002721 } else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002722 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002723 }
2724
Chris Lattnerf64b3522008-03-09 01:54:53 +00002725 // If there is a macro, process it.
2726 if (MI) // Mark it used.
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002727 markMacroAsUsed(MI);
Mike Stump11289f42009-09-09 15:08:12 +00002728
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002729 if (Callbacks) {
2730 if (isIfndef)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002731 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002732 else
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002733 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002734 }
2735
Chris Lattnerf64b3522008-03-09 01:54:53 +00002736 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002737 if (PPOpts->SingleFileParseMode && !MI) {
2738 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2739 // the directive blocks.
2740 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002741 /*wasskip*/false, /*foundnonskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002742 /*foundelse*/false);
2743 } else if (!MI == isIfndef) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002744 // Yes, remember that we are inside a conditional, then lex the next token.
Chris Lattner8cf1f932009-12-14 04:54:40 +00002745 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
2746 /*wasskip*/false, /*foundnonskip*/true,
2747 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002748 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002749 // No, skip the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002750 SkipExcludedConditionalBlock(HashToken.getLocation(),
2751 DirectiveTok.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002752 /*Foundnonskip*/ false,
2753 /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002754 }
2755}
2756
James Dennettf6333ac2012-06-22 05:46:07 +00002757/// HandleIfDirective - Implements the \#if directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002758///
2759void Preprocessor::HandleIfDirective(Token &IfToken,
Vedant Kumar3919a502017-09-11 20:47:42 +00002760 const Token &HashToken,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002761 bool ReadAnyTokensBeforeDirective) {
2762 ++NumIf;
Mike Stump11289f42009-09-09 15:08:12 +00002763
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002764 // Parse and evaluate the conditional expression.
Craig Topperd2d442c2014-05-17 23:10:59 +00002765 IdentifierInfo *IfNDefMacro = nullptr;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002766 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002767 const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
2768 const bool ConditionalTrue = DER.Conditional;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002769 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Nuno Lopes363212b2008-06-01 18:31:24 +00002770
2771 // If this condition is equivalent to #ifndef X, and if this is the first
2772 // directive seen, handle it for the multiple-include optimization.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002773 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002774 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
Richard Smith089ee152013-06-16 05:05:39 +00002775 // FIXME: Pass in the location of the macro name, not the 'if' token.
2776 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
Nuno Lopes363212b2008-06-01 18:31:24 +00002777 else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002778 CurPPLexer->MIOpt.EnterTopLevelConditional();
Nuno Lopes363212b2008-06-01 18:31:24 +00002779 }
2780
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002781 if (Callbacks)
2782 Callbacks->If(IfToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002783 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002784 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002785
Chris Lattnerf64b3522008-03-09 01:54:53 +00002786 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002787 if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
2788 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2789 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002790 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002791 /*foundnonskip*/false, /*foundelse*/false);
2792 } else if (ConditionalTrue) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002793 // Yes, remember that we are inside a conditional, then lex the next token.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002794 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002795 /*foundnonskip*/true, /*foundelse*/false);
2796 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002797 // No, skip the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002798 SkipExcludedConditionalBlock(HashToken.getLocation(), IfToken.getLocation(),
Vedant Kumar3919a502017-09-11 20:47:42 +00002799 /*Foundnonskip*/ false,
2800 /*FoundElse*/ false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002801 }
2802}
2803
James Dennettf6333ac2012-06-22 05:46:07 +00002804/// HandleEndifDirective - Implements the \#endif directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002805///
2806void Preprocessor::HandleEndifDirective(Token &EndifToken) {
2807 ++NumEndif;
Mike Stump11289f42009-09-09 15:08:12 +00002808
Chris Lattnerf64b3522008-03-09 01:54:53 +00002809 // Check that this is the whole directive.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002810 CheckEndOfDirective("endif");
Mike Stump11289f42009-09-09 15:08:12 +00002811
Chris Lattnerf64b3522008-03-09 01:54:53 +00002812 PPConditionalInfo CondInfo;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002813 if (CurPPLexer->popConditionalLevel(CondInfo)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002814 // No conditionals on the stack: this is an #endif without an #if.
Chris Lattner907dfe92008-11-18 07:59:24 +00002815 Diag(EndifToken, diag::err_pp_endif_without_if);
2816 return;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002817 }
Mike Stump11289f42009-09-09 15:08:12 +00002818
Chris Lattnerf64b3522008-03-09 01:54:53 +00002819 // If this the end of a top-level #endif, inform MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002820 if (CurPPLexer->getConditionalStackDepth() == 0)
2821 CurPPLexer->MIOpt.ExitTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002822
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002823 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&
Chris Lattnerf64b3522008-03-09 01:54:53 +00002824 "This code should only be reachable in the non-skipping case!");
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002825
2826 if (Callbacks)
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002827 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002828}
2829
James Dennettf6333ac2012-06-22 05:46:07 +00002830/// HandleElseDirective - Implements the \#else directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002831///
Vedant Kumar3919a502017-09-11 20:47:42 +00002832void Preprocessor::HandleElseDirective(Token &Result, const Token &HashToken) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002833 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002834
Chris Lattnerf64b3522008-03-09 01:54:53 +00002835 // #else directive in a non-skipping conditional... start skipping.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002836 CheckEndOfDirective("else");
Mike Stump11289f42009-09-09 15:08:12 +00002837
Chris Lattnerf64b3522008-03-09 01:54:53 +00002838 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002839 if (CurPPLexer->popConditionalLevel(CI)) {
2840 Diag(Result, diag::pp_err_else_without_if);
2841 return;
2842 }
Mike Stump11289f42009-09-09 15:08:12 +00002843
Chris Lattnerf64b3522008-03-09 01:54:53 +00002844 // If this is a top-level #else, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002845 if (CurPPLexer->getConditionalStackDepth() == 0)
2846 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002847
2848 // If this is a #else with a #else before it, report the error.
2849 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +00002850
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002851 if (Callbacks)
2852 Callbacks->Else(Result.getLocation(), CI.IfLoc);
2853
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002854 if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002855 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2856 // the directive blocks.
2857 CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002858 /*foundnonskip*/false, /*foundelse*/true);
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002859 return;
2860 }
2861
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002862 // Finally, skip the rest of the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002863 SkipExcludedConditionalBlock(HashToken.getLocation(), CI.IfLoc,
2864 /*Foundnonskip*/ true,
Vedant Kumar3919a502017-09-11 20:47:42 +00002865 /*FoundElse*/ true, Result.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002866}
2867
James Dennettf6333ac2012-06-22 05:46:07 +00002868/// HandleElifDirective - Implements the \#elif directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002869///
Vedant Kumar3919a502017-09-11 20:47:42 +00002870void Preprocessor::HandleElifDirective(Token &ElifToken,
2871 const Token &HashToken) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002872 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002873
Chris Lattnerf64b3522008-03-09 01:54:53 +00002874 // #elif directive in a non-skipping conditional... start skipping.
2875 // We don't care what the condition is, because we will always skip it (since
2876 // the block immediately before it was included).
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002877 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002878 DiscardUntilEndOfDirective();
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002879 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002880
2881 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002882 if (CurPPLexer->popConditionalLevel(CI)) {
2883 Diag(ElifToken, diag::pp_err_elif_without_if);
2884 return;
2885 }
Mike Stump11289f42009-09-09 15:08:12 +00002886
Chris Lattnerf64b3522008-03-09 01:54:53 +00002887 // If this is a top-level #elif, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002888 if (CurPPLexer->getConditionalStackDepth() == 0)
2889 CurPPLexer->MIOpt.EnterTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002890
Chris Lattnerf64b3522008-03-09 01:54:53 +00002891 // If this is a #elif with a #else before it, report the error.
2892 if (CI.FoundElse) Diag(ElifToken, diag::pp_err_elif_after_else);
Taewook Oh755e4d22016-06-13 21:55:33 +00002893
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002894 if (Callbacks)
2895 Callbacks->Elif(ElifToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002896 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002897 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002898
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002899 if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002900 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2901 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002902 CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002903 /*foundnonskip*/false, /*foundelse*/false);
2904 return;
2905 }
2906
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002907 // Finally, skip the rest of the contents of this block.
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00002908 SkipExcludedConditionalBlock(
2909 HashToken.getLocation(), CI.IfLoc, /*Foundnonskip*/ true,
2910 /*FoundElse*/ CI.FoundElse, ElifToken.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002911}