blob: b2c3c2e707653ec5c42c1d4776b948e487f2fd4a [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"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000033#include "clang/Lex/PTHLexer.h"
34#include "clang/Lex/Token.h"
35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/SmallString.h"
37#include "llvm/ADT/SmallVector.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000038#include "llvm/ADT/STLExtras.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000039#include "llvm/ADT/StringSwitch.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000040#include "llvm/ADT/StringRef.h"
41#include "llvm/Support/AlignOf.h"
Douglas Gregor41e115a2011-11-30 18:02:36 +000042#include "llvm/Support/ErrorHandling.h"
Rafael Espindolaf6002232014-08-08 21:31:04 +000043#include "llvm/Support/Path.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000044#include <algorithm>
45#include <cassert>
46#include <cstring>
47#include <new>
48#include <string>
49#include <utility>
Eugene Zelenko1ced5092016-02-12 22:53:10 +000050
Chris Lattnerf64b3522008-03-09 01:54:53 +000051using namespace clang;
52
53//===----------------------------------------------------------------------===//
54// Utility Methods for Preprocessor Directive Handling.
55//===----------------------------------------------------------------------===//
56
Richard Smith3f6dd7a2017-05-12 23:40:52 +000057MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
58 auto *MIChain = new (BP) MacroInfoChain{L, MIChainHead};
Ted Kremenekc8456f82010-10-19 22:15:20 +000059 MIChainHead = MIChain;
Richard Smithee0c4c12014-07-24 01:13:23 +000060 return &MIChain->MI;
Chris Lattnerc0a585d2010-08-17 15:55:45 +000061}
62
Richard Smith50474bf2015-04-23 23:29:05 +000063DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
64 SourceLocation Loc) {
Richard Smith713369b2015-04-23 20:40:50 +000065 return new (BP) DefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000066}
67
68UndefMacroDirective *
Richard Smith50474bf2015-04-23 23:29:05 +000069Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
Richard Smith713369b2015-04-23 20:40:50 +000070 return new (BP) UndefMacroDirective(UndefLoc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000071}
72
73VisibilityMacroDirective *
74Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
75 bool isPublic) {
Richard Smithdaa69e02014-07-25 04:40:03 +000076 return new (BP) VisibilityMacroDirective(Loc, isPublic);
Chris Lattnerc0a585d2010-08-17 15:55:45 +000077}
78
James Dennettf6333ac2012-06-22 05:46:07 +000079/// \brief Read and discard all tokens remaining on the current line until
80/// the tok::eod token is found.
Chris Lattnerf64b3522008-03-09 01:54:53 +000081void Preprocessor::DiscardUntilEndOfDirective() {
82 Token Tmp;
83 do {
84 LexUnexpandedToken(Tmp);
Peter Collingbournef29ce972011-02-22 13:49:06 +000085 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +000086 } while (Tmp.isNot(tok::eod));
Chris Lattnerf64b3522008-03-09 01:54:53 +000087}
88
Serge Pavlov07c0f042014-12-18 11:14:21 +000089/// \brief Enumerates possible cases of #define/#undef a reserved identifier.
90enum MacroDiag {
91 MD_NoWarn, //> Not a reserved identifier
92 MD_KeywordDef, //> Macro hides keyword, enabled by default
93 MD_ReservedMacro //> #define of #undef reserved id, disabled by default
94};
95
96/// \brief Checks if the specified identifier is reserved in the specified
97/// language.
98/// This function does not check if the identifier is a keyword.
99static bool isReservedId(StringRef Text, const LangOptions &Lang) {
100 // C++ [macro.names], C11 7.1.3:
101 // All identifiers that begin with an underscore and either an uppercase
102 // letter or another underscore are always reserved for any use.
103 if (Text.size() >= 2 && Text[0] == '_' &&
104 (isUppercase(Text[1]) || Text[1] == '_'))
105 return true;
106 // C++ [global.names]
107 // Each name that contains a double underscore ... is reserved to the
108 // implementation for any use.
109 if (Lang.CPlusPlus) {
110 if (Text.find("__") != StringRef::npos)
111 return true;
112 }
Nico Weber92c14bb2014-12-16 21:16:10 +0000113 return false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000114}
115
Serge Pavlov07c0f042014-12-18 11:14:21 +0000116static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
117 const LangOptions &Lang = PP.getLangOpts();
118 StringRef Text = II->getName();
119 if (isReservedId(Text, Lang))
120 return MD_ReservedMacro;
121 if (II->isKeyword(Lang))
122 return MD_KeywordDef;
123 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
124 return MD_KeywordDef;
125 return MD_NoWarn;
126}
127
128static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
129 const LangOptions &Lang = PP.getLangOpts();
130 StringRef Text = II->getName();
131 // Do not warn on keyword undef. It is generally harmless and widely used.
132 if (isReservedId(Text, Lang))
133 return MD_ReservedMacro;
134 return MD_NoWarn;
135}
136
Taewook Ohf42103c2016-06-13 20:40:21 +0000137// Return true if we want to issue a diagnostic by default if we
138// encounter this name in a #include with the wrong case. For now,
139// this includes the standard C and C++ headers, Posix headers,
140// and Boost headers. Improper case for these #includes is a
141// potential portability issue.
142static bool warnByDefaultOnWrongCase(StringRef Include) {
143 // If the first component of the path is "boost", treat this like a standard header
144 // for the purposes of diagnostics.
145 if (::llvm::sys::path::begin(Include)->equals_lower("boost"))
146 return true;
147
148 // "condition_variable" is the longest standard header name at 18 characters.
149 // If the include file name is longer than that, it can't be a standard header.
Taewook Oh755e4d22016-06-13 21:55:33 +0000150 static const size_t MaxStdHeaderNameLen = 18u;
Taewook Ohf42103c2016-06-13 20:40:21 +0000151 if (Include.size() > MaxStdHeaderNameLen)
152 return false;
153
154 // Lowercase and normalize the search string.
155 SmallString<32> LowerInclude{Include};
156 for (char &Ch : LowerInclude) {
157 // In the ASCII range?
George Burgess IV5d3bd932016-06-16 02:30:33 +0000158 if (static_cast<unsigned char>(Ch) > 0x7f)
Taewook Ohf42103c2016-06-13 20:40:21 +0000159 return false; // Can't be a standard header
160 // ASCII lowercase:
161 if (Ch >= 'A' && Ch <= 'Z')
162 Ch += 'a' - 'A';
163 // Normalize path separators for comparison purposes.
164 else if (::llvm::sys::path::is_separator(Ch))
165 Ch = '/';
166 }
167
168 // The standard C/C++ and Posix headers
169 return llvm::StringSwitch<bool>(LowerInclude)
170 // C library headers
171 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
172 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
173 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
174 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
175 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
176 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
177
178 // C++ headers for C library facilities
179 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
180 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
181 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
182 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
183 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
184 .Case("cwctype", true)
185
186 // C++ library headers
187 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
188 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
189 .Cases("atomic", "future", "map", "set", "type_traits", true)
190 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
191 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
192 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
193 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
194 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
195 .Cases("deque", "istream", "queue", "string", "valarray", true)
196 .Cases("exception", "iterator", "random", "strstream", "vector", true)
197 .Cases("forward_list", "limits", "ratio", "system_error", true)
198
199 // POSIX headers (which aren't also C headers)
200 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
201 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
202 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
203 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
204 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
205 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
206 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
207 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
208 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
209 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
210 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
211 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
212 .Default(false);
213}
214
Serge Pavlov07c0f042014-12-18 11:14:21 +0000215bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
216 bool *ShadowFlag) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000217 // Missing macro name?
218 if (MacroNameTok.is(tok::eod))
219 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
220
221 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
222 if (!II) {
223 bool Invalid = false;
224 std::string Spelling = getSpelling(MacroNameTok, &Invalid);
225 if (Invalid)
226 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerf33619c2014-05-31 03:38:08 +0000227 II = getIdentifierInfo(Spelling);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000228
Alp Tokerf33619c2014-05-31 03:38:08 +0000229 if (!II->isCPlusPlusOperatorKeyword())
230 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000231
Alp Tokere03e9e12014-05-31 16:32:22 +0000232 // C++ 2.5p2: Alternative tokens behave the same as its primary token
233 // except for their spellings.
234 Diag(MacroNameTok, getLangOpts().MicrosoftExt
235 ? diag::ext_pp_operator_used_as_macro_name
236 : diag::err_pp_operator_used_as_macro_name)
237 << II << MacroNameTok.getKind();
Alp Tokerb05e0b52014-05-21 06:13:51 +0000238
Alp Tokerc5d194fc2014-05-31 03:38:17 +0000239 // Allow #defining |and| and friends for Microsoft compatibility or
240 // recovery when legacy C headers are included in C++.
Alp Tokerf33619c2014-05-31 03:38:08 +0000241 MacroNameTok.setIdentifierInfo(II);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000242 }
243
Serge Pavlovd024f522014-10-24 17:31:32 +0000244 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000245 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
246 return Diag(MacroNameTok, diag::err_defined_macro_name);
247 }
248
Richard Smith20e883e2015-04-29 23:20:19 +0000249 if (isDefineUndef == MU_Undef) {
250 auto *MI = getMacroInfo(II);
251 if (MI && MI->isBuiltinMacro()) {
252 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
253 // and C++ [cpp.predefined]p4], but allow it as an extension.
254 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
255 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000256 }
257
Serge Pavlov07c0f042014-12-18 11:14:21 +0000258 // If defining/undefining reserved identifier or a keyword, we need to issue
259 // a warning.
Serge Pavlov83cf0782014-12-11 12:18:08 +0000260 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
Serge Pavlov07c0f042014-12-18 11:14:21 +0000261 if (ShadowFlag)
262 *ShadowFlag = false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000263 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
Mehdi Amini99d1b292016-10-01 16:38:28 +0000264 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
Serge Pavlov07c0f042014-12-18 11:14:21 +0000265 MacroDiag D = MD_NoWarn;
266 if (isDefineUndef == MU_Define) {
267 D = shouldWarnOnMacroDef(*this, II);
268 }
269 else if (isDefineUndef == MU_Undef)
270 D = shouldWarnOnMacroUndef(*this, II);
271 if (D == MD_KeywordDef) {
272 // We do not want to warn on some patterns widely used in configuration
273 // scripts. This requires analyzing next tokens, so do not issue warnings
274 // now, only inform caller.
275 if (ShadowFlag)
276 *ShadowFlag = true;
277 }
278 if (D == MD_ReservedMacro)
279 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
Serge Pavlov83cf0782014-12-11 12:18:08 +0000280 }
281
Alp Tokerb05e0b52014-05-21 06:13:51 +0000282 // Okay, we got a good identifier.
283 return false;
284}
285
James Dennettf6333ac2012-06-22 05:46:07 +0000286/// \brief Lex and validate a macro name, which occurs after a
287/// \#define or \#undef.
288///
Serge Pavlovd024f522014-10-24 17:31:32 +0000289/// This sets the token kind to eod and discards the rest of the macro line if
290/// the macro name is invalid.
291///
292/// \param MacroNameTok Token that is expected to be a macro name.
Serge Pavlov07c0f042014-12-18 11:14:21 +0000293/// \param isDefineUndef Context in which macro is used.
294/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
295void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
296 bool *ShadowFlag) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000297 // Read the token, don't allow macro expansion on it.
298 LexUnexpandedToken(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +0000299
Douglas Gregor12785102010-08-24 20:21:13 +0000300 if (MacroNameTok.is(tok::code_completion)) {
301 if (CodeComplete)
Serge Pavlovd024f522014-10-24 17:31:32 +0000302 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000303 setCodeCompletionReached();
Douglas Gregor12785102010-08-24 20:21:13 +0000304 LexUnexpandedToken(MacroNameTok);
Douglas Gregor12785102010-08-24 20:21:13 +0000305 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000306
Serge Pavlov07c0f042014-12-18 11:14:21 +0000307 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
Chris Lattner907dfe92008-11-18 07:59:24 +0000308 return;
Alp Tokerb05e0b52014-05-21 06:13:51 +0000309
310 // Invalid macro name, read and discard the rest of the line and set the
311 // token kind to tok::eod if necessary.
312 if (MacroNameTok.isNot(tok::eod)) {
313 MacroNameTok.setKind(tok::eod);
314 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +0000315 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000316}
317
James Dennettf6333ac2012-06-22 05:46:07 +0000318/// \brief Ensure that the next token is a tok::eod token.
319///
320/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
Chris Lattner0003c272009-04-17 23:30:53 +0000321/// true, then we consider macros that expand to zero tokens as being ok.
322void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000323 Token Tmp;
Chris Lattner0003c272009-04-17 23:30:53 +0000324 // Lex unexpanded tokens for most directives: macros might expand to zero
325 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
326 // #line) allow empty macros.
327 if (EnableMacros)
328 Lex(Tmp);
329 else
330 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000331
Chris Lattnerf64b3522008-03-09 01:54:53 +0000332 // There should be no tokens after the directive, but we allow them as an
333 // extension.
334 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
335 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000336
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000337 if (Tmp.isNot(tok::eod)) {
Chris Lattner825676a2009-04-14 05:15:20 +0000338 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000339 // or if this is a macro-style preprocessing directive, because it is more
340 // trouble than it is worth to insert /**/ and check that there is no /**/
341 // in the range also.
Douglas Gregora771f462010-03-31 17:46:05 +0000342 FixItHint Hint;
David Blaikiebbafb8a2012-03-11 07:00:24 +0000343 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000344 !CurTokenLexer)
Douglas Gregora771f462010-03-31 17:46:05 +0000345 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
346 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000347 DiscardUntilEndOfDirective();
348 }
349}
350
James Dennettf6333ac2012-06-22 05:46:07 +0000351/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
352/// decided that the subsequent tokens are in the \#if'd out portion of the
353/// file. Lex the rest of the file, until we see an \#endif. If
Chris Lattnerf64b3522008-03-09 01:54:53 +0000354/// FoundNonSkipPortion is true, then we have already emitted code for part of
James Dennettf6333ac2012-06-22 05:46:07 +0000355/// this \#if directive, so \#else/\#elif blocks should never be entered.
356/// If ElseOk is true, then \#else directives are ok, if not, then we have
357/// already seen one so a \#else directive is a duplicate. When this returns,
358/// the caller can lex the first valid token.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000359void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
360 bool FoundNonSkipPortion,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000361 bool FoundElse,
362 SourceLocation ElseLoc) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000363 ++NumSkipped;
David Blaikie7d170102013-05-15 07:37:26 +0000364 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?");
Chris Lattnerf64b3522008-03-09 01:54:53 +0000365
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000366 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000367 FoundNonSkipPortion, FoundElse);
Mike Stump11289f42009-09-09 15:08:12 +0000368
Ted Kremenek56572ab2008-12-12 18:34:08 +0000369 if (CurPTHLexer) {
370 PTHSkipExcludedConditionalBlock();
371 return;
372 }
Mike Stump11289f42009-09-09 15:08:12 +0000373
Chris Lattnerf64b3522008-03-09 01:54:53 +0000374 // Enter raw mode to disable identifier lookup (and thus macro expansion),
375 // disabling warnings, etc.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000376 CurPPLexer->LexingRawMode = true;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000377 Token Tok;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000378 while (true) {
Chris Lattnerf406b242010-01-18 22:33:01 +0000379 CurLexer->Lex(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000380
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000381 if (Tok.is(tok::code_completion)) {
382 if (CodeComplete)
383 CodeComplete->CodeCompleteInConditionalExclusion();
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000384 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000385 continue;
386 }
Taewook Oh755e4d22016-06-13 21:55:33 +0000387
Chris Lattnerf64b3522008-03-09 01:54:53 +0000388 // If this is the end of the buffer, we have an error.
389 if (Tok.is(tok::eof)) {
390 // Emit errors for each unterminated conditional on the stack, including
391 // the current one.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000392 while (!CurPPLexer->ConditionalStack.empty()) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000393 if (CurLexer->getFileLoc() != CodeCompletionFileLoc)
Douglas Gregor02690ba2010-08-12 17:04:55 +0000394 Diag(CurPPLexer->ConditionalStack.back().IfLoc,
395 diag::err_pp_unterminated_conditional);
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000396 CurPPLexer->ConditionalStack.pop_back();
Mike Stump11289f42009-09-09 15:08:12 +0000397 }
398
Chris Lattnerf64b3522008-03-09 01:54:53 +0000399 // Just return and let the caller lex after this #include.
400 break;
401 }
Mike Stump11289f42009-09-09 15:08:12 +0000402
Chris Lattnerf64b3522008-03-09 01:54:53 +0000403 // If this token is not a preprocessor directive, just skip it.
404 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
405 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000406
Chris Lattnerf64b3522008-03-09 01:54:53 +0000407 // We just parsed a # character at the start of a line, so we're in
408 // directive mode. Tell the lexer this so any newlines we see will be
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000409 // converted into an EOD token (this terminates the macro).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000410 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rose176057b2013-02-22 00:32:00 +0000411 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000412
Mike Stump11289f42009-09-09 15:08:12 +0000413
Chris Lattnerf64b3522008-03-09 01:54:53 +0000414 // Read the next token, the directive flavor.
415 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000416
Chris Lattnerf64b3522008-03-09 01:54:53 +0000417 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
418 // something bogus), skip it.
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000419 if (Tok.isNot(tok::raw_identifier)) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000420 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000421 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000422 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000423 continue;
424 }
425
426 // If the first letter isn't i or e, it isn't intesting to us. We know that
427 // this is safe in the face of spelling differences, because there is no way
428 // to spell an i/e in a strange way that is another letter. Skipping this
429 // allows us to avoid looking up the identifier info for #define/#undef and
430 // other common directives.
Alp Toker2d57cea2014-05-17 04:53:25 +0000431 StringRef RI = Tok.getRawIdentifier();
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000432
Alp Toker2d57cea2014-05-17 04:53:25 +0000433 char FirstChar = RI[0];
Mike Stump11289f42009-09-09 15:08:12 +0000434 if (FirstChar >= 'a' && FirstChar <= 'z' &&
Chris Lattnerf64b3522008-03-09 01:54:53 +0000435 FirstChar != 'i' && FirstChar != 'e') {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000436 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000437 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000438 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000439 continue;
440 }
Mike Stump11289f42009-09-09 15:08:12 +0000441
Chris Lattnerf64b3522008-03-09 01:54:53 +0000442 // Get the identifier name without trigraphs or embedded newlines. Note
443 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
444 // when skipping.
Benjamin Kramer144884642009-12-31 13:32:38 +0000445 char DirectiveBuf[20];
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446 StringRef Directive;
Alp Toker2d57cea2014-05-17 04:53:25 +0000447 if (!Tok.needsCleaning() && RI.size() < 20) {
448 Directive = RI;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000449 } else {
450 std::string DirectiveStr = getSpelling(Tok);
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000451 size_t IdLen = DirectiveStr.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000452 if (IdLen >= 20) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000453 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000454 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000455 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000456 continue;
457 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000458 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000459 Directive = StringRef(DirectiveBuf, IdLen);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000460 }
Mike Stump11289f42009-09-09 15:08:12 +0000461
Benjamin Kramer144884642009-12-31 13:32:38 +0000462 if (Directive.startswith("if")) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000463 StringRef Sub = Directive.substr(2);
Benjamin Kramer144884642009-12-31 13:32:38 +0000464 if (Sub.empty() || // "if"
465 Sub == "def" || // "ifdef"
466 Sub == "ndef") { // "ifndef"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000467 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
468 // bother parsing the condition.
469 DiscardUntilEndOfDirective();
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000470 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000471 /*foundnonskip*/false,
Chandler Carruth540960f2011-01-03 17:40:17 +0000472 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000473 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000474 } else if (Directive[0] == 'e') {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000475 StringRef Sub = Directive.substr(1);
Benjamin Kramer144884642009-12-31 13:32:38 +0000476 if (Sub == "ndif") { // "endif"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000477 PPConditionalInfo CondInfo;
478 CondInfo.WasSkipping = true; // Silence bogus warning.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000479 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000480 (void)InCond; // Silence warning in no-asserts mode.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000481 assert(!InCond && "Can't be skipping if not in a conditional!");
Mike Stump11289f42009-09-09 15:08:12 +0000482
Chris Lattnerf64b3522008-03-09 01:54:53 +0000483 // If we popped the outermost skipping block, we're done skipping!
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000484 if (!CondInfo.WasSkipping) {
Richard Smith87d8fb92012-06-24 23:56:26 +0000485 // Restore the value of LexingRawMode so that trailing comments
486 // are handled correctly, if we've reached the outermost block.
487 CurPPLexer->LexingRawMode = false;
Richard Smithd0124572012-06-21 00:35:03 +0000488 CheckEndOfDirective("endif");
Richard Smith87d8fb92012-06-24 23:56:26 +0000489 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000490 if (Callbacks)
491 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000492 break;
Richard Smithd0124572012-06-21 00:35:03 +0000493 } else {
494 DiscardUntilEndOfDirective();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000495 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000496 } else if (Sub == "lse") { // "else".
Chris Lattnerf64b3522008-03-09 01:54:53 +0000497 // #else directive in a skipping conditional. If not in some other
498 // skipping conditional, and if #else hasn't already been seen, enter it
499 // as a non-skipping conditional.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000500 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Mike Stump11289f42009-09-09 15:08:12 +0000501
Chris Lattnerf64b3522008-03-09 01:54:53 +0000502 // If this is a #else with a #else before it, report the error.
503 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000504
Chris Lattnerf64b3522008-03-09 01:54:53 +0000505 // Note that we've seen a #else in this conditional.
506 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000507
Chris Lattnerf64b3522008-03-09 01:54:53 +0000508 // If the conditional is at the top level, and the #if block wasn't
509 // entered, enter the #else block now.
510 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
511 CondInfo.FoundNonSkip = true;
Richard Smith87d8fb92012-06-24 23:56:26 +0000512 // Restore the value of LexingRawMode so that trailing comments
513 // are handled correctly.
514 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000515 CheckEndOfDirective("else");
Richard Smith87d8fb92012-06-24 23:56:26 +0000516 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000517 if (Callbacks)
518 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000519 break;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000520 } else {
521 DiscardUntilEndOfDirective(); // C99 6.10p4.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000522 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000523 } else if (Sub == "lif") { // "elif".
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000524 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000525
John Thompson17c35732013-12-04 20:19:30 +0000526 // If this is a #elif with a #else before it, report the error.
527 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_elif_after_else);
528
Chris Lattnerf64b3522008-03-09 01:54:53 +0000529 // If this is in a skipping block or if we're already handled this #if
530 // block, don't bother parsing the condition.
531 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
532 DiscardUntilEndOfDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000533 } else {
John Thompson17c35732013-12-04 20:19:30 +0000534 const SourceLocation CondBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000535 // Restore the value of LexingRawMode so that identifiers are
536 // looked up, etc, inside the #elif expression.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000537 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
538 CurPPLexer->LexingRawMode = false;
Craig Topperd2d442c2014-05-17 23:10:59 +0000539 IdentifierInfo *IfNDefMacro = nullptr;
John Thompson17c35732013-12-04 20:19:30 +0000540 const bool CondValue = EvaluateDirectiveExpression(IfNDefMacro);
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000541 CurPPLexer->LexingRawMode = true;
John Thompson17c35732013-12-04 20:19:30 +0000542 if (Callbacks) {
543 const SourceLocation CondEnd = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000544 Callbacks->Elif(Tok.getLocation(),
John Thompson17c35732013-12-04 20:19:30 +0000545 SourceRange(CondBegin, CondEnd),
John Thompson87f9fef2013-12-07 08:41:15 +0000546 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False), CondInfo.IfLoc);
John Thompson17c35732013-12-04 20:19:30 +0000547 }
548 // If this condition is true, enter it!
549 if (CondValue) {
550 CondInfo.FoundNonSkip = true;
551 break;
552 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000553 }
554 }
555 }
Mike Stump11289f42009-09-09 15:08:12 +0000556
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000557 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000558 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000559 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000560 }
561
562 // Finally, if we are out of the conditional (saw an #endif or ran off the end
563 // of the file, just stop skipping and return to lexing whatever came after
564 // the #if block.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000565 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000566
567 if (Callbacks) {
568 SourceLocation BeginLoc = ElseLoc.isValid() ? ElseLoc : IfTokenLoc;
569 Callbacks->SourceRangeSkipped(SourceRange(BeginLoc, Tok.getLocation()));
570 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000571}
572
Ted Kremenek56572ab2008-12-12 18:34:08 +0000573void Preprocessor::PTHSkipExcludedConditionalBlock() {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000574 while (true) {
Ted Kremenek56572ab2008-12-12 18:34:08 +0000575 assert(CurPTHLexer);
576 assert(CurPTHLexer->LexingRawMode == false);
Mike Stump11289f42009-09-09 15:08:12 +0000577
Ted Kremenek56572ab2008-12-12 18:34:08 +0000578 // Skip to the next '#else', '#elif', or #endif.
579 if (CurPTHLexer->SkipBlock()) {
580 // We have reached an #endif. Both the '#' and 'endif' tokens
581 // have been consumed by the PTHLexer. Just pop off the condition level.
582 PPConditionalInfo CondInfo;
583 bool InCond = CurPTHLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000584 (void)InCond; // Silence warning in no-asserts mode.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000585 assert(!InCond && "Can't be skipping if not in a conditional!");
586 break;
587 }
Mike Stump11289f42009-09-09 15:08:12 +0000588
Ted Kremenek56572ab2008-12-12 18:34:08 +0000589 // We have reached a '#else' or '#elif'. Lex the next token to get
590 // the directive flavor.
591 Token Tok;
592 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000593
Ted Kremenek56572ab2008-12-12 18:34:08 +0000594 // We can actually look up the IdentifierInfo here since we aren't in
595 // raw mode.
596 tok::PPKeywordKind K = Tok.getIdentifierInfo()->getPPKeywordID();
597
598 if (K == tok::pp_else) {
599 // #else: Enter the else condition. We aren't in a nested condition
600 // since we skip those. We're always in the one matching the last
601 // blocked we skipped.
602 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
603 // Note that we've seen a #else in this conditional.
604 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000605
Ted Kremenek56572ab2008-12-12 18:34:08 +0000606 // If the #if block wasn't entered then enter the #else block now.
607 if (!CondInfo.FoundNonSkip) {
608 CondInfo.FoundNonSkip = true;
Mike Stump11289f42009-09-09 15:08:12 +0000609
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000610 // Scan until the eod token.
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000611 CurPTHLexer->ParsingPreprocessorDirective = true;
Daniel Dunbar2cba6be2009-04-13 17:57:49 +0000612 DiscardUntilEndOfDirective();
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000613 CurPTHLexer->ParsingPreprocessorDirective = false;
Mike Stump11289f42009-09-09 15:08:12 +0000614
Ted Kremenek56572ab2008-12-12 18:34:08 +0000615 break;
616 }
Mike Stump11289f42009-09-09 15:08:12 +0000617
Ted Kremenek56572ab2008-12-12 18:34:08 +0000618 // Otherwise skip this block.
619 continue;
620 }
Mike Stump11289f42009-09-09 15:08:12 +0000621
Ted Kremenek56572ab2008-12-12 18:34:08 +0000622 assert(K == tok::pp_elif);
623 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
624
625 // If this is a #elif with a #else before it, report the error.
626 if (CondInfo.FoundElse)
627 Diag(Tok, diag::pp_err_elif_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000628
Ted Kremenek56572ab2008-12-12 18:34:08 +0000629 // If this is in a skipping block or if we're already handled this #if
Mike Stump11289f42009-09-09 15:08:12 +0000630 // block, don't bother parsing the condition. We just skip this block.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000631 if (CondInfo.FoundNonSkip)
632 continue;
633
634 // Evaluate the condition of the #elif.
Craig Topperd2d442c2014-05-17 23:10:59 +0000635 IdentifierInfo *IfNDefMacro = nullptr;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000636 CurPTHLexer->ParsingPreprocessorDirective = true;
637 bool ShouldEnter = EvaluateDirectiveExpression(IfNDefMacro);
638 CurPTHLexer->ParsingPreprocessorDirective = false;
639
640 // If this condition is true, enter it!
641 if (ShouldEnter) {
642 CondInfo.FoundNonSkip = true;
643 break;
644 }
645
646 // Otherwise, skip this block and go to the next one.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000647 }
648}
649
Richard Smith2a553082015-04-23 22:58:06 +0000650Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
Richard Smith7e82e012016-02-19 22:25:36 +0000651 if (!SourceMgr.isInMainFile(Loc)) {
652 // Try to determine the module of the include directive.
653 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
654 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
655 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
656 // The include comes from an included file.
657 return HeaderInfo.getModuleMap()
658 .findModuleForHeader(EntryOfIncl)
659 .getModule();
660 }
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000661 }
Richard Smith7e82e012016-02-19 22:25:36 +0000662
663 // This is either in the main file or not in a file at all. It belongs
664 // to the current module, if there is one.
665 return getLangOpts().CurrentModule.empty()
666 ? nullptr
667 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000668}
669
Richard Smith4eb83932016-04-27 21:57:05 +0000670const FileEntry *
671Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000672 Module *M,
Richard Smith4eb83932016-04-27 21:57:05 +0000673 SourceLocation Loc) {
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000674 assert(M && "no module to include");
675
Richard Smith4eb83932016-04-27 21:57:05 +0000676 // If we have a module import syntax, we shouldn't include a header to
677 // make a particular module visible.
678 if (getLangOpts().ObjC2)
679 return nullptr;
680
Richard Smith4eb83932016-04-27 21:57:05 +0000681 Module *TopM = M->getTopLevelModule();
682 Module *IncM = getModuleForLocation(IncLoc);
683
684 // Walk up through the include stack, looking through textual headers of M
685 // until we hit a non-textual header that we can #include. (We assume textual
686 // headers of a module with non-textual headers aren't meant to be used to
687 // import entities from the module.)
688 auto &SM = getSourceManager();
689 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
690 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
691 auto *FE = SM.getFileEntryForID(ID);
Richard Smith040e1262017-06-02 01:55:39 +0000692 if (!FE)
693 break;
Richard Smith4eb83932016-04-27 21:57:05 +0000694
695 bool InTextualHeader = false;
696 for (auto Header : HeaderInfo.getModuleMap().findAllModulesForHeader(FE)) {
697 if (!Header.getModule()->isSubModuleOf(TopM))
698 continue;
699
700 if (!(Header.getRole() & ModuleMap::TextualHeader)) {
701 // If this is an accessible, non-textual header of M's top-level module
702 // that transitively includes the given location and makes the
703 // corresponding module visible, this is the thing to #include.
704 if (Header.isAccessibleFrom(IncM))
705 return FE;
706
707 // It's in a private header; we can't #include it.
708 // FIXME: If there's a public header in some module that re-exports it,
709 // then we could suggest including that, but it's not clear that's the
710 // expected way to make this entity visible.
711 continue;
712 }
713
714 InTextualHeader = true;
715 }
716
717 if (!InTextualHeader)
718 break;
719
720 Loc = SM.getIncludeLoc(ID);
721 }
722
723 return nullptr;
724}
725
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000726const FileEntry *Preprocessor::LookupFile(
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000727 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
728 const DirectoryLookup *FromDir, const FileEntry *FromFile,
729 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
Douglas Gregor97eec242011-09-15 22:00:41 +0000730 SmallVectorImpl<char> *RelativePath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000731 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool SkipCache) {
Taewook Oh755e4d22016-06-13 21:55:33 +0000732 Module *RequestingModule = getModuleForLocation(FilenameLoc);
Richard Smith8d4e90b2016-03-14 17:52:37 +0000733 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
Richard Smith3d5b48c2015-10-16 21:42:56 +0000734
Will Wilson0fafd342013-12-27 19:46:16 +0000735 // If the header lookup mechanism may be relative to the current inclusion
736 // stack, record the parent #includes.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000737 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
738 Includers;
Manman Rene4a5d372016-05-17 02:15:12 +0000739 bool BuildSystemModule = false;
Richard Smith25d50752014-10-20 00:15:49 +0000740 if (!FromDir && !FromFile) {
Chris Lattnerd32480d2009-01-17 06:22:33 +0000741 FileID FID = getCurrentFileLexer()->getFileID();
Will Wilson0fafd342013-12-27 19:46:16 +0000742 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
Mike Stump11289f42009-09-09 15:08:12 +0000743
Chris Lattner022923a2009-02-04 19:45:07 +0000744 // If there is no file entry associated with this file, it must be the
Richard Smith3c1a41a2014-12-02 00:08:08 +0000745 // predefines buffer or the module includes buffer. Any other file is not
746 // lexed with a normal lexer, so it won't be scanned for preprocessor
747 // directives.
748 //
749 // If we have the predefines buffer, resolve #include references (which come
750 // from the -include command line argument) from the current working
751 // directory instead of relative to the main file.
752 //
753 // If we have the module includes buffer, resolve #include references (which
754 // come from header declarations in the module map) relative to the module
755 // map file.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000756 if (!FileEnt) {
Manman Rene4a5d372016-05-17 02:15:12 +0000757 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Richard Smith3c1a41a2014-12-02 00:08:08 +0000758 Includers.push_back(std::make_pair(nullptr, MainFileDir));
Manman Rene4a5d372016-05-17 02:15:12 +0000759 BuildSystemModule = getCurrentModule()->IsSystem;
760 } else if ((FileEnt =
Richard Smith3c1a41a2014-12-02 00:08:08 +0000761 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000762 Includers.push_back(std::make_pair(FileEnt, FileMgr.getDirectory(".")));
763 } else {
764 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
765 }
Will Wilson0fafd342013-12-27 19:46:16 +0000766
767 // MSVC searches the current include stack from top to bottom for
768 // headers included by quoted include directives.
769 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
Alp Tokerbfa39342014-01-14 12:51:41 +0000770 if (LangOpts.MSVCCompat && !isAngled) {
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000771 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Will Wilson0fafd342013-12-27 19:46:16 +0000772 if (IsFileLexer(ISEntry))
Yaron Keren65224612015-12-18 10:30:12 +0000773 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000774 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
Will Wilson0fafd342013-12-27 19:46:16 +0000775 }
Chris Lattner022923a2009-02-04 19:45:07 +0000776 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000777 }
Mike Stump11289f42009-09-09 15:08:12 +0000778
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000779 CurDir = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +0000780
781 if (FromFile) {
782 // We're supposed to start looking from after a particular file. Search
783 // the include path until we find that file or run out of files.
784 const DirectoryLookup *TmpCurDir = CurDir;
785 const DirectoryLookup *TmpFromDir = nullptr;
786 while (const FileEntry *FE = HeaderInfo.LookupFile(
787 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000788 Includers, SearchPath, RelativePath, RequestingModule,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000789 SuggestedModule, /*IsMapped=*/nullptr, SkipCache)) {
Richard Smith25d50752014-10-20 00:15:49 +0000790 // Keep looking as if this file did a #include_next.
791 TmpFromDir = TmpCurDir;
792 ++TmpFromDir;
793 if (FE == FromFile) {
794 // Found it.
795 FromDir = TmpFromDir;
796 CurDir = TmpCurDir;
797 break;
798 }
799 }
800 }
801
802 // Do a standard file entry lookup.
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000803 const FileEntry *FE = HeaderInfo.LookupFile(
Will Wilson0fafd342013-12-27 19:46:16 +0000804 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000805 RelativePath, RequestingModule, SuggestedModule, IsMapped, SkipCache,
Manman Rene4a5d372016-05-17 02:15:12 +0000806 BuildSystemModule);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000807 if (FE) {
Daniel Jasper5c77e392014-03-14 14:53:17 +0000808 if (SuggestedModule && !LangOpts.AsmPreprocessor)
Daniel Jasper92669ee2013-12-20 12:09:36 +0000809 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000810 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
811 Filename, FE);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000812 return FE;
813 }
Mike Stump11289f42009-09-09 15:08:12 +0000814
Will Wilson0fafd342013-12-27 19:46:16 +0000815 const FileEntry *CurFileEnt;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000816 // Otherwise, see if this is a subframework header. If so, this is relative
817 // to one of the headers on the #include stack. Walk the list of the current
818 // headers on the #include stack and pass them to HeaderInfo.
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000819 if (IsFileLexer()) {
Yaron Keren65224612015-12-18 10:30:12 +0000820 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000821 if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt,
Douglas Gregorf5f94522013-02-08 00:10:48 +0000822 SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000823 RequestingModule,
Ben Langmuir71e1a642014-05-05 21:44:13 +0000824 SuggestedModule))) {
825 if (SuggestedModule && !LangOpts.AsmPreprocessor)
826 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000827 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
828 Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000829 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000830 }
831 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000832 }
Mike Stump11289f42009-09-09 15:08:12 +0000833
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000834 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000835 if (IsFileLexer(ISEntry)) {
Yaron Keren65224612015-12-18 10:30:12 +0000836 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
Manuel Klimek0c69fd22011-04-26 21:50:03 +0000837 if ((FE = HeaderInfo.LookupSubframeworkHeader(
Douglas Gregorf5f94522013-02-08 00:10:48 +0000838 Filename, CurFileEnt, SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000839 RequestingModule, SuggestedModule))) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000840 if (SuggestedModule && !LangOpts.AsmPreprocessor)
841 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000842 RequestingModule, RequestingModuleIsModuleInterface,
843 FilenameLoc, Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000844 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000845 }
846 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000847 }
848 }
Mike Stump11289f42009-09-09 15:08:12 +0000849
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000850 // Otherwise, we really couldn't find the file.
Craig Topperd2d442c2014-05-17 23:10:59 +0000851 return nullptr;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000852}
853
Chris Lattnerf64b3522008-03-09 01:54:53 +0000854//===----------------------------------------------------------------------===//
855// Preprocessor Directive Handling.
856//===----------------------------------------------------------------------===//
857
David Blaikied5321242012-06-06 18:52:13 +0000858class Preprocessor::ResetMacroExpansionHelper {
859public:
860 ResetMacroExpansionHelper(Preprocessor *pp)
861 : PP(pp), save(pp->DisableMacroExpansion) {
862 if (pp->MacroExpansionInDirectivesOverride)
863 pp->DisableMacroExpansion = false;
864 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000865
David Blaikied5321242012-06-06 18:52:13 +0000866 ~ResetMacroExpansionHelper() {
867 PP->DisableMacroExpansion = save;
868 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000869
David Blaikied5321242012-06-06 18:52:13 +0000870private:
871 Preprocessor *PP;
872 bool save;
873};
874
Chris Lattnerf64b3522008-03-09 01:54:53 +0000875/// HandleDirective - This callback is invoked when the lexer sees a # token
Mike Stump11289f42009-09-09 15:08:12 +0000876/// at the start of a line. This consumes the directive, modifies the
Chris Lattnerf64b3522008-03-09 01:54:53 +0000877/// lexer/preprocessor state, and advances the lexer(s) so that the next token
878/// read is the correct one.
879void Preprocessor::HandleDirective(Token &Result) {
880 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
Mike Stump11289f42009-09-09 15:08:12 +0000881
Chris Lattnerf64b3522008-03-09 01:54:53 +0000882 // We just parsed a # character at the start of a line, so we're in directive
883 // mode. Tell the lexer this so any newlines we see will be converted into an
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000884 // EOD token (which terminates the directive).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000885 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000886 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Mike Stump11289f42009-09-09 15:08:12 +0000887
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000888 bool ImmediatelyAfterTopLevelIfndef =
889 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
890 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
891
Chris Lattnerf64b3522008-03-09 01:54:53 +0000892 ++NumDirectives;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +0000893
Chris Lattnerf64b3522008-03-09 01:54:53 +0000894 // We are about to read a token. For the multiple-include optimization FA to
Mike Stump11289f42009-09-09 15:08:12 +0000895 // work, we have to remember if we had read any tokens *before* this
Chris Lattnerf64b3522008-03-09 01:54:53 +0000896 // pp-directive.
Chris Lattner8cf1f932009-12-14 04:54:40 +0000897 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
Mike Stump11289f42009-09-09 15:08:12 +0000898
Chris Lattner2d17ab72009-03-18 21:00:25 +0000899 // Save the '#' token in case we need to return it later.
900 Token SavedHash = Result;
Mike Stump11289f42009-09-09 15:08:12 +0000901
Chris Lattnerf64b3522008-03-09 01:54:53 +0000902 // Read the next token, the directive flavor. This isn't expanded due to
903 // C99 6.10.3p8.
904 LexUnexpandedToken(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000905
Chris Lattnerf64b3522008-03-09 01:54:53 +0000906 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
907 // #define A(x) #x
908 // A(abc
909 // #warning blah
910 // def)
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000911 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
912 // not support this for #include-like directives, since that can result in
913 // terrible diagnostics, and does not work in GCC.
914 if (InMacroArgs) {
915 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
916 switch (II->getPPKeywordID()) {
917 case tok::pp_include:
918 case tok::pp_import:
919 case tok::pp_include_next:
920 case tok::pp___include_macros:
David Majnemerf2d3bc02014-12-28 07:42:49 +0000921 case tok::pp_pragma:
922 Diag(Result, diag::err_embedded_directive) << II->getName();
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000923 DiscardUntilEndOfDirective();
924 return;
925 default:
926 break;
927 }
928 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000929 Diag(Result, diag::ext_embedded_directive);
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000930 }
Mike Stump11289f42009-09-09 15:08:12 +0000931
David Blaikied5321242012-06-06 18:52:13 +0000932 // Temporarily enable macro expansion if set so
933 // and reset to previous state when returning from this function.
934 ResetMacroExpansionHelper helper(this);
935
Chris Lattnerf64b3522008-03-09 01:54:53 +0000936 switch (Result.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000937 case tok::eod:
Chris Lattnerf64b3522008-03-09 01:54:53 +0000938 return; // null directive.
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000939 case tok::code_completion:
940 if (CodeComplete)
941 CodeComplete->CodeCompleteDirective(
942 CurPPLexer->getConditionalStackDepth() > 0);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000943 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000944 return;
Chris Lattner76e68962009-01-26 06:19:46 +0000945 case tok::numeric_constant: // # 7 GNU line marker directive.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000946 if (getLangOpts().AsmPreprocessor)
Chris Lattner5eb8ae22009-03-18 20:41:10 +0000947 break; // # 4 is not a preprocessor directive in .S files.
Chris Lattner76e68962009-01-26 06:19:46 +0000948 return HandleDigitDirective(Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000949 default:
950 IdentifierInfo *II = Result.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +0000951 if (!II) break; // Not an identifier.
Mike Stump11289f42009-09-09 15:08:12 +0000952
Chris Lattnerf64b3522008-03-09 01:54:53 +0000953 // Ask what the preprocessor keyword ID is.
954 switch (II->getPPKeywordID()) {
955 default: break;
956 // C99 6.10.1 - Conditional Inclusion.
957 case tok::pp_if:
958 return HandleIfDirective(Result, ReadAnyTokensBeforeDirective);
959 case tok::pp_ifdef:
960 return HandleIfdefDirective(Result, false, true/*not valid for miopt*/);
961 case tok::pp_ifndef:
962 return HandleIfdefDirective(Result, true, ReadAnyTokensBeforeDirective);
963 case tok::pp_elif:
964 return HandleElifDirective(Result);
965 case tok::pp_else:
966 return HandleElseDirective(Result);
967 case tok::pp_endif:
968 return HandleEndifDirective(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000969
Chris Lattnerf64b3522008-03-09 01:54:53 +0000970 // C99 6.10.2 - Source File Inclusion.
971 case tok::pp_include:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000972 // Handle #include.
973 return HandleIncludeDirective(SavedHash.getLocation(), Result);
Chris Lattner14a7f392009-04-08 18:24:34 +0000974 case tok::pp___include_macros:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000975 // Handle -imacros.
Taewook Oh755e4d22016-06-13 21:55:33 +0000976 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +0000977
Chris Lattnerf64b3522008-03-09 01:54:53 +0000978 // C99 6.10.3 - Macro Replacement.
979 case tok::pp_define:
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000980 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000981 case tok::pp_undef:
Erik Verbruggen4bddef92016-10-26 08:52:41 +0000982 return HandleUndefDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000983
984 // C99 6.10.4 - Line Control.
985 case tok::pp_line:
Erik Verbruggen4bddef92016-10-26 08:52:41 +0000986 return HandleLineDirective();
Mike Stump11289f42009-09-09 15:08:12 +0000987
Chris Lattnerf64b3522008-03-09 01:54:53 +0000988 // C99 6.10.5 - Error Directive.
989 case tok::pp_error:
990 return HandleUserDiagnosticDirective(Result, false);
Mike Stump11289f42009-09-09 15:08:12 +0000991
Chris Lattnerf64b3522008-03-09 01:54:53 +0000992 // C99 6.10.6 - Pragma Directive.
993 case tok::pp_pragma:
Enea Zaffanella5afb04a2013-07-20 20:09:11 +0000994 return HandlePragmaDirective(SavedHash.getLocation(), PIK_HashPragma);
Mike Stump11289f42009-09-09 15:08:12 +0000995
Chris Lattnerf64b3522008-03-09 01:54:53 +0000996 // GNU Extensions.
997 case tok::pp_import:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000998 return HandleImportDirective(SavedHash.getLocation(), Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000999 case tok::pp_include_next:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001000 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001001
Chris Lattnerf64b3522008-03-09 01:54:53 +00001002 case tok::pp_warning:
1003 Diag(Result, diag::ext_pp_warning_directive);
1004 return HandleUserDiagnosticDirective(Result, true);
1005 case tok::pp_ident:
1006 return HandleIdentSCCSDirective(Result);
1007 case tok::pp_sccs:
1008 return HandleIdentSCCSDirective(Result);
1009 case tok::pp_assert:
1010 //isExtension = true; // FIXME: implement #assert
1011 break;
1012 case tok::pp_unassert:
1013 //isExtension = true; // FIXME: implement #unassert
1014 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001015
Douglas Gregor663b48f2012-01-03 19:48:16 +00001016 case tok::pp___public_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001017 if (getLangOpts().Modules)
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001018 return HandleMacroPublicDirective(Result);
1019 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001020
Douglas Gregor663b48f2012-01-03 19:48:16 +00001021 case tok::pp___private_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001022 if (getLangOpts().Modules)
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001023 return HandleMacroPrivateDirective();
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001024 break;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001025 }
1026 break;
1027 }
Mike Stump11289f42009-09-09 15:08:12 +00001028
Chris Lattner2d17ab72009-03-18 21:00:25 +00001029 // If this is a .S file, treat unknown # directives as non-preprocessor
1030 // directives. This is important because # may be a comment or introduce
1031 // various pseudo-ops. Just return the # token and push back the following
1032 // token to be lexed next time.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001033 if (getLangOpts().AsmPreprocessor) {
David Blaikie2eabcc92016-02-09 18:52:09 +00001034 auto Toks = llvm::make_unique<Token[]>(2);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001035 // Return the # and the token after it.
Mike Stump11289f42009-09-09 15:08:12 +00001036 Toks[0] = SavedHash;
Chris Lattner2d17ab72009-03-18 21:00:25 +00001037 Toks[1] = Result;
Taewook Oh755e4d22016-06-13 21:55:33 +00001038
Chris Lattner56f64c12011-01-06 05:01:51 +00001039 // If the second token is a hashhash token, then we need to translate it to
1040 // unknown so the token lexer doesn't try to perform token pasting.
1041 if (Result.is(tok::hashhash))
1042 Toks[1].setKind(tok::unknown);
Taewook Oh755e4d22016-06-13 21:55:33 +00001043
Chris Lattner2d17ab72009-03-18 21:00:25 +00001044 // Enter this token stream so that we re-lex the tokens. Make sure to
1045 // enable macro expansion, in case the token after the # is an identifier
1046 // that is expanded.
David Blaikie2eabcc92016-02-09 18:52:09 +00001047 EnterTokenStream(std::move(Toks), 2, false);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001048 return;
1049 }
Mike Stump11289f42009-09-09 15:08:12 +00001050
Chris Lattnerf64b3522008-03-09 01:54:53 +00001051 // If we reached here, the preprocessing token is not valid!
1052 Diag(Result, diag::err_pp_invalid_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001053
Chris Lattnerf64b3522008-03-09 01:54:53 +00001054 // Read the rest of the PP line.
1055 DiscardUntilEndOfDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001056
Chris Lattnerf64b3522008-03-09 01:54:53 +00001057 // Okay, we're done parsing the directive.
1058}
1059
Chris Lattner76e68962009-01-26 06:19:46 +00001060/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1061/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1062static bool GetLineValue(Token &DigitTok, unsigned &Val,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001063 unsigned DiagID, Preprocessor &PP,
1064 bool IsGNULineDirective=false) {
Chris Lattner76e68962009-01-26 06:19:46 +00001065 if (DigitTok.isNot(tok::numeric_constant)) {
1066 PP.Diag(DigitTok, DiagID);
Mike Stump11289f42009-09-09 15:08:12 +00001067
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001068 if (DigitTok.isNot(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001069 PP.DiscardUntilEndOfDirective();
1070 return true;
1071 }
Mike Stump11289f42009-09-09 15:08:12 +00001072
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001073 SmallString<64> IntegerBuffer;
Chris Lattner76e68962009-01-26 06:19:46 +00001074 IntegerBuffer.resize(DigitTok.getLength());
1075 const char *DigitTokBegin = &IntegerBuffer[0];
Douglas Gregordc970f02010-03-16 22:30:13 +00001076 bool Invalid = false;
1077 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1078 if (Invalid)
1079 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001080
Chris Lattnerd66f1722009-04-18 18:35:15 +00001081 // Verify that we have a simple digit-sequence, and compute the value. This
1082 // is always a simple digit string computed in decimal, so we do this manually
1083 // here.
1084 Val = 0;
1085 for (unsigned i = 0; i != ActualLength; ++i) {
Richard Smith7f2707a2013-09-26 18:13:20 +00001086 // C++1y [lex.fcon]p1:
1087 // Optional separating single quotes in a digit-sequence are ignored
1088 if (DigitTokBegin[i] == '\'')
1089 continue;
1090
Jordan Rosea7d03842013-02-08 22:30:41 +00001091 if (!isDigit(DigitTokBegin[i])) {
Chris Lattnerd66f1722009-04-18 18:35:15 +00001092 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
Michael Ilsemane910cc82013-04-10 01:04:18 +00001093 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001094 PP.DiscardUntilEndOfDirective();
1095 return true;
1096 }
Mike Stump11289f42009-09-09 15:08:12 +00001097
Chris Lattnerd66f1722009-04-18 18:35:15 +00001098 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1099 if (NextVal < Val) { // overflow.
1100 PP.Diag(DigitTok, DiagID);
1101 PP.DiscardUntilEndOfDirective();
1102 return true;
1103 }
1104 Val = NextVal;
Chris Lattner76e68962009-01-26 06:19:46 +00001105 }
Mike Stump11289f42009-09-09 15:08:12 +00001106
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001107 if (DigitTokBegin[0] == '0' && Val)
Michael Ilsemane910cc82013-04-10 01:04:18 +00001108 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1109 << IsGNULineDirective;
Mike Stump11289f42009-09-09 15:08:12 +00001110
Chris Lattner76e68962009-01-26 06:19:46 +00001111 return false;
1112}
1113
James Dennettf6333ac2012-06-22 05:46:07 +00001114/// \brief Handle a \#line directive: C99 6.10.4.
1115///
1116/// The two acceptable forms are:
1117/// \verbatim
Chris Lattner100c65e2009-01-26 05:29:08 +00001118/// # line digit-sequence
1119/// # line digit-sequence "s-char-sequence"
James Dennettf6333ac2012-06-22 05:46:07 +00001120/// \endverbatim
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001121void Preprocessor::HandleLineDirective() {
Chris Lattner100c65e2009-01-26 05:29:08 +00001122 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1123 // expanded.
1124 Token DigitTok;
1125 Lex(DigitTok);
1126
Chris Lattner100c65e2009-01-26 05:29:08 +00001127 // Validate the number and convert it to an unsigned.
Chris Lattner76e68962009-01-26 06:19:46 +00001128 unsigned LineNo;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001129 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
Chris Lattner100c65e2009-01-26 05:29:08 +00001130 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001131
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001132 if (LineNo == 0)
1133 Diag(DigitTok, diag::ext_pp_line_zero);
Chris Lattner100c65e2009-01-26 05:29:08 +00001134
Chris Lattner76e68962009-01-26 06:19:46 +00001135 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1136 // number greater than 2147483647". C90 requires that the line # be <= 32767.
Eli Friedman192e0342011-10-10 23:35:28 +00001137 unsigned LineLimit = 32768U;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001138 if (LangOpts.C99 || LangOpts.CPlusPlus11)
Eli Friedman192e0342011-10-10 23:35:28 +00001139 LineLimit = 2147483648U;
Chris Lattner100c65e2009-01-26 05:29:08 +00001140 if (LineNo >= LineLimit)
1141 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001142 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
Richard Smithacd4d3d2011-10-15 01:18:56 +00001143 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
Mike Stump11289f42009-09-09 15:08:12 +00001144
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001145 int FilenameID = -1;
Chris Lattner100c65e2009-01-26 05:29:08 +00001146 Token StrTok;
1147 Lex(StrTok);
1148
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001149 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1150 // string followed by eod.
1151 if (StrTok.is(tok::eod))
Chris Lattner100c65e2009-01-26 05:29:08 +00001152 ; // ok
1153 else if (StrTok.isNot(tok::string_literal)) {
1154 Diag(StrTok, diag::err_pp_line_invalid_filename);
Richard Smithd67aea22012-03-06 03:21:47 +00001155 return DiscardUntilEndOfDirective();
1156 } else if (StrTok.hasUDSuffix()) {
1157 Diag(StrTok, diag::err_invalid_string_udl);
1158 return DiscardUntilEndOfDirective();
Chris Lattner100c65e2009-01-26 05:29:08 +00001159 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001160 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001161 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001162 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001163 if (Literal.hadError)
1164 return DiscardUntilEndOfDirective();
1165 if (Literal.Pascal) {
1166 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1167 return DiscardUntilEndOfDirective();
1168 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001169 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001170
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001171 // Verify that there is nothing after the string, other than EOD. Because
Chris Lattner0003c272009-04-17 23:30:53 +00001172 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1173 CheckEndOfDirective("line", true);
Chris Lattner100c65e2009-01-26 05:29:08 +00001174 }
Mike Stump11289f42009-09-09 15:08:12 +00001175
Reid Klecknereb00ee02017-05-22 21:42:58 +00001176 // Take the file kind of the file containing the #line directive. #line
1177 // directives are often used for generated sources from the same codebase, so
1178 // the new file should generally be classified the same way as the current
1179 // file. This is visible in GCC's pre-processed output, which rewrites #line
1180 // to GNU line markers.
1181 SrcMgr::CharacteristicKind FileKind =
1182 SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1183
1184 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1185 false, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001186
Chris Lattner839150e2009-03-27 17:13:49 +00001187 if (Callbacks)
Chris Lattnerc745cec2010-04-14 04:28:50 +00001188 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
Reid Klecknereb00ee02017-05-22 21:42:58 +00001189 PPCallbacks::RenameFile, FileKind);
Chris Lattner100c65e2009-01-26 05:29:08 +00001190}
1191
Chris Lattner76e68962009-01-26 06:19:46 +00001192/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1193/// marker directive.
1194static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
Reid Klecknereb00ee02017-05-22 21:42:58 +00001195 SrcMgr::CharacteristicKind &FileKind,
Chris Lattner76e68962009-01-26 06:19:46 +00001196 Preprocessor &PP) {
1197 unsigned FlagVal;
1198 Token FlagTok;
1199 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001200 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001201 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1202 return true;
1203
1204 if (FlagVal == 1) {
1205 IsFileEntry = true;
Mike Stump11289f42009-09-09 15:08:12 +00001206
Chris Lattner76e68962009-01-26 06:19:46 +00001207 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001208 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001209 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1210 return true;
1211 } else if (FlagVal == 2) {
1212 IsFileExit = true;
Mike Stump11289f42009-09-09 15:08:12 +00001213
Chris Lattner1c967782009-02-04 06:25:26 +00001214 SourceManager &SM = PP.getSourceManager();
1215 // If we are leaving the current presumed file, check to make sure the
1216 // presumed include stack isn't empty!
1217 FileID CurFileID =
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001218 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
Chris Lattner1c967782009-02-04 06:25:26 +00001219 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
Douglas Gregor453b0122010-11-12 07:15:47 +00001220 if (PLoc.isInvalid())
1221 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001222
Chris Lattner1c967782009-02-04 06:25:26 +00001223 // If there is no include loc (main file) or if the include loc is in a
1224 // different physical file, then we aren't in a "1" line marker flag region.
1225 SourceLocation IncLoc = PLoc.getIncludeLoc();
1226 if (IncLoc.isInvalid() ||
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001227 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
Chris Lattner1c967782009-02-04 06:25:26 +00001228 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1229 PP.DiscardUntilEndOfDirective();
1230 return true;
1231 }
Mike Stump11289f42009-09-09 15:08:12 +00001232
Chris Lattner76e68962009-01-26 06:19:46 +00001233 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001234 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001235 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1236 return true;
1237 }
1238
1239 // We must have 3 if there are still flags.
1240 if (FlagVal != 3) {
1241 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001242 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001243 return true;
1244 }
Mike Stump11289f42009-09-09 15:08:12 +00001245
Reid Klecknereb00ee02017-05-22 21:42:58 +00001246 FileKind = SrcMgr::C_System;
Mike Stump11289f42009-09-09 15:08:12 +00001247
Chris Lattner76e68962009-01-26 06:19:46 +00001248 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001249 if (FlagTok.is(tok::eod)) return false;
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001250 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
Chris Lattner76e68962009-01-26 06:19:46 +00001251 return true;
1252
1253 // We must have 4 if there is yet another flag.
1254 if (FlagVal != 4) {
1255 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001256 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001257 return true;
1258 }
Mike Stump11289f42009-09-09 15:08:12 +00001259
Reid Klecknereb00ee02017-05-22 21:42:58 +00001260 FileKind = SrcMgr::C_ExternCSystem;
Mike Stump11289f42009-09-09 15:08:12 +00001261
Chris Lattner76e68962009-01-26 06:19:46 +00001262 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001263 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001264
1265 // There are no more valid flags here.
1266 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001267 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001268 return true;
1269}
1270
1271/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1272/// one of the following forms:
1273///
1274/// # 42
Mike Stump11289f42009-09-09 15:08:12 +00001275/// # 42 "file" ('1' | '2')?
Chris Lattner76e68962009-01-26 06:19:46 +00001276/// # 42 "file" ('1' | '2')? '3' '4'?
1277///
1278void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1279 // Validate the number and convert it to an unsigned. GNU does not have a
1280 // line # limit other than it fit in 32-bits.
1281 unsigned LineNo;
1282 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001283 *this, true))
Chris Lattner76e68962009-01-26 06:19:46 +00001284 return;
Mike Stump11289f42009-09-09 15:08:12 +00001285
Chris Lattner76e68962009-01-26 06:19:46 +00001286 Token StrTok;
1287 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001288
Chris Lattner76e68962009-01-26 06:19:46 +00001289 bool IsFileEntry = false, IsFileExit = false;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001290 int FilenameID = -1;
Reid Klecknereb00ee02017-05-22 21:42:58 +00001291 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001292
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001293 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1294 // string followed by eod.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001295 if (StrTok.is(tok::eod)) {
1296 // Treat this like "#line NN", which doesn't change file characteristics.
1297 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1298 } else if (StrTok.isNot(tok::string_literal)) {
Chris Lattner76e68962009-01-26 06:19:46 +00001299 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001300 return DiscardUntilEndOfDirective();
Richard Smithd67aea22012-03-06 03:21:47 +00001301 } else if (StrTok.hasUDSuffix()) {
1302 Diag(StrTok, diag::err_invalid_string_udl);
1303 return DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001304 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001305 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001306 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001307 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001308 if (Literal.hadError)
1309 return DiscardUntilEndOfDirective();
1310 if (Literal.Pascal) {
1311 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1312 return DiscardUntilEndOfDirective();
1313 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001314 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001315
Chris Lattner76e68962009-01-26 06:19:46 +00001316 // If a filename was present, read any flags that are present.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001317 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
Chris Lattner76e68962009-01-26 06:19:46 +00001318 return;
Chris Lattner76e68962009-01-26 06:19:46 +00001319 }
Mike Stump11289f42009-09-09 15:08:12 +00001320
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001321 // Create a line note with this information.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001322 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1323 IsFileExit, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001324
Chris Lattner839150e2009-03-27 17:13:49 +00001325 // If the preprocessor has callbacks installed, notify them of the #line
1326 // change. This is used so that the line marker comes out in -E mode for
1327 // example.
1328 if (Callbacks) {
1329 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1330 if (IsFileEntry)
1331 Reason = PPCallbacks::EnterFile;
1332 else if (IsFileExit)
1333 Reason = PPCallbacks::ExitFile;
Mike Stump11289f42009-09-09 15:08:12 +00001334
Chris Lattnerc745cec2010-04-14 04:28:50 +00001335 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
Chris Lattner839150e2009-03-27 17:13:49 +00001336 }
Chris Lattner76e68962009-01-26 06:19:46 +00001337}
1338
Chris Lattner38d7fd22009-01-26 05:30:54 +00001339/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1340///
Mike Stump11289f42009-09-09 15:08:12 +00001341void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001342 bool isWarning) {
Chris Lattner38d7fd22009-01-26 05:30:54 +00001343 // PTH doesn't emit #warning or #error directives.
1344 if (CurPTHLexer)
Chris Lattner100c65e2009-01-26 05:29:08 +00001345 return CurPTHLexer->DiscardToEndOfLine();
1346
Chris Lattnerf64b3522008-03-09 01:54:53 +00001347 // Read the rest of the line raw. We do this because we don't want macros
1348 // to be expanded and we don't require that the tokens be valid preprocessing
1349 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
1350 // collapse multiple consequtive white space between tokens, but this isn't
1351 // specified by the standard.
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001352 SmallString<128> Message;
1353 CurLexer->ReadToEndOfLine(&Message);
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001354
1355 // Find the first non-whitespace character, so that we can make the
1356 // diagnostic more succinct.
David Majnemerbf7e0c62016-02-24 22:07:26 +00001357 StringRef Msg = StringRef(Message).ltrim(' ');
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001358
Chris Lattner100c65e2009-01-26 05:29:08 +00001359 if (isWarning)
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001360 Diag(Tok, diag::pp_hash_warning) << Msg;
Chris Lattner100c65e2009-01-26 05:29:08 +00001361 else
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001362 Diag(Tok, diag::err_pp_hash_error) << Msg;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001363}
1364
1365/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1366///
1367void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1368 // Yes, this directive is an extension.
1369 Diag(Tok, diag::ext_pp_ident_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001370
Chris Lattnerf64b3522008-03-09 01:54:53 +00001371 // Read the string argument.
1372 Token StrTok;
1373 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001374
Chris Lattnerf64b3522008-03-09 01:54:53 +00001375 // If the token kind isn't a string, it's a malformed directive.
1376 if (StrTok.isNot(tok::string_literal) &&
Chris Lattner907dfe92008-11-18 07:59:24 +00001377 StrTok.isNot(tok::wide_string_literal)) {
1378 Diag(StrTok, diag::err_pp_malformed_ident);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001379 if (StrTok.isNot(tok::eod))
Chris Lattner38d7fd22009-01-26 05:30:54 +00001380 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +00001381 return;
1382 }
Mike Stump11289f42009-09-09 15:08:12 +00001383
Richard Smithd67aea22012-03-06 03:21:47 +00001384 if (StrTok.hasUDSuffix()) {
1385 Diag(StrTok, diag::err_invalid_string_udl);
1386 return DiscardUntilEndOfDirective();
1387 }
1388
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001389 // Verify that there is nothing after the string, other than EOD.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00001390 CheckEndOfDirective("ident");
Chris Lattnerf64b3522008-03-09 01:54:53 +00001391
Douglas Gregordc970f02010-03-16 22:30:13 +00001392 if (Callbacks) {
1393 bool Invalid = false;
1394 std::string Str = getSpelling(StrTok, &Invalid);
1395 if (!Invalid)
1396 Callbacks->Ident(Tok.getLocation(), Str);
1397 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00001398}
1399
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001400/// \brief Handle a #public directive.
1401void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001402 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001403 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001404
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001405 // Error reading macro name? If so, diagnostic already issued.
1406 if (MacroNameTok.is(tok::eod))
1407 return;
1408
Douglas Gregor663b48f2012-01-03 19:48:16 +00001409 // Check to see if this is the last token on the #__public_macro line.
1410 CheckEndOfDirective("__public_macro");
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001411
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001412 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001413 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001414 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001415
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001416 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001417 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001418 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001419 return;
1420 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001421
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001422 // Note that this macro has now been exported.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001423 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1424 MacroNameTok.getLocation(), /*IsPublic=*/true));
Douglas Gregorebf00492011-10-17 15:32:29 +00001425}
1426
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001427/// \brief Handle a #private directive.
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001428void Preprocessor::HandleMacroPrivateDirective() {
Douglas Gregorebf00492011-10-17 15:32:29 +00001429 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001430 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001431
Douglas Gregorebf00492011-10-17 15:32:29 +00001432 // Error reading macro name? If so, diagnostic already issued.
1433 if (MacroNameTok.is(tok::eod))
1434 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001435
Douglas Gregor663b48f2012-01-03 19:48:16 +00001436 // Check to see if this is the last token on the #__private_macro line.
1437 CheckEndOfDirective("__private_macro");
Taewook Oh755e4d22016-06-13 21:55:33 +00001438
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001439 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregorebf00492011-10-17 15:32:29 +00001440 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001441 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001442
Douglas Gregorebf00492011-10-17 15:32:29 +00001443 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001444 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001445 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregorebf00492011-10-17 15:32:29 +00001446 return;
1447 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001448
Douglas Gregorebf00492011-10-17 15:32:29 +00001449 // Note that this macro has now been marked private.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001450 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1451 MacroNameTok.getLocation(), /*IsPublic=*/false));
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001452}
1453
Chris Lattnerf64b3522008-03-09 01:54:53 +00001454//===----------------------------------------------------------------------===//
1455// Preprocessor Include Directive Handling.
1456//===----------------------------------------------------------------------===//
1457
1458/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
James Dennettf6333ac2012-06-22 05:46:07 +00001459/// checked and spelled filename, e.g. as an operand of \#include. This returns
Chris Lattnerf64b3522008-03-09 01:54:53 +00001460/// true if the input filename was in <>'s or false if it were in ""'s. The
1461/// caller is expected to provide a buffer that is large enough to hold the
1462/// spelling of the filename, but is also expected to handle the case when
1463/// this method decides to use a different buffer.
1464bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001465 StringRef &Buffer) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001466 // Get the text form of the filename.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001467 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
Mike Stump11289f42009-09-09 15:08:12 +00001468
Chris Lattnerf64b3522008-03-09 01:54:53 +00001469 // Make sure the filename is <x> or "x".
1470 bool isAngled;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001471 if (Buffer[0] == '<') {
1472 if (Buffer.back() != '>') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001473 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001474 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001475 return true;
1476 }
1477 isAngled = true;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001478 } else if (Buffer[0] == '"') {
1479 if (Buffer.back() != '"') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001480 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001481 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001482 return true;
1483 }
1484 isAngled = false;
1485 } else {
1486 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001487 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001488 return true;
1489 }
Mike Stump11289f42009-09-09 15:08:12 +00001490
Chris Lattnerf64b3522008-03-09 01:54:53 +00001491 // Diagnose #include "" as invalid.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001492 if (Buffer.size() <= 2) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001493 Diag(Loc, diag::err_pp_empty_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001494 Buffer = StringRef();
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001495 return true;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001496 }
Mike Stump11289f42009-09-09 15:08:12 +00001497
Chris Lattnerf64b3522008-03-09 01:54:53 +00001498 // Skip the brackets.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001499 Buffer = Buffer.substr(1, Buffer.size()-2);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001500 return isAngled;
1501}
1502
James Dennett4a4f72d2013-11-27 01:27:40 +00001503// \brief Handle cases where the \#include name is expanded from a macro
1504// as multiple tokens, which need to be glued together.
1505//
1506// This occurs for code like:
1507// \code
1508// \#define FOO <a/b.h>
1509// \#include FOO
1510// \endcode
1511// because in this case, "<a/b.h>" is returned as 7 tokens, not one.
1512//
1513// This code concatenates and consumes tokens up to the '>' token. It returns
1514// false if the > was found, otherwise it returns true if it finds and consumes
1515// the EOD marker.
1516bool Preprocessor::ConcatenateIncludeName(SmallString<128> &FilenameBuffer,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001517 SourceLocation &End) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001518 Token CurTok;
Mike Stump11289f42009-09-09 15:08:12 +00001519
John Thompsonb5353522009-10-30 13:49:06 +00001520 Lex(CurTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001521 while (CurTok.isNot(tok::eod)) {
Douglas Gregor796d76a2010-10-20 22:00:55 +00001522 End = CurTok.getLocation();
Taewook Oh755e4d22016-06-13 21:55:33 +00001523
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001524 // FIXME: Provide code completion for #includes.
1525 if (CurTok.is(tok::code_completion)) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +00001526 setCodeCompletionReached();
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001527 Lex(CurTok);
1528 continue;
1529 }
1530
Chris Lattnerf64b3522008-03-09 01:54:53 +00001531 // Append the spelling of this token to the buffer. If there was a space
1532 // before it, add it now.
1533 if (CurTok.hasLeadingSpace())
1534 FilenameBuffer.push_back(' ');
Mike Stump11289f42009-09-09 15:08:12 +00001535
Chris Lattnerf64b3522008-03-09 01:54:53 +00001536 // Get the spelling of the token, directly into FilenameBuffer if possible.
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001537 size_t PreAppendSize = FilenameBuffer.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001538 FilenameBuffer.resize(PreAppendSize+CurTok.getLength());
Mike Stump11289f42009-09-09 15:08:12 +00001539
Chris Lattnerf64b3522008-03-09 01:54:53 +00001540 const char *BufPtr = &FilenameBuffer[PreAppendSize];
John Thompsonb5353522009-10-30 13:49:06 +00001541 unsigned ActualLen = getSpelling(CurTok, BufPtr);
Mike Stump11289f42009-09-09 15:08:12 +00001542
Chris Lattnerf64b3522008-03-09 01:54:53 +00001543 // If the token was spelled somewhere else, copy it into FilenameBuffer.
1544 if (BufPtr != &FilenameBuffer[PreAppendSize])
1545 memcpy(&FilenameBuffer[PreAppendSize], BufPtr, ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001546
Chris Lattnerf64b3522008-03-09 01:54:53 +00001547 // Resize FilenameBuffer to the correct size.
1548 if (CurTok.getLength() != ActualLen)
1549 FilenameBuffer.resize(PreAppendSize+ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001550
Chris Lattnerf64b3522008-03-09 01:54:53 +00001551 // If we found the '>' marker, return success.
1552 if (CurTok.is(tok::greater))
1553 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001554
John Thompsonb5353522009-10-30 13:49:06 +00001555 Lex(CurTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001556 }
1557
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001558 // If we hit the eod marker, emit an error and return true so that the caller
1559 // knows the EOD has been read.
John Thompsonb5353522009-10-30 13:49:06 +00001560 Diag(CurTok.getLocation(), diag::err_pp_expects_filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001561 return true;
1562}
1563
Richard Smith34f30512013-11-23 04:06:09 +00001564/// \brief Push a token onto the token stream containing an annotation.
Richard Smithc51c38b2017-04-29 00:34:47 +00001565void Preprocessor::EnterAnnotationToken(SourceRange Range,
1566 tok::TokenKind Kind,
1567 void *AnnotationVal) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001568 // FIXME: Produce this as the current token directly, rather than
1569 // allocating a new token for it.
David Blaikie2eabcc92016-02-09 18:52:09 +00001570 auto Tok = llvm::make_unique<Token[]>(1);
Richard Smith34f30512013-11-23 04:06:09 +00001571 Tok[0].startToken();
1572 Tok[0].setKind(Kind);
Richard Smithc51c38b2017-04-29 00:34:47 +00001573 Tok[0].setLocation(Range.getBegin());
1574 Tok[0].setAnnotationEndLoc(Range.getEnd());
Richard Smith34f30512013-11-23 04:06:09 +00001575 Tok[0].setAnnotationValue(AnnotationVal);
Richard Smithc51c38b2017-04-29 00:34:47 +00001576 EnterTokenStream(std::move(Tok), 1, true);
Richard Smith34f30512013-11-23 04:06:09 +00001577}
1578
Richard Smith63b6fce2015-05-18 04:45:41 +00001579/// \brief Produce a diagnostic informing the user that a #include or similar
1580/// was implicitly treated as a module import.
1581static void diagnoseAutoModuleImport(
1582 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1583 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1584 SourceLocation PathEnd) {
1585 assert(PP.getLangOpts().ObjC2 && "no import syntax available");
1586
1587 SmallString<128> PathString;
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001588 for (size_t I = 0, N = Path.size(); I != N; ++I) {
Richard Smith63b6fce2015-05-18 04:45:41 +00001589 if (I)
1590 PathString += '.';
1591 PathString += Path[I].first->getName();
1592 }
1593 int IncludeKind = 0;
Taewook Oh755e4d22016-06-13 21:55:33 +00001594
Richard Smith63b6fce2015-05-18 04:45:41 +00001595 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1596 case tok::pp_include:
1597 IncludeKind = 0;
1598 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001599
Richard Smith63b6fce2015-05-18 04:45:41 +00001600 case tok::pp_import:
1601 IncludeKind = 1;
Taewook Oh755e4d22016-06-13 21:55:33 +00001602 break;
1603
Richard Smith63b6fce2015-05-18 04:45:41 +00001604 case tok::pp_include_next:
1605 IncludeKind = 2;
1606 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001607
Richard Smith63b6fce2015-05-18 04:45:41 +00001608 case tok::pp___include_macros:
1609 IncludeKind = 3;
1610 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001611
Richard Smith63b6fce2015-05-18 04:45:41 +00001612 default:
1613 llvm_unreachable("unknown include directive kind");
1614 }
1615
1616 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1617 /*IsTokenRange=*/false);
1618 PP.Diag(HashLoc, diag::warn_auto_module_import)
1619 << IncludeKind << PathString
1620 << FixItHint::CreateReplacement(ReplaceRange,
1621 ("@import " + PathString + ";").str());
1622}
1623
Taewook Ohf42103c2016-06-13 20:40:21 +00001624// Given a vector of path components and a string containing the real
1625// path to the file, build a properly-cased replacement in the vector,
1626// and return true if the replacement should be suggested.
1627static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1628 StringRef RealPathName) {
1629 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1630 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1631 int Cnt = 0;
1632 bool SuggestReplacement = false;
1633 // Below is a best-effort to handle ".." in paths. It is admittedly
1634 // not 100% correct in the presence of symlinks.
1635 for (auto &Component : llvm::reverse(Components)) {
1636 if ("." == Component) {
1637 } else if (".." == Component) {
1638 ++Cnt;
1639 } else if (Cnt) {
1640 --Cnt;
1641 } else if (RealPathComponentIter != RealPathComponentEnd) {
1642 if (Component != *RealPathComponentIter) {
1643 // If these path components differ by more than just case, then we
1644 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1645 // noisy false positives.
1646 SuggestReplacement = RealPathComponentIter->equals_lower(Component);
1647 if (!SuggestReplacement)
1648 break;
1649 Component = *RealPathComponentIter;
1650 }
1651 ++RealPathComponentIter;
1652 }
1653 }
1654 return SuggestReplacement;
1655}
1656
Richard Smith27e5aa02017-06-05 18:57:56 +00001657bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1658 const TargetInfo &TargetInfo,
1659 DiagnosticsEngine &Diags, Module *M) {
1660 Module::Requirement Requirement;
1661 Module::UnresolvedHeaderDirective MissingHeader;
1662 if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader))
1663 return false;
1664
1665 if (MissingHeader.FileNameLoc.isValid()) {
1666 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1667 << MissingHeader.IsUmbrella << MissingHeader.FileName;
1668 } else {
1669 // FIXME: Track the location at which the requirement was specified, and
1670 // use it here.
1671 Diags.Report(M->DefinitionLoc, diag::err_module_unavailable)
1672 << M->getFullModuleName() << Requirement.second << Requirement.first;
1673 }
1674 return true;
1675}
1676
James Dennettf6333ac2012-06-22 05:46:07 +00001677/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1678/// the file to be included from the lexer, then include it! This is a common
1679/// routine with functionality shared between \#include, \#include_next and
1680/// \#import. LookupFrom is set when this is a \#include_next directive, it
Mike Stump11289f42009-09-09 15:08:12 +00001681/// specifies the file to start searching from.
Taewook Oh755e4d22016-06-13 21:55:33 +00001682void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001683 Token &IncludeTok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001684 const DirectoryLookup *LookupFrom,
Richard Smith25d50752014-10-20 00:15:49 +00001685 const FileEntry *LookupFromFile,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001686 bool isImport) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001687 Token FilenameTok;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00001688 CurPPLexer->LexIncludeFilename(FilenameTok);
Mike Stump11289f42009-09-09 15:08:12 +00001689
Chris Lattnerf64b3522008-03-09 01:54:53 +00001690 // Reserve a buffer to get the spelling.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001691 SmallString<128> FilenameBuffer;
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001692 StringRef Filename;
Douglas Gregor796d76a2010-10-20 22:00:55 +00001693 SourceLocation End;
Douglas Gregor41e115a2011-11-30 18:02:36 +00001694 SourceLocation CharEnd; // the end of this directive, in characters
Taewook Oh755e4d22016-06-13 21:55:33 +00001695
Chris Lattnerf64b3522008-03-09 01:54:53 +00001696 switch (FilenameTok.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001697 case tok::eod:
1698 // If the token kind is EOD, the error has already been diagnosed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00001699 return;
Mike Stump11289f42009-09-09 15:08:12 +00001700
Chris Lattnerf64b3522008-03-09 01:54:53 +00001701 case tok::angle_string_literal:
Benjamin Kramer0a1abd42010-02-27 13:44:12 +00001702 case tok::string_literal:
1703 Filename = getSpelling(FilenameTok, FilenameBuffer);
Douglas Gregor796d76a2010-10-20 22:00:55 +00001704 End = FilenameTok.getLocation();
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001705 CharEnd = End.getLocWithOffset(FilenameTok.getLength());
Chris Lattnerf64b3522008-03-09 01:54:53 +00001706 break;
Mike Stump11289f42009-09-09 15:08:12 +00001707
Chris Lattnerf64b3522008-03-09 01:54:53 +00001708 case tok::less:
1709 // This could be a <foo/bar.h> file coming from a macro expansion. In this
1710 // case, glue the tokens together into FilenameBuffer and interpret those.
1711 FilenameBuffer.push_back('<');
Douglas Gregor796d76a2010-10-20 22:00:55 +00001712 if (ConcatenateIncludeName(FilenameBuffer, End))
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001713 return; // Found <eod> but no ">"? Diagnostic already emitted.
Yaron Keren92e1b622015-03-18 10:17:07 +00001714 Filename = FilenameBuffer;
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001715 CharEnd = End.getLocWithOffset(1);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001716 break;
1717 default:
1718 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1719 DiscardUntilEndOfDirective();
1720 return;
1721 }
Mike Stump11289f42009-09-09 15:08:12 +00001722
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001723 CharSourceRange FilenameRange
1724 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
Aaron Ballman611306e2012-03-02 22:51:54 +00001725 StringRef OriginalFilename = Filename;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001726 bool isAngled =
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001727 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001728 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1729 // error.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001730 if (Filename.empty()) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001731 DiscardUntilEndOfDirective();
1732 return;
1733 }
Mike Stump11289f42009-09-09 15:08:12 +00001734
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001735 // Verify that there is nothing after the filename, other than EOD. Note that
Chris Lattnerb40289b2009-04-17 23:56:52 +00001736 // we allow macros that expand to nothing after the filename, because this
1737 // falls into the category of "#include pp-tokens new-line" specified in
1738 // C99 6.10.2p4.
Daniel Dunbar2c422dc92009-10-18 20:26:12 +00001739 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001740
1741 // Check that we don't have infinite #include recursion.
Chris Lattner907dfe92008-11-18 07:59:24 +00001742 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
1743 Diag(FilenameTok, diag::err_pp_include_too_deep);
1744 return;
1745 }
Mike Stump11289f42009-09-09 15:08:12 +00001746
John McCall32f5fe12011-09-30 05:12:12 +00001747 // Complain about attempts to #include files in an audit pragma.
1748 if (PragmaARCCFCodeAuditedLoc.isValid()) {
1749 Diag(HashLoc, diag::err_pp_include_in_arc_cf_code_audited);
1750 Diag(PragmaARCCFCodeAuditedLoc, diag::note_pragma_entered_here);
1751
1752 // Immediately leave the pragma.
1753 PragmaARCCFCodeAuditedLoc = SourceLocation();
1754 }
1755
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001756 // Complain about attempts to #include files in an assume-nonnull pragma.
1757 if (PragmaAssumeNonNullLoc.isValid()) {
1758 Diag(HashLoc, diag::err_pp_include_in_assume_nonnull);
1759 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1760
1761 // Immediately leave the pragma.
1762 PragmaAssumeNonNullLoc = SourceLocation();
1763 }
1764
Aaron Ballman611306e2012-03-02 22:51:54 +00001765 if (HeaderInfo.HasIncludeAliasMap()) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001766 // Map the filename with the brackets still attached. If the name doesn't
1767 // map to anything, fall back on the filename we've already gotten the
Aaron Ballman611306e2012-03-02 22:51:54 +00001768 // spelling for.
1769 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1770 if (!NewName.empty())
1771 Filename = NewName;
1772 }
1773
Chris Lattnerf64b3522008-03-09 01:54:53 +00001774 // Search include directories.
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001775 bool IsMapped = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001776 const DirectoryLookup *CurDir;
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001777 SmallString<1024> SearchPath;
1778 SmallString<1024> RelativePath;
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001779 // We get the raw path only if we have 'Callbacks' to which we later pass
1780 // the path.
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001781 ModuleMap::KnownHeader SuggestedModule;
1782 SourceLocation FilenameLoc = FilenameTok.getLocation();
Saleem Abdulrasool729b7d32014-03-12 02:26:08 +00001783 SmallString<128> NormalizedPath;
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001784 if (LangOpts.MSVCCompat) {
1785 NormalizedPath = Filename.str();
Yaron Keren1801d1b2014-08-09 18:13:01 +00001786#ifndef LLVM_ON_WIN32
Rafael Espindolaf6002232014-08-08 21:31:04 +00001787 llvm::sys::path::native(NormalizedPath);
Yaron Keren1801d1b2014-08-09 18:13:01 +00001788#endif
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001789 }
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001790 const FileEntry *File = LookupFile(
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001791 FilenameLoc, LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename,
Richard Smith25d50752014-10-20 00:15:49 +00001792 isAngled, LookupFrom, LookupFromFile, CurDir,
1793 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001794 &SuggestedModule, &IsMapped);
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001795
Richard Smithdbbc5232015-05-14 02:25:44 +00001796 if (!File) {
1797 if (Callbacks) {
Douglas Gregor11729f02011-11-30 18:12:06 +00001798 // Give the clients a chance to recover.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001799 SmallString<128> RecoveryPath;
Douglas Gregor11729f02011-11-30 18:12:06 +00001800 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
1801 if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) {
1802 // Add the recovery path to the list of search paths.
Daniel Dunbarae4feb62013-01-25 01:50:28 +00001803 DirectoryLookup DL(DE, SrcMgr::C_User, false);
Douglas Gregor11729f02011-11-30 18:12:06 +00001804 HeaderInfo.AddSearchPath(DL, isAngled);
Taewook Oh755e4d22016-06-13 21:55:33 +00001805
Douglas Gregor11729f02011-11-30 18:12:06 +00001806 // Try the lookup again, skipping the cache.
Richard Smith25d50752014-10-20 00:15:49 +00001807 File = LookupFile(
1808 FilenameLoc,
1809 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1810 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001811 &SuggestedModule, &IsMapped, /*SkipCache*/ true);
Douglas Gregor11729f02011-11-30 18:12:06 +00001812 }
1813 }
1814 }
Craig Topperd2d442c2014-05-17 23:10:59 +00001815
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001816 if (!SuppressIncludeNotFoundError) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001817 // If the file could not be located and it was included via angle
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001818 // brackets, we can attempt a lookup as though it were a quoted path to
1819 // provide the user with a possible fixit.
1820 if (isAngled) {
Daniel Jasper07e6c402013-08-05 20:26:17 +00001821 File = LookupFile(
Richard Smith25d50752014-10-20 00:15:49 +00001822 FilenameLoc,
1823 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, false,
1824 LookupFrom, LookupFromFile, CurDir,
1825 Callbacks ? &SearchPath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001826 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped);
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001827 if (File) {
1828 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001829 Diag(FilenameTok, diag::err_pp_file_not_found_not_fatal) <<
1830 Filename <<
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001831 FixItHint::CreateReplacement(Range, "\"" + Filename.str() + "\"");
1832 }
1833 }
Richard Smithdbbc5232015-05-14 02:25:44 +00001834
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001835 // If the file is still not found, just go with the vanilla diagnostic
1836 if (!File)
Erik Verbruggen45449542016-10-25 10:13:10 +00001837 Diag(FilenameTok, diag::err_pp_file_not_found) << Filename
1838 << FilenameRange;
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001839 }
Douglas Gregor11729f02011-11-30 18:12:06 +00001840 }
1841
Richard Smith63b6fce2015-05-18 04:45:41 +00001842 // Should we enter the source file? Set to false if either the source file is
1843 // known to have no effect beyond its effect on module visibility -- that is,
1844 // if it's got an include guard that is already defined or is a modular header
1845 // we've imported or already built.
1846 bool ShouldEnter = true;
Richard Smithdbbc5232015-05-14 02:25:44 +00001847
Richard Smith63b6fce2015-05-18 04:45:41 +00001848 // Determine whether we should try to import the module for this #include, if
1849 // there is one. Don't do so if precompiled module support is disabled or we
1850 // are processing this module textually (because we're building the module).
1851 if (File && SuggestedModule && getLangOpts().Modules &&
1852 SuggestedModule.getModule()->getTopLevelModuleName() !=
Richard Smith7e82e012016-02-19 22:25:36 +00001853 getLangOpts().CurrentModule) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001854 // If this include corresponds to a module but that module is
1855 // unavailable, diagnose the situation and bail out.
Richard Smith58df3432016-04-12 19:58:30 +00001856 // FIXME: Remove this; loadModule does the same check (but produces
1857 // slightly worse diagnostics).
Richard Smith27e5aa02017-06-05 18:57:56 +00001858 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), getDiagnostics(),
1859 SuggestedModule.getModule())) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001860 Diag(FilenameTok.getLocation(),
1861 diag::note_implicit_top_level_module_import_here)
Richard Smith27e5aa02017-06-05 18:57:56 +00001862 << SuggestedModule.getModule()->getTopLevelModuleName();
Sean Silva8b7c0392015-08-17 16:39:30 +00001863 return;
1864 }
1865
Douglas Gregor71944202011-11-30 00:36:36 +00001866 // Compute the module access path corresponding to this module.
1867 // FIXME: Should we have a second loadModule() overload to avoid this
1868 // extra lookup step?
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001869 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001870 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
Douglas Gregor71944202011-11-30 00:36:36 +00001871 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
1872 FilenameTok.getLocation()));
1873 std::reverse(Path.begin(), Path.end());
1874
Douglas Gregor41e115a2011-11-30 18:02:36 +00001875 // Warn that we're replacing the include/import with a module import.
Richard Smith63b6fce2015-05-18 04:45:41 +00001876 // We only do this in Objective-C, where we have a module-import syntax.
1877 if (getLangOpts().ObjC2)
1878 diagnoseAutoModuleImport(*this, HashLoc, IncludeTok, Path, CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001879
Richard Smith10434f32015-05-02 02:08:26 +00001880 // Load the module to import its macros. We'll make the declarations
Richard Smithce587f52013-11-15 04:24:58 +00001881 // visible when the parser gets here.
Richard Smithdbbc5232015-05-14 02:25:44 +00001882 // FIXME: Pass SuggestedModule in here rather than converting it to a path
1883 // and making the module loader convert it back again.
Richard Smith10434f32015-05-02 02:08:26 +00001884 ModuleLoadResult Imported = TheModuleLoader.loadModule(
1885 IncludeTok.getLocation(), Path, Module::Hidden,
1886 /*IsIncludeDirective=*/true);
Craig Topperd2d442c2014-05-17 23:10:59 +00001887 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
Argyrios Kyrtzidis051b4432012-09-29 01:06:01 +00001888 "the imported module is different than the suggested one");
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001889
Richard Smith63b6fce2015-05-18 04:45:41 +00001890 if (Imported)
1891 ShouldEnter = false;
1892 else if (Imported.isMissingExpected()) {
1893 // We failed to find a submodule that we assumed would exist (because it
1894 // was in the directory of an umbrella header, for instance), but no
Richard Smitha114c462016-12-06 00:40:17 +00001895 // actual module containing it exists (because the umbrella header is
Richard Smith63b6fce2015-05-18 04:45:41 +00001896 // incomplete). Treat this as a textual inclusion.
1897 SuggestedModule = ModuleMap::KnownHeader();
Richard Smitha114c462016-12-06 00:40:17 +00001898 } else if (Imported.isConfigMismatch()) {
1899 // On a configuration mismatch, enter the header textually. We still know
1900 // that it's part of the corresponding module.
Richard Smith63b6fce2015-05-18 04:45:41 +00001901 } else {
1902 // We hit an error processing the import. Bail out.
1903 if (hadModuleLoaderFatalFailure()) {
1904 // With a fatal failure in the module loader, we abort parsing.
1905 Token &Result = IncludeTok;
1906 if (CurLexer) {
1907 Result.startToken();
1908 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
1909 CurLexer->cutOffLexing();
1910 } else {
1911 assert(CurPTHLexer && "#include but no current lexer set!");
1912 CurPTHLexer->getEOF(Result);
1913 }
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001914 }
1915 return;
1916 }
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001917 }
1918
Richard Smithc5247e62017-05-30 02:03:19 +00001919 // The #included file will be considered to be a system header if either it is
1920 // in a system include directory, or if the #includer is a system include
1921 // header.
1922 SrcMgr::CharacteristicKind FileCharacter =
1923 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
1924 if (File)
1925 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(File), FileCharacter);
1926
1927 // Ask HeaderInfo if we should enter this #include file. If not, #including
1928 // this file will have no effect.
1929 bool SkipHeader = false;
1930 if (ShouldEnter && File &&
1931 !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport,
1932 getLangOpts().Modules,
1933 SuggestedModule.getModule())) {
1934 ShouldEnter = false;
1935 SkipHeader = true;
1936 }
1937
Richard Smith63b6fce2015-05-18 04:45:41 +00001938 if (Callbacks) {
1939 // Notify the callback object that we've seen an inclusion directive.
1940 Callbacks->InclusionDirective(
1941 HashLoc, IncludeTok,
1942 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1943 FilenameRange, File, SearchPath, RelativePath,
1944 ShouldEnter ? nullptr : SuggestedModule.getModule());
Richard Smithc5247e62017-05-30 02:03:19 +00001945 if (SkipHeader && !SuggestedModule.getModule())
1946 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
Douglas Gregor97eec242011-09-15 22:00:41 +00001947 }
Richard Smith63b6fce2015-05-18 04:45:41 +00001948
1949 if (!File)
1950 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001951
Richard Smith54ef4c32015-05-19 19:58:11 +00001952 // FIXME: If we have a suggested module, and we've already visited this file,
1953 // don't bother entering it again. We know it has no further effect.
1954
Taewook Ohf42103c2016-06-13 20:40:21 +00001955 // Issue a diagnostic if the name of the file on disk has a different case
1956 // than the one we're about to open.
1957 const bool CheckIncludePathPortability =
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001958 !IsMapped && File && !File->tryGetRealPathName().empty();
Taewook Ohf42103c2016-06-13 20:40:21 +00001959
1960 if (CheckIncludePathPortability) {
1961 StringRef Name = LangOpts.MSVCCompat ? NormalizedPath.str() : Filename;
1962 StringRef RealPathName = File->tryGetRealPathName();
1963 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
1964 llvm::sys::path::end(Name));
1965
1966 if (trySimplifyPath(Components, RealPathName)) {
1967 SmallString<128> Path;
1968 Path.reserve(Name.size()+2);
1969 Path.push_back(isAngled ? '<' : '"');
Taewook Ohcc89bac2017-02-21 22:30:55 +00001970 bool isLeadingSeparator = llvm::sys::path::is_absolute(Name);
Taewook Ohf42103c2016-06-13 20:40:21 +00001971 for (auto Component : Components) {
Taewook Ohcc89bac2017-02-21 22:30:55 +00001972 if (isLeadingSeparator)
1973 isLeadingSeparator = false;
1974 else
1975 Path.append(Component);
Taewook Ohf42103c2016-06-13 20:40:21 +00001976 // Append the separator the user used, or the close quote
1977 Path.push_back(
1978 Path.size() <= Filename.size() ? Filename[Path.size()-1] :
1979 (isAngled ? '>' : '"'));
1980 }
Taewook Ohf42103c2016-06-13 20:40:21 +00001981 // For user files and known standard headers, by default we issue a diagnostic.
1982 // For other system headers, we don't. They can be controlled separately.
1983 auto DiagId = (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name)) ?
1984 diag::pp_nonportable_path : diag::pp_nonportable_system_path;
1985 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Reid Kleckner273895b2017-02-14 18:38:40 +00001986 Diag(FilenameTok, DiagId) << Path <<
1987 FixItHint::CreateReplacement(Range, Path);
Taewook Ohf42103c2016-06-13 20:40:21 +00001988 }
1989 }
1990
Richard Smith63b6fce2015-05-18 04:45:41 +00001991 // If we don't need to enter the file, stop now.
1992 if (!ShouldEnter) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001993 // If this is a module import, make it visible if needed.
Richard Smitha0aafa32015-05-18 03:52:30 +00001994 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00001995 // When building a pch, -fmodule-name tells the compiler to textually
1996 // include headers in the specified module. But it is possible that
1997 // ShouldEnter is false because we are skipping the header. In that
1998 // case, We are not importing the specified module.
1999 if (SkipHeader && getLangOpts().CompilingPCH &&
2000 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2001 return;
2002
Richard Smitha0aafa32015-05-18 03:52:30 +00002003 makeModuleVisible(M, HashLoc);
Richard Smithdbbc5232015-05-14 02:25:44 +00002004
2005 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() !=
2006 tok::pp___include_macros)
Richard Smithc51c38b2017-04-29 00:34:47 +00002007 EnterAnnotationToken(SourceRange(HashLoc, End),
2008 tok::annot_module_include, M);
Richard Smithdbbc5232015-05-14 02:25:44 +00002009 }
Chris Lattner72286d62010-04-19 20:44:31 +00002010 return;
2011 }
2012
Chris Lattnerf64b3522008-03-09 01:54:53 +00002013 // Look up the file, create a File ID for it.
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002014 SourceLocation IncludePos = End;
2015 // If the filename string was the result of macro expansions, set the include
2016 // position on the file where it will be included and after the expansions.
2017 if (IncludePos.isMacroID())
2018 IncludePos = SourceMgr.getExpansionRange(IncludePos).second;
2019 FileID FID = SourceMgr.createFileID(File, IncludePos, FileCharacter);
Yaron Keren8b563662015-10-03 10:46:20 +00002020 assert(FID.isValid() && "Expected valid file ID");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002021
Richard Smith34f30512013-11-23 04:06:09 +00002022 // If all is good, enter the new file!
Richard Smith67294e22014-01-31 20:47:44 +00002023 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
2024 return;
Richard Smith34f30512013-11-23 04:06:09 +00002025
Richard Smitha0aafa32015-05-18 03:52:30 +00002026 // Determine if we're switching to building a new submodule, and which one.
Richard Smitha0aafa32015-05-18 03:52:30 +00002027 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00002028 // When building a pch, -fmodule-name tells the compiler to textually
2029 // include headers in the specified module. We are not building the
2030 // specified module.
2031 if (getLangOpts().CompilingPCH &&
2032 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2033 return;
2034
Richard Smithd1386302017-05-04 00:29:54 +00002035 assert(!CurLexerSubmodule && "should not have marked this as a module yet");
2036 CurLexerSubmodule = M;
Richard Smith67294e22014-01-31 20:47:44 +00002037
Richard Smitha0aafa32015-05-18 03:52:30 +00002038 // Let the macro handling code know that any future macros are within
2039 // the new submodule.
Richard Smithd1386302017-05-04 00:29:54 +00002040 EnterSubmodule(M, HashLoc, /*ForPragma*/false);
Richard Smithb8b2ed62015-04-23 18:18:26 +00002041
Richard Smitha0aafa32015-05-18 03:52:30 +00002042 // Let the parser know that any future declarations are within the new
2043 // submodule.
2044 // FIXME: There's no point doing this if we're handling a #__include_macros
2045 // directive.
Richard Smithc51c38b2017-04-29 00:34:47 +00002046 EnterAnnotationToken(SourceRange(HashLoc, End), tok::annot_module_begin, M);
Richard Smith67294e22014-01-31 20:47:44 +00002047 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002048}
2049
James Dennettf6333ac2012-06-22 05:46:07 +00002050/// HandleIncludeNextDirective - Implements \#include_next.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002051///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002052void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2053 Token &IncludeNextTok) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002054 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
Mike Stump11289f42009-09-09 15:08:12 +00002055
Chris Lattnerf64b3522008-03-09 01:54:53 +00002056 // #include_next is like #include, except that we start searching after
2057 // the current found directory. If we can't do this, issue a
2058 // diagnostic.
2059 const DirectoryLookup *Lookup = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +00002060 const FileEntry *LookupFromFile = nullptr;
Erik Verbruggene0bde752016-10-27 14:17:10 +00002061 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2062 // If the main file is a header, then it's either for PCH/AST generation,
2063 // or libclang opened it. Either way, handle it as a normal include below
2064 // and do not complain about include_next.
2065 } else if (isInPrimaryFile()) {
Craig Topperd2d442c2014-05-17 23:10:59 +00002066 Lookup = nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002067 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
Richard Smithd1386302017-05-04 00:29:54 +00002068 } else if (CurLexerSubmodule) {
Richard Smith25d50752014-10-20 00:15:49 +00002069 // Start looking up in the directory *after* the one in which the current
2070 // file would be found, if any.
2071 assert(CurPPLexer && "#include_next directive in macro?");
2072 LookupFromFile = CurPPLexer->getFileEntry();
2073 Lookup = nullptr;
Craig Topperd2d442c2014-05-17 23:10:59 +00002074 } else if (!Lookup) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002075 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2076 } else {
2077 // Start looking up in the next directory.
2078 ++Lookup;
2079 }
Mike Stump11289f42009-09-09 15:08:12 +00002080
Richard Smith25d50752014-10-20 00:15:49 +00002081 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2082 LookupFromFile);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002083}
2084
James Dennettf6333ac2012-06-22 05:46:07 +00002085/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
Aaron Ballman0467f552012-03-18 03:10:37 +00002086void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2087 // The Microsoft #import directive takes a type library and generates header
2088 // files from it, and includes those. This is beyond the scope of what clang
2089 // does, so we ignore it and error out. However, #import can optionally have
2090 // trailing attributes that span multiple lines. We're going to eat those
2091 // so we can continue processing from there.
2092 Diag(Tok, diag::err_pp_import_directive_ms );
2093
Taewook Oh755e4d22016-06-13 21:55:33 +00002094 // Read tokens until we get to the end of the directive. Note that the
Aaron Ballman0467f552012-03-18 03:10:37 +00002095 // directive can be split over multiple lines using the backslash character.
2096 DiscardUntilEndOfDirective();
2097}
2098
James Dennettf6333ac2012-06-22 05:46:07 +00002099/// HandleImportDirective - Implements \#import.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002100///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002101void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2102 Token &ImportTok) {
Aaron Ballman0467f552012-03-18 03:10:37 +00002103 if (!LangOpts.ObjC1) { // #import is standard for ObjC.
Alp Tokerbfa39342014-01-14 12:51:41 +00002104 if (LangOpts.MSVCCompat)
Aaron Ballman0467f552012-03-18 03:10:37 +00002105 return HandleMicrosoftImportDirective(ImportTok);
Chris Lattnerd4a96732009-03-06 04:28:03 +00002106 Diag(ImportTok, diag::ext_pp_import_directive);
Aaron Ballman0467f552012-03-18 03:10:37 +00002107 }
Richard Smith25d50752014-10-20 00:15:49 +00002108 return HandleIncludeDirective(HashLoc, ImportTok, nullptr, nullptr, true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002109}
2110
Chris Lattner58a1eb02009-04-08 18:46:40 +00002111/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2112/// pseudo directive in the predefines buffer. This handles it by sucking all
2113/// tokens through the preprocessor and discarding them (only keeping the side
2114/// effects on the preprocessor).
Douglas Gregor796d76a2010-10-20 22:00:55 +00002115void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2116 Token &IncludeMacrosTok) {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002117 // This directive should only occur in the predefines buffer. If not, emit an
2118 // error and reject it.
2119 SourceLocation Loc = IncludeMacrosTok.getLocation();
Mehdi Amini99d1b292016-10-01 16:38:28 +00002120 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002121 Diag(IncludeMacrosTok.getLocation(),
2122 diag::pp_include_macros_out_of_predefines);
2123 DiscardUntilEndOfDirective();
2124 return;
2125 }
Mike Stump11289f42009-09-09 15:08:12 +00002126
Chris Lattnere01d82b2009-04-08 20:53:24 +00002127 // Treat this as a normal #include for checking purposes. If this is
2128 // successful, it will push a new lexer onto the include stack.
Richard Smith25d50752014-10-20 00:15:49 +00002129 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
Mike Stump11289f42009-09-09 15:08:12 +00002130
Chris Lattnere01d82b2009-04-08 20:53:24 +00002131 Token TmpTok;
2132 do {
2133 Lex(TmpTok);
2134 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2135 } while (TmpTok.isNot(tok::hashhash));
Chris Lattner58a1eb02009-04-08 18:46:40 +00002136}
2137
Chris Lattnerf64b3522008-03-09 01:54:53 +00002138//===----------------------------------------------------------------------===//
2139// Preprocessor Macro Directive Handling.
2140//===----------------------------------------------------------------------===//
2141
2142/// ReadMacroDefinitionArgList - The ( starting an argument list of a macro
2143/// definition has just been read. Lex the rest of the arguments and the
2144/// closing ), updating MI with what we learn. Return true if an error occurs
2145/// parsing the arg list.
Abramo Bagnarac9e48c02012-03-31 20:17:27 +00002146bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI, Token &Tok) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002147 SmallVector<IdentifierInfo*, 32> Arguments;
Mike Stump11289f42009-09-09 15:08:12 +00002148
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002149 while (true) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002150 LexUnexpandedToken(Tok);
2151 switch (Tok.getKind()) {
2152 case tok::r_paren:
2153 // Found the end of the argument list.
Chris Lattnerf87c5102009-02-20 22:31:31 +00002154 if (Arguments.empty()) // #define FOO()
Chris Lattnerf64b3522008-03-09 01:54:53 +00002155 return false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002156 // Otherwise we have #define FOO(A,)
2157 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2158 return true;
2159 case tok::ellipsis: // #define X(... -> C99 varargs
David Blaikiebbafb8a2012-03-11 07:00:24 +00002160 if (!LangOpts.C99)
Taewook Oh755e4d22016-06-13 21:55:33 +00002161 Diag(Tok, LangOpts.CPlusPlus11 ?
Richard Smithacd4d3d2011-10-15 01:18:56 +00002162 diag::warn_cxx98_compat_variadic_macro :
2163 diag::ext_variadic_macro);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002164
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002165 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2166 if (LangOpts.OpenCL) {
2167 Diag(Tok, diag::err_pp_opencl_variadic_macros);
2168 return true;
2169 }
2170
Chris Lattnerf64b3522008-03-09 01:54:53 +00002171 // Lex the token after the identifier.
2172 LexUnexpandedToken(Tok);
2173 if (Tok.isNot(tok::r_paren)) {
2174 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2175 return true;
2176 }
2177 // Add the __VA_ARGS__ identifier as an argument.
2178 Arguments.push_back(Ident__VA_ARGS__);
2179 MI->setIsC99Varargs();
Craig Topperd96b3f92015-10-22 04:59:52 +00002180 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002181 return false;
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002182 case tok::eod: // #define X(
Chris Lattnerf64b3522008-03-09 01:54:53 +00002183 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2184 return true;
2185 default:
2186 // Handle keywords and identifiers here to accept things like
2187 // #define Foo(for) for.
2188 IdentifierInfo *II = Tok.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +00002189 if (!II) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002190 // #define X(1
2191 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2192 return true;
2193 }
2194
2195 // If this is already used as an argument, it is used multiple times (e.g.
2196 // #define X(A,A.
Mike Stump11289f42009-09-09 15:08:12 +00002197 if (std::find(Arguments.begin(), Arguments.end(), II) !=
Chris Lattnerf64b3522008-03-09 01:54:53 +00002198 Arguments.end()) { // C99 6.10.3p6
Chris Lattnerc5cdade2008-11-19 07:33:58 +00002199 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002200 return true;
2201 }
Mike Stump11289f42009-09-09 15:08:12 +00002202
Chris Lattnerf64b3522008-03-09 01:54:53 +00002203 // Add the argument to the macro info.
2204 Arguments.push_back(II);
Mike Stump11289f42009-09-09 15:08:12 +00002205
Chris Lattnerf64b3522008-03-09 01:54:53 +00002206 // Lex the token after the identifier.
2207 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002208
Chris Lattnerf64b3522008-03-09 01:54:53 +00002209 switch (Tok.getKind()) {
2210 default: // #define X(A B
2211 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2212 return true;
2213 case tok::r_paren: // #define X(A)
Craig Topperd96b3f92015-10-22 04:59:52 +00002214 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002215 return false;
2216 case tok::comma: // #define X(A,
2217 break;
2218 case tok::ellipsis: // #define X(A... -> GCC extension
2219 // Diagnose extension.
2220 Diag(Tok, diag::ext_named_variadic_macro);
Mike Stump11289f42009-09-09 15:08:12 +00002221
Chris Lattnerf64b3522008-03-09 01:54:53 +00002222 // Lex the token after the identifier.
2223 LexUnexpandedToken(Tok);
2224 if (Tok.isNot(tok::r_paren)) {
2225 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2226 return true;
2227 }
Mike Stump11289f42009-09-09 15:08:12 +00002228
Chris Lattnerf64b3522008-03-09 01:54:53 +00002229 MI->setIsGNUVarargs();
Craig Topperd96b3f92015-10-22 04:59:52 +00002230 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002231 return false;
2232 }
2233 }
2234 }
2235}
2236
Serge Pavlov07c0f042014-12-18 11:14:21 +00002237static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2238 const LangOptions &LOptions) {
2239 if (MI->getNumTokens() == 1) {
2240 const Token &Value = MI->getReplacementToken(0);
2241
2242 // Macro that is identity, like '#define inline inline' is a valid pattern.
2243 if (MacroName.getKind() == Value.getKind())
2244 return true;
2245
2246 // Macro that maps a keyword to the same keyword decorated with leading/
2247 // trailing underscores is a valid pattern:
2248 // #define inline __inline
2249 // #define inline __inline__
2250 // #define inline _inline (in MS compatibility mode)
2251 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2252 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2253 if (!II->isKeyword(LOptions))
2254 return false;
2255 StringRef ValueText = II->getName();
2256 StringRef TrimmedValue = ValueText;
2257 if (!ValueText.startswith("__")) {
2258 if (ValueText.startswith("_"))
2259 TrimmedValue = TrimmedValue.drop_front(1);
2260 else
2261 return false;
2262 } else {
2263 TrimmedValue = TrimmedValue.drop_front(2);
2264 if (TrimmedValue.endswith("__"))
2265 TrimmedValue = TrimmedValue.drop_back(2);
2266 }
2267 return TrimmedValue.equals(MacroText);
2268 } else {
2269 return false;
2270 }
2271 }
2272
2273 // #define inline
Alexander Kornienkoa26c4952015-12-28 15:30:42 +00002274 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2275 tok::kw_const) &&
2276 MI->getNumTokens() == 0;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002277}
2278
James Dennettf6333ac2012-06-22 05:46:07 +00002279/// HandleDefineDirective - Implements \#define. This consumes the entire macro
Chris Lattnerf64b3522008-03-09 01:54:53 +00002280/// line then lets the caller lex the next real token.
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002281void Preprocessor::HandleDefineDirective(Token &DefineTok,
2282 bool ImmediatelyAfterHeaderGuard) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002283 ++NumDefined;
2284
2285 Token MacroNameTok;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002286 bool MacroShadowsKeyword;
2287 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
Mike Stump11289f42009-09-09 15:08:12 +00002288
Chris Lattnerf64b3522008-03-09 01:54:53 +00002289 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002290 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002291 return;
2292
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002293 Token LastTok = MacroNameTok;
2294
Chris Lattnerf64b3522008-03-09 01:54:53 +00002295 // If we are supposed to keep comments in #defines, reenable comment saving
2296 // mode.
Ted Kremenek59e003e2008-11-18 00:43:07 +00002297 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
Mike Stump11289f42009-09-09 15:08:12 +00002298
Chris Lattnerf64b3522008-03-09 01:54:53 +00002299 // Create the new macro.
Ted Kremenek6c7ea112008-12-15 19:56:42 +00002300 MacroInfo *MI = AllocateMacroInfo(MacroNameTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002301
Chris Lattnerf64b3522008-03-09 01:54:53 +00002302 Token Tok;
2303 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002304
Chris Lattnerf64b3522008-03-09 01:54:53 +00002305 // If this is a function-like macro definition, parse the argument list,
2306 // marking each of the identifiers as being used as macro arguments. Also,
2307 // check other constraints on the first token of the macro body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002308 if (Tok.is(tok::eod)) {
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002309 if (ImmediatelyAfterHeaderGuard) {
2310 // Save this macro information since it may part of a header guard.
2311 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2312 MacroNameTok.getLocation());
2313 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002314 // If there is no body to this macro, we have no special handling here.
Chris Lattner2425bcb2009-04-18 02:23:25 +00002315 } else if (Tok.hasLeadingSpace()) {
2316 // This is a normal token with leading space. Clear the leading space
2317 // marker on the first token to get proper expansion.
2318 Tok.clearFlag(Token::LeadingSpace);
2319 } else if (Tok.is(tok::l_paren)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002320 // This is a function-like macro definition. Read the argument list.
2321 MI->setIsFunctionLike();
Abramo Bagnarac9e48c02012-03-31 20:17:27 +00002322 if (ReadMacroDefinitionArgList(MI, LastTok)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002323 // Throw away the rest of the line.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002324 if (CurPPLexer->ParsingPreprocessorDirective)
Chris Lattnerf64b3522008-03-09 01:54:53 +00002325 DiscardUntilEndOfDirective();
2326 return;
2327 }
2328
Chris Lattner249c38b2009-04-19 18:26:34 +00002329 // If this is a definition of a variadic C99 function-like macro, not using
2330 // the GNU named varargs extension, enabled __VA_ARGS__.
Mike Stump11289f42009-09-09 15:08:12 +00002331
Chris Lattner249c38b2009-04-19 18:26:34 +00002332 // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
2333 // This gets unpoisoned where it is allowed.
2334 assert(Ident__VA_ARGS__->isPoisoned() && "__VA_ARGS__ should be poisoned!");
2335 if (MI->isC99Varargs())
2336 Ident__VA_ARGS__->setIsPoisoned(false);
Mike Stump11289f42009-09-09 15:08:12 +00002337
Chris Lattnerf64b3522008-03-09 01:54:53 +00002338 // Read the first token after the arg list for down below.
2339 LexUnexpandedToken(Tok);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00002340 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002341 // C99 requires whitespace between the macro definition and the body. Emit
2342 // a diagnostic for something like "#define X+".
Chris Lattner2425bcb2009-04-18 02:23:25 +00002343 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002344 } else {
Chris Lattner2425bcb2009-04-18 02:23:25 +00002345 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2346 // first character of a replacement list is not a character required by
2347 // subclause 5.2.1, then there shall be white-space separation between the
2348 // identifier and the replacement list.". 5.2.1 lists this set:
2349 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2350 // is irrelevant here.
2351 bool isInvalid = false;
2352 if (Tok.is(tok::at)) // @ is not in the list above.
2353 isInvalid = true;
2354 else if (Tok.is(tok::unknown)) {
2355 // If we have an unknown token, it is something strange like "`". Since
2356 // all of valid characters would have lexed into a single character
2357 // token of some sort, we know this is not a valid case.
2358 isInvalid = true;
2359 }
2360 if (isInvalid)
2361 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2362 else
2363 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002364 }
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002365
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002366 if (!Tok.is(tok::eod))
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002367 LastTok = Tok;
2368
Chris Lattnerf64b3522008-03-09 01:54:53 +00002369 // Read the rest of the macro body.
2370 if (MI->isObjectLike()) {
2371 // Object-like macros are very simple, just read their body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002372 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002373 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002374 MI->AddTokenToBody(Tok);
2375 // Get the next token of the macro.
2376 LexUnexpandedToken(Tok);
2377 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002378 } else {
Chris Lattner83bd8282009-05-25 17:16:10 +00002379 // Otherwise, read the body of a function-like macro. While we are at it,
2380 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2381 // parameters in function-like macro expansions.
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
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002385 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002386 MI->AddTokenToBody(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002387
Chris Lattnerf64b3522008-03-09 01:54:53 +00002388 // Get the next token of the macro.
2389 LexUnexpandedToken(Tok);
2390 continue;
2391 }
Mike Stump11289f42009-09-09 15:08:12 +00002392
Richard Smith701a3522013-07-09 01:00:29 +00002393 // If we're in -traditional mode, then we should ignore stringification
2394 // and token pasting. Mark the tokens as unknown so as not to confuse
2395 // things.
2396 if (getLangOpts().TraditionalCPP) {
2397 Tok.setKind(tok::unknown);
2398 MI->AddTokenToBody(Tok);
2399
2400 // Get the next token of the macro.
2401 LexUnexpandedToken(Tok);
2402 continue;
2403 }
2404
Eli Friedman14d3c792012-11-14 02:18:46 +00002405 if (Tok.is(tok::hashhash)) {
Eli Friedman14d3c792012-11-14 02:18:46 +00002406 // If we see token pasting, check if it looks like the gcc comma
2407 // pasting extension. We'll use this information to suppress
2408 // diagnostics later on.
Taewook Oh755e4d22016-06-13 21:55:33 +00002409
Eli Friedman14d3c792012-11-14 02:18:46 +00002410 // Get the next token of the macro.
2411 LexUnexpandedToken(Tok);
2412
2413 if (Tok.is(tok::eod)) {
2414 MI->AddTokenToBody(LastTok);
2415 break;
2416 }
2417
2418 unsigned NumTokens = MI->getNumTokens();
2419 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2420 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2421 MI->setHasCommaPasting();
2422
David Majnemer76faf1f2013-11-05 09:30:17 +00002423 // Things look ok, add the '##' token to the macro.
Eli Friedman14d3c792012-11-14 02:18:46 +00002424 MI->AddTokenToBody(LastTok);
Eli Friedman14d3c792012-11-14 02:18:46 +00002425 continue;
2426 }
2427
Chris Lattnerf64b3522008-03-09 01:54:53 +00002428 // Get the next token of the macro.
2429 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002430
Chris Lattner83bd8282009-05-25 17:16:10 +00002431 // Check for a valid macro arg identifier.
Craig Topperd2d442c2014-05-17 23:10:59 +00002432 if (Tok.getIdentifierInfo() == nullptr ||
Chris Lattner83bd8282009-05-25 17:16:10 +00002433 MI->getArgumentNum(Tok.getIdentifierInfo()) == -1) {
2434
2435 // If this is assembler-with-cpp mode, we accept random gibberish after
2436 // the '#' because '#' is often a comment character. However, change
2437 // the kind of the token to tok::unknown so that the preprocessor isn't
2438 // confused.
David Blaikiebbafb8a2012-03-11 07:00:24 +00002439 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002440 LastTok.setKind(tok::unknown);
Eli Friedmancdf8b882013-06-18 21:33:38 +00002441 MI->AddTokenToBody(LastTok);
2442 continue;
Chris Lattner83bd8282009-05-25 17:16:10 +00002443 } else {
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002444 Diag(Tok, diag::err_pp_stringize_not_parameter)
2445 << LastTok.is(tok::hashat);
Mike Stump11289f42009-09-09 15:08:12 +00002446
Chris Lattner83bd8282009-05-25 17:16:10 +00002447 // Disable __VA_ARGS__ again.
2448 Ident__VA_ARGS__->setIsPoisoned(true);
2449 return;
2450 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002451 }
Mike Stump11289f42009-09-09 15:08:12 +00002452
Chris Lattner83bd8282009-05-25 17:16:10 +00002453 // Things look ok, add the '#' and param name tokens to the macro.
2454 MI->AddTokenToBody(LastTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002455 MI->AddTokenToBody(Tok);
Chris Lattner83bd8282009-05-25 17:16:10 +00002456 LastTok = Tok;
Mike Stump11289f42009-09-09 15:08:12 +00002457
Chris Lattnerf64b3522008-03-09 01:54:53 +00002458 // Get the next token of the macro.
2459 LexUnexpandedToken(Tok);
2460 }
2461 }
Mike Stump11289f42009-09-09 15:08:12 +00002462
Serge Pavlov07c0f042014-12-18 11:14:21 +00002463 if (MacroShadowsKeyword &&
2464 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2465 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
2466 }
Mike Stump11289f42009-09-09 15:08:12 +00002467
Chris Lattnerf64b3522008-03-09 01:54:53 +00002468 // Disable __VA_ARGS__ again.
2469 Ident__VA_ARGS__->setIsPoisoned(true);
2470
Chris Lattner57540c52011-04-15 05:22:18 +00002471 // Check that there is no paste (##) operator at the beginning or end of the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002472 // replacement list.
2473 unsigned NumTokens = MI->getNumTokens();
2474 if (NumTokens != 0) {
2475 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2476 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002477 return;
2478 }
2479 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2480 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002481 return;
2482 }
2483 }
Mike Stump11289f42009-09-09 15:08:12 +00002484
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002485 MI->setDefinitionEndLoc(LastTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002486
Chris Lattnerf64b3522008-03-09 01:54:53 +00002487 // Finally, if this identifier already had a macro defined for it, verify that
Alexander Kornienko8b3f6232012-08-29 00:20:03 +00002488 // the macro bodies are identical, and issue diagnostics if they are not.
Argyrios Kyrtzidis09c9e812013-02-20 00:54:57 +00002489 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
John McCall83760372015-12-10 23:31:01 +00002490 // In Objective-C, ignore attempts to directly redefine the builtin
2491 // definitions of the ownership qualifiers. It's still possible to
2492 // #undef them.
2493 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2494 return II->isStr("__strong") ||
2495 II->isStr("__weak") ||
2496 II->isStr("__unsafe_unretained") ||
2497 II->isStr("__autoreleasing");
2498 };
2499 if (getLangOpts().ObjC1 &&
2500 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2501 == getPredefinesFileID() &&
2502 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2503 // Warn if it changes the tokens.
2504 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2505 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2506 !MI->isIdenticalTo(*OtherMI, *this,
2507 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2508 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2509 }
2510 assert(!OtherMI->isWarnIfUnused());
2511 return;
2512 }
2513
Chris Lattner5244f342009-01-16 19:50:11 +00002514 // It is very common for system headers to have tons of macro redefinitions
2515 // and for warnings to be disabled in system headers. If this is the case,
2516 // then don't bother calling MacroInfo::isIdenticalTo.
Chris Lattner80c21df2009-03-13 21:17:23 +00002517 if (!getDiagnostics().getSuppressSystemWarnings() ||
Chris Lattner5244f342009-01-16 19:50:11 +00002518 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002519 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
Chris Lattner5244f342009-01-16 19:50:11 +00002520 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002521
Taewook Oh755e4d22016-06-13 21:55:33 +00002522 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
Richard Smith7b242542013-03-06 00:46:00 +00002523 // C++ [cpp.predefined]p4, but allow it as an extension.
2524 if (OtherMI->isBuiltinMacro())
2525 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
Chris Lattnerc0a585d2010-08-17 15:55:45 +00002526 // Macros must be identical. This means all tokens and whitespace
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002527 // separation must be the same. C99 6.10.3p2.
Richard Smith7b242542013-03-06 00:46:00 +00002528 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002529 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
Chris Lattner5244f342009-01-16 19:50:11 +00002530 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2531 << MacroNameTok.getIdentifierInfo();
2532 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2533 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002534 }
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002535 if (OtherMI->isWarnIfUnused())
2536 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002537 }
Mike Stump11289f42009-09-09 15:08:12 +00002538
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002539 DefMacroDirective *MD =
2540 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
Mike Stump11289f42009-09-09 15:08:12 +00002541
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002542 assert(!MI->isUsed());
2543 // If we need warning for not using the macro, add its location in the
2544 // warn-because-unused-macro set. If it gets used it will be removed from set.
Eli Friedman5ba37d52013-08-22 00:27:10 +00002545 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
Alp Tokerd4a3f0e2014-06-15 23:30:39 +00002546 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc())) {
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002547 MI->setIsWarnIfUnused(true);
2548 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2549 }
2550
Chris Lattner928e9092009-04-12 01:39:54 +00002551 // If the callbacks want to know, tell them about the macro definition.
2552 if (Callbacks)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002553 Callbacks->MacroDefined(MacroNameTok, MD);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002554}
2555
James Dennettf6333ac2012-06-22 05:46:07 +00002556/// HandleUndefDirective - Implements \#undef.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002557///
Erik Verbruggen4bddef92016-10-26 08:52:41 +00002558void Preprocessor::HandleUndefDirective() {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002559 ++NumUndefined;
2560
2561 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00002562 ReadMacroName(MacroNameTok, MU_Undef);
Mike Stump11289f42009-09-09 15:08:12 +00002563
Chris Lattnerf64b3522008-03-09 01:54:53 +00002564 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002565 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002566 return;
Mike Stump11289f42009-09-09 15:08:12 +00002567
Chris Lattnerf64b3522008-03-09 01:54:53 +00002568 // Check to see if this is the last token on the #undef line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002569 CheckEndOfDirective("undef");
Mike Stump11289f42009-09-09 15:08:12 +00002570
Richard Smith20e883e2015-04-29 23:20:19 +00002571 // Okay, we have a valid identifier to undef.
2572 auto *II = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002573 auto MD = getMacroDefinition(II);
Vedant Kumar349a6242017-04-26 21:05:44 +00002574 UndefMacroDirective *Undef = nullptr;
2575
2576 // If the macro is not defined, this is a noop undef.
2577 if (const MacroInfo *MI = MD.getMacroInfo()) {
2578 if (!MI->isUsed() && MI->isWarnIfUnused())
2579 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
2580
2581 if (MI->isWarnIfUnused())
2582 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
2583
2584 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
2585 }
Mike Stump11289f42009-09-09 15:08:12 +00002586
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002587 // If the callbacks want to know, tell them about the macro #undef.
2588 // Note: no matter if the macro was defined or not.
Richard Smith36bd40d2015-05-04 03:15:40 +00002589 if (Callbacks)
Vedant Kumar349a6242017-04-26 21:05:44 +00002590 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002591
Vedant Kumar349a6242017-04-26 21:05:44 +00002592 if (Undef)
2593 appendMacroDirective(II, Undef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002594}
2595
Chris Lattnerf64b3522008-03-09 01:54:53 +00002596//===----------------------------------------------------------------------===//
2597// Preprocessor Conditional Directive Handling.
2598//===----------------------------------------------------------------------===//
2599
James Dennettf6333ac2012-06-22 05:46:07 +00002600/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
2601/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
2602/// true if any tokens have been returned or pp-directives activated before this
2603/// \#ifndef has been lexed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002604///
2605void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
2606 bool ReadAnyTokensBeforeDirective) {
2607 ++NumIf;
2608 Token DirectiveTok = Result;
2609
2610 Token MacroNameTok;
2611 ReadMacroName(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +00002612
Chris Lattnerf64b3522008-03-09 01:54:53 +00002613 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002614 if (MacroNameTok.is(tok::eod)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002615 // Skip code until we get to #endif. This helps with recovery by not
2616 // emitting an error when the #endif is reached.
2617 SkipExcludedConditionalBlock(DirectiveTok.getLocation(),
2618 /*Foundnonskip*/false, /*FoundElse*/false);
2619 return;
2620 }
Mike Stump11289f42009-09-09 15:08:12 +00002621
Chris Lattnerf64b3522008-03-09 01:54:53 +00002622 // Check to see if this is the last token on the #if[n]def line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002623 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002624
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002625 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002626 auto MD = getMacroDefinition(MII);
2627 MacroInfo *MI = MD.getMacroInfo();
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00002628
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002629 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002630 // If the start of a top-level #ifdef and if the macro is not defined,
2631 // inform MIOpt that this might be the start of a proper include guard.
2632 // Otherwise it is some other form of unknown conditional which we can't
2633 // handle.
Craig Topperd2d442c2014-05-17 23:10:59 +00002634 if (!ReadAnyTokensBeforeDirective && !MI) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002635 assert(isIfndef && "#ifdef shouldn't reach here");
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002636 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002637 } else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002638 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002639 }
2640
Chris Lattnerf64b3522008-03-09 01:54:53 +00002641 // If there is a macro, process it.
2642 if (MI) // Mark it used.
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002643 markMacroAsUsed(MI);
Mike Stump11289f42009-09-09 15:08:12 +00002644
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002645 if (Callbacks) {
2646 if (isIfndef)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002647 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002648 else
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002649 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002650 }
2651
Chris Lattnerf64b3522008-03-09 01:54:53 +00002652 // Should we include the stuff contained by this directive?
2653 if (!MI == isIfndef) {
2654 // Yes, remember that we are inside a conditional, then lex the next token.
Chris Lattner8cf1f932009-12-14 04:54:40 +00002655 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
2656 /*wasskip*/false, /*foundnonskip*/true,
2657 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002658 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002659 // No, skip the contents of this block.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002660 SkipExcludedConditionalBlock(DirectiveTok.getLocation(),
Mike Stump11289f42009-09-09 15:08:12 +00002661 /*Foundnonskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002662 /*FoundElse*/false);
2663 }
2664}
2665
James Dennettf6333ac2012-06-22 05:46:07 +00002666/// HandleIfDirective - Implements the \#if directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002667///
2668void Preprocessor::HandleIfDirective(Token &IfToken,
2669 bool ReadAnyTokensBeforeDirective) {
2670 ++NumIf;
Mike Stump11289f42009-09-09 15:08:12 +00002671
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002672 // Parse and evaluate the conditional expression.
Craig Topperd2d442c2014-05-17 23:10:59 +00002673 IdentifierInfo *IfNDefMacro = nullptr;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002674 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
2675 const bool ConditionalTrue = EvaluateDirectiveExpression(IfNDefMacro);
2676 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Nuno Lopes363212b2008-06-01 18:31:24 +00002677
2678 // If this condition is equivalent to #ifndef X, and if this is the first
2679 // directive seen, handle it for the multiple-include optimization.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002680 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002681 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
Richard Smith089ee152013-06-16 05:05:39 +00002682 // FIXME: Pass in the location of the macro name, not the 'if' token.
2683 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
Nuno Lopes363212b2008-06-01 18:31:24 +00002684 else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002685 CurPPLexer->MIOpt.EnterTopLevelConditional();
Nuno Lopes363212b2008-06-01 18:31:24 +00002686 }
2687
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002688 if (Callbacks)
2689 Callbacks->If(IfToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002690 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002691 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002692
Chris Lattnerf64b3522008-03-09 01:54:53 +00002693 // Should we include the stuff contained by this directive?
2694 if (ConditionalTrue) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002695 // Yes, remember that we are inside a conditional, then lex the next token.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002696 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002697 /*foundnonskip*/true, /*foundelse*/false);
2698 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002699 // No, skip the contents of this block.
Mike Stump11289f42009-09-09 15:08:12 +00002700 SkipExcludedConditionalBlock(IfToken.getLocation(), /*Foundnonskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002701 /*FoundElse*/false);
2702 }
2703}
2704
James Dennettf6333ac2012-06-22 05:46:07 +00002705/// HandleEndifDirective - Implements the \#endif directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002706///
2707void Preprocessor::HandleEndifDirective(Token &EndifToken) {
2708 ++NumEndif;
Mike Stump11289f42009-09-09 15:08:12 +00002709
Chris Lattnerf64b3522008-03-09 01:54:53 +00002710 // Check that this is the whole directive.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002711 CheckEndOfDirective("endif");
Mike Stump11289f42009-09-09 15:08:12 +00002712
Chris Lattnerf64b3522008-03-09 01:54:53 +00002713 PPConditionalInfo CondInfo;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002714 if (CurPPLexer->popConditionalLevel(CondInfo)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002715 // No conditionals on the stack: this is an #endif without an #if.
Chris Lattner907dfe92008-11-18 07:59:24 +00002716 Diag(EndifToken, diag::err_pp_endif_without_if);
2717 return;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002718 }
Mike Stump11289f42009-09-09 15:08:12 +00002719
Chris Lattnerf64b3522008-03-09 01:54:53 +00002720 // If this the end of a top-level #endif, inform MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002721 if (CurPPLexer->getConditionalStackDepth() == 0)
2722 CurPPLexer->MIOpt.ExitTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002723
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002724 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&
Chris Lattnerf64b3522008-03-09 01:54:53 +00002725 "This code should only be reachable in the non-skipping case!");
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002726
2727 if (Callbacks)
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002728 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002729}
2730
James Dennettf6333ac2012-06-22 05:46:07 +00002731/// HandleElseDirective - Implements the \#else directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002732///
Chris Lattnerf64b3522008-03-09 01:54:53 +00002733void Preprocessor::HandleElseDirective(Token &Result) {
2734 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002735
Chris Lattnerf64b3522008-03-09 01:54:53 +00002736 // #else directive in a non-skipping conditional... start skipping.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002737 CheckEndOfDirective("else");
Mike Stump11289f42009-09-09 15:08:12 +00002738
Chris Lattnerf64b3522008-03-09 01:54:53 +00002739 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002740 if (CurPPLexer->popConditionalLevel(CI)) {
2741 Diag(Result, diag::pp_err_else_without_if);
2742 return;
2743 }
Mike Stump11289f42009-09-09 15:08:12 +00002744
Chris Lattnerf64b3522008-03-09 01:54:53 +00002745 // If this is a top-level #else, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002746 if (CurPPLexer->getConditionalStackDepth() == 0)
2747 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002748
2749 // If this is a #else with a #else before it, report the error.
2750 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +00002751
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002752 if (Callbacks)
2753 Callbacks->Else(Result.getLocation(), CI.IfLoc);
2754
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002755 // Finally, skip the rest of the contents of this block.
2756 SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +00002757 /*FoundElse*/true, Result.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002758}
2759
James Dennettf6333ac2012-06-22 05:46:07 +00002760/// HandleElifDirective - Implements the \#elif directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002761///
Chris Lattnerf64b3522008-03-09 01:54:53 +00002762void Preprocessor::HandleElifDirective(Token &ElifToken) {
2763 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002764
Chris Lattnerf64b3522008-03-09 01:54:53 +00002765 // #elif directive in a non-skipping conditional... start skipping.
2766 // We don't care what the condition is, because we will always skip it (since
2767 // the block immediately before it was included).
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002768 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002769 DiscardUntilEndOfDirective();
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002770 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002771
2772 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002773 if (CurPPLexer->popConditionalLevel(CI)) {
2774 Diag(ElifToken, diag::pp_err_elif_without_if);
2775 return;
2776 }
Mike Stump11289f42009-09-09 15:08:12 +00002777
Chris Lattnerf64b3522008-03-09 01:54:53 +00002778 // If this is a top-level #elif, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002779 if (CurPPLexer->getConditionalStackDepth() == 0)
2780 CurPPLexer->MIOpt.EnterTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002781
Chris Lattnerf64b3522008-03-09 01:54:53 +00002782 // If this is a #elif with a #else before it, report the error.
2783 if (CI.FoundElse) Diag(ElifToken, diag::pp_err_elif_after_else);
Taewook Oh755e4d22016-06-13 21:55:33 +00002784
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002785 if (Callbacks)
2786 Callbacks->Elif(ElifToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002787 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002788 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002789
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002790 // Finally, skip the rest of the contents of this block.
2791 SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +00002792 /*FoundElse*/CI.FoundElse,
2793 ElifToken.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002794}