blob: 8c79e50176e18adc488c5ade20482b6846479655 [file] [log] [blame]
Chris Lattner89620152008-03-09 03:13:06 +00001//===--- PPDirectives.cpp - Directive Handling for Preprocessor -----------===//
Chris Lattnerf64b3522008-03-09 01:54:53 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
James Dennettf6333ac2012-06-22 05:46:07 +00009///
10/// \file
11/// \brief Implements # directive processing for the Preprocessor.
12///
Chris Lattnerf64b3522008-03-09 01:54:53 +000013//===----------------------------------------------------------------------===//
14
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000015#include "clang/Basic/CharInfo.h"
Chris Lattner710bb872009-11-30 04:18:44 +000016#include "clang/Basic/FileManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000017#include "clang/Basic/IdentifierTable.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/Module.h"
20#include "clang/Basic/SourceLocation.h"
Chris Lattnerf64b3522008-03-09 01:54:53 +000021#include "clang/Basic/SourceManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000022#include "clang/Basic/TokenKinds.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000023#include "clang/Lex/CodeCompletionHandler.h"
24#include "clang/Lex/HeaderSearch.h"
25#include "clang/Lex/LexDiagnostic.h"
26#include "clang/Lex/LiteralSupport.h"
27#include "clang/Lex/MacroInfo.h"
28#include "clang/Lex/ModuleLoader.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000029#include "clang/Lex/ModuleMap.h"
30#include "clang/Lex/PPCallbacks.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000031#include "clang/Lex/Pragma.h"
Mehdi Amini9670f842016-07-18 19:02:11 +000032#include "clang/Lex/Preprocessor.h"
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +000033#include "clang/Lex/PreprocessorOptions.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000034#include "clang/Lex/PTHLexer.h"
35#include "clang/Lex/Token.h"
36#include "llvm/ADT/ArrayRef.h"
37#include "llvm/ADT/SmallString.h"
38#include "llvm/ADT/SmallVector.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000039#include "llvm/ADT/STLExtras.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000040#include "llvm/ADT/StringSwitch.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000041#include "llvm/ADT/StringRef.h"
42#include "llvm/Support/AlignOf.h"
Douglas Gregor41e115a2011-11-30 18:02:36 +000043#include "llvm/Support/ErrorHandling.h"
Rafael Espindolaf6002232014-08-08 21:31:04 +000044#include "llvm/Support/Path.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000045#include <algorithm>
46#include <cassert>
47#include <cstring>
48#include <new>
49#include <string>
50#include <utility>
Eugene Zelenko1ced5092016-02-12 22:53:10 +000051
Chris Lattnerf64b3522008-03-09 01:54:53 +000052using namespace clang;
53
54//===----------------------------------------------------------------------===//
55// Utility Methods for Preprocessor Directive Handling.
56//===----------------------------------------------------------------------===//
57
Richard Smith3f6dd7a2017-05-12 23:40:52 +000058MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
59 auto *MIChain = new (BP) MacroInfoChain{L, MIChainHead};
Ted Kremenekc8456f82010-10-19 22:15:20 +000060 MIChainHead = MIChain;
Richard Smithee0c4c12014-07-24 01:13:23 +000061 return &MIChain->MI;
Chris Lattnerc0a585d2010-08-17 15:55:45 +000062}
63
Richard Smith50474bf2015-04-23 23:29:05 +000064DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
65 SourceLocation Loc) {
Richard Smith713369b2015-04-23 20:40:50 +000066 return new (BP) DefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000067}
68
69UndefMacroDirective *
Richard Smith50474bf2015-04-23 23:29:05 +000070Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
Richard Smith713369b2015-04-23 20:40:50 +000071 return new (BP) UndefMacroDirective(UndefLoc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000072}
73
74VisibilityMacroDirective *
75Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
76 bool isPublic) {
Richard Smithdaa69e02014-07-25 04:40:03 +000077 return new (BP) VisibilityMacroDirective(Loc, isPublic);
Chris Lattnerc0a585d2010-08-17 15:55:45 +000078}
79
James Dennettf6333ac2012-06-22 05:46:07 +000080/// \brief Read and discard all tokens remaining on the current line until
81/// the tok::eod token is found.
Chris Lattnerf64b3522008-03-09 01:54:53 +000082void Preprocessor::DiscardUntilEndOfDirective() {
83 Token Tmp;
84 do {
85 LexUnexpandedToken(Tmp);
Peter Collingbournef29ce972011-02-22 13:49:06 +000086 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +000087 } while (Tmp.isNot(tok::eod));
Chris Lattnerf64b3522008-03-09 01:54:53 +000088}
89
Serge Pavlov07c0f042014-12-18 11:14:21 +000090/// \brief Enumerates possible cases of #define/#undef a reserved identifier.
91enum MacroDiag {
92 MD_NoWarn, //> Not a reserved identifier
93 MD_KeywordDef, //> Macro hides keyword, enabled by default
94 MD_ReservedMacro //> #define of #undef reserved id, disabled by default
95};
96
97/// \brief Checks if the specified identifier is reserved in the specified
98/// language.
99/// This function does not check if the identifier is a keyword.
100static bool isReservedId(StringRef Text, const LangOptions &Lang) {
101 // C++ [macro.names], C11 7.1.3:
102 // All identifiers that begin with an underscore and either an uppercase
103 // letter or another underscore are always reserved for any use.
104 if (Text.size() >= 2 && Text[0] == '_' &&
105 (isUppercase(Text[1]) || Text[1] == '_'))
106 return true;
107 // C++ [global.names]
108 // Each name that contains a double underscore ... is reserved to the
109 // implementation for any use.
110 if (Lang.CPlusPlus) {
111 if (Text.find("__") != StringRef::npos)
112 return true;
113 }
Nico Weber92c14bb2014-12-16 21:16:10 +0000114 return false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000115}
116
Serge Pavlov07c0f042014-12-18 11:14:21 +0000117static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
118 const LangOptions &Lang = PP.getLangOpts();
119 StringRef Text = II->getName();
120 if (isReservedId(Text, Lang))
121 return MD_ReservedMacro;
122 if (II->isKeyword(Lang))
123 return MD_KeywordDef;
124 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
125 return MD_KeywordDef;
126 return MD_NoWarn;
127}
128
129static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
130 const LangOptions &Lang = PP.getLangOpts();
131 StringRef Text = II->getName();
132 // Do not warn on keyword undef. It is generally harmless and widely used.
133 if (isReservedId(Text, Lang))
134 return MD_ReservedMacro;
135 return MD_NoWarn;
136}
137
Taewook Ohf42103c2016-06-13 20:40:21 +0000138// Return true if we want to issue a diagnostic by default if we
139// encounter this name in a #include with the wrong case. For now,
140// this includes the standard C and C++ headers, Posix headers,
141// and Boost headers. Improper case for these #includes is a
142// potential portability issue.
143static bool warnByDefaultOnWrongCase(StringRef Include) {
144 // If the first component of the path is "boost", treat this like a standard header
145 // for the purposes of diagnostics.
146 if (::llvm::sys::path::begin(Include)->equals_lower("boost"))
147 return true;
148
149 // "condition_variable" is the longest standard header name at 18 characters.
150 // If the include file name is longer than that, it can't be a standard header.
Taewook Oh755e4d22016-06-13 21:55:33 +0000151 static const size_t MaxStdHeaderNameLen = 18u;
Taewook Ohf42103c2016-06-13 20:40:21 +0000152 if (Include.size() > MaxStdHeaderNameLen)
153 return false;
154
155 // Lowercase and normalize the search string.
156 SmallString<32> LowerInclude{Include};
157 for (char &Ch : LowerInclude) {
158 // In the ASCII range?
George Burgess IV5d3bd932016-06-16 02:30:33 +0000159 if (static_cast<unsigned char>(Ch) > 0x7f)
Taewook Ohf42103c2016-06-13 20:40:21 +0000160 return false; // Can't be a standard header
161 // ASCII lowercase:
162 if (Ch >= 'A' && Ch <= 'Z')
163 Ch += 'a' - 'A';
164 // Normalize path separators for comparison purposes.
165 else if (::llvm::sys::path::is_separator(Ch))
166 Ch = '/';
167 }
168
169 // The standard C/C++ and Posix headers
170 return llvm::StringSwitch<bool>(LowerInclude)
171 // C library headers
172 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
173 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
174 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
175 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
176 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
177 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
178
179 // C++ headers for C library facilities
180 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
181 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
182 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
183 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
184 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
185 .Case("cwctype", true)
186
187 // C++ library headers
188 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
189 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
190 .Cases("atomic", "future", "map", "set", "type_traits", true)
191 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
192 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
193 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
194 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
195 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
196 .Cases("deque", "istream", "queue", "string", "valarray", true)
197 .Cases("exception", "iterator", "random", "strstream", "vector", true)
198 .Cases("forward_list", "limits", "ratio", "system_error", true)
199
200 // POSIX headers (which aren't also C headers)
201 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
202 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
203 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
204 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
205 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
206 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
207 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
208 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
209 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
210 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
211 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
212 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
213 .Default(false);
214}
215
Serge Pavlov07c0f042014-12-18 11:14:21 +0000216bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
217 bool *ShadowFlag) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000218 // Missing macro name?
219 if (MacroNameTok.is(tok::eod))
220 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
221
222 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
223 if (!II) {
224 bool Invalid = false;
225 std::string Spelling = getSpelling(MacroNameTok, &Invalid);
226 if (Invalid)
227 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerf33619c2014-05-31 03:38:08 +0000228 II = getIdentifierInfo(Spelling);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000229
Alp Tokerf33619c2014-05-31 03:38:08 +0000230 if (!II->isCPlusPlusOperatorKeyword())
231 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000232
Alp Tokere03e9e12014-05-31 16:32:22 +0000233 // C++ 2.5p2: Alternative tokens behave the same as its primary token
234 // except for their spellings.
235 Diag(MacroNameTok, getLangOpts().MicrosoftExt
236 ? diag::ext_pp_operator_used_as_macro_name
237 : diag::err_pp_operator_used_as_macro_name)
238 << II << MacroNameTok.getKind();
Alp Tokerb05e0b52014-05-21 06:13:51 +0000239
Alp Tokerc5d194fc2014-05-31 03:38:17 +0000240 // Allow #defining |and| and friends for Microsoft compatibility or
241 // recovery when legacy C headers are included in C++.
Alp Tokerf33619c2014-05-31 03:38:08 +0000242 MacroNameTok.setIdentifierInfo(II);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000243 }
244
Serge Pavlovd024f522014-10-24 17:31:32 +0000245 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000246 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
247 return Diag(MacroNameTok, diag::err_defined_macro_name);
248 }
249
Richard Smith20e883e2015-04-29 23:20:19 +0000250 if (isDefineUndef == MU_Undef) {
251 auto *MI = getMacroInfo(II);
252 if (MI && MI->isBuiltinMacro()) {
253 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
254 // and C++ [cpp.predefined]p4], but allow it as an extension.
255 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
256 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000257 }
258
Serge Pavlov07c0f042014-12-18 11:14:21 +0000259 // If defining/undefining reserved identifier or a keyword, we need to issue
260 // a warning.
Serge Pavlov83cf0782014-12-11 12:18:08 +0000261 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
Serge Pavlov07c0f042014-12-18 11:14:21 +0000262 if (ShadowFlag)
263 *ShadowFlag = false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000264 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
Mehdi Amini99d1b292016-10-01 16:38:28 +0000265 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
Serge Pavlov07c0f042014-12-18 11:14:21 +0000266 MacroDiag D = MD_NoWarn;
267 if (isDefineUndef == MU_Define) {
268 D = shouldWarnOnMacroDef(*this, II);
269 }
270 else if (isDefineUndef == MU_Undef)
271 D = shouldWarnOnMacroUndef(*this, II);
272 if (D == MD_KeywordDef) {
273 // We do not want to warn on some patterns widely used in configuration
274 // scripts. This requires analyzing next tokens, so do not issue warnings
275 // now, only inform caller.
276 if (ShadowFlag)
277 *ShadowFlag = true;
278 }
279 if (D == MD_ReservedMacro)
280 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
Serge Pavlov83cf0782014-12-11 12:18:08 +0000281 }
282
Alp Tokerb05e0b52014-05-21 06:13:51 +0000283 // Okay, we got a good identifier.
284 return false;
285}
286
James Dennettf6333ac2012-06-22 05:46:07 +0000287/// \brief Lex and validate a macro name, which occurs after a
288/// \#define or \#undef.
289///
Serge Pavlovd024f522014-10-24 17:31:32 +0000290/// This sets the token kind to eod and discards the rest of the macro line if
291/// the macro name is invalid.
292///
293/// \param MacroNameTok Token that is expected to be a macro name.
Serge Pavlov07c0f042014-12-18 11:14:21 +0000294/// \param isDefineUndef Context in which macro is used.
295/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
296void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
297 bool *ShadowFlag) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000298 // Read the token, don't allow macro expansion on it.
299 LexUnexpandedToken(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +0000300
Douglas Gregor12785102010-08-24 20:21:13 +0000301 if (MacroNameTok.is(tok::code_completion)) {
302 if (CodeComplete)
Serge Pavlovd024f522014-10-24 17:31:32 +0000303 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000304 setCodeCompletionReached();
Douglas Gregor12785102010-08-24 20:21:13 +0000305 LexUnexpandedToken(MacroNameTok);
Douglas Gregor12785102010-08-24 20:21:13 +0000306 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000307
Serge Pavlov07c0f042014-12-18 11:14:21 +0000308 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
Chris Lattner907dfe92008-11-18 07:59:24 +0000309 return;
Alp Tokerb05e0b52014-05-21 06:13:51 +0000310
311 // Invalid macro name, read and discard the rest of the line and set the
312 // token kind to tok::eod if necessary.
313 if (MacroNameTok.isNot(tok::eod)) {
314 MacroNameTok.setKind(tok::eod);
315 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +0000316 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000317}
318
James Dennettf6333ac2012-06-22 05:46:07 +0000319/// \brief Ensure that the next token is a tok::eod token.
320///
321/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
Chris Lattner0003c272009-04-17 23:30:53 +0000322/// true, then we consider macros that expand to zero tokens as being ok.
323void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000324 Token Tmp;
Chris Lattner0003c272009-04-17 23:30:53 +0000325 // Lex unexpanded tokens for most directives: macros might expand to zero
326 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
327 // #line) allow empty macros.
328 if (EnableMacros)
329 Lex(Tmp);
330 else
331 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000332
Chris Lattnerf64b3522008-03-09 01:54:53 +0000333 // There should be no tokens after the directive, but we allow them as an
334 // extension.
335 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
336 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000337
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000338 if (Tmp.isNot(tok::eod)) {
Chris Lattner825676a2009-04-14 05:15:20 +0000339 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000340 // or if this is a macro-style preprocessing directive, because it is more
341 // trouble than it is worth to insert /**/ and check that there is no /**/
342 // in the range also.
Douglas Gregora771f462010-03-31 17:46:05 +0000343 FixItHint Hint;
David Blaikiebbafb8a2012-03-11 07:00:24 +0000344 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000345 !CurTokenLexer)
Douglas Gregora771f462010-03-31 17:46:05 +0000346 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
347 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000348 DiscardUntilEndOfDirective();
349 }
350}
351
James Dennettf6333ac2012-06-22 05:46:07 +0000352/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
353/// decided that the subsequent tokens are in the \#if'd out portion of the
354/// file. Lex the rest of the file, until we see an \#endif. If
Chris Lattnerf64b3522008-03-09 01:54:53 +0000355/// FoundNonSkipPortion is true, then we have already emitted code for part of
James Dennettf6333ac2012-06-22 05:46:07 +0000356/// this \#if directive, so \#else/\#elif blocks should never be entered.
357/// If ElseOk is true, then \#else directives are ok, if not, then we have
358/// already seen one so a \#else directive is a duplicate. When this returns,
359/// the caller can lex the first valid token.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000360void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
361 bool FoundNonSkipPortion,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000362 bool FoundElse,
363 SourceLocation ElseLoc) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000364 ++NumSkipped;
David Blaikie7d170102013-05-15 07:37:26 +0000365 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?");
Chris Lattnerf64b3522008-03-09 01:54:53 +0000366
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000367 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000368 FoundNonSkipPortion, FoundElse);
Mike Stump11289f42009-09-09 15:08:12 +0000369
Ted Kremenek56572ab2008-12-12 18:34:08 +0000370 if (CurPTHLexer) {
371 PTHSkipExcludedConditionalBlock();
372 return;
373 }
Mike Stump11289f42009-09-09 15:08:12 +0000374
Chris Lattnerf64b3522008-03-09 01:54:53 +0000375 // Enter raw mode to disable identifier lookup (and thus macro expansion),
376 // disabling warnings, etc.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000377 CurPPLexer->LexingRawMode = true;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000378 Token Tok;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000379 while (true) {
Chris Lattnerf406b242010-01-18 22:33:01 +0000380 CurLexer->Lex(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000381
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000382 if (Tok.is(tok::code_completion)) {
383 if (CodeComplete)
384 CodeComplete->CodeCompleteInConditionalExclusion();
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000385 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000386 continue;
387 }
Taewook Oh755e4d22016-06-13 21:55:33 +0000388
Chris Lattnerf64b3522008-03-09 01:54:53 +0000389 // If this is the end of the buffer, we have an error.
390 if (Tok.is(tok::eof)) {
391 // Emit errors for each unterminated conditional on the stack, including
392 // the current one.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000393 while (!CurPPLexer->ConditionalStack.empty()) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000394 if (CurLexer->getFileLoc() != CodeCompletionFileLoc)
Douglas Gregor02690ba2010-08-12 17:04:55 +0000395 Diag(CurPPLexer->ConditionalStack.back().IfLoc,
396 diag::err_pp_unterminated_conditional);
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000397 CurPPLexer->ConditionalStack.pop_back();
Mike Stump11289f42009-09-09 15:08:12 +0000398 }
399
Chris Lattnerf64b3522008-03-09 01:54:53 +0000400 // Just return and let the caller lex after this #include.
401 break;
402 }
Mike Stump11289f42009-09-09 15:08:12 +0000403
Chris Lattnerf64b3522008-03-09 01:54:53 +0000404 // If this token is not a preprocessor directive, just skip it.
405 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
406 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000407
Chris Lattnerf64b3522008-03-09 01:54:53 +0000408 // We just parsed a # character at the start of a line, so we're in
409 // directive mode. Tell the lexer this so any newlines we see will be
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000410 // converted into an EOD token (this terminates the macro).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000411 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rose176057b2013-02-22 00:32:00 +0000412 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000413
Mike Stump11289f42009-09-09 15:08:12 +0000414
Chris Lattnerf64b3522008-03-09 01:54:53 +0000415 // Read the next token, the directive flavor.
416 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000417
Chris Lattnerf64b3522008-03-09 01:54:53 +0000418 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
419 // something bogus), skip it.
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000420 if (Tok.isNot(tok::raw_identifier)) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000421 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000422 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000423 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000424 continue;
425 }
426
427 // If the first letter isn't i or e, it isn't intesting to us. We know that
428 // this is safe in the face of spelling differences, because there is no way
429 // to spell an i/e in a strange way that is another letter. Skipping this
430 // allows us to avoid looking up the identifier info for #define/#undef and
431 // other common directives.
Alp Toker2d57cea2014-05-17 04:53:25 +0000432 StringRef RI = Tok.getRawIdentifier();
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000433
Alp Toker2d57cea2014-05-17 04:53:25 +0000434 char FirstChar = RI[0];
Mike Stump11289f42009-09-09 15:08:12 +0000435 if (FirstChar >= 'a' && FirstChar <= 'z' &&
Chris Lattnerf64b3522008-03-09 01:54:53 +0000436 FirstChar != 'i' && FirstChar != 'e') {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000437 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000438 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000439 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000440 continue;
441 }
Mike Stump11289f42009-09-09 15:08:12 +0000442
Chris Lattnerf64b3522008-03-09 01:54:53 +0000443 // Get the identifier name without trigraphs or embedded newlines. Note
444 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
445 // when skipping.
Benjamin Kramer144884642009-12-31 13:32:38 +0000446 char DirectiveBuf[20];
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000447 StringRef Directive;
Alp Toker2d57cea2014-05-17 04:53:25 +0000448 if (!Tok.needsCleaning() && RI.size() < 20) {
449 Directive = RI;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000450 } else {
451 std::string DirectiveStr = getSpelling(Tok);
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000452 size_t IdLen = DirectiveStr.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000453 if (IdLen >= 20) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000454 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000455 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000456 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000457 continue;
458 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000459 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000460 Directive = StringRef(DirectiveBuf, IdLen);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000461 }
Mike Stump11289f42009-09-09 15:08:12 +0000462
Benjamin Kramer144884642009-12-31 13:32:38 +0000463 if (Directive.startswith("if")) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000464 StringRef Sub = Directive.substr(2);
Benjamin Kramer144884642009-12-31 13:32:38 +0000465 if (Sub.empty() || // "if"
466 Sub == "def" || // "ifdef"
467 Sub == "ndef") { // "ifndef"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000468 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
469 // bother parsing the condition.
470 DiscardUntilEndOfDirective();
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000471 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000472 /*foundnonskip*/false,
Chandler Carruth540960f2011-01-03 17:40:17 +0000473 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000474 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000475 } else if (Directive[0] == 'e') {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000476 StringRef Sub = Directive.substr(1);
Benjamin Kramer144884642009-12-31 13:32:38 +0000477 if (Sub == "ndif") { // "endif"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000478 PPConditionalInfo CondInfo;
479 CondInfo.WasSkipping = true; // Silence bogus warning.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000480 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000481 (void)InCond; // Silence warning in no-asserts mode.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000482 assert(!InCond && "Can't be skipping if not in a conditional!");
Mike Stump11289f42009-09-09 15:08:12 +0000483
Chris Lattnerf64b3522008-03-09 01:54:53 +0000484 // If we popped the outermost skipping block, we're done skipping!
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000485 if (!CondInfo.WasSkipping) {
Richard Smith87d8fb92012-06-24 23:56:26 +0000486 // Restore the value of LexingRawMode so that trailing comments
487 // are handled correctly, if we've reached the outermost block.
488 CurPPLexer->LexingRawMode = false;
Richard Smithd0124572012-06-21 00:35:03 +0000489 CheckEndOfDirective("endif");
Richard Smith87d8fb92012-06-24 23:56:26 +0000490 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000491 if (Callbacks)
492 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000493 break;
Richard Smithd0124572012-06-21 00:35:03 +0000494 } else {
495 DiscardUntilEndOfDirective();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000496 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000497 } else if (Sub == "lse") { // "else".
Chris Lattnerf64b3522008-03-09 01:54:53 +0000498 // #else directive in a skipping conditional. If not in some other
499 // skipping conditional, and if #else hasn't already been seen, enter it
500 // as a non-skipping conditional.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000501 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Mike Stump11289f42009-09-09 15:08:12 +0000502
Chris Lattnerf64b3522008-03-09 01:54:53 +0000503 // If this is a #else with a #else before it, report the error.
504 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000505
Chris Lattnerf64b3522008-03-09 01:54:53 +0000506 // Note that we've seen a #else in this conditional.
507 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000508
Chris Lattnerf64b3522008-03-09 01:54:53 +0000509 // If the conditional is at the top level, and the #if block wasn't
510 // entered, enter the #else block now.
511 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
512 CondInfo.FoundNonSkip = true;
Richard Smith87d8fb92012-06-24 23:56:26 +0000513 // Restore the value of LexingRawMode so that trailing comments
514 // are handled correctly.
515 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000516 CheckEndOfDirective("else");
Richard Smith87d8fb92012-06-24 23:56:26 +0000517 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000518 if (Callbacks)
519 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000520 break;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000521 } else {
522 DiscardUntilEndOfDirective(); // C99 6.10p4.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000523 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000524 } else if (Sub == "lif") { // "elif".
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000525 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000526
John Thompson17c35732013-12-04 20:19:30 +0000527 // If this is a #elif with a #else before it, report the error.
528 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_elif_after_else);
529
Chris Lattnerf64b3522008-03-09 01:54:53 +0000530 // If this is in a skipping block or if we're already handled this #if
531 // block, don't bother parsing the condition.
532 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
533 DiscardUntilEndOfDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000534 } else {
John Thompson17c35732013-12-04 20:19:30 +0000535 const SourceLocation CondBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000536 // Restore the value of LexingRawMode so that identifiers are
537 // looked up, etc, inside the #elif expression.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000538 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
539 CurPPLexer->LexingRawMode = false;
Craig Topperd2d442c2014-05-17 23:10:59 +0000540 IdentifierInfo *IfNDefMacro = nullptr;
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +0000541 const bool CondValue = EvaluateDirectiveExpression(IfNDefMacro).Conditional;
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000542 CurPPLexer->LexingRawMode = true;
John Thompson17c35732013-12-04 20:19:30 +0000543 if (Callbacks) {
544 const SourceLocation CondEnd = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000545 Callbacks->Elif(Tok.getLocation(),
John Thompson17c35732013-12-04 20:19:30 +0000546 SourceRange(CondBegin, CondEnd),
John Thompson87f9fef2013-12-07 08:41:15 +0000547 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False), CondInfo.IfLoc);
John Thompson17c35732013-12-04 20:19:30 +0000548 }
549 // If this condition is true, enter it!
550 if (CondValue) {
551 CondInfo.FoundNonSkip = true;
552 break;
553 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000554 }
555 }
556 }
Mike Stump11289f42009-09-09 15:08:12 +0000557
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000558 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000559 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000560 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000561 }
562
563 // Finally, if we are out of the conditional (saw an #endif or ran off the end
564 // of the file, just stop skipping and return to lexing whatever came after
565 // the #if block.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000566 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000567
568 if (Callbacks) {
569 SourceLocation BeginLoc = ElseLoc.isValid() ? ElseLoc : IfTokenLoc;
570 Callbacks->SourceRangeSkipped(SourceRange(BeginLoc, Tok.getLocation()));
571 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000572}
573
Ted Kremenek56572ab2008-12-12 18:34:08 +0000574void Preprocessor::PTHSkipExcludedConditionalBlock() {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000575 while (true) {
Ted Kremenek56572ab2008-12-12 18:34:08 +0000576 assert(CurPTHLexer);
577 assert(CurPTHLexer->LexingRawMode == false);
Mike Stump11289f42009-09-09 15:08:12 +0000578
Ted Kremenek56572ab2008-12-12 18:34:08 +0000579 // Skip to the next '#else', '#elif', or #endif.
580 if (CurPTHLexer->SkipBlock()) {
581 // We have reached an #endif. Both the '#' and 'endif' tokens
582 // have been consumed by the PTHLexer. Just pop off the condition level.
583 PPConditionalInfo CondInfo;
584 bool InCond = CurPTHLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000585 (void)InCond; // Silence warning in no-asserts mode.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000586 assert(!InCond && "Can't be skipping if not in a conditional!");
587 break;
588 }
Mike Stump11289f42009-09-09 15:08:12 +0000589
Ted Kremenek56572ab2008-12-12 18:34:08 +0000590 // We have reached a '#else' or '#elif'. Lex the next token to get
591 // the directive flavor.
592 Token Tok;
593 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000594
Ted Kremenek56572ab2008-12-12 18:34:08 +0000595 // We can actually look up the IdentifierInfo here since we aren't in
596 // raw mode.
597 tok::PPKeywordKind K = Tok.getIdentifierInfo()->getPPKeywordID();
598
599 if (K == tok::pp_else) {
600 // #else: Enter the else condition. We aren't in a nested condition
601 // since we skip those. We're always in the one matching the last
602 // blocked we skipped.
603 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
604 // Note that we've seen a #else in this conditional.
605 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000606
Ted Kremenek56572ab2008-12-12 18:34:08 +0000607 // If the #if block wasn't entered then enter the #else block now.
608 if (!CondInfo.FoundNonSkip) {
609 CondInfo.FoundNonSkip = true;
Mike Stump11289f42009-09-09 15:08:12 +0000610
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000611 // Scan until the eod token.
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000612 CurPTHLexer->ParsingPreprocessorDirective = true;
Daniel Dunbar2cba6be2009-04-13 17:57:49 +0000613 DiscardUntilEndOfDirective();
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000614 CurPTHLexer->ParsingPreprocessorDirective = false;
Mike Stump11289f42009-09-09 15:08:12 +0000615
Ted Kremenek56572ab2008-12-12 18:34:08 +0000616 break;
617 }
Mike Stump11289f42009-09-09 15:08:12 +0000618
Ted Kremenek56572ab2008-12-12 18:34:08 +0000619 // Otherwise skip this block.
620 continue;
621 }
Mike Stump11289f42009-09-09 15:08:12 +0000622
Ted Kremenek56572ab2008-12-12 18:34:08 +0000623 assert(K == tok::pp_elif);
624 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
625
626 // If this is a #elif with a #else before it, report the error.
627 if (CondInfo.FoundElse)
628 Diag(Tok, diag::pp_err_elif_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000629
Ted Kremenek56572ab2008-12-12 18:34:08 +0000630 // If this is in a skipping block or if we're already handled this #if
Mike Stump11289f42009-09-09 15:08:12 +0000631 // block, don't bother parsing the condition. We just skip this block.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000632 if (CondInfo.FoundNonSkip)
633 continue;
634
635 // Evaluate the condition of the #elif.
Craig Topperd2d442c2014-05-17 23:10:59 +0000636 IdentifierInfo *IfNDefMacro = nullptr;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000637 CurPTHLexer->ParsingPreprocessorDirective = true;
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +0000638 bool ShouldEnter = EvaluateDirectiveExpression(IfNDefMacro).Conditional;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000639 CurPTHLexer->ParsingPreprocessorDirective = false;
640
641 // If this condition is true, enter it!
642 if (ShouldEnter) {
643 CondInfo.FoundNonSkip = true;
644 break;
645 }
646
647 // Otherwise, skip this block and go to the next one.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000648 }
649}
650
Richard Smith2a553082015-04-23 22:58:06 +0000651Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
Richard Smith7e82e012016-02-19 22:25:36 +0000652 if (!SourceMgr.isInMainFile(Loc)) {
653 // Try to determine the module of the include directive.
654 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
655 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
656 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
657 // The include comes from an included file.
658 return HeaderInfo.getModuleMap()
659 .findModuleForHeader(EntryOfIncl)
660 .getModule();
661 }
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000662 }
Richard Smith7e82e012016-02-19 22:25:36 +0000663
664 // This is either in the main file or not in a file at all. It belongs
665 // to the current module, if there is one.
666 return getLangOpts().CurrentModule.empty()
667 ? nullptr
668 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000669}
670
Richard Smith4eb83932016-04-27 21:57:05 +0000671const FileEntry *
672Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000673 Module *M,
Richard Smith4eb83932016-04-27 21:57:05 +0000674 SourceLocation Loc) {
Richard Smithcbf7d8a2017-05-19 23:49:00 +0000675 assert(M && "no module to include");
676
Richard Smith4eb83932016-04-27 21:57:05 +0000677 // If we have a module import syntax, we shouldn't include a header to
678 // make a particular module visible.
679 if (getLangOpts().ObjC2)
680 return nullptr;
681
Richard Smith4eb83932016-04-27 21:57:05 +0000682 Module *TopM = M->getTopLevelModule();
683 Module *IncM = getModuleForLocation(IncLoc);
684
685 // Walk up through the include stack, looking through textual headers of M
686 // until we hit a non-textual header that we can #include. (We assume textual
687 // headers of a module with non-textual headers aren't meant to be used to
688 // import entities from the module.)
689 auto &SM = getSourceManager();
690 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
691 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
692 auto *FE = SM.getFileEntryForID(ID);
Richard Smith040e1262017-06-02 01:55:39 +0000693 if (!FE)
694 break;
Richard Smith4eb83932016-04-27 21:57:05 +0000695
696 bool InTextualHeader = false;
697 for (auto Header : HeaderInfo.getModuleMap().findAllModulesForHeader(FE)) {
698 if (!Header.getModule()->isSubModuleOf(TopM))
699 continue;
700
701 if (!(Header.getRole() & ModuleMap::TextualHeader)) {
702 // If this is an accessible, non-textual header of M's top-level module
703 // that transitively includes the given location and makes the
704 // corresponding module visible, this is the thing to #include.
705 if (Header.isAccessibleFrom(IncM))
706 return FE;
707
708 // It's in a private header; we can't #include it.
709 // FIXME: If there's a public header in some module that re-exports it,
710 // then we could suggest including that, but it's not clear that's the
711 // expected way to make this entity visible.
712 continue;
713 }
714
715 InTextualHeader = true;
716 }
717
718 if (!InTextualHeader)
719 break;
720
721 Loc = SM.getIncludeLoc(ID);
722 }
723
724 return nullptr;
725}
726
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000727const FileEntry *Preprocessor::LookupFile(
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000728 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
729 const DirectoryLookup *FromDir, const FileEntry *FromFile,
730 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
Douglas Gregor97eec242011-09-15 22:00:41 +0000731 SmallVectorImpl<char> *RelativePath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000732 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool SkipCache) {
Taewook Oh755e4d22016-06-13 21:55:33 +0000733 Module *RequestingModule = getModuleForLocation(FilenameLoc);
Richard Smith8d4e90b2016-03-14 17:52:37 +0000734 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
Richard Smith3d5b48c2015-10-16 21:42:56 +0000735
Will Wilson0fafd342013-12-27 19:46:16 +0000736 // If the header lookup mechanism may be relative to the current inclusion
737 // stack, record the parent #includes.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000738 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
739 Includers;
Manman Rene4a5d372016-05-17 02:15:12 +0000740 bool BuildSystemModule = false;
Richard Smith25d50752014-10-20 00:15:49 +0000741 if (!FromDir && !FromFile) {
Chris Lattnerd32480d2009-01-17 06:22:33 +0000742 FileID FID = getCurrentFileLexer()->getFileID();
Will Wilson0fafd342013-12-27 19:46:16 +0000743 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
Mike Stump11289f42009-09-09 15:08:12 +0000744
Chris Lattner022923a2009-02-04 19:45:07 +0000745 // If there is no file entry associated with this file, it must be the
Richard Smith3c1a41a2014-12-02 00:08:08 +0000746 // predefines buffer or the module includes buffer. Any other file is not
747 // lexed with a normal lexer, so it won't be scanned for preprocessor
748 // directives.
749 //
750 // If we have the predefines buffer, resolve #include references (which come
751 // from the -include command line argument) from the current working
752 // directory instead of relative to the main file.
753 //
754 // If we have the module includes buffer, resolve #include references (which
755 // come from header declarations in the module map) relative to the module
756 // map file.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000757 if (!FileEnt) {
Manman Rene4a5d372016-05-17 02:15:12 +0000758 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Richard Smith3c1a41a2014-12-02 00:08:08 +0000759 Includers.push_back(std::make_pair(nullptr, MainFileDir));
Manman Rene4a5d372016-05-17 02:15:12 +0000760 BuildSystemModule = getCurrentModule()->IsSystem;
761 } else if ((FileEnt =
Richard Smith3c1a41a2014-12-02 00:08:08 +0000762 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000763 Includers.push_back(std::make_pair(FileEnt, FileMgr.getDirectory(".")));
764 } else {
765 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
766 }
Will Wilson0fafd342013-12-27 19:46:16 +0000767
768 // MSVC searches the current include stack from top to bottom for
769 // headers included by quoted include directives.
770 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
Alp Tokerbfa39342014-01-14 12:51:41 +0000771 if (LangOpts.MSVCCompat && !isAngled) {
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000772 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Will Wilson0fafd342013-12-27 19:46:16 +0000773 if (IsFileLexer(ISEntry))
Yaron Keren65224612015-12-18 10:30:12 +0000774 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000775 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
Will Wilson0fafd342013-12-27 19:46:16 +0000776 }
Chris Lattner022923a2009-02-04 19:45:07 +0000777 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000778 }
Mike Stump11289f42009-09-09 15:08:12 +0000779
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000780 CurDir = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +0000781
782 if (FromFile) {
783 // We're supposed to start looking from after a particular file. Search
784 // the include path until we find that file or run out of files.
785 const DirectoryLookup *TmpCurDir = CurDir;
786 const DirectoryLookup *TmpFromDir = nullptr;
787 while (const FileEntry *FE = HeaderInfo.LookupFile(
788 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000789 Includers, SearchPath, RelativePath, RequestingModule,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000790 SuggestedModule, /*IsMapped=*/nullptr, SkipCache)) {
Richard Smith25d50752014-10-20 00:15:49 +0000791 // Keep looking as if this file did a #include_next.
792 TmpFromDir = TmpCurDir;
793 ++TmpFromDir;
794 if (FE == FromFile) {
795 // Found it.
796 FromDir = TmpFromDir;
797 CurDir = TmpCurDir;
798 break;
799 }
800 }
801 }
802
803 // Do a standard file entry lookup.
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000804 const FileEntry *FE = HeaderInfo.LookupFile(
Will Wilson0fafd342013-12-27 19:46:16 +0000805 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000806 RelativePath, RequestingModule, SuggestedModule, IsMapped, SkipCache,
Manman Rene4a5d372016-05-17 02:15:12 +0000807 BuildSystemModule);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000808 if (FE) {
Daniel Jasper5c77e392014-03-14 14:53:17 +0000809 if (SuggestedModule && !LangOpts.AsmPreprocessor)
Daniel Jasper92669ee2013-12-20 12:09:36 +0000810 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000811 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
812 Filename, FE);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000813 return FE;
814 }
Mike Stump11289f42009-09-09 15:08:12 +0000815
Will Wilson0fafd342013-12-27 19:46:16 +0000816 const FileEntry *CurFileEnt;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000817 // Otherwise, see if this is a subframework header. If so, this is relative
818 // to one of the headers on the #include stack. Walk the list of the current
819 // headers on the #include stack and pass them to HeaderInfo.
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000820 if (IsFileLexer()) {
Yaron Keren65224612015-12-18 10:30:12 +0000821 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000822 if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt,
Douglas Gregorf5f94522013-02-08 00:10:48 +0000823 SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000824 RequestingModule,
Ben Langmuir71e1a642014-05-05 21:44:13 +0000825 SuggestedModule))) {
826 if (SuggestedModule && !LangOpts.AsmPreprocessor)
827 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000828 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
829 Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000830 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000831 }
832 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000833 }
Mike Stump11289f42009-09-09 15:08:12 +0000834
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000835 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000836 if (IsFileLexer(ISEntry)) {
Yaron Keren65224612015-12-18 10:30:12 +0000837 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
Manuel Klimek0c69fd22011-04-26 21:50:03 +0000838 if ((FE = HeaderInfo.LookupSubframeworkHeader(
Douglas Gregorf5f94522013-02-08 00:10:48 +0000839 Filename, CurFileEnt, SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000840 RequestingModule, SuggestedModule))) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000841 if (SuggestedModule && !LangOpts.AsmPreprocessor)
842 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000843 RequestingModule, RequestingModuleIsModuleInterface,
844 FilenameLoc, Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000845 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000846 }
847 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000848 }
849 }
Mike Stump11289f42009-09-09 15:08:12 +0000850
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000851 // Otherwise, we really couldn't find the file.
Craig Topperd2d442c2014-05-17 23:10:59 +0000852 return nullptr;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000853}
854
Chris Lattnerf64b3522008-03-09 01:54:53 +0000855//===----------------------------------------------------------------------===//
856// Preprocessor Directive Handling.
857//===----------------------------------------------------------------------===//
858
David Blaikied5321242012-06-06 18:52:13 +0000859class Preprocessor::ResetMacroExpansionHelper {
860public:
861 ResetMacroExpansionHelper(Preprocessor *pp)
862 : PP(pp), save(pp->DisableMacroExpansion) {
863 if (pp->MacroExpansionInDirectivesOverride)
864 pp->DisableMacroExpansion = false;
865 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000866
David Blaikied5321242012-06-06 18:52:13 +0000867 ~ResetMacroExpansionHelper() {
868 PP->DisableMacroExpansion = save;
869 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000870
David Blaikied5321242012-06-06 18:52:13 +0000871private:
872 Preprocessor *PP;
873 bool save;
874};
875
Chris Lattnerf64b3522008-03-09 01:54:53 +0000876/// HandleDirective - This callback is invoked when the lexer sees a # token
Mike Stump11289f42009-09-09 15:08:12 +0000877/// at the start of a line. This consumes the directive, modifies the
Chris Lattnerf64b3522008-03-09 01:54:53 +0000878/// lexer/preprocessor state, and advances the lexer(s) so that the next token
879/// read is the correct one.
880void Preprocessor::HandleDirective(Token &Result) {
881 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
Mike Stump11289f42009-09-09 15:08:12 +0000882
Chris Lattnerf64b3522008-03-09 01:54:53 +0000883 // We just parsed a # character at the start of a line, so we're in directive
884 // mode. Tell the lexer this so any newlines we see will be converted into an
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000885 // EOD token (which terminates the directive).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000886 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000887 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Mike Stump11289f42009-09-09 15:08:12 +0000888
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000889 bool ImmediatelyAfterTopLevelIfndef =
890 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
891 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
892
Chris Lattnerf64b3522008-03-09 01:54:53 +0000893 ++NumDirectives;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +0000894
Chris Lattnerf64b3522008-03-09 01:54:53 +0000895 // We are about to read a token. For the multiple-include optimization FA to
Mike Stump11289f42009-09-09 15:08:12 +0000896 // work, we have to remember if we had read any tokens *before* this
Chris Lattnerf64b3522008-03-09 01:54:53 +0000897 // pp-directive.
Chris Lattner8cf1f932009-12-14 04:54:40 +0000898 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
Mike Stump11289f42009-09-09 15:08:12 +0000899
Chris Lattner2d17ab72009-03-18 21:00:25 +0000900 // Save the '#' token in case we need to return it later.
901 Token SavedHash = Result;
Mike Stump11289f42009-09-09 15:08:12 +0000902
Chris Lattnerf64b3522008-03-09 01:54:53 +0000903 // Read the next token, the directive flavor. This isn't expanded due to
904 // C99 6.10.3p8.
905 LexUnexpandedToken(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000906
Chris Lattnerf64b3522008-03-09 01:54:53 +0000907 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
908 // #define A(x) #x
909 // A(abc
910 // #warning blah
911 // def)
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000912 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
913 // not support this for #include-like directives, since that can result in
914 // terrible diagnostics, and does not work in GCC.
915 if (InMacroArgs) {
916 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
917 switch (II->getPPKeywordID()) {
918 case tok::pp_include:
919 case tok::pp_import:
920 case tok::pp_include_next:
921 case tok::pp___include_macros:
David Majnemerf2d3bc02014-12-28 07:42:49 +0000922 case tok::pp_pragma:
923 Diag(Result, diag::err_embedded_directive) << II->getName();
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000924 DiscardUntilEndOfDirective();
925 return;
926 default:
927 break;
928 }
929 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000930 Diag(Result, diag::ext_embedded_directive);
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000931 }
Mike Stump11289f42009-09-09 15:08:12 +0000932
David Blaikied5321242012-06-06 18:52:13 +0000933 // Temporarily enable macro expansion if set so
934 // and reset to previous state when returning from this function.
935 ResetMacroExpansionHelper helper(this);
936
Chris Lattnerf64b3522008-03-09 01:54:53 +0000937 switch (Result.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000938 case tok::eod:
Chris Lattnerf64b3522008-03-09 01:54:53 +0000939 return; // null directive.
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000940 case tok::code_completion:
941 if (CodeComplete)
942 CodeComplete->CodeCompleteDirective(
943 CurPPLexer->getConditionalStackDepth() > 0);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000944 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000945 return;
Chris Lattner76e68962009-01-26 06:19:46 +0000946 case tok::numeric_constant: // # 7 GNU line marker directive.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000947 if (getLangOpts().AsmPreprocessor)
Chris Lattner5eb8ae22009-03-18 20:41:10 +0000948 break; // # 4 is not a preprocessor directive in .S files.
Chris Lattner76e68962009-01-26 06:19:46 +0000949 return HandleDigitDirective(Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000950 default:
951 IdentifierInfo *II = Result.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +0000952 if (!II) break; // Not an identifier.
Mike Stump11289f42009-09-09 15:08:12 +0000953
Chris Lattnerf64b3522008-03-09 01:54:53 +0000954 // Ask what the preprocessor keyword ID is.
955 switch (II->getPPKeywordID()) {
956 default: break;
957 // C99 6.10.1 - Conditional Inclusion.
958 case tok::pp_if:
959 return HandleIfDirective(Result, ReadAnyTokensBeforeDirective);
960 case tok::pp_ifdef:
961 return HandleIfdefDirective(Result, false, true/*not valid for miopt*/);
962 case tok::pp_ifndef:
963 return HandleIfdefDirective(Result, true, ReadAnyTokensBeforeDirective);
964 case tok::pp_elif:
965 return HandleElifDirective(Result);
966 case tok::pp_else:
967 return HandleElseDirective(Result);
968 case tok::pp_endif:
969 return HandleEndifDirective(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000970
Chris Lattnerf64b3522008-03-09 01:54:53 +0000971 // C99 6.10.2 - Source File Inclusion.
972 case tok::pp_include:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000973 // Handle #include.
974 return HandleIncludeDirective(SavedHash.getLocation(), Result);
Chris Lattner14a7f392009-04-08 18:24:34 +0000975 case tok::pp___include_macros:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000976 // Handle -imacros.
Taewook Oh755e4d22016-06-13 21:55:33 +0000977 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +0000978
Chris Lattnerf64b3522008-03-09 01:54:53 +0000979 // C99 6.10.3 - Macro Replacement.
980 case tok::pp_define:
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000981 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000982 case tok::pp_undef:
Erik Verbruggen4bddef92016-10-26 08:52:41 +0000983 return HandleUndefDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000984
985 // C99 6.10.4 - Line Control.
986 case tok::pp_line:
Erik Verbruggen4bddef92016-10-26 08:52:41 +0000987 return HandleLineDirective();
Mike Stump11289f42009-09-09 15:08:12 +0000988
Chris Lattnerf64b3522008-03-09 01:54:53 +0000989 // C99 6.10.5 - Error Directive.
990 case tok::pp_error:
991 return HandleUserDiagnosticDirective(Result, false);
Mike Stump11289f42009-09-09 15:08:12 +0000992
Chris Lattnerf64b3522008-03-09 01:54:53 +0000993 // C99 6.10.6 - Pragma Directive.
994 case tok::pp_pragma:
Enea Zaffanella5afb04a2013-07-20 20:09:11 +0000995 return HandlePragmaDirective(SavedHash.getLocation(), PIK_HashPragma);
Mike Stump11289f42009-09-09 15:08:12 +0000996
Chris Lattnerf64b3522008-03-09 01:54:53 +0000997 // GNU Extensions.
998 case tok::pp_import:
Douglas Gregor796d76a2010-10-20 22:00:55 +0000999 return HandleImportDirective(SavedHash.getLocation(), Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001000 case tok::pp_include_next:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001001 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001002
Chris Lattnerf64b3522008-03-09 01:54:53 +00001003 case tok::pp_warning:
1004 Diag(Result, diag::ext_pp_warning_directive);
1005 return HandleUserDiagnosticDirective(Result, true);
1006 case tok::pp_ident:
1007 return HandleIdentSCCSDirective(Result);
1008 case tok::pp_sccs:
1009 return HandleIdentSCCSDirective(Result);
1010 case tok::pp_assert:
1011 //isExtension = true; // FIXME: implement #assert
1012 break;
1013 case tok::pp_unassert:
1014 //isExtension = true; // FIXME: implement #unassert
1015 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001016
Douglas Gregor663b48f2012-01-03 19:48:16 +00001017 case tok::pp___public_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001018 if (getLangOpts().Modules)
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001019 return HandleMacroPublicDirective(Result);
1020 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001021
Douglas Gregor663b48f2012-01-03 19:48:16 +00001022 case tok::pp___private_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001023 if (getLangOpts().Modules)
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001024 return HandleMacroPrivateDirective();
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001025 break;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001026 }
1027 break;
1028 }
Mike Stump11289f42009-09-09 15:08:12 +00001029
Chris Lattner2d17ab72009-03-18 21:00:25 +00001030 // If this is a .S file, treat unknown # directives as non-preprocessor
1031 // directives. This is important because # may be a comment or introduce
1032 // various pseudo-ops. Just return the # token and push back the following
1033 // token to be lexed next time.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001034 if (getLangOpts().AsmPreprocessor) {
David Blaikie2eabcc92016-02-09 18:52:09 +00001035 auto Toks = llvm::make_unique<Token[]>(2);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001036 // Return the # and the token after it.
Mike Stump11289f42009-09-09 15:08:12 +00001037 Toks[0] = SavedHash;
Chris Lattner2d17ab72009-03-18 21:00:25 +00001038 Toks[1] = Result;
Taewook Oh755e4d22016-06-13 21:55:33 +00001039
Chris Lattner56f64c12011-01-06 05:01:51 +00001040 // If the second token is a hashhash token, then we need to translate it to
1041 // unknown so the token lexer doesn't try to perform token pasting.
1042 if (Result.is(tok::hashhash))
1043 Toks[1].setKind(tok::unknown);
Taewook Oh755e4d22016-06-13 21:55:33 +00001044
Chris Lattner2d17ab72009-03-18 21:00:25 +00001045 // Enter this token stream so that we re-lex the tokens. Make sure to
1046 // enable macro expansion, in case the token after the # is an identifier
1047 // that is expanded.
David Blaikie2eabcc92016-02-09 18:52:09 +00001048 EnterTokenStream(std::move(Toks), 2, false);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001049 return;
1050 }
Mike Stump11289f42009-09-09 15:08:12 +00001051
Chris Lattnerf64b3522008-03-09 01:54:53 +00001052 // If we reached here, the preprocessing token is not valid!
1053 Diag(Result, diag::err_pp_invalid_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001054
Chris Lattnerf64b3522008-03-09 01:54:53 +00001055 // Read the rest of the PP line.
1056 DiscardUntilEndOfDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001057
Chris Lattnerf64b3522008-03-09 01:54:53 +00001058 // Okay, we're done parsing the directive.
1059}
1060
Chris Lattner76e68962009-01-26 06:19:46 +00001061/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1062/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1063static bool GetLineValue(Token &DigitTok, unsigned &Val,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001064 unsigned DiagID, Preprocessor &PP,
1065 bool IsGNULineDirective=false) {
Chris Lattner76e68962009-01-26 06:19:46 +00001066 if (DigitTok.isNot(tok::numeric_constant)) {
1067 PP.Diag(DigitTok, DiagID);
Mike Stump11289f42009-09-09 15:08:12 +00001068
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001069 if (DigitTok.isNot(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001070 PP.DiscardUntilEndOfDirective();
1071 return true;
1072 }
Mike Stump11289f42009-09-09 15:08:12 +00001073
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001074 SmallString<64> IntegerBuffer;
Chris Lattner76e68962009-01-26 06:19:46 +00001075 IntegerBuffer.resize(DigitTok.getLength());
1076 const char *DigitTokBegin = &IntegerBuffer[0];
Douglas Gregordc970f02010-03-16 22:30:13 +00001077 bool Invalid = false;
1078 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1079 if (Invalid)
1080 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001081
Chris Lattnerd66f1722009-04-18 18:35:15 +00001082 // Verify that we have a simple digit-sequence, and compute the value. This
1083 // is always a simple digit string computed in decimal, so we do this manually
1084 // here.
1085 Val = 0;
1086 for (unsigned i = 0; i != ActualLength; ++i) {
Richard Smith7f2707a2013-09-26 18:13:20 +00001087 // C++1y [lex.fcon]p1:
1088 // Optional separating single quotes in a digit-sequence are ignored
1089 if (DigitTokBegin[i] == '\'')
1090 continue;
1091
Jordan Rosea7d03842013-02-08 22:30:41 +00001092 if (!isDigit(DigitTokBegin[i])) {
Chris Lattnerd66f1722009-04-18 18:35:15 +00001093 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
Michael Ilsemane910cc82013-04-10 01:04:18 +00001094 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001095 PP.DiscardUntilEndOfDirective();
1096 return true;
1097 }
Mike Stump11289f42009-09-09 15:08:12 +00001098
Chris Lattnerd66f1722009-04-18 18:35:15 +00001099 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1100 if (NextVal < Val) { // overflow.
1101 PP.Diag(DigitTok, DiagID);
1102 PP.DiscardUntilEndOfDirective();
1103 return true;
1104 }
1105 Val = NextVal;
Chris Lattner76e68962009-01-26 06:19:46 +00001106 }
Mike Stump11289f42009-09-09 15:08:12 +00001107
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001108 if (DigitTokBegin[0] == '0' && Val)
Michael Ilsemane910cc82013-04-10 01:04:18 +00001109 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1110 << IsGNULineDirective;
Mike Stump11289f42009-09-09 15:08:12 +00001111
Chris Lattner76e68962009-01-26 06:19:46 +00001112 return false;
1113}
1114
James Dennettf6333ac2012-06-22 05:46:07 +00001115/// \brief Handle a \#line directive: C99 6.10.4.
1116///
1117/// The two acceptable forms are:
1118/// \verbatim
Chris Lattner100c65e2009-01-26 05:29:08 +00001119/// # line digit-sequence
1120/// # line digit-sequence "s-char-sequence"
James Dennettf6333ac2012-06-22 05:46:07 +00001121/// \endverbatim
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001122void Preprocessor::HandleLineDirective() {
Chris Lattner100c65e2009-01-26 05:29:08 +00001123 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1124 // expanded.
1125 Token DigitTok;
1126 Lex(DigitTok);
1127
Chris Lattner100c65e2009-01-26 05:29:08 +00001128 // Validate the number and convert it to an unsigned.
Chris Lattner76e68962009-01-26 06:19:46 +00001129 unsigned LineNo;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001130 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
Chris Lattner100c65e2009-01-26 05:29:08 +00001131 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001132
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001133 if (LineNo == 0)
1134 Diag(DigitTok, diag::ext_pp_line_zero);
Chris Lattner100c65e2009-01-26 05:29:08 +00001135
Chris Lattner76e68962009-01-26 06:19:46 +00001136 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1137 // number greater than 2147483647". C90 requires that the line # be <= 32767.
Eli Friedman192e0342011-10-10 23:35:28 +00001138 unsigned LineLimit = 32768U;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001139 if (LangOpts.C99 || LangOpts.CPlusPlus11)
Eli Friedman192e0342011-10-10 23:35:28 +00001140 LineLimit = 2147483648U;
Chris Lattner100c65e2009-01-26 05:29:08 +00001141 if (LineNo >= LineLimit)
1142 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001143 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
Richard Smithacd4d3d2011-10-15 01:18:56 +00001144 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
Mike Stump11289f42009-09-09 15:08:12 +00001145
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001146 int FilenameID = -1;
Chris Lattner100c65e2009-01-26 05:29:08 +00001147 Token StrTok;
1148 Lex(StrTok);
1149
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001150 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1151 // string followed by eod.
1152 if (StrTok.is(tok::eod))
Chris Lattner100c65e2009-01-26 05:29:08 +00001153 ; // ok
1154 else if (StrTok.isNot(tok::string_literal)) {
1155 Diag(StrTok, diag::err_pp_line_invalid_filename);
Richard Smithd67aea22012-03-06 03:21:47 +00001156 return DiscardUntilEndOfDirective();
1157 } else if (StrTok.hasUDSuffix()) {
1158 Diag(StrTok, diag::err_invalid_string_udl);
1159 return DiscardUntilEndOfDirective();
Chris Lattner100c65e2009-01-26 05:29:08 +00001160 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001161 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001162 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001163 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001164 if (Literal.hadError)
1165 return DiscardUntilEndOfDirective();
1166 if (Literal.Pascal) {
1167 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1168 return DiscardUntilEndOfDirective();
1169 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001170 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001171
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001172 // Verify that there is nothing after the string, other than EOD. Because
Chris Lattner0003c272009-04-17 23:30:53 +00001173 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1174 CheckEndOfDirective("line", true);
Chris Lattner100c65e2009-01-26 05:29:08 +00001175 }
Mike Stump11289f42009-09-09 15:08:12 +00001176
Reid Klecknereb00ee02017-05-22 21:42:58 +00001177 // Take the file kind of the file containing the #line directive. #line
1178 // directives are often used for generated sources from the same codebase, so
1179 // the new file should generally be classified the same way as the current
1180 // file. This is visible in GCC's pre-processed output, which rewrites #line
1181 // to GNU line markers.
1182 SrcMgr::CharacteristicKind FileKind =
1183 SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1184
1185 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1186 false, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001187
Chris Lattner839150e2009-03-27 17:13:49 +00001188 if (Callbacks)
Chris Lattnerc745cec2010-04-14 04:28:50 +00001189 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
Reid Klecknereb00ee02017-05-22 21:42:58 +00001190 PPCallbacks::RenameFile, FileKind);
Chris Lattner100c65e2009-01-26 05:29:08 +00001191}
1192
Chris Lattner76e68962009-01-26 06:19:46 +00001193/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1194/// marker directive.
1195static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
Reid Klecknereb00ee02017-05-22 21:42:58 +00001196 SrcMgr::CharacteristicKind &FileKind,
Chris Lattner76e68962009-01-26 06:19:46 +00001197 Preprocessor &PP) {
1198 unsigned FlagVal;
1199 Token FlagTok;
1200 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001201 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001202 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1203 return true;
1204
1205 if (FlagVal == 1) {
1206 IsFileEntry = true;
Mike Stump11289f42009-09-09 15:08:12 +00001207
Chris Lattner76e68962009-01-26 06:19:46 +00001208 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001209 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001210 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1211 return true;
1212 } else if (FlagVal == 2) {
1213 IsFileExit = true;
Mike Stump11289f42009-09-09 15:08:12 +00001214
Chris Lattner1c967782009-02-04 06:25:26 +00001215 SourceManager &SM = PP.getSourceManager();
1216 // If we are leaving the current presumed file, check to make sure the
1217 // presumed include stack isn't empty!
1218 FileID CurFileID =
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001219 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
Chris Lattner1c967782009-02-04 06:25:26 +00001220 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
Douglas Gregor453b0122010-11-12 07:15:47 +00001221 if (PLoc.isInvalid())
1222 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001223
Chris Lattner1c967782009-02-04 06:25:26 +00001224 // If there is no include loc (main file) or if the include loc is in a
1225 // different physical file, then we aren't in a "1" line marker flag region.
1226 SourceLocation IncLoc = PLoc.getIncludeLoc();
1227 if (IncLoc.isInvalid() ||
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001228 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
Chris Lattner1c967782009-02-04 06:25:26 +00001229 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1230 PP.DiscardUntilEndOfDirective();
1231 return true;
1232 }
Mike Stump11289f42009-09-09 15:08:12 +00001233
Chris Lattner76e68962009-01-26 06:19:46 +00001234 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001235 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001236 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1237 return true;
1238 }
1239
1240 // We must have 3 if there are still flags.
1241 if (FlagVal != 3) {
1242 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001243 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001244 return true;
1245 }
Mike Stump11289f42009-09-09 15:08:12 +00001246
Reid Klecknereb00ee02017-05-22 21:42:58 +00001247 FileKind = SrcMgr::C_System;
Mike Stump11289f42009-09-09 15:08:12 +00001248
Chris Lattner76e68962009-01-26 06:19:46 +00001249 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001250 if (FlagTok.is(tok::eod)) return false;
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001251 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
Chris Lattner76e68962009-01-26 06:19:46 +00001252 return true;
1253
1254 // We must have 4 if there is yet another flag.
1255 if (FlagVal != 4) {
1256 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001257 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001258 return true;
1259 }
Mike Stump11289f42009-09-09 15:08:12 +00001260
Reid Klecknereb00ee02017-05-22 21:42:58 +00001261 FileKind = SrcMgr::C_ExternCSystem;
Mike Stump11289f42009-09-09 15:08:12 +00001262
Chris Lattner76e68962009-01-26 06:19:46 +00001263 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001264 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001265
1266 // There are no more valid flags here.
1267 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001268 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001269 return true;
1270}
1271
1272/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1273/// one of the following forms:
1274///
1275/// # 42
Mike Stump11289f42009-09-09 15:08:12 +00001276/// # 42 "file" ('1' | '2')?
Chris Lattner76e68962009-01-26 06:19:46 +00001277/// # 42 "file" ('1' | '2')? '3' '4'?
1278///
1279void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1280 // Validate the number and convert it to an unsigned. GNU does not have a
1281 // line # limit other than it fit in 32-bits.
1282 unsigned LineNo;
1283 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001284 *this, true))
Chris Lattner76e68962009-01-26 06:19:46 +00001285 return;
Mike Stump11289f42009-09-09 15:08:12 +00001286
Chris Lattner76e68962009-01-26 06:19:46 +00001287 Token StrTok;
1288 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001289
Chris Lattner76e68962009-01-26 06:19:46 +00001290 bool IsFileEntry = false, IsFileExit = false;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001291 int FilenameID = -1;
Reid Klecknereb00ee02017-05-22 21:42:58 +00001292 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001293
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001294 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1295 // string followed by eod.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001296 if (StrTok.is(tok::eod)) {
1297 // Treat this like "#line NN", which doesn't change file characteristics.
1298 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1299 } else if (StrTok.isNot(tok::string_literal)) {
Chris Lattner76e68962009-01-26 06:19:46 +00001300 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001301 return DiscardUntilEndOfDirective();
Richard Smithd67aea22012-03-06 03:21:47 +00001302 } else if (StrTok.hasUDSuffix()) {
1303 Diag(StrTok, diag::err_invalid_string_udl);
1304 return DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001305 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001306 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001307 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001308 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001309 if (Literal.hadError)
1310 return DiscardUntilEndOfDirective();
1311 if (Literal.Pascal) {
1312 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1313 return DiscardUntilEndOfDirective();
1314 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001315 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001316
Chris Lattner76e68962009-01-26 06:19:46 +00001317 // If a filename was present, read any flags that are present.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001318 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
Chris Lattner76e68962009-01-26 06:19:46 +00001319 return;
Chris Lattner76e68962009-01-26 06:19:46 +00001320 }
Mike Stump11289f42009-09-09 15:08:12 +00001321
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001322 // Create a line note with this information.
Reid Klecknereb00ee02017-05-22 21:42:58 +00001323 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1324 IsFileExit, FileKind);
Mike Stump11289f42009-09-09 15:08:12 +00001325
Chris Lattner839150e2009-03-27 17:13:49 +00001326 // If the preprocessor has callbacks installed, notify them of the #line
1327 // change. This is used so that the line marker comes out in -E mode for
1328 // example.
1329 if (Callbacks) {
1330 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1331 if (IsFileEntry)
1332 Reason = PPCallbacks::EnterFile;
1333 else if (IsFileExit)
1334 Reason = PPCallbacks::ExitFile;
Mike Stump11289f42009-09-09 15:08:12 +00001335
Chris Lattnerc745cec2010-04-14 04:28:50 +00001336 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
Chris Lattner839150e2009-03-27 17:13:49 +00001337 }
Chris Lattner76e68962009-01-26 06:19:46 +00001338}
1339
Chris Lattner38d7fd22009-01-26 05:30:54 +00001340/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1341///
Mike Stump11289f42009-09-09 15:08:12 +00001342void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001343 bool isWarning) {
Chris Lattner38d7fd22009-01-26 05:30:54 +00001344 // PTH doesn't emit #warning or #error directives.
1345 if (CurPTHLexer)
Chris Lattner100c65e2009-01-26 05:29:08 +00001346 return CurPTHLexer->DiscardToEndOfLine();
1347
Chris Lattnerf64b3522008-03-09 01:54:53 +00001348 // Read the rest of the line raw. We do this because we don't want macros
1349 // to be expanded and we don't require that the tokens be valid preprocessing
1350 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
1351 // collapse multiple consequtive white space between tokens, but this isn't
1352 // specified by the standard.
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001353 SmallString<128> Message;
1354 CurLexer->ReadToEndOfLine(&Message);
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001355
1356 // Find the first non-whitespace character, so that we can make the
1357 // diagnostic more succinct.
David Majnemerbf7e0c62016-02-24 22:07:26 +00001358 StringRef Msg = StringRef(Message).ltrim(' ');
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001359
Chris Lattner100c65e2009-01-26 05:29:08 +00001360 if (isWarning)
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001361 Diag(Tok, diag::pp_hash_warning) << Msg;
Chris Lattner100c65e2009-01-26 05:29:08 +00001362 else
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001363 Diag(Tok, diag::err_pp_hash_error) << Msg;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001364}
1365
1366/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1367///
1368void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1369 // Yes, this directive is an extension.
1370 Diag(Tok, diag::ext_pp_ident_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001371
Chris Lattnerf64b3522008-03-09 01:54:53 +00001372 // Read the string argument.
1373 Token StrTok;
1374 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001375
Chris Lattnerf64b3522008-03-09 01:54:53 +00001376 // If the token kind isn't a string, it's a malformed directive.
1377 if (StrTok.isNot(tok::string_literal) &&
Chris Lattner907dfe92008-11-18 07:59:24 +00001378 StrTok.isNot(tok::wide_string_literal)) {
1379 Diag(StrTok, diag::err_pp_malformed_ident);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001380 if (StrTok.isNot(tok::eod))
Chris Lattner38d7fd22009-01-26 05:30:54 +00001381 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +00001382 return;
1383 }
Mike Stump11289f42009-09-09 15:08:12 +00001384
Richard Smithd67aea22012-03-06 03:21:47 +00001385 if (StrTok.hasUDSuffix()) {
1386 Diag(StrTok, diag::err_invalid_string_udl);
1387 return DiscardUntilEndOfDirective();
1388 }
1389
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001390 // Verify that there is nothing after the string, other than EOD.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00001391 CheckEndOfDirective("ident");
Chris Lattnerf64b3522008-03-09 01:54:53 +00001392
Douglas Gregordc970f02010-03-16 22:30:13 +00001393 if (Callbacks) {
1394 bool Invalid = false;
1395 std::string Str = getSpelling(StrTok, &Invalid);
1396 if (!Invalid)
1397 Callbacks->Ident(Tok.getLocation(), Str);
1398 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00001399}
1400
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001401/// \brief Handle a #public directive.
1402void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001403 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001404 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001405
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001406 // Error reading macro name? If so, diagnostic already issued.
1407 if (MacroNameTok.is(tok::eod))
1408 return;
1409
Douglas Gregor663b48f2012-01-03 19:48:16 +00001410 // Check to see if this is the last token on the #__public_macro line.
1411 CheckEndOfDirective("__public_macro");
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001412
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001413 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001414 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001415 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001416
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001417 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001418 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001419 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001420 return;
1421 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001422
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001423 // Note that this macro has now been exported.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001424 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1425 MacroNameTok.getLocation(), /*IsPublic=*/true));
Douglas Gregorebf00492011-10-17 15:32:29 +00001426}
1427
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001428/// \brief Handle a #private directive.
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001429void Preprocessor::HandleMacroPrivateDirective() {
Douglas Gregorebf00492011-10-17 15:32:29 +00001430 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001431 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001432
Douglas Gregorebf00492011-10-17 15:32:29 +00001433 // Error reading macro name? If so, diagnostic already issued.
1434 if (MacroNameTok.is(tok::eod))
1435 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001436
Douglas Gregor663b48f2012-01-03 19:48:16 +00001437 // Check to see if this is the last token on the #__private_macro line.
1438 CheckEndOfDirective("__private_macro");
Taewook Oh755e4d22016-06-13 21:55:33 +00001439
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001440 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregorebf00492011-10-17 15:32:29 +00001441 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001442 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001443
Douglas Gregorebf00492011-10-17 15:32:29 +00001444 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001445 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001446 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregorebf00492011-10-17 15:32:29 +00001447 return;
1448 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001449
Douglas Gregorebf00492011-10-17 15:32:29 +00001450 // Note that this macro has now been marked private.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001451 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1452 MacroNameTok.getLocation(), /*IsPublic=*/false));
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001453}
1454
Chris Lattnerf64b3522008-03-09 01:54:53 +00001455//===----------------------------------------------------------------------===//
1456// Preprocessor Include Directive Handling.
1457//===----------------------------------------------------------------------===//
1458
1459/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
James Dennettf6333ac2012-06-22 05:46:07 +00001460/// checked and spelled filename, e.g. as an operand of \#include. This returns
Chris Lattnerf64b3522008-03-09 01:54:53 +00001461/// true if the input filename was in <>'s or false if it were in ""'s. The
1462/// caller is expected to provide a buffer that is large enough to hold the
1463/// spelling of the filename, but is also expected to handle the case when
1464/// this method decides to use a different buffer.
1465bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001466 StringRef &Buffer) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001467 // Get the text form of the filename.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001468 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
Mike Stump11289f42009-09-09 15:08:12 +00001469
Chris Lattnerf64b3522008-03-09 01:54:53 +00001470 // Make sure the filename is <x> or "x".
1471 bool isAngled;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001472 if (Buffer[0] == '<') {
1473 if (Buffer.back() != '>') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001474 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001475 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001476 return true;
1477 }
1478 isAngled = true;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001479 } else if (Buffer[0] == '"') {
1480 if (Buffer.back() != '"') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001481 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001482 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001483 return true;
1484 }
1485 isAngled = false;
1486 } else {
1487 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001488 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001489 return true;
1490 }
Mike Stump11289f42009-09-09 15:08:12 +00001491
Chris Lattnerf64b3522008-03-09 01:54:53 +00001492 // Diagnose #include "" as invalid.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001493 if (Buffer.size() <= 2) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001494 Diag(Loc, diag::err_pp_empty_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001495 Buffer = StringRef();
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001496 return true;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001497 }
Mike Stump11289f42009-09-09 15:08:12 +00001498
Chris Lattnerf64b3522008-03-09 01:54:53 +00001499 // Skip the brackets.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001500 Buffer = Buffer.substr(1, Buffer.size()-2);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001501 return isAngled;
1502}
1503
James Dennett4a4f72d2013-11-27 01:27:40 +00001504// \brief Handle cases where the \#include name is expanded from a macro
1505// as multiple tokens, which need to be glued together.
1506//
1507// This occurs for code like:
1508// \code
1509// \#define FOO <a/b.h>
1510// \#include FOO
1511// \endcode
1512// because in this case, "<a/b.h>" is returned as 7 tokens, not one.
1513//
1514// This code concatenates and consumes tokens up to the '>' token. It returns
1515// false if the > was found, otherwise it returns true if it finds and consumes
1516// the EOD marker.
1517bool Preprocessor::ConcatenateIncludeName(SmallString<128> &FilenameBuffer,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001518 SourceLocation &End) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001519 Token CurTok;
Mike Stump11289f42009-09-09 15:08:12 +00001520
John Thompsonb5353522009-10-30 13:49:06 +00001521 Lex(CurTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001522 while (CurTok.isNot(tok::eod)) {
Douglas Gregor796d76a2010-10-20 22:00:55 +00001523 End = CurTok.getLocation();
Taewook Oh755e4d22016-06-13 21:55:33 +00001524
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001525 // FIXME: Provide code completion for #includes.
1526 if (CurTok.is(tok::code_completion)) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +00001527 setCodeCompletionReached();
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001528 Lex(CurTok);
1529 continue;
1530 }
1531
Chris Lattnerf64b3522008-03-09 01:54:53 +00001532 // Append the spelling of this token to the buffer. If there was a space
1533 // before it, add it now.
1534 if (CurTok.hasLeadingSpace())
1535 FilenameBuffer.push_back(' ');
Mike Stump11289f42009-09-09 15:08:12 +00001536
Chris Lattnerf64b3522008-03-09 01:54:53 +00001537 // Get the spelling of the token, directly into FilenameBuffer if possible.
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001538 size_t PreAppendSize = FilenameBuffer.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001539 FilenameBuffer.resize(PreAppendSize+CurTok.getLength());
Mike Stump11289f42009-09-09 15:08:12 +00001540
Chris Lattnerf64b3522008-03-09 01:54:53 +00001541 const char *BufPtr = &FilenameBuffer[PreAppendSize];
John Thompsonb5353522009-10-30 13:49:06 +00001542 unsigned ActualLen = getSpelling(CurTok, BufPtr);
Mike Stump11289f42009-09-09 15:08:12 +00001543
Chris Lattnerf64b3522008-03-09 01:54:53 +00001544 // If the token was spelled somewhere else, copy it into FilenameBuffer.
1545 if (BufPtr != &FilenameBuffer[PreAppendSize])
1546 memcpy(&FilenameBuffer[PreAppendSize], BufPtr, ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001547
Chris Lattnerf64b3522008-03-09 01:54:53 +00001548 // Resize FilenameBuffer to the correct size.
1549 if (CurTok.getLength() != ActualLen)
1550 FilenameBuffer.resize(PreAppendSize+ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001551
Chris Lattnerf64b3522008-03-09 01:54:53 +00001552 // If we found the '>' marker, return success.
1553 if (CurTok.is(tok::greater))
1554 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001555
John Thompsonb5353522009-10-30 13:49:06 +00001556 Lex(CurTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001557 }
1558
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001559 // If we hit the eod marker, emit an error and return true so that the caller
1560 // knows the EOD has been read.
John Thompsonb5353522009-10-30 13:49:06 +00001561 Diag(CurTok.getLocation(), diag::err_pp_expects_filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001562 return true;
1563}
1564
Richard Smith34f30512013-11-23 04:06:09 +00001565/// \brief Push a token onto the token stream containing an annotation.
Richard Smithc51c38b2017-04-29 00:34:47 +00001566void Preprocessor::EnterAnnotationToken(SourceRange Range,
1567 tok::TokenKind Kind,
1568 void *AnnotationVal) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001569 // FIXME: Produce this as the current token directly, rather than
1570 // allocating a new token for it.
David Blaikie2eabcc92016-02-09 18:52:09 +00001571 auto Tok = llvm::make_unique<Token[]>(1);
Richard Smith34f30512013-11-23 04:06:09 +00001572 Tok[0].startToken();
1573 Tok[0].setKind(Kind);
Richard Smithc51c38b2017-04-29 00:34:47 +00001574 Tok[0].setLocation(Range.getBegin());
1575 Tok[0].setAnnotationEndLoc(Range.getEnd());
Richard Smith34f30512013-11-23 04:06:09 +00001576 Tok[0].setAnnotationValue(AnnotationVal);
Richard Smithc51c38b2017-04-29 00:34:47 +00001577 EnterTokenStream(std::move(Tok), 1, true);
Richard Smith34f30512013-11-23 04:06:09 +00001578}
1579
Richard Smith63b6fce2015-05-18 04:45:41 +00001580/// \brief Produce a diagnostic informing the user that a #include or similar
1581/// was implicitly treated as a module import.
1582static void diagnoseAutoModuleImport(
1583 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1584 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1585 SourceLocation PathEnd) {
1586 assert(PP.getLangOpts().ObjC2 && "no import syntax available");
1587
1588 SmallString<128> PathString;
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001589 for (size_t I = 0, N = Path.size(); I != N; ++I) {
Richard Smith63b6fce2015-05-18 04:45:41 +00001590 if (I)
1591 PathString += '.';
1592 PathString += Path[I].first->getName();
1593 }
1594 int IncludeKind = 0;
Taewook Oh755e4d22016-06-13 21:55:33 +00001595
Richard Smith63b6fce2015-05-18 04:45:41 +00001596 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1597 case tok::pp_include:
1598 IncludeKind = 0;
1599 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001600
Richard Smith63b6fce2015-05-18 04:45:41 +00001601 case tok::pp_import:
1602 IncludeKind = 1;
Taewook Oh755e4d22016-06-13 21:55:33 +00001603 break;
1604
Richard Smith63b6fce2015-05-18 04:45:41 +00001605 case tok::pp_include_next:
1606 IncludeKind = 2;
1607 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001608
Richard Smith63b6fce2015-05-18 04:45:41 +00001609 case tok::pp___include_macros:
1610 IncludeKind = 3;
1611 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001612
Richard Smith63b6fce2015-05-18 04:45:41 +00001613 default:
1614 llvm_unreachable("unknown include directive kind");
1615 }
1616
1617 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1618 /*IsTokenRange=*/false);
1619 PP.Diag(HashLoc, diag::warn_auto_module_import)
1620 << IncludeKind << PathString
1621 << FixItHint::CreateReplacement(ReplaceRange,
1622 ("@import " + PathString + ";").str());
1623}
1624
Taewook Ohf42103c2016-06-13 20:40:21 +00001625// Given a vector of path components and a string containing the real
1626// path to the file, build a properly-cased replacement in the vector,
1627// and return true if the replacement should be suggested.
1628static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1629 StringRef RealPathName) {
1630 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1631 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1632 int Cnt = 0;
1633 bool SuggestReplacement = false;
1634 // Below is a best-effort to handle ".." in paths. It is admittedly
1635 // not 100% correct in the presence of symlinks.
1636 for (auto &Component : llvm::reverse(Components)) {
1637 if ("." == Component) {
1638 } else if (".." == Component) {
1639 ++Cnt;
1640 } else if (Cnt) {
1641 --Cnt;
1642 } else if (RealPathComponentIter != RealPathComponentEnd) {
1643 if (Component != *RealPathComponentIter) {
1644 // If these path components differ by more than just case, then we
1645 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1646 // noisy false positives.
1647 SuggestReplacement = RealPathComponentIter->equals_lower(Component);
1648 if (!SuggestReplacement)
1649 break;
1650 Component = *RealPathComponentIter;
1651 }
1652 ++RealPathComponentIter;
1653 }
1654 }
1655 return SuggestReplacement;
1656}
1657
Richard Smith27e5aa02017-06-05 18:57:56 +00001658bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1659 const TargetInfo &TargetInfo,
1660 DiagnosticsEngine &Diags, Module *M) {
1661 Module::Requirement Requirement;
1662 Module::UnresolvedHeaderDirective MissingHeader;
1663 if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader))
1664 return false;
1665
1666 if (MissingHeader.FileNameLoc.isValid()) {
1667 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1668 << MissingHeader.IsUmbrella << MissingHeader.FileName;
1669 } else {
1670 // FIXME: Track the location at which the requirement was specified, and
1671 // use it here.
1672 Diags.Report(M->DefinitionLoc, diag::err_module_unavailable)
1673 << M->getFullModuleName() << Requirement.second << Requirement.first;
1674 }
1675 return true;
1676}
1677
James Dennettf6333ac2012-06-22 05:46:07 +00001678/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1679/// the file to be included from the lexer, then include it! This is a common
1680/// routine with functionality shared between \#include, \#include_next and
1681/// \#import. LookupFrom is set when this is a \#include_next directive, it
Mike Stump11289f42009-09-09 15:08:12 +00001682/// specifies the file to start searching from.
Taewook Oh755e4d22016-06-13 21:55:33 +00001683void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001684 Token &IncludeTok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001685 const DirectoryLookup *LookupFrom,
Richard Smith25d50752014-10-20 00:15:49 +00001686 const FileEntry *LookupFromFile,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001687 bool isImport) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001688 Token FilenameTok;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00001689 CurPPLexer->LexIncludeFilename(FilenameTok);
Mike Stump11289f42009-09-09 15:08:12 +00001690
Chris Lattnerf64b3522008-03-09 01:54:53 +00001691 // Reserve a buffer to get the spelling.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001692 SmallString<128> FilenameBuffer;
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001693 StringRef Filename;
Douglas Gregor796d76a2010-10-20 22:00:55 +00001694 SourceLocation End;
Douglas Gregor41e115a2011-11-30 18:02:36 +00001695 SourceLocation CharEnd; // the end of this directive, in characters
Taewook Oh755e4d22016-06-13 21:55:33 +00001696
Chris Lattnerf64b3522008-03-09 01:54:53 +00001697 switch (FilenameTok.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001698 case tok::eod:
1699 // If the token kind is EOD, the error has already been diagnosed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00001700 return;
Mike Stump11289f42009-09-09 15:08:12 +00001701
Chris Lattnerf64b3522008-03-09 01:54:53 +00001702 case tok::angle_string_literal:
Benjamin Kramer0a1abd42010-02-27 13:44:12 +00001703 case tok::string_literal:
1704 Filename = getSpelling(FilenameTok, FilenameBuffer);
Douglas Gregor796d76a2010-10-20 22:00:55 +00001705 End = FilenameTok.getLocation();
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001706 CharEnd = End.getLocWithOffset(FilenameTok.getLength());
Chris Lattnerf64b3522008-03-09 01:54:53 +00001707 break;
Mike Stump11289f42009-09-09 15:08:12 +00001708
Chris Lattnerf64b3522008-03-09 01:54:53 +00001709 case tok::less:
1710 // This could be a <foo/bar.h> file coming from a macro expansion. In this
1711 // case, glue the tokens together into FilenameBuffer and interpret those.
1712 FilenameBuffer.push_back('<');
Douglas Gregor796d76a2010-10-20 22:00:55 +00001713 if (ConcatenateIncludeName(FilenameBuffer, End))
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001714 return; // Found <eod> but no ">"? Diagnostic already emitted.
Yaron Keren92e1b622015-03-18 10:17:07 +00001715 Filename = FilenameBuffer;
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001716 CharEnd = End.getLocWithOffset(1);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001717 break;
1718 default:
1719 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1720 DiscardUntilEndOfDirective();
1721 return;
1722 }
Mike Stump11289f42009-09-09 15:08:12 +00001723
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001724 CharSourceRange FilenameRange
1725 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
Aaron Ballman611306e2012-03-02 22:51:54 +00001726 StringRef OriginalFilename = Filename;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001727 bool isAngled =
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001728 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001729 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1730 // error.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001731 if (Filename.empty()) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001732 DiscardUntilEndOfDirective();
1733 return;
1734 }
Mike Stump11289f42009-09-09 15:08:12 +00001735
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001736 // Verify that there is nothing after the filename, other than EOD. Note that
Chris Lattnerb40289b2009-04-17 23:56:52 +00001737 // we allow macros that expand to nothing after the filename, because this
1738 // falls into the category of "#include pp-tokens new-line" specified in
1739 // C99 6.10.2p4.
Daniel Dunbar2c422dc92009-10-18 20:26:12 +00001740 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001741
1742 // Check that we don't have infinite #include recursion.
Chris Lattner907dfe92008-11-18 07:59:24 +00001743 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
1744 Diag(FilenameTok, diag::err_pp_include_too_deep);
1745 return;
1746 }
Mike Stump11289f42009-09-09 15:08:12 +00001747
John McCall32f5fe12011-09-30 05:12:12 +00001748 // Complain about attempts to #include files in an audit pragma.
1749 if (PragmaARCCFCodeAuditedLoc.isValid()) {
1750 Diag(HashLoc, diag::err_pp_include_in_arc_cf_code_audited);
1751 Diag(PragmaARCCFCodeAuditedLoc, diag::note_pragma_entered_here);
1752
1753 // Immediately leave the pragma.
1754 PragmaARCCFCodeAuditedLoc = SourceLocation();
1755 }
1756
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001757 // Complain about attempts to #include files in an assume-nonnull pragma.
1758 if (PragmaAssumeNonNullLoc.isValid()) {
1759 Diag(HashLoc, diag::err_pp_include_in_assume_nonnull);
1760 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1761
1762 // Immediately leave the pragma.
1763 PragmaAssumeNonNullLoc = SourceLocation();
1764 }
1765
Aaron Ballman611306e2012-03-02 22:51:54 +00001766 if (HeaderInfo.HasIncludeAliasMap()) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001767 // Map the filename with the brackets still attached. If the name doesn't
1768 // map to anything, fall back on the filename we've already gotten the
Aaron Ballman611306e2012-03-02 22:51:54 +00001769 // spelling for.
1770 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1771 if (!NewName.empty())
1772 Filename = NewName;
1773 }
1774
Chris Lattnerf64b3522008-03-09 01:54:53 +00001775 // Search include directories.
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001776 bool IsMapped = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001777 const DirectoryLookup *CurDir;
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001778 SmallString<1024> SearchPath;
1779 SmallString<1024> RelativePath;
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001780 // We get the raw path only if we have 'Callbacks' to which we later pass
1781 // the path.
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001782 ModuleMap::KnownHeader SuggestedModule;
1783 SourceLocation FilenameLoc = FilenameTok.getLocation();
Saleem Abdulrasool729b7d32014-03-12 02:26:08 +00001784 SmallString<128> NormalizedPath;
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001785 if (LangOpts.MSVCCompat) {
1786 NormalizedPath = Filename.str();
Yaron Keren1801d1b2014-08-09 18:13:01 +00001787#ifndef LLVM_ON_WIN32
Rafael Espindolaf6002232014-08-08 21:31:04 +00001788 llvm::sys::path::native(NormalizedPath);
Yaron Keren1801d1b2014-08-09 18:13:01 +00001789#endif
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001790 }
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001791 const FileEntry *File = LookupFile(
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001792 FilenameLoc, LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename,
Richard Smith25d50752014-10-20 00:15:49 +00001793 isAngled, LookupFrom, LookupFromFile, CurDir,
1794 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001795 &SuggestedModule, &IsMapped);
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001796
Richard Smithdbbc5232015-05-14 02:25:44 +00001797 if (!File) {
1798 if (Callbacks) {
Douglas Gregor11729f02011-11-30 18:12:06 +00001799 // Give the clients a chance to recover.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001800 SmallString<128> RecoveryPath;
Douglas Gregor11729f02011-11-30 18:12:06 +00001801 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
1802 if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) {
1803 // Add the recovery path to the list of search paths.
Daniel Dunbarae4feb62013-01-25 01:50:28 +00001804 DirectoryLookup DL(DE, SrcMgr::C_User, false);
Douglas Gregor11729f02011-11-30 18:12:06 +00001805 HeaderInfo.AddSearchPath(DL, isAngled);
Taewook Oh755e4d22016-06-13 21:55:33 +00001806
Douglas Gregor11729f02011-11-30 18:12:06 +00001807 // Try the lookup again, skipping the cache.
Richard Smith25d50752014-10-20 00:15:49 +00001808 File = LookupFile(
1809 FilenameLoc,
1810 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1811 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001812 &SuggestedModule, &IsMapped, /*SkipCache*/ true);
Douglas Gregor11729f02011-11-30 18:12:06 +00001813 }
1814 }
1815 }
Craig Topperd2d442c2014-05-17 23:10:59 +00001816
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001817 if (!SuppressIncludeNotFoundError) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001818 // If the file could not be located and it was included via angle
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001819 // brackets, we can attempt a lookup as though it were a quoted path to
1820 // provide the user with a possible fixit.
1821 if (isAngled) {
Daniel Jasper07e6c402013-08-05 20:26:17 +00001822 File = LookupFile(
Richard Smith25d50752014-10-20 00:15:49 +00001823 FilenameLoc,
1824 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, false,
1825 LookupFrom, LookupFromFile, CurDir,
1826 Callbacks ? &SearchPath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001827 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped);
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001828 if (File) {
1829 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001830 Diag(FilenameTok, diag::err_pp_file_not_found_not_fatal) <<
1831 Filename <<
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001832 FixItHint::CreateReplacement(Range, "\"" + Filename.str() + "\"");
1833 }
1834 }
Richard Smithdbbc5232015-05-14 02:25:44 +00001835
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001836 // If the file is still not found, just go with the vanilla diagnostic
1837 if (!File)
Erik Verbruggen45449542016-10-25 10:13:10 +00001838 Diag(FilenameTok, diag::err_pp_file_not_found) << Filename
1839 << FilenameRange;
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001840 }
Douglas Gregor11729f02011-11-30 18:12:06 +00001841 }
1842
Richard Smith63b6fce2015-05-18 04:45:41 +00001843 // Should we enter the source file? Set to false if either the source file is
1844 // known to have no effect beyond its effect on module visibility -- that is,
1845 // if it's got an include guard that is already defined or is a modular header
1846 // we've imported or already built.
1847 bool ShouldEnter = true;
Richard Smithdbbc5232015-05-14 02:25:44 +00001848
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001849 if (PPOpts->SingleFileParseMode)
1850 ShouldEnter = false;
1851
Richard Smith63b6fce2015-05-18 04:45:41 +00001852 // Determine whether we should try to import the module for this #include, if
1853 // there is one. Don't do so if precompiled module support is disabled or we
1854 // are processing this module textually (because we're building the module).
Argyrios Kyrtzidis735e92c2017-06-09 01:20:48 +00001855 if (ShouldEnter && File && SuggestedModule && getLangOpts().Modules &&
Richard Smith63b6fce2015-05-18 04:45:41 +00001856 SuggestedModule.getModule()->getTopLevelModuleName() !=
Richard Smith7e82e012016-02-19 22:25:36 +00001857 getLangOpts().CurrentModule) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001858 // If this include corresponds to a module but that module is
1859 // unavailable, diagnose the situation and bail out.
Richard Smith58df3432016-04-12 19:58:30 +00001860 // FIXME: Remove this; loadModule does the same check (but produces
1861 // slightly worse diagnostics).
Richard Smith27e5aa02017-06-05 18:57:56 +00001862 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), getDiagnostics(),
1863 SuggestedModule.getModule())) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001864 Diag(FilenameTok.getLocation(),
1865 diag::note_implicit_top_level_module_import_here)
Richard Smith27e5aa02017-06-05 18:57:56 +00001866 << SuggestedModule.getModule()->getTopLevelModuleName();
Sean Silva8b7c0392015-08-17 16:39:30 +00001867 return;
1868 }
1869
Douglas Gregor71944202011-11-30 00:36:36 +00001870 // Compute the module access path corresponding to this module.
1871 // FIXME: Should we have a second loadModule() overload to avoid this
1872 // extra lookup step?
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001873 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001874 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
Douglas Gregor71944202011-11-30 00:36:36 +00001875 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
1876 FilenameTok.getLocation()));
1877 std::reverse(Path.begin(), Path.end());
1878
Douglas Gregor41e115a2011-11-30 18:02:36 +00001879 // Warn that we're replacing the include/import with a module import.
Richard Smith63b6fce2015-05-18 04:45:41 +00001880 // We only do this in Objective-C, where we have a module-import syntax.
1881 if (getLangOpts().ObjC2)
1882 diagnoseAutoModuleImport(*this, HashLoc, IncludeTok, Path, CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001883
Richard Smith10434f32015-05-02 02:08:26 +00001884 // Load the module to import its macros. We'll make the declarations
Richard Smithce587f52013-11-15 04:24:58 +00001885 // visible when the parser gets here.
Richard Smithdbbc5232015-05-14 02:25:44 +00001886 // FIXME: Pass SuggestedModule in here rather than converting it to a path
1887 // and making the module loader convert it back again.
Richard Smith10434f32015-05-02 02:08:26 +00001888 ModuleLoadResult Imported = TheModuleLoader.loadModule(
1889 IncludeTok.getLocation(), Path, Module::Hidden,
1890 /*IsIncludeDirective=*/true);
Craig Topperd2d442c2014-05-17 23:10:59 +00001891 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
Argyrios Kyrtzidis051b4432012-09-29 01:06:01 +00001892 "the imported module is different than the suggested one");
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001893
Richard Smith63b6fce2015-05-18 04:45:41 +00001894 if (Imported)
1895 ShouldEnter = false;
1896 else if (Imported.isMissingExpected()) {
1897 // We failed to find a submodule that we assumed would exist (because it
1898 // was in the directory of an umbrella header, for instance), but no
Richard Smitha114c462016-12-06 00:40:17 +00001899 // actual module containing it exists (because the umbrella header is
Richard Smith63b6fce2015-05-18 04:45:41 +00001900 // incomplete). Treat this as a textual inclusion.
1901 SuggestedModule = ModuleMap::KnownHeader();
Richard Smitha114c462016-12-06 00:40:17 +00001902 } else if (Imported.isConfigMismatch()) {
1903 // On a configuration mismatch, enter the header textually. We still know
1904 // that it's part of the corresponding module.
Richard Smith63b6fce2015-05-18 04:45:41 +00001905 } else {
1906 // We hit an error processing the import. Bail out.
1907 if (hadModuleLoaderFatalFailure()) {
1908 // With a fatal failure in the module loader, we abort parsing.
1909 Token &Result = IncludeTok;
1910 if (CurLexer) {
1911 Result.startToken();
1912 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
1913 CurLexer->cutOffLexing();
1914 } else {
1915 assert(CurPTHLexer && "#include but no current lexer set!");
1916 CurPTHLexer->getEOF(Result);
1917 }
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001918 }
1919 return;
1920 }
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001921 }
1922
Richard Smithc5247e62017-05-30 02:03:19 +00001923 // The #included file will be considered to be a system header if either it is
1924 // in a system include directory, or if the #includer is a system include
1925 // header.
1926 SrcMgr::CharacteristicKind FileCharacter =
1927 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
1928 if (File)
1929 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(File), FileCharacter);
1930
1931 // Ask HeaderInfo if we should enter this #include file. If not, #including
1932 // this file will have no effect.
1933 bool SkipHeader = false;
1934 if (ShouldEnter && File &&
1935 !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport,
1936 getLangOpts().Modules,
1937 SuggestedModule.getModule())) {
1938 ShouldEnter = false;
1939 SkipHeader = true;
1940 }
1941
Richard Smith63b6fce2015-05-18 04:45:41 +00001942 if (Callbacks) {
1943 // Notify the callback object that we've seen an inclusion directive.
1944 Callbacks->InclusionDirective(
1945 HashLoc, IncludeTok,
1946 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1947 FilenameRange, File, SearchPath, RelativePath,
1948 ShouldEnter ? nullptr : SuggestedModule.getModule());
Richard Smithc5247e62017-05-30 02:03:19 +00001949 if (SkipHeader && !SuggestedModule.getModule())
1950 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
Douglas Gregor97eec242011-09-15 22:00:41 +00001951 }
Richard Smith63b6fce2015-05-18 04:45:41 +00001952
1953 if (!File)
1954 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001955
Richard Smith54ef4c32015-05-19 19:58:11 +00001956 // FIXME: If we have a suggested module, and we've already visited this file,
1957 // don't bother entering it again. We know it has no further effect.
1958
Taewook Ohf42103c2016-06-13 20:40:21 +00001959 // Issue a diagnostic if the name of the file on disk has a different case
1960 // than the one we're about to open.
1961 const bool CheckIncludePathPortability =
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001962 !IsMapped && File && !File->tryGetRealPathName().empty();
Taewook Ohf42103c2016-06-13 20:40:21 +00001963
1964 if (CheckIncludePathPortability) {
1965 StringRef Name = LangOpts.MSVCCompat ? NormalizedPath.str() : Filename;
1966 StringRef RealPathName = File->tryGetRealPathName();
1967 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
1968 llvm::sys::path::end(Name));
1969
1970 if (trySimplifyPath(Components, RealPathName)) {
1971 SmallString<128> Path;
1972 Path.reserve(Name.size()+2);
1973 Path.push_back(isAngled ? '<' : '"');
Taewook Ohcc89bac2017-02-21 22:30:55 +00001974 bool isLeadingSeparator = llvm::sys::path::is_absolute(Name);
Taewook Ohf42103c2016-06-13 20:40:21 +00001975 for (auto Component : Components) {
Taewook Ohcc89bac2017-02-21 22:30:55 +00001976 if (isLeadingSeparator)
1977 isLeadingSeparator = false;
1978 else
1979 Path.append(Component);
Taewook Ohf42103c2016-06-13 20:40:21 +00001980 // Append the separator the user used, or the close quote
1981 Path.push_back(
1982 Path.size() <= Filename.size() ? Filename[Path.size()-1] :
1983 (isAngled ? '>' : '"'));
1984 }
Taewook Ohf42103c2016-06-13 20:40:21 +00001985 // For user files and known standard headers, by default we issue a diagnostic.
1986 // For other system headers, we don't. They can be controlled separately.
1987 auto DiagId = (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name)) ?
1988 diag::pp_nonportable_path : diag::pp_nonportable_system_path;
1989 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Reid Kleckner273895b2017-02-14 18:38:40 +00001990 Diag(FilenameTok, DiagId) << Path <<
1991 FixItHint::CreateReplacement(Range, Path);
Taewook Ohf42103c2016-06-13 20:40:21 +00001992 }
1993 }
1994
Richard Smith63b6fce2015-05-18 04:45:41 +00001995 // If we don't need to enter the file, stop now.
1996 if (!ShouldEnter) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001997 // If this is a module import, make it visible if needed.
Richard Smitha0aafa32015-05-18 03:52:30 +00001998 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00001999 // When building a pch, -fmodule-name tells the compiler to textually
2000 // include headers in the specified module. But it is possible that
2001 // ShouldEnter is false because we are skipping the header. In that
2002 // case, We are not importing the specified module.
2003 if (SkipHeader && getLangOpts().CompilingPCH &&
2004 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2005 return;
2006
Richard Smitha0aafa32015-05-18 03:52:30 +00002007 makeModuleVisible(M, HashLoc);
Richard Smithdbbc5232015-05-14 02:25:44 +00002008
2009 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() !=
2010 tok::pp___include_macros)
Richard Smithc51c38b2017-04-29 00:34:47 +00002011 EnterAnnotationToken(SourceRange(HashLoc, End),
2012 tok::annot_module_include, M);
Richard Smithdbbc5232015-05-14 02:25:44 +00002013 }
Chris Lattner72286d62010-04-19 20:44:31 +00002014 return;
2015 }
2016
Chris Lattnerf64b3522008-03-09 01:54:53 +00002017 // Look up the file, create a File ID for it.
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002018 SourceLocation IncludePos = End;
2019 // If the filename string was the result of macro expansions, set the include
2020 // position on the file where it will be included and after the expansions.
2021 if (IncludePos.isMacroID())
2022 IncludePos = SourceMgr.getExpansionRange(IncludePos).second;
2023 FileID FID = SourceMgr.createFileID(File, IncludePos, FileCharacter);
Yaron Keren8b563662015-10-03 10:46:20 +00002024 assert(FID.isValid() && "Expected valid file ID");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002025
Richard Smith34f30512013-11-23 04:06:09 +00002026 // If all is good, enter the new file!
Richard Smith67294e22014-01-31 20:47:44 +00002027 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
2028 return;
Richard Smith34f30512013-11-23 04:06:09 +00002029
Richard Smitha0aafa32015-05-18 03:52:30 +00002030 // Determine if we're switching to building a new submodule, and which one.
Richard Smitha0aafa32015-05-18 03:52:30 +00002031 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00002032 // When building a pch, -fmodule-name tells the compiler to textually
2033 // include headers in the specified module. We are not building the
2034 // specified module.
2035 if (getLangOpts().CompilingPCH &&
2036 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2037 return;
2038
Richard Smithd1386302017-05-04 00:29:54 +00002039 assert(!CurLexerSubmodule && "should not have marked this as a module yet");
2040 CurLexerSubmodule = M;
Richard Smith67294e22014-01-31 20:47:44 +00002041
Richard Smitha0aafa32015-05-18 03:52:30 +00002042 // Let the macro handling code know that any future macros are within
2043 // the new submodule.
Richard Smithd1386302017-05-04 00:29:54 +00002044 EnterSubmodule(M, HashLoc, /*ForPragma*/false);
Richard Smithb8b2ed62015-04-23 18:18:26 +00002045
Richard Smitha0aafa32015-05-18 03:52:30 +00002046 // Let the parser know that any future declarations are within the new
2047 // submodule.
2048 // FIXME: There's no point doing this if we're handling a #__include_macros
2049 // directive.
Richard Smithc51c38b2017-04-29 00:34:47 +00002050 EnterAnnotationToken(SourceRange(HashLoc, End), tok::annot_module_begin, M);
Richard Smith67294e22014-01-31 20:47:44 +00002051 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002052}
2053
James Dennettf6333ac2012-06-22 05:46:07 +00002054/// HandleIncludeNextDirective - Implements \#include_next.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002055///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002056void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2057 Token &IncludeNextTok) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002058 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
Mike Stump11289f42009-09-09 15:08:12 +00002059
Chris Lattnerf64b3522008-03-09 01:54:53 +00002060 // #include_next is like #include, except that we start searching after
2061 // the current found directory. If we can't do this, issue a
2062 // diagnostic.
2063 const DirectoryLookup *Lookup = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +00002064 const FileEntry *LookupFromFile = nullptr;
Erik Verbruggene0bde752016-10-27 14:17:10 +00002065 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2066 // If the main file is a header, then it's either for PCH/AST generation,
2067 // or libclang opened it. Either way, handle it as a normal include below
2068 // and do not complain about include_next.
2069 } else if (isInPrimaryFile()) {
Craig Topperd2d442c2014-05-17 23:10:59 +00002070 Lookup = nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002071 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
Richard Smithd1386302017-05-04 00:29:54 +00002072 } else if (CurLexerSubmodule) {
Richard Smith25d50752014-10-20 00:15:49 +00002073 // Start looking up in the directory *after* the one in which the current
2074 // file would be found, if any.
2075 assert(CurPPLexer && "#include_next directive in macro?");
2076 LookupFromFile = CurPPLexer->getFileEntry();
2077 Lookup = nullptr;
Craig Topperd2d442c2014-05-17 23:10:59 +00002078 } else if (!Lookup) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002079 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2080 } else {
2081 // Start looking up in the next directory.
2082 ++Lookup;
2083 }
Mike Stump11289f42009-09-09 15:08:12 +00002084
Richard Smith25d50752014-10-20 00:15:49 +00002085 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2086 LookupFromFile);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002087}
2088
James Dennettf6333ac2012-06-22 05:46:07 +00002089/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
Aaron Ballman0467f552012-03-18 03:10:37 +00002090void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2091 // The Microsoft #import directive takes a type library and generates header
2092 // files from it, and includes those. This is beyond the scope of what clang
2093 // does, so we ignore it and error out. However, #import can optionally have
2094 // trailing attributes that span multiple lines. We're going to eat those
2095 // so we can continue processing from there.
2096 Diag(Tok, diag::err_pp_import_directive_ms );
2097
Taewook Oh755e4d22016-06-13 21:55:33 +00002098 // Read tokens until we get to the end of the directive. Note that the
Aaron Ballman0467f552012-03-18 03:10:37 +00002099 // directive can be split over multiple lines using the backslash character.
2100 DiscardUntilEndOfDirective();
2101}
2102
James Dennettf6333ac2012-06-22 05:46:07 +00002103/// HandleImportDirective - Implements \#import.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002104///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002105void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2106 Token &ImportTok) {
Aaron Ballman0467f552012-03-18 03:10:37 +00002107 if (!LangOpts.ObjC1) { // #import is standard for ObjC.
Alp Tokerbfa39342014-01-14 12:51:41 +00002108 if (LangOpts.MSVCCompat)
Aaron Ballman0467f552012-03-18 03:10:37 +00002109 return HandleMicrosoftImportDirective(ImportTok);
Chris Lattnerd4a96732009-03-06 04:28:03 +00002110 Diag(ImportTok, diag::ext_pp_import_directive);
Aaron Ballman0467f552012-03-18 03:10:37 +00002111 }
Richard Smith25d50752014-10-20 00:15:49 +00002112 return HandleIncludeDirective(HashLoc, ImportTok, nullptr, nullptr, true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002113}
2114
Chris Lattner58a1eb02009-04-08 18:46:40 +00002115/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2116/// pseudo directive in the predefines buffer. This handles it by sucking all
2117/// tokens through the preprocessor and discarding them (only keeping the side
2118/// effects on the preprocessor).
Douglas Gregor796d76a2010-10-20 22:00:55 +00002119void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2120 Token &IncludeMacrosTok) {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002121 // This directive should only occur in the predefines buffer. If not, emit an
2122 // error and reject it.
2123 SourceLocation Loc = IncludeMacrosTok.getLocation();
Mehdi Amini99d1b292016-10-01 16:38:28 +00002124 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002125 Diag(IncludeMacrosTok.getLocation(),
2126 diag::pp_include_macros_out_of_predefines);
2127 DiscardUntilEndOfDirective();
2128 return;
2129 }
Mike Stump11289f42009-09-09 15:08:12 +00002130
Chris Lattnere01d82b2009-04-08 20:53:24 +00002131 // Treat this as a normal #include for checking purposes. If this is
2132 // successful, it will push a new lexer onto the include stack.
Richard Smith25d50752014-10-20 00:15:49 +00002133 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
Mike Stump11289f42009-09-09 15:08:12 +00002134
Chris Lattnere01d82b2009-04-08 20:53:24 +00002135 Token TmpTok;
2136 do {
2137 Lex(TmpTok);
2138 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2139 } while (TmpTok.isNot(tok::hashhash));
Chris Lattner58a1eb02009-04-08 18:46:40 +00002140}
2141
Chris Lattnerf64b3522008-03-09 01:54:53 +00002142//===----------------------------------------------------------------------===//
2143// Preprocessor Macro Directive Handling.
2144//===----------------------------------------------------------------------===//
2145
2146/// ReadMacroDefinitionArgList - The ( starting an argument list of a macro
2147/// definition has just been read. Lex the rest of the arguments and the
2148/// closing ), updating MI with what we learn. Return true if an error occurs
2149/// parsing the arg list.
Abramo Bagnarac9e48c02012-03-31 20:17:27 +00002150bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI, Token &Tok) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002151 SmallVector<IdentifierInfo*, 32> Arguments;
Mike Stump11289f42009-09-09 15:08:12 +00002152
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002153 while (true) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002154 LexUnexpandedToken(Tok);
2155 switch (Tok.getKind()) {
2156 case tok::r_paren:
2157 // Found the end of the argument list.
Chris Lattnerf87c5102009-02-20 22:31:31 +00002158 if (Arguments.empty()) // #define FOO()
Chris Lattnerf64b3522008-03-09 01:54:53 +00002159 return false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002160 // Otherwise we have #define FOO(A,)
2161 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2162 return true;
2163 case tok::ellipsis: // #define X(... -> C99 varargs
David Blaikiebbafb8a2012-03-11 07:00:24 +00002164 if (!LangOpts.C99)
Taewook Oh755e4d22016-06-13 21:55:33 +00002165 Diag(Tok, LangOpts.CPlusPlus11 ?
Richard Smithacd4d3d2011-10-15 01:18:56 +00002166 diag::warn_cxx98_compat_variadic_macro :
2167 diag::ext_variadic_macro);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002168
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002169 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2170 if (LangOpts.OpenCL) {
2171 Diag(Tok, diag::err_pp_opencl_variadic_macros);
2172 return true;
2173 }
2174
Chris Lattnerf64b3522008-03-09 01:54:53 +00002175 // Lex the token after the identifier.
2176 LexUnexpandedToken(Tok);
2177 if (Tok.isNot(tok::r_paren)) {
2178 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2179 return true;
2180 }
2181 // Add the __VA_ARGS__ identifier as an argument.
2182 Arguments.push_back(Ident__VA_ARGS__);
2183 MI->setIsC99Varargs();
Craig Topperd96b3f92015-10-22 04:59:52 +00002184 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002185 return false;
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002186 case tok::eod: // #define X(
Chris Lattnerf64b3522008-03-09 01:54:53 +00002187 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2188 return true;
2189 default:
2190 // Handle keywords and identifiers here to accept things like
2191 // #define Foo(for) for.
2192 IdentifierInfo *II = Tok.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +00002193 if (!II) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002194 // #define X(1
2195 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2196 return true;
2197 }
2198
2199 // If this is already used as an argument, it is used multiple times (e.g.
2200 // #define X(A,A.
Mike Stump11289f42009-09-09 15:08:12 +00002201 if (std::find(Arguments.begin(), Arguments.end(), II) !=
Chris Lattnerf64b3522008-03-09 01:54:53 +00002202 Arguments.end()) { // C99 6.10.3p6
Chris Lattnerc5cdade2008-11-19 07:33:58 +00002203 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002204 return true;
2205 }
Mike Stump11289f42009-09-09 15:08:12 +00002206
Chris Lattnerf64b3522008-03-09 01:54:53 +00002207 // Add the argument to the macro info.
2208 Arguments.push_back(II);
Mike Stump11289f42009-09-09 15:08:12 +00002209
Chris Lattnerf64b3522008-03-09 01:54:53 +00002210 // Lex the token after the identifier.
2211 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002212
Chris Lattnerf64b3522008-03-09 01:54:53 +00002213 switch (Tok.getKind()) {
2214 default: // #define X(A B
2215 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2216 return true;
2217 case tok::r_paren: // #define X(A)
Craig Topperd96b3f92015-10-22 04:59:52 +00002218 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002219 return false;
2220 case tok::comma: // #define X(A,
2221 break;
2222 case tok::ellipsis: // #define X(A... -> GCC extension
2223 // Diagnose extension.
2224 Diag(Tok, diag::ext_named_variadic_macro);
Mike Stump11289f42009-09-09 15:08:12 +00002225
Chris Lattnerf64b3522008-03-09 01:54:53 +00002226 // Lex the token after the identifier.
2227 LexUnexpandedToken(Tok);
2228 if (Tok.isNot(tok::r_paren)) {
2229 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2230 return true;
2231 }
Mike Stump11289f42009-09-09 15:08:12 +00002232
Chris Lattnerf64b3522008-03-09 01:54:53 +00002233 MI->setIsGNUVarargs();
Craig Topperd96b3f92015-10-22 04:59:52 +00002234 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002235 return false;
2236 }
2237 }
2238 }
2239}
2240
Serge Pavlov07c0f042014-12-18 11:14:21 +00002241static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2242 const LangOptions &LOptions) {
2243 if (MI->getNumTokens() == 1) {
2244 const Token &Value = MI->getReplacementToken(0);
2245
2246 // Macro that is identity, like '#define inline inline' is a valid pattern.
2247 if (MacroName.getKind() == Value.getKind())
2248 return true;
2249
2250 // Macro that maps a keyword to the same keyword decorated with leading/
2251 // trailing underscores is a valid pattern:
2252 // #define inline __inline
2253 // #define inline __inline__
2254 // #define inline _inline (in MS compatibility mode)
2255 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2256 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2257 if (!II->isKeyword(LOptions))
2258 return false;
2259 StringRef ValueText = II->getName();
2260 StringRef TrimmedValue = ValueText;
2261 if (!ValueText.startswith("__")) {
2262 if (ValueText.startswith("_"))
2263 TrimmedValue = TrimmedValue.drop_front(1);
2264 else
2265 return false;
2266 } else {
2267 TrimmedValue = TrimmedValue.drop_front(2);
2268 if (TrimmedValue.endswith("__"))
2269 TrimmedValue = TrimmedValue.drop_back(2);
2270 }
2271 return TrimmedValue.equals(MacroText);
2272 } else {
2273 return false;
2274 }
2275 }
2276
2277 // #define inline
Alexander Kornienkoa26c4952015-12-28 15:30:42 +00002278 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2279 tok::kw_const) &&
2280 MI->getNumTokens() == 0;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002281}
2282
James Dennettf6333ac2012-06-22 05:46:07 +00002283/// HandleDefineDirective - Implements \#define. This consumes the entire macro
Chris Lattnerf64b3522008-03-09 01:54:53 +00002284/// line then lets the caller lex the next real token.
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002285void Preprocessor::HandleDefineDirective(Token &DefineTok,
2286 bool ImmediatelyAfterHeaderGuard) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002287 ++NumDefined;
2288
2289 Token MacroNameTok;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002290 bool MacroShadowsKeyword;
2291 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
Mike Stump11289f42009-09-09 15:08:12 +00002292
Chris Lattnerf64b3522008-03-09 01:54:53 +00002293 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002294 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002295 return;
2296
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002297 Token LastTok = MacroNameTok;
2298
Chris Lattnerf64b3522008-03-09 01:54:53 +00002299 // If we are supposed to keep comments in #defines, reenable comment saving
2300 // mode.
Ted Kremenek59e003e2008-11-18 00:43:07 +00002301 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
Mike Stump11289f42009-09-09 15:08:12 +00002302
Chris Lattnerf64b3522008-03-09 01:54:53 +00002303 // Create the new macro.
Ted Kremenek6c7ea112008-12-15 19:56:42 +00002304 MacroInfo *MI = AllocateMacroInfo(MacroNameTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002305
Chris Lattnerf64b3522008-03-09 01:54:53 +00002306 Token Tok;
2307 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002308
Chris Lattnerf64b3522008-03-09 01:54:53 +00002309 // If this is a function-like macro definition, parse the argument list,
2310 // marking each of the identifiers as being used as macro arguments. Also,
2311 // check other constraints on the first token of the macro body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002312 if (Tok.is(tok::eod)) {
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002313 if (ImmediatelyAfterHeaderGuard) {
2314 // Save this macro information since it may part of a header guard.
2315 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2316 MacroNameTok.getLocation());
2317 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002318 // If there is no body to this macro, we have no special handling here.
Chris Lattner2425bcb2009-04-18 02:23:25 +00002319 } else if (Tok.hasLeadingSpace()) {
2320 // This is a normal token with leading space. Clear the leading space
2321 // marker on the first token to get proper expansion.
2322 Tok.clearFlag(Token::LeadingSpace);
2323 } else if (Tok.is(tok::l_paren)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002324 // This is a function-like macro definition. Read the argument list.
2325 MI->setIsFunctionLike();
Abramo Bagnarac9e48c02012-03-31 20:17:27 +00002326 if (ReadMacroDefinitionArgList(MI, LastTok)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002327 // Throw away the rest of the line.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002328 if (CurPPLexer->ParsingPreprocessorDirective)
Chris Lattnerf64b3522008-03-09 01:54:53 +00002329 DiscardUntilEndOfDirective();
2330 return;
2331 }
2332
Chris Lattner249c38b2009-04-19 18:26:34 +00002333 // If this is a definition of a variadic C99 function-like macro, not using
2334 // the GNU named varargs extension, enabled __VA_ARGS__.
Mike Stump11289f42009-09-09 15:08:12 +00002335
Chris Lattner249c38b2009-04-19 18:26:34 +00002336 // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
2337 // This gets unpoisoned where it is allowed.
2338 assert(Ident__VA_ARGS__->isPoisoned() && "__VA_ARGS__ should be poisoned!");
2339 if (MI->isC99Varargs())
2340 Ident__VA_ARGS__->setIsPoisoned(false);
Mike Stump11289f42009-09-09 15:08:12 +00002341
Chris Lattnerf64b3522008-03-09 01:54:53 +00002342 // Read the first token after the arg list for down below.
2343 LexUnexpandedToken(Tok);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00002344 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002345 // C99 requires whitespace between the macro definition and the body. Emit
2346 // a diagnostic for something like "#define X+".
Chris Lattner2425bcb2009-04-18 02:23:25 +00002347 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002348 } else {
Chris Lattner2425bcb2009-04-18 02:23:25 +00002349 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2350 // first character of a replacement list is not a character required by
2351 // subclause 5.2.1, then there shall be white-space separation between the
2352 // identifier and the replacement list.". 5.2.1 lists this set:
2353 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2354 // is irrelevant here.
2355 bool isInvalid = false;
2356 if (Tok.is(tok::at)) // @ is not in the list above.
2357 isInvalid = true;
2358 else if (Tok.is(tok::unknown)) {
2359 // If we have an unknown token, it is something strange like "`". Since
2360 // all of valid characters would have lexed into a single character
2361 // token of some sort, we know this is not a valid case.
2362 isInvalid = true;
2363 }
2364 if (isInvalid)
2365 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2366 else
2367 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002368 }
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002369
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002370 if (!Tok.is(tok::eod))
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002371 LastTok = Tok;
2372
Chris Lattnerf64b3522008-03-09 01:54:53 +00002373 // Read the rest of the macro body.
2374 if (MI->isObjectLike()) {
2375 // Object-like macros are very simple, just read their body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002376 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002377 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002378 MI->AddTokenToBody(Tok);
2379 // Get the next token of the macro.
2380 LexUnexpandedToken(Tok);
2381 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002382 } else {
Chris Lattner83bd8282009-05-25 17:16:10 +00002383 // Otherwise, read the body of a function-like macro. While we are at it,
2384 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2385 // parameters in function-like macro expansions.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002386 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002387 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002388
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002389 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002390 MI->AddTokenToBody(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002391
Chris Lattnerf64b3522008-03-09 01:54:53 +00002392 // Get the next token of the macro.
2393 LexUnexpandedToken(Tok);
2394 continue;
2395 }
Mike Stump11289f42009-09-09 15:08:12 +00002396
Richard Smith701a3522013-07-09 01:00:29 +00002397 // If we're in -traditional mode, then we should ignore stringification
2398 // and token pasting. Mark the tokens as unknown so as not to confuse
2399 // things.
2400 if (getLangOpts().TraditionalCPP) {
2401 Tok.setKind(tok::unknown);
2402 MI->AddTokenToBody(Tok);
2403
2404 // Get the next token of the macro.
2405 LexUnexpandedToken(Tok);
2406 continue;
2407 }
2408
Eli Friedman14d3c792012-11-14 02:18:46 +00002409 if (Tok.is(tok::hashhash)) {
Eli Friedman14d3c792012-11-14 02:18:46 +00002410 // If we see token pasting, check if it looks like the gcc comma
2411 // pasting extension. We'll use this information to suppress
2412 // diagnostics later on.
Taewook Oh755e4d22016-06-13 21:55:33 +00002413
Eli Friedman14d3c792012-11-14 02:18:46 +00002414 // Get the next token of the macro.
2415 LexUnexpandedToken(Tok);
2416
2417 if (Tok.is(tok::eod)) {
2418 MI->AddTokenToBody(LastTok);
2419 break;
2420 }
2421
2422 unsigned NumTokens = MI->getNumTokens();
2423 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2424 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2425 MI->setHasCommaPasting();
2426
David Majnemer76faf1f2013-11-05 09:30:17 +00002427 // Things look ok, add the '##' token to the macro.
Eli Friedman14d3c792012-11-14 02:18:46 +00002428 MI->AddTokenToBody(LastTok);
Eli Friedman14d3c792012-11-14 02:18:46 +00002429 continue;
2430 }
2431
Chris Lattnerf64b3522008-03-09 01:54:53 +00002432 // Get the next token of the macro.
2433 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002434
Chris Lattner83bd8282009-05-25 17:16:10 +00002435 // Check for a valid macro arg identifier.
Craig Topperd2d442c2014-05-17 23:10:59 +00002436 if (Tok.getIdentifierInfo() == nullptr ||
Chris Lattner83bd8282009-05-25 17:16:10 +00002437 MI->getArgumentNum(Tok.getIdentifierInfo()) == -1) {
2438
2439 // If this is assembler-with-cpp mode, we accept random gibberish after
2440 // the '#' because '#' is often a comment character. However, change
2441 // the kind of the token to tok::unknown so that the preprocessor isn't
2442 // confused.
David Blaikiebbafb8a2012-03-11 07:00:24 +00002443 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002444 LastTok.setKind(tok::unknown);
Eli Friedmancdf8b882013-06-18 21:33:38 +00002445 MI->AddTokenToBody(LastTok);
2446 continue;
Chris Lattner83bd8282009-05-25 17:16:10 +00002447 } else {
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002448 Diag(Tok, diag::err_pp_stringize_not_parameter)
2449 << LastTok.is(tok::hashat);
Mike Stump11289f42009-09-09 15:08:12 +00002450
Chris Lattner83bd8282009-05-25 17:16:10 +00002451 // Disable __VA_ARGS__ again.
2452 Ident__VA_ARGS__->setIsPoisoned(true);
2453 return;
2454 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002455 }
Mike Stump11289f42009-09-09 15:08:12 +00002456
Chris Lattner83bd8282009-05-25 17:16:10 +00002457 // Things look ok, add the '#' and param name tokens to the macro.
2458 MI->AddTokenToBody(LastTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002459 MI->AddTokenToBody(Tok);
Chris Lattner83bd8282009-05-25 17:16:10 +00002460 LastTok = Tok;
Mike Stump11289f42009-09-09 15:08:12 +00002461
Chris Lattnerf64b3522008-03-09 01:54:53 +00002462 // Get the next token of the macro.
2463 LexUnexpandedToken(Tok);
2464 }
2465 }
Mike Stump11289f42009-09-09 15:08:12 +00002466
Serge Pavlov07c0f042014-12-18 11:14:21 +00002467 if (MacroShadowsKeyword &&
2468 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2469 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
2470 }
Mike Stump11289f42009-09-09 15:08:12 +00002471
Chris Lattnerf64b3522008-03-09 01:54:53 +00002472 // Disable __VA_ARGS__ again.
2473 Ident__VA_ARGS__->setIsPoisoned(true);
2474
Chris Lattner57540c52011-04-15 05:22:18 +00002475 // Check that there is no paste (##) operator at the beginning or end of the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002476 // replacement list.
2477 unsigned NumTokens = MI->getNumTokens();
2478 if (NumTokens != 0) {
2479 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2480 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002481 return;
2482 }
2483 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2484 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002485 return;
2486 }
2487 }
Mike Stump11289f42009-09-09 15:08:12 +00002488
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002489 MI->setDefinitionEndLoc(LastTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002490
Chris Lattnerf64b3522008-03-09 01:54:53 +00002491 // Finally, if this identifier already had a macro defined for it, verify that
Alexander Kornienko8b3f6232012-08-29 00:20:03 +00002492 // the macro bodies are identical, and issue diagnostics if they are not.
Argyrios Kyrtzidis09c9e812013-02-20 00:54:57 +00002493 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
John McCall83760372015-12-10 23:31:01 +00002494 // In Objective-C, ignore attempts to directly redefine the builtin
2495 // definitions of the ownership qualifiers. It's still possible to
2496 // #undef them.
2497 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2498 return II->isStr("__strong") ||
2499 II->isStr("__weak") ||
2500 II->isStr("__unsafe_unretained") ||
2501 II->isStr("__autoreleasing");
2502 };
2503 if (getLangOpts().ObjC1 &&
2504 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2505 == getPredefinesFileID() &&
2506 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2507 // Warn if it changes the tokens.
2508 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2509 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2510 !MI->isIdenticalTo(*OtherMI, *this,
2511 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2512 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2513 }
2514 assert(!OtherMI->isWarnIfUnused());
2515 return;
2516 }
2517
Chris Lattner5244f342009-01-16 19:50:11 +00002518 // It is very common for system headers to have tons of macro redefinitions
2519 // and for warnings to be disabled in system headers. If this is the case,
2520 // then don't bother calling MacroInfo::isIdenticalTo.
Chris Lattner80c21df2009-03-13 21:17:23 +00002521 if (!getDiagnostics().getSuppressSystemWarnings() ||
Chris Lattner5244f342009-01-16 19:50:11 +00002522 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002523 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
Chris Lattner5244f342009-01-16 19:50:11 +00002524 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002525
Taewook Oh755e4d22016-06-13 21:55:33 +00002526 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
Richard Smith7b242542013-03-06 00:46:00 +00002527 // C++ [cpp.predefined]p4, but allow it as an extension.
2528 if (OtherMI->isBuiltinMacro())
2529 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
Chris Lattnerc0a585d2010-08-17 15:55:45 +00002530 // Macros must be identical. This means all tokens and whitespace
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002531 // separation must be the same. C99 6.10.3p2.
Richard Smith7b242542013-03-06 00:46:00 +00002532 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002533 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
Chris Lattner5244f342009-01-16 19:50:11 +00002534 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2535 << MacroNameTok.getIdentifierInfo();
2536 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2537 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002538 }
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002539 if (OtherMI->isWarnIfUnused())
2540 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002541 }
Mike Stump11289f42009-09-09 15:08:12 +00002542
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002543 DefMacroDirective *MD =
2544 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
Mike Stump11289f42009-09-09 15:08:12 +00002545
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002546 assert(!MI->isUsed());
2547 // If we need warning for not using the macro, add its location in the
2548 // warn-because-unused-macro set. If it gets used it will be removed from set.
Eli Friedman5ba37d52013-08-22 00:27:10 +00002549 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
Alp Tokerd4a3f0e2014-06-15 23:30:39 +00002550 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc())) {
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002551 MI->setIsWarnIfUnused(true);
2552 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2553 }
2554
Chris Lattner928e9092009-04-12 01:39:54 +00002555 // If the callbacks want to know, tell them about the macro definition.
2556 if (Callbacks)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002557 Callbacks->MacroDefined(MacroNameTok, MD);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002558}
2559
James Dennettf6333ac2012-06-22 05:46:07 +00002560/// HandleUndefDirective - Implements \#undef.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002561///
Erik Verbruggen4bddef92016-10-26 08:52:41 +00002562void Preprocessor::HandleUndefDirective() {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002563 ++NumUndefined;
2564
2565 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00002566 ReadMacroName(MacroNameTok, MU_Undef);
Mike Stump11289f42009-09-09 15:08:12 +00002567
Chris Lattnerf64b3522008-03-09 01:54:53 +00002568 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002569 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002570 return;
Mike Stump11289f42009-09-09 15:08:12 +00002571
Chris Lattnerf64b3522008-03-09 01:54:53 +00002572 // Check to see if this is the last token on the #undef line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002573 CheckEndOfDirective("undef");
Mike Stump11289f42009-09-09 15:08:12 +00002574
Richard Smith20e883e2015-04-29 23:20:19 +00002575 // Okay, we have a valid identifier to undef.
2576 auto *II = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002577 auto MD = getMacroDefinition(II);
Vedant Kumar349a6242017-04-26 21:05:44 +00002578 UndefMacroDirective *Undef = nullptr;
2579
2580 // If the macro is not defined, this is a noop undef.
2581 if (const MacroInfo *MI = MD.getMacroInfo()) {
2582 if (!MI->isUsed() && MI->isWarnIfUnused())
2583 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
2584
2585 if (MI->isWarnIfUnused())
2586 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
2587
2588 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
2589 }
Mike Stump11289f42009-09-09 15:08:12 +00002590
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002591 // If the callbacks want to know, tell them about the macro #undef.
2592 // Note: no matter if the macro was defined or not.
Richard Smith36bd40d2015-05-04 03:15:40 +00002593 if (Callbacks)
Vedant Kumar349a6242017-04-26 21:05:44 +00002594 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002595
Vedant Kumar349a6242017-04-26 21:05:44 +00002596 if (Undef)
2597 appendMacroDirective(II, Undef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002598}
2599
Chris Lattnerf64b3522008-03-09 01:54:53 +00002600//===----------------------------------------------------------------------===//
2601// Preprocessor Conditional Directive Handling.
2602//===----------------------------------------------------------------------===//
2603
James Dennettf6333ac2012-06-22 05:46:07 +00002604/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
2605/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
2606/// true if any tokens have been returned or pp-directives activated before this
2607/// \#ifndef has been lexed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002608///
2609void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
2610 bool ReadAnyTokensBeforeDirective) {
2611 ++NumIf;
2612 Token DirectiveTok = Result;
2613
2614 Token MacroNameTok;
2615 ReadMacroName(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +00002616
Chris Lattnerf64b3522008-03-09 01:54:53 +00002617 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002618 if (MacroNameTok.is(tok::eod)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002619 // Skip code until we get to #endif. This helps with recovery by not
2620 // emitting an error when the #endif is reached.
2621 SkipExcludedConditionalBlock(DirectiveTok.getLocation(),
2622 /*Foundnonskip*/false, /*FoundElse*/false);
2623 return;
2624 }
Mike Stump11289f42009-09-09 15:08:12 +00002625
Chris Lattnerf64b3522008-03-09 01:54:53 +00002626 // Check to see if this is the last token on the #if[n]def line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002627 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002628
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002629 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002630 auto MD = getMacroDefinition(MII);
2631 MacroInfo *MI = MD.getMacroInfo();
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00002632
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002633 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002634 // If the start of a top-level #ifdef and if the macro is not defined,
2635 // inform MIOpt that this might be the start of a proper include guard.
2636 // Otherwise it is some other form of unknown conditional which we can't
2637 // handle.
Craig Topperd2d442c2014-05-17 23:10:59 +00002638 if (!ReadAnyTokensBeforeDirective && !MI) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002639 assert(isIfndef && "#ifdef shouldn't reach here");
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002640 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002641 } else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002642 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002643 }
2644
Chris Lattnerf64b3522008-03-09 01:54:53 +00002645 // If there is a macro, process it.
2646 if (MI) // Mark it used.
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002647 markMacroAsUsed(MI);
Mike Stump11289f42009-09-09 15:08:12 +00002648
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002649 if (Callbacks) {
2650 if (isIfndef)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002651 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002652 else
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002653 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002654 }
2655
Chris Lattnerf64b3522008-03-09 01:54:53 +00002656 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002657 if (PPOpts->SingleFileParseMode && !MI) {
2658 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2659 // the directive blocks.
2660 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002661 /*wasskip*/false, /*foundnonskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002662 /*foundelse*/false);
2663 } else if (!MI == isIfndef) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002664 // Yes, remember that we are inside a conditional, then lex the next token.
Chris Lattner8cf1f932009-12-14 04:54:40 +00002665 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
2666 /*wasskip*/false, /*foundnonskip*/true,
2667 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002668 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002669 // No, skip the contents of this block.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002670 SkipExcludedConditionalBlock(DirectiveTok.getLocation(),
Mike Stump11289f42009-09-09 15:08:12 +00002671 /*Foundnonskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002672 /*FoundElse*/false);
2673 }
2674}
2675
James Dennettf6333ac2012-06-22 05:46:07 +00002676/// HandleIfDirective - Implements the \#if directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002677///
2678void Preprocessor::HandleIfDirective(Token &IfToken,
2679 bool ReadAnyTokensBeforeDirective) {
2680 ++NumIf;
Mike Stump11289f42009-09-09 15:08:12 +00002681
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002682 // Parse and evaluate the conditional expression.
Craig Topperd2d442c2014-05-17 23:10:59 +00002683 IdentifierInfo *IfNDefMacro = nullptr;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002684 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002685 const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
2686 const bool ConditionalTrue = DER.Conditional;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002687 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Nuno Lopes363212b2008-06-01 18:31:24 +00002688
2689 // If this condition is equivalent to #ifndef X, and if this is the first
2690 // directive seen, handle it for the multiple-include optimization.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002691 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002692 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
Richard Smith089ee152013-06-16 05:05:39 +00002693 // FIXME: Pass in the location of the macro name, not the 'if' token.
2694 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
Nuno Lopes363212b2008-06-01 18:31:24 +00002695 else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002696 CurPPLexer->MIOpt.EnterTopLevelConditional();
Nuno Lopes363212b2008-06-01 18:31:24 +00002697 }
2698
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002699 if (Callbacks)
2700 Callbacks->If(IfToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002701 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002702 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002703
Chris Lattnerf64b3522008-03-09 01:54:53 +00002704 // Should we include the stuff contained by this directive?
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002705 if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
2706 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2707 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002708 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002709 /*foundnonskip*/false, /*foundelse*/false);
2710 } else if (ConditionalTrue) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002711 // Yes, remember that we are inside a conditional, then lex the next token.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002712 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002713 /*foundnonskip*/true, /*foundelse*/false);
2714 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002715 // No, skip the contents of this block.
Mike Stump11289f42009-09-09 15:08:12 +00002716 SkipExcludedConditionalBlock(IfToken.getLocation(), /*Foundnonskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002717 /*FoundElse*/false);
2718 }
2719}
2720
James Dennettf6333ac2012-06-22 05:46:07 +00002721/// HandleEndifDirective - Implements the \#endif directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002722///
2723void Preprocessor::HandleEndifDirective(Token &EndifToken) {
2724 ++NumEndif;
Mike Stump11289f42009-09-09 15:08:12 +00002725
Chris Lattnerf64b3522008-03-09 01:54:53 +00002726 // Check that this is the whole directive.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002727 CheckEndOfDirective("endif");
Mike Stump11289f42009-09-09 15:08:12 +00002728
Chris Lattnerf64b3522008-03-09 01:54:53 +00002729 PPConditionalInfo CondInfo;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002730 if (CurPPLexer->popConditionalLevel(CondInfo)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002731 // No conditionals on the stack: this is an #endif without an #if.
Chris Lattner907dfe92008-11-18 07:59:24 +00002732 Diag(EndifToken, diag::err_pp_endif_without_if);
2733 return;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002734 }
Mike Stump11289f42009-09-09 15:08:12 +00002735
Chris Lattnerf64b3522008-03-09 01:54:53 +00002736 // If this the end of a top-level #endif, inform MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002737 if (CurPPLexer->getConditionalStackDepth() == 0)
2738 CurPPLexer->MIOpt.ExitTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002739
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002740 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&
Chris Lattnerf64b3522008-03-09 01:54:53 +00002741 "This code should only be reachable in the non-skipping case!");
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002742
2743 if (Callbacks)
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002744 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002745}
2746
James Dennettf6333ac2012-06-22 05:46:07 +00002747/// HandleElseDirective - Implements the \#else directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002748///
Chris Lattnerf64b3522008-03-09 01:54:53 +00002749void Preprocessor::HandleElseDirective(Token &Result) {
2750 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002751
Chris Lattnerf64b3522008-03-09 01:54:53 +00002752 // #else directive in a non-skipping conditional... start skipping.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002753 CheckEndOfDirective("else");
Mike Stump11289f42009-09-09 15:08:12 +00002754
Chris Lattnerf64b3522008-03-09 01:54:53 +00002755 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002756 if (CurPPLexer->popConditionalLevel(CI)) {
2757 Diag(Result, diag::pp_err_else_without_if);
2758 return;
2759 }
Mike Stump11289f42009-09-09 15:08:12 +00002760
Chris Lattnerf64b3522008-03-09 01:54:53 +00002761 // If this is a top-level #else, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002762 if (CurPPLexer->getConditionalStackDepth() == 0)
2763 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002764
2765 // If this is a #else with a #else before it, report the error.
2766 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +00002767
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002768 if (Callbacks)
2769 Callbacks->Else(Result.getLocation(), CI.IfLoc);
2770
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002771 if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002772 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2773 // the directive blocks.
2774 CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002775 /*foundnonskip*/false, /*foundelse*/true);
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002776 return;
2777 }
2778
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002779 // Finally, skip the rest of the contents of this block.
2780 SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +00002781 /*FoundElse*/true, Result.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002782}
2783
James Dennettf6333ac2012-06-22 05:46:07 +00002784/// HandleElifDirective - Implements the \#elif directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002785///
Chris Lattnerf64b3522008-03-09 01:54:53 +00002786void Preprocessor::HandleElifDirective(Token &ElifToken) {
2787 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002788
Chris Lattnerf64b3522008-03-09 01:54:53 +00002789 // #elif directive in a non-skipping conditional... start skipping.
2790 // We don't care what the condition is, because we will always skip it (since
2791 // the block immediately before it was included).
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002792 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002793 DiscardUntilEndOfDirective();
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002794 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002795
2796 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002797 if (CurPPLexer->popConditionalLevel(CI)) {
2798 Diag(ElifToken, diag::pp_err_elif_without_if);
2799 return;
2800 }
Mike Stump11289f42009-09-09 15:08:12 +00002801
Chris Lattnerf64b3522008-03-09 01:54:53 +00002802 // If this is a top-level #elif, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002803 if (CurPPLexer->getConditionalStackDepth() == 0)
2804 CurPPLexer->MIOpt.EnterTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002805
Chris Lattnerf64b3522008-03-09 01:54:53 +00002806 // If this is a #elif with a #else before it, report the error.
2807 if (CI.FoundElse) Diag(ElifToken, diag::pp_err_elif_after_else);
Taewook Oh755e4d22016-06-13 21:55:33 +00002808
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002809 if (Callbacks)
2810 Callbacks->Elif(ElifToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002811 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002812 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002813
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002814 if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002815 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
2816 // the directive blocks.
Argyrios Kyrtzidisd750e1c2017-06-21 18:52:44 +00002817 CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
Argyrios Kyrtzidisad870f82017-06-20 14:36:58 +00002818 /*foundnonskip*/false, /*foundelse*/false);
2819 return;
2820 }
2821
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002822 // Finally, skip the rest of the contents of this block.
2823 SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +00002824 /*FoundElse*/CI.FoundElse,
2825 ElifToken.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002826}