blob: 54578e8fb9fcc45045ec30469d02d04a1795f877 [file] [log] [blame]
Chris Lattner89620152008-03-09 03:13:06 +00001//===--- PPDirectives.cpp - Directive Handling for Preprocessor -----------===//
Chris Lattnerf64b3522008-03-09 01:54:53 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
James Dennettf6333ac2012-06-22 05:46:07 +00009///
10/// \file
11/// \brief Implements # directive processing for the Preprocessor.
12///
Chris Lattnerf64b3522008-03-09 01:54:53 +000013//===----------------------------------------------------------------------===//
14
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000015#include "clang/Basic/CharInfo.h"
Chris Lattner710bb872009-11-30 04:18:44 +000016#include "clang/Basic/FileManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000017#include "clang/Basic/IdentifierTable.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/Module.h"
20#include "clang/Basic/SourceLocation.h"
Chris Lattnerf64b3522008-03-09 01:54:53 +000021#include "clang/Basic/SourceManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000022#include "clang/Basic/TokenKinds.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000023#include "clang/Lex/CodeCompletionHandler.h"
24#include "clang/Lex/HeaderSearch.h"
25#include "clang/Lex/LexDiagnostic.h"
26#include "clang/Lex/LiteralSupport.h"
27#include "clang/Lex/MacroInfo.h"
28#include "clang/Lex/ModuleLoader.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000029#include "clang/Lex/ModuleMap.h"
30#include "clang/Lex/PPCallbacks.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000031#include "clang/Lex/Pragma.h"
Mehdi Amini9670f842016-07-18 19:02:11 +000032#include "clang/Lex/Preprocessor.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000033#include "clang/Lex/PTHLexer.h"
34#include "clang/Lex/Token.h"
35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/SmallString.h"
37#include "llvm/ADT/SmallVector.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000038#include "llvm/ADT/STLExtras.h"
Taewook Ohf42103c2016-06-13 20:40:21 +000039#include "llvm/ADT/StringSwitch.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000040#include "llvm/ADT/StringRef.h"
41#include "llvm/Support/AlignOf.h"
Douglas Gregor41e115a2011-11-30 18:02:36 +000042#include "llvm/Support/ErrorHandling.h"
Rafael Espindolaf6002232014-08-08 21:31:04 +000043#include "llvm/Support/Path.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000044#include <algorithm>
45#include <cassert>
46#include <cstring>
47#include <new>
48#include <string>
49#include <utility>
Eugene Zelenko1ced5092016-02-12 22:53:10 +000050
Chris Lattnerf64b3522008-03-09 01:54:53 +000051using namespace clang;
52
53//===----------------------------------------------------------------------===//
54// Utility Methods for Preprocessor Directive Handling.
55//===----------------------------------------------------------------------===//
56
Chris Lattnerc0a585d2010-08-17 15:55:45 +000057MacroInfo *Preprocessor::AllocateMacroInfo() {
Richard Smithee0c4c12014-07-24 01:13:23 +000058 MacroInfoChain *MIChain = BP.Allocate<MacroInfoChain>();
Ted Kremenekc8456f82010-10-19 22:15:20 +000059 MIChain->Next = 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
64MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
65 MacroInfo *MI = AllocateMacroInfo();
Ted Kremenek6c7ea112008-12-15 19:56:42 +000066 new (MI) MacroInfo(L);
67 return MI;
68}
69
Argyrios Kyrtzidis4f32da12013-03-22 21:12:51 +000070MacroInfo *Preprocessor::AllocateDeserializedMacroInfo(SourceLocation L,
71 unsigned SubModuleID) {
Benjamin Kramerc3f89252016-10-20 14:27:22 +000072 static_assert(alignof(MacroInfo) >= sizeof(SubModuleID),
Chandler Carruth06dde922014-03-02 13:02:01 +000073 "alignment for MacroInfo is less than the ID");
Argyrios Kyrtzidisd48b91d2013-04-30 05:05:35 +000074 DeserializedMacroInfoChain *MIChain =
75 BP.Allocate<DeserializedMacroInfoChain>();
76 MIChain->Next = DeserialMIChainHead;
77 DeserialMIChainHead = MIChain;
78
79 MacroInfo *MI = &MIChain->MI;
Argyrios Kyrtzidis4f32da12013-03-22 21:12:51 +000080 new (MI) MacroInfo(L);
81 MI->FromASTFile = true;
82 MI->setOwningModuleID(SubModuleID);
83 return MI;
84}
85
Richard Smith50474bf2015-04-23 23:29:05 +000086DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
87 SourceLocation Loc) {
Richard Smith713369b2015-04-23 20:40:50 +000088 return new (BP) DefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000089}
90
91UndefMacroDirective *
Richard Smith50474bf2015-04-23 23:29:05 +000092Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
Richard Smith713369b2015-04-23 20:40:50 +000093 return new (BP) UndefMacroDirective(UndefLoc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +000094}
95
96VisibilityMacroDirective *
97Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
98 bool isPublic) {
Richard Smithdaa69e02014-07-25 04:40:03 +000099 return new (BP) VisibilityMacroDirective(Loc, isPublic);
Chris Lattnerc0a585d2010-08-17 15:55:45 +0000100}
101
James Dennettf6333ac2012-06-22 05:46:07 +0000102/// \brief Read and discard all tokens remaining on the current line until
103/// the tok::eod token is found.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000104void Preprocessor::DiscardUntilEndOfDirective() {
105 Token Tmp;
106 do {
107 LexUnexpandedToken(Tmp);
Peter Collingbournef29ce972011-02-22 13:49:06 +0000108 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens");
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000109 } while (Tmp.isNot(tok::eod));
Chris Lattnerf64b3522008-03-09 01:54:53 +0000110}
111
Serge Pavlov07c0f042014-12-18 11:14:21 +0000112/// \brief Enumerates possible cases of #define/#undef a reserved identifier.
113enum MacroDiag {
114 MD_NoWarn, //> Not a reserved identifier
115 MD_KeywordDef, //> Macro hides keyword, enabled by default
116 MD_ReservedMacro //> #define of #undef reserved id, disabled by default
117};
118
119/// \brief Checks if the specified identifier is reserved in the specified
120/// language.
121/// This function does not check if the identifier is a keyword.
122static bool isReservedId(StringRef Text, const LangOptions &Lang) {
123 // C++ [macro.names], C11 7.1.3:
124 // All identifiers that begin with an underscore and either an uppercase
125 // letter or another underscore are always reserved for any use.
126 if (Text.size() >= 2 && Text[0] == '_' &&
127 (isUppercase(Text[1]) || Text[1] == '_'))
128 return true;
129 // C++ [global.names]
130 // Each name that contains a double underscore ... is reserved to the
131 // implementation for any use.
132 if (Lang.CPlusPlus) {
133 if (Text.find("__") != StringRef::npos)
134 return true;
135 }
Nico Weber92c14bb2014-12-16 21:16:10 +0000136 return false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000137}
138
Serge Pavlov07c0f042014-12-18 11:14:21 +0000139static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
140 const LangOptions &Lang = PP.getLangOpts();
141 StringRef Text = II->getName();
142 if (isReservedId(Text, Lang))
143 return MD_ReservedMacro;
144 if (II->isKeyword(Lang))
145 return MD_KeywordDef;
146 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
147 return MD_KeywordDef;
148 return MD_NoWarn;
149}
150
151static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
152 const LangOptions &Lang = PP.getLangOpts();
153 StringRef Text = II->getName();
154 // Do not warn on keyword undef. It is generally harmless and widely used.
155 if (isReservedId(Text, Lang))
156 return MD_ReservedMacro;
157 return MD_NoWarn;
158}
159
Taewook Ohf42103c2016-06-13 20:40:21 +0000160// Return true if we want to issue a diagnostic by default if we
161// encounter this name in a #include with the wrong case. For now,
162// this includes the standard C and C++ headers, Posix headers,
163// and Boost headers. Improper case for these #includes is a
164// potential portability issue.
165static bool warnByDefaultOnWrongCase(StringRef Include) {
166 // If the first component of the path is "boost", treat this like a standard header
167 // for the purposes of diagnostics.
168 if (::llvm::sys::path::begin(Include)->equals_lower("boost"))
169 return true;
170
171 // "condition_variable" is the longest standard header name at 18 characters.
172 // If the include file name is longer than that, it can't be a standard header.
Taewook Oh755e4d22016-06-13 21:55:33 +0000173 static const size_t MaxStdHeaderNameLen = 18u;
Taewook Ohf42103c2016-06-13 20:40:21 +0000174 if (Include.size() > MaxStdHeaderNameLen)
175 return false;
176
177 // Lowercase and normalize the search string.
178 SmallString<32> LowerInclude{Include};
179 for (char &Ch : LowerInclude) {
180 // In the ASCII range?
George Burgess IV5d3bd932016-06-16 02:30:33 +0000181 if (static_cast<unsigned char>(Ch) > 0x7f)
Taewook Ohf42103c2016-06-13 20:40:21 +0000182 return false; // Can't be a standard header
183 // ASCII lowercase:
184 if (Ch >= 'A' && Ch <= 'Z')
185 Ch += 'a' - 'A';
186 // Normalize path separators for comparison purposes.
187 else if (::llvm::sys::path::is_separator(Ch))
188 Ch = '/';
189 }
190
191 // The standard C/C++ and Posix headers
192 return llvm::StringSwitch<bool>(LowerInclude)
193 // C library headers
194 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
195 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
196 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
197 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
198 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
199 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
200
201 // C++ headers for C library facilities
202 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
203 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
204 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
205 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
206 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
207 .Case("cwctype", true)
208
209 // C++ library headers
210 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
211 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
212 .Cases("atomic", "future", "map", "set", "type_traits", true)
213 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
214 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
215 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
216 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
217 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
218 .Cases("deque", "istream", "queue", "string", "valarray", true)
219 .Cases("exception", "iterator", "random", "strstream", "vector", true)
220 .Cases("forward_list", "limits", "ratio", "system_error", true)
221
222 // POSIX headers (which aren't also C headers)
223 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
224 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
225 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
226 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
227 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
228 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
229 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
230 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
231 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
232 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
233 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
234 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
235 .Default(false);
236}
237
Serge Pavlov07c0f042014-12-18 11:14:21 +0000238bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
239 bool *ShadowFlag) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000240 // Missing macro name?
241 if (MacroNameTok.is(tok::eod))
242 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
243
244 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
245 if (!II) {
246 bool Invalid = false;
247 std::string Spelling = getSpelling(MacroNameTok, &Invalid);
248 if (Invalid)
249 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerf33619c2014-05-31 03:38:08 +0000250 II = getIdentifierInfo(Spelling);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000251
Alp Tokerf33619c2014-05-31 03:38:08 +0000252 if (!II->isCPlusPlusOperatorKeyword())
253 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000254
Alp Tokere03e9e12014-05-31 16:32:22 +0000255 // C++ 2.5p2: Alternative tokens behave the same as its primary token
256 // except for their spellings.
257 Diag(MacroNameTok, getLangOpts().MicrosoftExt
258 ? diag::ext_pp_operator_used_as_macro_name
259 : diag::err_pp_operator_used_as_macro_name)
260 << II << MacroNameTok.getKind();
Alp Tokerb05e0b52014-05-21 06:13:51 +0000261
Alp Tokerc5d194fc2014-05-31 03:38:17 +0000262 // Allow #defining |and| and friends for Microsoft compatibility or
263 // recovery when legacy C headers are included in C++.
Alp Tokerf33619c2014-05-31 03:38:08 +0000264 MacroNameTok.setIdentifierInfo(II);
Alp Tokerb05e0b52014-05-21 06:13:51 +0000265 }
266
Serge Pavlovd024f522014-10-24 17:31:32 +0000267 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
Alp Tokerb05e0b52014-05-21 06:13:51 +0000268 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
269 return Diag(MacroNameTok, diag::err_defined_macro_name);
270 }
271
Richard Smith20e883e2015-04-29 23:20:19 +0000272 if (isDefineUndef == MU_Undef) {
273 auto *MI = getMacroInfo(II);
274 if (MI && MI->isBuiltinMacro()) {
275 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
276 // and C++ [cpp.predefined]p4], but allow it as an extension.
277 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
278 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000279 }
280
Serge Pavlov07c0f042014-12-18 11:14:21 +0000281 // If defining/undefining reserved identifier or a keyword, we need to issue
282 // a warning.
Serge Pavlov83cf0782014-12-11 12:18:08 +0000283 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
Serge Pavlov07c0f042014-12-18 11:14:21 +0000284 if (ShadowFlag)
285 *ShadowFlag = false;
Serge Pavlov83cf0782014-12-11 12:18:08 +0000286 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
Mehdi Amini99d1b292016-10-01 16:38:28 +0000287 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
Serge Pavlov07c0f042014-12-18 11:14:21 +0000288 MacroDiag D = MD_NoWarn;
289 if (isDefineUndef == MU_Define) {
290 D = shouldWarnOnMacroDef(*this, II);
291 }
292 else if (isDefineUndef == MU_Undef)
293 D = shouldWarnOnMacroUndef(*this, II);
294 if (D == MD_KeywordDef) {
295 // We do not want to warn on some patterns widely used in configuration
296 // scripts. This requires analyzing next tokens, so do not issue warnings
297 // now, only inform caller.
298 if (ShadowFlag)
299 *ShadowFlag = true;
300 }
301 if (D == MD_ReservedMacro)
302 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
Serge Pavlov83cf0782014-12-11 12:18:08 +0000303 }
304
Alp Tokerb05e0b52014-05-21 06:13:51 +0000305 // Okay, we got a good identifier.
306 return false;
307}
308
James Dennettf6333ac2012-06-22 05:46:07 +0000309/// \brief Lex and validate a macro name, which occurs after a
310/// \#define or \#undef.
311///
Serge Pavlovd024f522014-10-24 17:31:32 +0000312/// This sets the token kind to eod and discards the rest of the macro line if
313/// the macro name is invalid.
314///
315/// \param MacroNameTok Token that is expected to be a macro name.
Serge Pavlov07c0f042014-12-18 11:14:21 +0000316/// \param isDefineUndef Context in which macro is used.
317/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
318void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
319 bool *ShadowFlag) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000320 // Read the token, don't allow macro expansion on it.
321 LexUnexpandedToken(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +0000322
Douglas Gregor12785102010-08-24 20:21:13 +0000323 if (MacroNameTok.is(tok::code_completion)) {
324 if (CodeComplete)
Serge Pavlovd024f522014-10-24 17:31:32 +0000325 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000326 setCodeCompletionReached();
Douglas Gregor12785102010-08-24 20:21:13 +0000327 LexUnexpandedToken(MacroNameTok);
Douglas Gregor12785102010-08-24 20:21:13 +0000328 }
Alp Tokerb05e0b52014-05-21 06:13:51 +0000329
Serge Pavlov07c0f042014-12-18 11:14:21 +0000330 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
Chris Lattner907dfe92008-11-18 07:59:24 +0000331 return;
Alp Tokerb05e0b52014-05-21 06:13:51 +0000332
333 // Invalid macro name, read and discard the rest of the line and set the
334 // token kind to tok::eod if necessary.
335 if (MacroNameTok.isNot(tok::eod)) {
336 MacroNameTok.setKind(tok::eod);
337 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +0000338 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000339}
340
James Dennettf6333ac2012-06-22 05:46:07 +0000341/// \brief Ensure that the next token is a tok::eod token.
342///
343/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
Chris Lattner0003c272009-04-17 23:30:53 +0000344/// true, then we consider macros that expand to zero tokens as being ok.
345void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000346 Token Tmp;
Chris Lattner0003c272009-04-17 23:30:53 +0000347 // Lex unexpanded tokens for most directives: macros might expand to zero
348 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
349 // #line) allow empty macros.
350 if (EnableMacros)
351 Lex(Tmp);
352 else
353 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000354
Chris Lattnerf64b3522008-03-09 01:54:53 +0000355 // There should be no tokens after the directive, but we allow them as an
356 // extension.
357 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
358 LexUnexpandedToken(Tmp);
Mike Stump11289f42009-09-09 15:08:12 +0000359
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000360 if (Tmp.isNot(tok::eod)) {
Chris Lattner825676a2009-04-14 05:15:20 +0000361 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000362 // or if this is a macro-style preprocessing directive, because it is more
363 // trouble than it is worth to insert /**/ and check that there is no /**/
364 // in the range also.
Douglas Gregora771f462010-03-31 17:46:05 +0000365 FixItHint Hint;
David Blaikiebbafb8a2012-03-11 07:00:24 +0000366 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
Peter Collingbourne2c9f9662011-02-22 13:49:00 +0000367 !CurTokenLexer)
Douglas Gregora771f462010-03-31 17:46:05 +0000368 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
369 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000370 DiscardUntilEndOfDirective();
371 }
372}
373
James Dennettf6333ac2012-06-22 05:46:07 +0000374/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
375/// decided that the subsequent tokens are in the \#if'd out portion of the
376/// file. Lex the rest of the file, until we see an \#endif. If
Chris Lattnerf64b3522008-03-09 01:54:53 +0000377/// FoundNonSkipPortion is true, then we have already emitted code for part of
James Dennettf6333ac2012-06-22 05:46:07 +0000378/// this \#if directive, so \#else/\#elif blocks should never be entered.
379/// If ElseOk is true, then \#else directives are ok, if not, then we have
380/// already seen one so a \#else directive is a duplicate. When this returns,
381/// the caller can lex the first valid token.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000382void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
383 bool FoundNonSkipPortion,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000384 bool FoundElse,
385 SourceLocation ElseLoc) {
Chris Lattnerf64b3522008-03-09 01:54:53 +0000386 ++NumSkipped;
David Blaikie7d170102013-05-15 07:37:26 +0000387 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?");
Chris Lattnerf64b3522008-03-09 01:54:53 +0000388
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000389 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000390 FoundNonSkipPortion, FoundElse);
Mike Stump11289f42009-09-09 15:08:12 +0000391
Ted Kremenek56572ab2008-12-12 18:34:08 +0000392 if (CurPTHLexer) {
393 PTHSkipExcludedConditionalBlock();
394 return;
395 }
Mike Stump11289f42009-09-09 15:08:12 +0000396
Chris Lattnerf64b3522008-03-09 01:54:53 +0000397 // Enter raw mode to disable identifier lookup (and thus macro expansion),
398 // disabling warnings, etc.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000399 CurPPLexer->LexingRawMode = true;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000400 Token Tok;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000401 while (true) {
Chris Lattnerf406b242010-01-18 22:33:01 +0000402 CurLexer->Lex(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000403
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000404 if (Tok.is(tok::code_completion)) {
405 if (CodeComplete)
406 CodeComplete->CodeCompleteInConditionalExclusion();
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000407 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000408 continue;
409 }
Taewook Oh755e4d22016-06-13 21:55:33 +0000410
Chris Lattnerf64b3522008-03-09 01:54:53 +0000411 // If this is the end of the buffer, we have an error.
412 if (Tok.is(tok::eof)) {
413 // Emit errors for each unterminated conditional on the stack, including
414 // the current one.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000415 while (!CurPPLexer->ConditionalStack.empty()) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000416 if (CurLexer->getFileLoc() != CodeCompletionFileLoc)
Douglas Gregor02690ba2010-08-12 17:04:55 +0000417 Diag(CurPPLexer->ConditionalStack.back().IfLoc,
418 diag::err_pp_unterminated_conditional);
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000419 CurPPLexer->ConditionalStack.pop_back();
Mike Stump11289f42009-09-09 15:08:12 +0000420 }
421
Chris Lattnerf64b3522008-03-09 01:54:53 +0000422 // Just return and let the caller lex after this #include.
423 break;
424 }
Mike Stump11289f42009-09-09 15:08:12 +0000425
Chris Lattnerf64b3522008-03-09 01:54:53 +0000426 // If this token is not a preprocessor directive, just skip it.
427 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
428 continue;
Mike Stump11289f42009-09-09 15:08:12 +0000429
Chris Lattnerf64b3522008-03-09 01:54:53 +0000430 // We just parsed a # character at the start of a line, so we're in
431 // directive mode. Tell the lexer this so any newlines we see will be
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000432 // converted into an EOD token (this terminates the macro).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000433 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rose176057b2013-02-22 00:32:00 +0000434 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000435
Mike Stump11289f42009-09-09 15:08:12 +0000436
Chris Lattnerf64b3522008-03-09 01:54:53 +0000437 // Read the next token, the directive flavor.
438 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000439
Chris Lattnerf64b3522008-03-09 01:54:53 +0000440 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
441 // something bogus), skip it.
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000442 if (Tok.isNot(tok::raw_identifier)) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000443 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000444 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000445 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000446 continue;
447 }
448
449 // If the first letter isn't i or e, it isn't intesting to us. We know that
450 // this is safe in the face of spelling differences, because there is no way
451 // to spell an i/e in a strange way that is another letter. Skipping this
452 // allows us to avoid looking up the identifier info for #define/#undef and
453 // other common directives.
Alp Toker2d57cea2014-05-17 04:53:25 +0000454 StringRef RI = Tok.getRawIdentifier();
Abramo Bagnaraea4f7c72010-12-22 08:23:18 +0000455
Alp Toker2d57cea2014-05-17 04:53:25 +0000456 char FirstChar = RI[0];
Mike Stump11289f42009-09-09 15:08:12 +0000457 if (FirstChar >= 'a' && FirstChar <= 'z' &&
Chris Lattnerf64b3522008-03-09 01:54:53 +0000458 FirstChar != 'i' && FirstChar != 'e') {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000459 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000460 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000461 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000462 continue;
463 }
Mike Stump11289f42009-09-09 15:08:12 +0000464
Chris Lattnerf64b3522008-03-09 01:54:53 +0000465 // Get the identifier name without trigraphs or embedded newlines. Note
466 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
467 // when skipping.
Benjamin Kramer144884642009-12-31 13:32:38 +0000468 char DirectiveBuf[20];
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000469 StringRef Directive;
Alp Toker2d57cea2014-05-17 04:53:25 +0000470 if (!Tok.needsCleaning() && RI.size() < 20) {
471 Directive = RI;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000472 } else {
473 std::string DirectiveStr = getSpelling(Tok);
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000474 size_t IdLen = DirectiveStr.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000475 if (IdLen >= 20) {
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000476 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000477 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000478 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000479 continue;
480 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000481 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000482 Directive = StringRef(DirectiveBuf, IdLen);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000483 }
Mike Stump11289f42009-09-09 15:08:12 +0000484
Benjamin Kramer144884642009-12-31 13:32:38 +0000485 if (Directive.startswith("if")) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000486 StringRef Sub = Directive.substr(2);
Benjamin Kramer144884642009-12-31 13:32:38 +0000487 if (Sub.empty() || // "if"
488 Sub == "def" || // "ifdef"
489 Sub == "ndef") { // "ifndef"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000490 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
491 // bother parsing the condition.
492 DiscardUntilEndOfDirective();
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000493 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
Chris Lattnerf64b3522008-03-09 01:54:53 +0000494 /*foundnonskip*/false,
Chandler Carruth540960f2011-01-03 17:40:17 +0000495 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000496 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000497 } else if (Directive[0] == 'e') {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000498 StringRef Sub = Directive.substr(1);
Benjamin Kramer144884642009-12-31 13:32:38 +0000499 if (Sub == "ndif") { // "endif"
Chris Lattnerf64b3522008-03-09 01:54:53 +0000500 PPConditionalInfo CondInfo;
501 CondInfo.WasSkipping = true; // Silence bogus warning.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000502 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000503 (void)InCond; // Silence warning in no-asserts mode.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000504 assert(!InCond && "Can't be skipping if not in a conditional!");
Mike Stump11289f42009-09-09 15:08:12 +0000505
Chris Lattnerf64b3522008-03-09 01:54:53 +0000506 // If we popped the outermost skipping block, we're done skipping!
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000507 if (!CondInfo.WasSkipping) {
Richard Smith87d8fb92012-06-24 23:56:26 +0000508 // Restore the value of LexingRawMode so that trailing comments
509 // are handled correctly, if we've reached the outermost block.
510 CurPPLexer->LexingRawMode = false;
Richard Smithd0124572012-06-21 00:35:03 +0000511 CheckEndOfDirective("endif");
Richard Smith87d8fb92012-06-24 23:56:26 +0000512 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000513 if (Callbacks)
514 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000515 break;
Richard Smithd0124572012-06-21 00:35:03 +0000516 } else {
517 DiscardUntilEndOfDirective();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000518 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000519 } else if (Sub == "lse") { // "else".
Chris Lattnerf64b3522008-03-09 01:54:53 +0000520 // #else directive in a skipping conditional. If not in some other
521 // skipping conditional, and if #else hasn't already been seen, enter it
522 // as a non-skipping conditional.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000523 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Mike Stump11289f42009-09-09 15:08:12 +0000524
Chris Lattnerf64b3522008-03-09 01:54:53 +0000525 // If this is a #else with a #else before it, report the error.
526 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_else_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000527
Chris Lattnerf64b3522008-03-09 01:54:53 +0000528 // Note that we've seen a #else in this conditional.
529 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000530
Chris Lattnerf64b3522008-03-09 01:54:53 +0000531 // If the conditional is at the top level, and the #if block wasn't
532 // entered, enter the #else block now.
533 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
534 CondInfo.FoundNonSkip = true;
Richard Smith87d8fb92012-06-24 23:56:26 +0000535 // Restore the value of LexingRawMode so that trailing comments
536 // are handled correctly.
537 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000538 CheckEndOfDirective("else");
Richard Smith87d8fb92012-06-24 23:56:26 +0000539 CurPPLexer->LexingRawMode = true;
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000540 if (Callbacks)
541 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000542 break;
Argyrios Kyrtzidis627c14a2011-05-21 04:26:04 +0000543 } else {
544 DiscardUntilEndOfDirective(); // C99 6.10p4.
Chris Lattnerf64b3522008-03-09 01:54:53 +0000545 }
Benjamin Kramer144884642009-12-31 13:32:38 +0000546 } else if (Sub == "lif") { // "elif".
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000547 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000548
John Thompson17c35732013-12-04 20:19:30 +0000549 // If this is a #elif with a #else before it, report the error.
550 if (CondInfo.FoundElse) Diag(Tok, diag::pp_err_elif_after_else);
551
Chris Lattnerf64b3522008-03-09 01:54:53 +0000552 // If this is in a skipping block or if we're already handled this #if
553 // block, don't bother parsing the condition.
554 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
555 DiscardUntilEndOfDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000556 } else {
John Thompson17c35732013-12-04 20:19:30 +0000557 const SourceLocation CondBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000558 // Restore the value of LexingRawMode so that identifiers are
559 // looked up, etc, inside the #elif expression.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000560 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!");
561 CurPPLexer->LexingRawMode = false;
Craig Topperd2d442c2014-05-17 23:10:59 +0000562 IdentifierInfo *IfNDefMacro = nullptr;
John Thompson17c35732013-12-04 20:19:30 +0000563 const bool CondValue = EvaluateDirectiveExpression(IfNDefMacro);
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000564 CurPPLexer->LexingRawMode = true;
John Thompson17c35732013-12-04 20:19:30 +0000565 if (Callbacks) {
566 const SourceLocation CondEnd = CurPPLexer->getSourceLocation();
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +0000567 Callbacks->Elif(Tok.getLocation(),
John Thompson17c35732013-12-04 20:19:30 +0000568 SourceRange(CondBegin, CondEnd),
John Thompson87f9fef2013-12-07 08:41:15 +0000569 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False), CondInfo.IfLoc);
John Thompson17c35732013-12-04 20:19:30 +0000570 }
571 // If this condition is true, enter it!
572 if (CondValue) {
573 CondInfo.FoundNonSkip = true;
574 break;
575 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000576 }
577 }
578 }
Mike Stump11289f42009-09-09 15:08:12 +0000579
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000580 CurPPLexer->ParsingPreprocessorDirective = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +0000581 // Restore comment saving mode.
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000582 if (CurLexer) CurLexer->resetExtendedTokenMode();
Chris Lattnerf64b3522008-03-09 01:54:53 +0000583 }
584
585 // Finally, if we are out of the conditional (saw an #endif or ran off the end
586 // of the file, just stop skipping and return to lexing whatever came after
587 // the #if block.
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000588 CurPPLexer->LexingRawMode = false;
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +0000589
590 if (Callbacks) {
591 SourceLocation BeginLoc = ElseLoc.isValid() ? ElseLoc : IfTokenLoc;
592 Callbacks->SourceRangeSkipped(SourceRange(BeginLoc, Tok.getLocation()));
593 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000594}
595
Ted Kremenek56572ab2008-12-12 18:34:08 +0000596void Preprocessor::PTHSkipExcludedConditionalBlock() {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000597 while (true) {
Ted Kremenek56572ab2008-12-12 18:34:08 +0000598 assert(CurPTHLexer);
599 assert(CurPTHLexer->LexingRawMode == false);
Mike Stump11289f42009-09-09 15:08:12 +0000600
Ted Kremenek56572ab2008-12-12 18:34:08 +0000601 // Skip to the next '#else', '#elif', or #endif.
602 if (CurPTHLexer->SkipBlock()) {
603 // We have reached an #endif. Both the '#' and 'endif' tokens
604 // have been consumed by the PTHLexer. Just pop off the condition level.
605 PPConditionalInfo CondInfo;
606 bool InCond = CurPTHLexer->popConditionalLevel(CondInfo);
Jeffrey Yasskinb3321532010-12-23 01:01:28 +0000607 (void)InCond; // Silence warning in no-asserts mode.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000608 assert(!InCond && "Can't be skipping if not in a conditional!");
609 break;
610 }
Mike Stump11289f42009-09-09 15:08:12 +0000611
Ted Kremenek56572ab2008-12-12 18:34:08 +0000612 // We have reached a '#else' or '#elif'. Lex the next token to get
613 // the directive flavor.
614 Token Tok;
615 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +0000616
Ted Kremenek56572ab2008-12-12 18:34:08 +0000617 // We can actually look up the IdentifierInfo here since we aren't in
618 // raw mode.
619 tok::PPKeywordKind K = Tok.getIdentifierInfo()->getPPKeywordID();
620
621 if (K == tok::pp_else) {
622 // #else: Enter the else condition. We aren't in a nested condition
623 // since we skip those. We're always in the one matching the last
624 // blocked we skipped.
625 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
626 // Note that we've seen a #else in this conditional.
627 CondInfo.FoundElse = true;
Mike Stump11289f42009-09-09 15:08:12 +0000628
Ted Kremenek56572ab2008-12-12 18:34:08 +0000629 // If the #if block wasn't entered then enter the #else block now.
630 if (!CondInfo.FoundNonSkip) {
631 CondInfo.FoundNonSkip = true;
Mike Stump11289f42009-09-09 15:08:12 +0000632
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000633 // Scan until the eod token.
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000634 CurPTHLexer->ParsingPreprocessorDirective = true;
Daniel Dunbar2cba6be2009-04-13 17:57:49 +0000635 DiscardUntilEndOfDirective();
Ted Kremenek1b18ad22008-12-23 01:30:52 +0000636 CurPTHLexer->ParsingPreprocessorDirective = false;
Mike Stump11289f42009-09-09 15:08:12 +0000637
Ted Kremenek56572ab2008-12-12 18:34:08 +0000638 break;
639 }
Mike Stump11289f42009-09-09 15:08:12 +0000640
Ted Kremenek56572ab2008-12-12 18:34:08 +0000641 // Otherwise skip this block.
642 continue;
643 }
Mike Stump11289f42009-09-09 15:08:12 +0000644
Ted Kremenek56572ab2008-12-12 18:34:08 +0000645 assert(K == tok::pp_elif);
646 PPConditionalInfo &CondInfo = CurPTHLexer->peekConditionalLevel();
647
648 // If this is a #elif with a #else before it, report the error.
649 if (CondInfo.FoundElse)
650 Diag(Tok, diag::pp_err_elif_after_else);
Mike Stump11289f42009-09-09 15:08:12 +0000651
Ted Kremenek56572ab2008-12-12 18:34:08 +0000652 // If this is in a skipping block or if we're already handled this #if
Mike Stump11289f42009-09-09 15:08:12 +0000653 // block, don't bother parsing the condition. We just skip this block.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000654 if (CondInfo.FoundNonSkip)
655 continue;
656
657 // Evaluate the condition of the #elif.
Craig Topperd2d442c2014-05-17 23:10:59 +0000658 IdentifierInfo *IfNDefMacro = nullptr;
Ted Kremenek56572ab2008-12-12 18:34:08 +0000659 CurPTHLexer->ParsingPreprocessorDirective = true;
660 bool ShouldEnter = EvaluateDirectiveExpression(IfNDefMacro);
661 CurPTHLexer->ParsingPreprocessorDirective = false;
662
663 // If this condition is true, enter it!
664 if (ShouldEnter) {
665 CondInfo.FoundNonSkip = true;
666 break;
667 }
668
669 // Otherwise, skip this block and go to the next one.
Ted Kremenek56572ab2008-12-12 18:34:08 +0000670 }
671}
672
Richard Smith2a553082015-04-23 22:58:06 +0000673Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
Richard Smith7e82e012016-02-19 22:25:36 +0000674 if (!SourceMgr.isInMainFile(Loc)) {
675 // Try to determine the module of the include directive.
676 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
677 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
678 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
679 // The include comes from an included file.
680 return HeaderInfo.getModuleMap()
681 .findModuleForHeader(EntryOfIncl)
682 .getModule();
683 }
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000684 }
Richard Smith7e82e012016-02-19 22:25:36 +0000685
686 // This is either in the main file or not in a file at all. It belongs
687 // to the current module, if there is one.
688 return getLangOpts().CurrentModule.empty()
689 ? nullptr
690 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
Daniel Jasperba7f2f72013-09-24 09:14:14 +0000691}
692
Richard Smith2a553082015-04-23 22:58:06 +0000693Module *Preprocessor::getModuleContainingLocation(SourceLocation Loc) {
694 return HeaderInfo.getModuleMap().inferModuleFromLocation(
695 FullSourceLoc(Loc, SourceMgr));
696}
697
Richard Smith4eb83932016-04-27 21:57:05 +0000698const FileEntry *
699Preprocessor::getModuleHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
700 SourceLocation Loc) {
701 // If we have a module import syntax, we shouldn't include a header to
702 // make a particular module visible.
703 if (getLangOpts().ObjC2)
704 return nullptr;
705
706 // Figure out which module we'd want to import.
707 Module *M = getModuleContainingLocation(Loc);
708 if (!M)
709 return nullptr;
710
711 Module *TopM = M->getTopLevelModule();
712 Module *IncM = getModuleForLocation(IncLoc);
713
714 // Walk up through the include stack, looking through textual headers of M
715 // until we hit a non-textual header that we can #include. (We assume textual
716 // headers of a module with non-textual headers aren't meant to be used to
717 // import entities from the module.)
718 auto &SM = getSourceManager();
719 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
720 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
721 auto *FE = SM.getFileEntryForID(ID);
722
723 bool InTextualHeader = false;
724 for (auto Header : HeaderInfo.getModuleMap().findAllModulesForHeader(FE)) {
725 if (!Header.getModule()->isSubModuleOf(TopM))
726 continue;
727
728 if (!(Header.getRole() & ModuleMap::TextualHeader)) {
729 // If this is an accessible, non-textual header of M's top-level module
730 // that transitively includes the given location and makes the
731 // corresponding module visible, this is the thing to #include.
732 if (Header.isAccessibleFrom(IncM))
733 return FE;
734
735 // It's in a private header; we can't #include it.
736 // FIXME: If there's a public header in some module that re-exports it,
737 // then we could suggest including that, but it's not clear that's the
738 // expected way to make this entity visible.
739 continue;
740 }
741
742 InTextualHeader = true;
743 }
744
745 if (!InTextualHeader)
746 break;
747
748 Loc = SM.getIncludeLoc(ID);
749 }
750
751 return nullptr;
752}
753
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000754const FileEntry *Preprocessor::LookupFile(
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000755 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
756 const DirectoryLookup *FromDir, const FileEntry *FromFile,
757 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
Douglas Gregor97eec242011-09-15 22:00:41 +0000758 SmallVectorImpl<char> *RelativePath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000759 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool SkipCache) {
Taewook Oh755e4d22016-06-13 21:55:33 +0000760 Module *RequestingModule = getModuleForLocation(FilenameLoc);
Richard Smith8d4e90b2016-03-14 17:52:37 +0000761 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
Richard Smith3d5b48c2015-10-16 21:42:56 +0000762
Will Wilson0fafd342013-12-27 19:46:16 +0000763 // If the header lookup mechanism may be relative to the current inclusion
764 // stack, record the parent #includes.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000765 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
766 Includers;
Manman Rene4a5d372016-05-17 02:15:12 +0000767 bool BuildSystemModule = false;
Richard Smith25d50752014-10-20 00:15:49 +0000768 if (!FromDir && !FromFile) {
Chris Lattnerd32480d2009-01-17 06:22:33 +0000769 FileID FID = getCurrentFileLexer()->getFileID();
Will Wilson0fafd342013-12-27 19:46:16 +0000770 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
Mike Stump11289f42009-09-09 15:08:12 +0000771
Chris Lattner022923a2009-02-04 19:45:07 +0000772 // If there is no file entry associated with this file, it must be the
Richard Smith3c1a41a2014-12-02 00:08:08 +0000773 // predefines buffer or the module includes buffer. Any other file is not
774 // lexed with a normal lexer, so it won't be scanned for preprocessor
775 // directives.
776 //
777 // If we have the predefines buffer, resolve #include references (which come
778 // from the -include command line argument) from the current working
779 // directory instead of relative to the main file.
780 //
781 // If we have the module includes buffer, resolve #include references (which
782 // come from header declarations in the module map) relative to the module
783 // map file.
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000784 if (!FileEnt) {
Manman Rene4a5d372016-05-17 02:15:12 +0000785 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Richard Smith3c1a41a2014-12-02 00:08:08 +0000786 Includers.push_back(std::make_pair(nullptr, MainFileDir));
Manman Rene4a5d372016-05-17 02:15:12 +0000787 BuildSystemModule = getCurrentModule()->IsSystem;
788 } else if ((FileEnt =
Richard Smith3c1a41a2014-12-02 00:08:08 +0000789 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000790 Includers.push_back(std::make_pair(FileEnt, FileMgr.getDirectory(".")));
791 } else {
792 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
793 }
Will Wilson0fafd342013-12-27 19:46:16 +0000794
795 // MSVC searches the current include stack from top to bottom for
796 // headers included by quoted include directives.
797 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
Alp Tokerbfa39342014-01-14 12:51:41 +0000798 if (LangOpts.MSVCCompat && !isAngled) {
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000799 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Will Wilson0fafd342013-12-27 19:46:16 +0000800 if (IsFileLexer(ISEntry))
Yaron Keren65224612015-12-18 10:30:12 +0000801 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000802 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
Will Wilson0fafd342013-12-27 19:46:16 +0000803 }
Chris Lattner022923a2009-02-04 19:45:07 +0000804 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000805 }
Mike Stump11289f42009-09-09 15:08:12 +0000806
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000807 CurDir = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +0000808
809 if (FromFile) {
810 // We're supposed to start looking from after a particular file. Search
811 // the include path until we find that file or run out of files.
812 const DirectoryLookup *TmpCurDir = CurDir;
813 const DirectoryLookup *TmpFromDir = nullptr;
814 while (const FileEntry *FE = HeaderInfo.LookupFile(
815 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000816 Includers, SearchPath, RelativePath, RequestingModule,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000817 SuggestedModule, /*IsMapped=*/nullptr, SkipCache)) {
Richard Smith25d50752014-10-20 00:15:49 +0000818 // Keep looking as if this file did a #include_next.
819 TmpFromDir = TmpCurDir;
820 ++TmpFromDir;
821 if (FE == FromFile) {
822 // Found it.
823 FromDir = TmpFromDir;
824 CurDir = TmpCurDir;
825 break;
826 }
827 }
828 }
829
830 // Do a standard file entry lookup.
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000831 const FileEntry *FE = HeaderInfo.LookupFile(
Will Wilson0fafd342013-12-27 19:46:16 +0000832 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +0000833 RelativePath, RequestingModule, SuggestedModule, IsMapped, SkipCache,
Manman Rene4a5d372016-05-17 02:15:12 +0000834 BuildSystemModule);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000835 if (FE) {
Daniel Jasper5c77e392014-03-14 14:53:17 +0000836 if (SuggestedModule && !LangOpts.AsmPreprocessor)
Daniel Jasper92669ee2013-12-20 12:09:36 +0000837 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000838 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
839 Filename, FE);
Lawrence Crowlb53e5482013-06-20 21:14:14 +0000840 return FE;
841 }
Mike Stump11289f42009-09-09 15:08:12 +0000842
Will Wilson0fafd342013-12-27 19:46:16 +0000843 const FileEntry *CurFileEnt;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000844 // Otherwise, see if this is a subframework header. If so, this is relative
845 // to one of the headers on the #include stack. Walk the list of the current
846 // headers on the #include stack and pass them to HeaderInfo.
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000847 if (IsFileLexer()) {
Yaron Keren65224612015-12-18 10:30:12 +0000848 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
Chandler Carruth3cc331a2011-03-16 18:34:36 +0000849 if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt,
Douglas Gregorf5f94522013-02-08 00:10:48 +0000850 SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000851 RequestingModule,
Ben Langmuir71e1a642014-05-05 21:44:13 +0000852 SuggestedModule))) {
853 if (SuggestedModule && !LangOpts.AsmPreprocessor)
854 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000855 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
856 Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000857 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000858 }
859 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000860 }
Mike Stump11289f42009-09-09 15:08:12 +0000861
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +0000862 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
Ted Kremenek6bc5f3e2008-11-20 16:19:53 +0000863 if (IsFileLexer(ISEntry)) {
Yaron Keren65224612015-12-18 10:30:12 +0000864 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
Manuel Klimek0c69fd22011-04-26 21:50:03 +0000865 if ((FE = HeaderInfo.LookupSubframeworkHeader(
Douglas Gregorf5f94522013-02-08 00:10:48 +0000866 Filename, CurFileEnt, SearchPath, RelativePath,
Richard Smith3d5b48c2015-10-16 21:42:56 +0000867 RequestingModule, SuggestedModule))) {
Ben Langmuir71e1a642014-05-05 21:44:13 +0000868 if (SuggestedModule && !LangOpts.AsmPreprocessor)
869 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Richard Smith8d4e90b2016-03-14 17:52:37 +0000870 RequestingModule, RequestingModuleIsModuleInterface,
871 FilenameLoc, Filename, FE);
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000872 return FE;
Ben Langmuir71e1a642014-05-05 21:44:13 +0000873 }
874 }
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000875 }
876 }
Mike Stump11289f42009-09-09 15:08:12 +0000877
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000878 // Otherwise, we really couldn't find the file.
Craig Topperd2d442c2014-05-17 23:10:59 +0000879 return nullptr;
Chris Lattnerf7ad82d2008-03-09 04:17:44 +0000880}
881
Chris Lattnerf64b3522008-03-09 01:54:53 +0000882//===----------------------------------------------------------------------===//
883// Preprocessor Directive Handling.
884//===----------------------------------------------------------------------===//
885
David Blaikied5321242012-06-06 18:52:13 +0000886class Preprocessor::ResetMacroExpansionHelper {
887public:
888 ResetMacroExpansionHelper(Preprocessor *pp)
889 : PP(pp), save(pp->DisableMacroExpansion) {
890 if (pp->MacroExpansionInDirectivesOverride)
891 pp->DisableMacroExpansion = false;
892 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000893
David Blaikied5321242012-06-06 18:52:13 +0000894 ~ResetMacroExpansionHelper() {
895 PP->DisableMacroExpansion = save;
896 }
Eugene Zelenko1ced5092016-02-12 22:53:10 +0000897
David Blaikied5321242012-06-06 18:52:13 +0000898private:
899 Preprocessor *PP;
900 bool save;
901};
902
Chris Lattnerf64b3522008-03-09 01:54:53 +0000903/// HandleDirective - This callback is invoked when the lexer sees a # token
Mike Stump11289f42009-09-09 15:08:12 +0000904/// at the start of a line. This consumes the directive, modifies the
Chris Lattnerf64b3522008-03-09 01:54:53 +0000905/// lexer/preprocessor state, and advances the lexer(s) so that the next token
906/// read is the correct one.
907void Preprocessor::HandleDirective(Token &Result) {
908 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
Mike Stump11289f42009-09-09 15:08:12 +0000909
Chris Lattnerf64b3522008-03-09 01:54:53 +0000910 // We just parsed a # character at the start of a line, so we're in directive
911 // mode. Tell the lexer this so any newlines we see will be converted into an
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000912 // EOD token (which terminates the directive).
Ted Kremenek30cd88c2008-11-18 00:34:22 +0000913 CurPPLexer->ParsingPreprocessorDirective = true;
Jordan Rosecb8a1ac2013-02-21 18:53:19 +0000914 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
Mike Stump11289f42009-09-09 15:08:12 +0000915
Richard Trieu33a4b3d2013-06-12 21:20:57 +0000916 bool ImmediatelyAfterTopLevelIfndef =
917 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
918 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
919
Chris Lattnerf64b3522008-03-09 01:54:53 +0000920 ++NumDirectives;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +0000921
Chris Lattnerf64b3522008-03-09 01:54:53 +0000922 // We are about to read a token. For the multiple-include optimization FA to
Mike Stump11289f42009-09-09 15:08:12 +0000923 // work, we have to remember if we had read any tokens *before* this
Chris Lattnerf64b3522008-03-09 01:54:53 +0000924 // pp-directive.
Chris Lattner8cf1f932009-12-14 04:54:40 +0000925 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
Mike Stump11289f42009-09-09 15:08:12 +0000926
Chris Lattner2d17ab72009-03-18 21:00:25 +0000927 // Save the '#' token in case we need to return it later.
928 Token SavedHash = Result;
Mike Stump11289f42009-09-09 15:08:12 +0000929
Chris Lattnerf64b3522008-03-09 01:54:53 +0000930 // Read the next token, the directive flavor. This isn't expanded due to
931 // C99 6.10.3p8.
932 LexUnexpandedToken(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000933
Chris Lattnerf64b3522008-03-09 01:54:53 +0000934 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
935 // #define A(x) #x
936 // A(abc
937 // #warning blah
938 // def)
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000939 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
940 // not support this for #include-like directives, since that can result in
941 // terrible diagnostics, and does not work in GCC.
942 if (InMacroArgs) {
943 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
944 switch (II->getPPKeywordID()) {
945 case tok::pp_include:
946 case tok::pp_import:
947 case tok::pp_include_next:
948 case tok::pp___include_macros:
David Majnemerf2d3bc02014-12-28 07:42:49 +0000949 case tok::pp_pragma:
950 Diag(Result, diag::err_embedded_directive) << II->getName();
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000951 DiscardUntilEndOfDirective();
952 return;
953 default:
954 break;
955 }
956 }
Chris Lattnerf64b3522008-03-09 01:54:53 +0000957 Diag(Result, diag::ext_embedded_directive);
Richard Smitheb3ce7c2011-12-16 22:50:01 +0000958 }
Mike Stump11289f42009-09-09 15:08:12 +0000959
David Blaikied5321242012-06-06 18:52:13 +0000960 // Temporarily enable macro expansion if set so
961 // and reset to previous state when returning from this function.
962 ResetMacroExpansionHelper helper(this);
963
Chris Lattnerf64b3522008-03-09 01:54:53 +0000964 switch (Result.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +0000965 case tok::eod:
Chris Lattnerf64b3522008-03-09 01:54:53 +0000966 return; // null directive.
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000967 case tok::code_completion:
968 if (CodeComplete)
969 CodeComplete->CodeCompleteDirective(
970 CurPPLexer->getConditionalStackDepth() > 0);
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +0000971 setCodeCompletionReached();
Douglas Gregor3a7ad252010-08-24 19:08:16 +0000972 return;
Chris Lattner76e68962009-01-26 06:19:46 +0000973 case tok::numeric_constant: // # 7 GNU line marker directive.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000974 if (getLangOpts().AsmPreprocessor)
Chris Lattner5eb8ae22009-03-18 20:41:10 +0000975 break; // # 4 is not a preprocessor directive in .S files.
Chris Lattner76e68962009-01-26 06:19:46 +0000976 return HandleDigitDirective(Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +0000977 default:
978 IdentifierInfo *II = Result.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +0000979 if (!II) break; // Not an identifier.
Mike Stump11289f42009-09-09 15:08:12 +0000980
Chris Lattnerf64b3522008-03-09 01:54:53 +0000981 // Ask what the preprocessor keyword ID is.
982 switch (II->getPPKeywordID()) {
983 default: break;
984 // C99 6.10.1 - Conditional Inclusion.
985 case tok::pp_if:
986 return HandleIfDirective(Result, ReadAnyTokensBeforeDirective);
987 case tok::pp_ifdef:
988 return HandleIfdefDirective(Result, false, true/*not valid for miopt*/);
989 case tok::pp_ifndef:
990 return HandleIfdefDirective(Result, true, ReadAnyTokensBeforeDirective);
991 case tok::pp_elif:
992 return HandleElifDirective(Result);
993 case tok::pp_else:
994 return HandleElseDirective(Result);
995 case tok::pp_endif:
996 return HandleEndifDirective(Result);
Mike Stump11289f42009-09-09 15:08:12 +0000997
Chris Lattnerf64b3522008-03-09 01:54:53 +0000998 // C99 6.10.2 - Source File Inclusion.
999 case tok::pp_include:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001000 // Handle #include.
1001 return HandleIncludeDirective(SavedHash.getLocation(), Result);
Chris Lattner14a7f392009-04-08 18:24:34 +00001002 case tok::pp___include_macros:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001003 // Handle -imacros.
Taewook Oh755e4d22016-06-13 21:55:33 +00001004 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001005
Chris Lattnerf64b3522008-03-09 01:54:53 +00001006 // C99 6.10.3 - Macro Replacement.
1007 case tok::pp_define:
Richard Trieu33a4b3d2013-06-12 21:20:57 +00001008 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001009 case tok::pp_undef:
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001010 return HandleUndefDirective();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001011
1012 // C99 6.10.4 - Line Control.
1013 case tok::pp_line:
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001014 return HandleLineDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001015
Chris Lattnerf64b3522008-03-09 01:54:53 +00001016 // C99 6.10.5 - Error Directive.
1017 case tok::pp_error:
1018 return HandleUserDiagnosticDirective(Result, false);
Mike Stump11289f42009-09-09 15:08:12 +00001019
Chris Lattnerf64b3522008-03-09 01:54:53 +00001020 // C99 6.10.6 - Pragma Directive.
1021 case tok::pp_pragma:
Enea Zaffanella5afb04a2013-07-20 20:09:11 +00001022 return HandlePragmaDirective(SavedHash.getLocation(), PIK_HashPragma);
Mike Stump11289f42009-09-09 15:08:12 +00001023
Chris Lattnerf64b3522008-03-09 01:54:53 +00001024 // GNU Extensions.
1025 case tok::pp_import:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001026 return HandleImportDirective(SavedHash.getLocation(), Result);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001027 case tok::pp_include_next:
Douglas Gregor796d76a2010-10-20 22:00:55 +00001028 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
Mike Stump11289f42009-09-09 15:08:12 +00001029
Chris Lattnerf64b3522008-03-09 01:54:53 +00001030 case tok::pp_warning:
1031 Diag(Result, diag::ext_pp_warning_directive);
1032 return HandleUserDiagnosticDirective(Result, true);
1033 case tok::pp_ident:
1034 return HandleIdentSCCSDirective(Result);
1035 case tok::pp_sccs:
1036 return HandleIdentSCCSDirective(Result);
1037 case tok::pp_assert:
1038 //isExtension = true; // FIXME: implement #assert
1039 break;
1040 case tok::pp_unassert:
1041 //isExtension = true; // FIXME: implement #unassert
1042 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001043
Douglas Gregor663b48f2012-01-03 19:48:16 +00001044 case tok::pp___public_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001045 if (getLangOpts().Modules)
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001046 return HandleMacroPublicDirective(Result);
1047 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001048
Douglas Gregor663b48f2012-01-03 19:48:16 +00001049 case tok::pp___private_macro:
David Blaikiebbafb8a2012-03-11 07:00:24 +00001050 if (getLangOpts().Modules)
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001051 return HandleMacroPrivateDirective();
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001052 break;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001053 }
1054 break;
1055 }
Mike Stump11289f42009-09-09 15:08:12 +00001056
Chris Lattner2d17ab72009-03-18 21:00:25 +00001057 // If this is a .S file, treat unknown # directives as non-preprocessor
1058 // directives. This is important because # may be a comment or introduce
1059 // various pseudo-ops. Just return the # token and push back the following
1060 // token to be lexed next time.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001061 if (getLangOpts().AsmPreprocessor) {
David Blaikie2eabcc92016-02-09 18:52:09 +00001062 auto Toks = llvm::make_unique<Token[]>(2);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001063 // Return the # and the token after it.
Mike Stump11289f42009-09-09 15:08:12 +00001064 Toks[0] = SavedHash;
Chris Lattner2d17ab72009-03-18 21:00:25 +00001065 Toks[1] = Result;
Taewook Oh755e4d22016-06-13 21:55:33 +00001066
Chris Lattner56f64c12011-01-06 05:01:51 +00001067 // If the second token is a hashhash token, then we need to translate it to
1068 // unknown so the token lexer doesn't try to perform token pasting.
1069 if (Result.is(tok::hashhash))
1070 Toks[1].setKind(tok::unknown);
Taewook Oh755e4d22016-06-13 21:55:33 +00001071
Chris Lattner2d17ab72009-03-18 21:00:25 +00001072 // Enter this token stream so that we re-lex the tokens. Make sure to
1073 // enable macro expansion, in case the token after the # is an identifier
1074 // that is expanded.
David Blaikie2eabcc92016-02-09 18:52:09 +00001075 EnterTokenStream(std::move(Toks), 2, false);
Chris Lattner2d17ab72009-03-18 21:00:25 +00001076 return;
1077 }
Mike Stump11289f42009-09-09 15:08:12 +00001078
Chris Lattnerf64b3522008-03-09 01:54:53 +00001079 // If we reached here, the preprocessing token is not valid!
1080 Diag(Result, diag::err_pp_invalid_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001081
Chris Lattnerf64b3522008-03-09 01:54:53 +00001082 // Read the rest of the PP line.
1083 DiscardUntilEndOfDirective();
Mike Stump11289f42009-09-09 15:08:12 +00001084
Chris Lattnerf64b3522008-03-09 01:54:53 +00001085 // Okay, we're done parsing the directive.
1086}
1087
Chris Lattner76e68962009-01-26 06:19:46 +00001088/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1089/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1090static bool GetLineValue(Token &DigitTok, unsigned &Val,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001091 unsigned DiagID, Preprocessor &PP,
1092 bool IsGNULineDirective=false) {
Chris Lattner76e68962009-01-26 06:19:46 +00001093 if (DigitTok.isNot(tok::numeric_constant)) {
1094 PP.Diag(DigitTok, DiagID);
Mike Stump11289f42009-09-09 15:08:12 +00001095
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001096 if (DigitTok.isNot(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001097 PP.DiscardUntilEndOfDirective();
1098 return true;
1099 }
Mike Stump11289f42009-09-09 15:08:12 +00001100
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001101 SmallString<64> IntegerBuffer;
Chris Lattner76e68962009-01-26 06:19:46 +00001102 IntegerBuffer.resize(DigitTok.getLength());
1103 const char *DigitTokBegin = &IntegerBuffer[0];
Douglas Gregordc970f02010-03-16 22:30:13 +00001104 bool Invalid = false;
1105 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1106 if (Invalid)
1107 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001108
Chris Lattnerd66f1722009-04-18 18:35:15 +00001109 // Verify that we have a simple digit-sequence, and compute the value. This
1110 // is always a simple digit string computed in decimal, so we do this manually
1111 // here.
1112 Val = 0;
1113 for (unsigned i = 0; i != ActualLength; ++i) {
Richard Smith7f2707a2013-09-26 18:13:20 +00001114 // C++1y [lex.fcon]p1:
1115 // Optional separating single quotes in a digit-sequence are ignored
1116 if (DigitTokBegin[i] == '\'')
1117 continue;
1118
Jordan Rosea7d03842013-02-08 22:30:41 +00001119 if (!isDigit(DigitTokBegin[i])) {
Chris Lattnerd66f1722009-04-18 18:35:15 +00001120 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
Michael Ilsemane910cc82013-04-10 01:04:18 +00001121 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001122 PP.DiscardUntilEndOfDirective();
1123 return true;
1124 }
Mike Stump11289f42009-09-09 15:08:12 +00001125
Chris Lattnerd66f1722009-04-18 18:35:15 +00001126 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1127 if (NextVal < Val) { // overflow.
1128 PP.Diag(DigitTok, DiagID);
1129 PP.DiscardUntilEndOfDirective();
1130 return true;
1131 }
1132 Val = NextVal;
Chris Lattner76e68962009-01-26 06:19:46 +00001133 }
Mike Stump11289f42009-09-09 15:08:12 +00001134
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001135 if (DigitTokBegin[0] == '0' && Val)
Michael Ilsemane910cc82013-04-10 01:04:18 +00001136 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1137 << IsGNULineDirective;
Mike Stump11289f42009-09-09 15:08:12 +00001138
Chris Lattner76e68962009-01-26 06:19:46 +00001139 return false;
1140}
1141
James Dennettf6333ac2012-06-22 05:46:07 +00001142/// \brief Handle a \#line directive: C99 6.10.4.
1143///
1144/// The two acceptable forms are:
1145/// \verbatim
Chris Lattner100c65e2009-01-26 05:29:08 +00001146/// # line digit-sequence
1147/// # line digit-sequence "s-char-sequence"
James Dennettf6333ac2012-06-22 05:46:07 +00001148/// \endverbatim
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001149void Preprocessor::HandleLineDirective() {
Chris Lattner100c65e2009-01-26 05:29:08 +00001150 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1151 // expanded.
1152 Token DigitTok;
1153 Lex(DigitTok);
1154
Chris Lattner100c65e2009-01-26 05:29:08 +00001155 // Validate the number and convert it to an unsigned.
Chris Lattner76e68962009-01-26 06:19:46 +00001156 unsigned LineNo;
Chris Lattnerd66f1722009-04-18 18:35:15 +00001157 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
Chris Lattner100c65e2009-01-26 05:29:08 +00001158 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001159
Fariborz Jahanian0638c152012-06-26 21:19:20 +00001160 if (LineNo == 0)
1161 Diag(DigitTok, diag::ext_pp_line_zero);
Chris Lattner100c65e2009-01-26 05:29:08 +00001162
Chris Lattner76e68962009-01-26 06:19:46 +00001163 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1164 // number greater than 2147483647". C90 requires that the line # be <= 32767.
Eli Friedman192e0342011-10-10 23:35:28 +00001165 unsigned LineLimit = 32768U;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001166 if (LangOpts.C99 || LangOpts.CPlusPlus11)
Eli Friedman192e0342011-10-10 23:35:28 +00001167 LineLimit = 2147483648U;
Chris Lattner100c65e2009-01-26 05:29:08 +00001168 if (LineNo >= LineLimit)
1169 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
Richard Smith2bf7fdb2013-01-02 11:42:31 +00001170 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
Richard Smithacd4d3d2011-10-15 01:18:56 +00001171 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
Mike Stump11289f42009-09-09 15:08:12 +00001172
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001173 int FilenameID = -1;
Chris Lattner100c65e2009-01-26 05:29:08 +00001174 Token StrTok;
1175 Lex(StrTok);
1176
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001177 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1178 // string followed by eod.
1179 if (StrTok.is(tok::eod))
Chris Lattner100c65e2009-01-26 05:29:08 +00001180 ; // ok
1181 else if (StrTok.isNot(tok::string_literal)) {
1182 Diag(StrTok, diag::err_pp_line_invalid_filename);
Richard Smithd67aea22012-03-06 03:21:47 +00001183 return DiscardUntilEndOfDirective();
1184 } else if (StrTok.hasUDSuffix()) {
1185 Diag(StrTok, diag::err_invalid_string_udl);
1186 return DiscardUntilEndOfDirective();
Chris Lattner100c65e2009-01-26 05:29:08 +00001187 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001188 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001189 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001190 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001191 if (Literal.hadError)
1192 return DiscardUntilEndOfDirective();
1193 if (Literal.Pascal) {
1194 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1195 return DiscardUntilEndOfDirective();
1196 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001197 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001198
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001199 // Verify that there is nothing after the string, other than EOD. Because
Chris Lattner0003c272009-04-17 23:30:53 +00001200 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1201 CheckEndOfDirective("line", true);
Chris Lattner100c65e2009-01-26 05:29:08 +00001202 }
Mike Stump11289f42009-09-09 15:08:12 +00001203
Chris Lattner1eaa70a2009-02-03 21:52:55 +00001204 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID);
Mike Stump11289f42009-09-09 15:08:12 +00001205
Chris Lattner839150e2009-03-27 17:13:49 +00001206 if (Callbacks)
Chris Lattnerc745cec2010-04-14 04:28:50 +00001207 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
1208 PPCallbacks::RenameFile,
Chris Lattner839150e2009-03-27 17:13:49 +00001209 SrcMgr::C_User);
Chris Lattner100c65e2009-01-26 05:29:08 +00001210}
1211
Chris Lattner76e68962009-01-26 06:19:46 +00001212/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1213/// marker directive.
1214static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
1215 bool &IsSystemHeader, bool &IsExternCHeader,
1216 Preprocessor &PP) {
1217 unsigned FlagVal;
1218 Token FlagTok;
1219 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001220 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001221 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1222 return true;
1223
1224 if (FlagVal == 1) {
1225 IsFileEntry = true;
Mike Stump11289f42009-09-09 15:08:12 +00001226
Chris Lattner76e68962009-01-26 06:19:46 +00001227 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001228 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001229 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1230 return true;
1231 } else if (FlagVal == 2) {
1232 IsFileExit = true;
Mike Stump11289f42009-09-09 15:08:12 +00001233
Chris Lattner1c967782009-02-04 06:25:26 +00001234 SourceManager &SM = PP.getSourceManager();
1235 // If we are leaving the current presumed file, check to make sure the
1236 // presumed include stack isn't empty!
1237 FileID CurFileID =
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001238 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
Chris Lattner1c967782009-02-04 06:25:26 +00001239 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
Douglas Gregor453b0122010-11-12 07:15:47 +00001240 if (PLoc.isInvalid())
1241 return true;
Taewook Oh755e4d22016-06-13 21:55:33 +00001242
Chris Lattner1c967782009-02-04 06:25:26 +00001243 // If there is no include loc (main file) or if the include loc is in a
1244 // different physical file, then we aren't in a "1" line marker flag region.
1245 SourceLocation IncLoc = PLoc.getIncludeLoc();
1246 if (IncLoc.isInvalid() ||
Chandler Carruthc7ca5212011-07-25 20:52:32 +00001247 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
Chris Lattner1c967782009-02-04 06:25:26 +00001248 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1249 PP.DiscardUntilEndOfDirective();
1250 return true;
1251 }
Mike Stump11289f42009-09-09 15:08:12 +00001252
Chris Lattner76e68962009-01-26 06:19:46 +00001253 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001254 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001255 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1256 return true;
1257 }
1258
1259 // We must have 3 if there are still flags.
1260 if (FlagVal != 3) {
1261 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001262 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001263 return true;
1264 }
Mike Stump11289f42009-09-09 15:08:12 +00001265
Chris Lattner76e68962009-01-26 06:19:46 +00001266 IsSystemHeader = true;
Mike Stump11289f42009-09-09 15:08:12 +00001267
Chris Lattner76e68962009-01-26 06:19:46 +00001268 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001269 if (FlagTok.is(tok::eod)) return false;
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001270 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
Chris Lattner76e68962009-01-26 06:19:46 +00001271 return true;
1272
1273 // We must have 4 if there is yet another flag.
1274 if (FlagVal != 4) {
1275 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001276 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001277 return true;
1278 }
Mike Stump11289f42009-09-09 15:08:12 +00001279
Chris Lattner76e68962009-01-26 06:19:46 +00001280 IsExternCHeader = true;
Mike Stump11289f42009-09-09 15:08:12 +00001281
Chris Lattner76e68962009-01-26 06:19:46 +00001282 PP.Lex(FlagTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001283 if (FlagTok.is(tok::eod)) return false;
Chris Lattner76e68962009-01-26 06:19:46 +00001284
1285 // There are no more valid flags here.
1286 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001287 PP.DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001288 return true;
1289}
1290
1291/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1292/// one of the following forms:
1293///
1294/// # 42
Mike Stump11289f42009-09-09 15:08:12 +00001295/// # 42 "file" ('1' | '2')?
Chris Lattner76e68962009-01-26 06:19:46 +00001296/// # 42 "file" ('1' | '2')? '3' '4'?
1297///
1298void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1299 // Validate the number and convert it to an unsigned. GNU does not have a
1300 // line # limit other than it fit in 32-bits.
1301 unsigned LineNo;
1302 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
Michael Ilsemane910cc82013-04-10 01:04:18 +00001303 *this, true))
Chris Lattner76e68962009-01-26 06:19:46 +00001304 return;
Mike Stump11289f42009-09-09 15:08:12 +00001305
Chris Lattner76e68962009-01-26 06:19:46 +00001306 Token StrTok;
1307 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001308
Chris Lattner76e68962009-01-26 06:19:46 +00001309 bool IsFileEntry = false, IsFileExit = false;
1310 bool IsSystemHeader = false, IsExternCHeader = false;
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001311 int FilenameID = -1;
1312
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001313 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1314 // string followed by eod.
1315 if (StrTok.is(tok::eod))
Chris Lattner76e68962009-01-26 06:19:46 +00001316 ; // ok
1317 else if (StrTok.isNot(tok::string_literal)) {
1318 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001319 return DiscardUntilEndOfDirective();
Richard Smithd67aea22012-03-06 03:21:47 +00001320 } else if (StrTok.hasUDSuffix()) {
1321 Diag(StrTok, diag::err_invalid_string_udl);
1322 return DiscardUntilEndOfDirective();
Chris Lattner76e68962009-01-26 06:19:46 +00001323 } else {
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001324 // Parse and validate the string, converting it into a unique ID.
Craig Topper9d5583e2014-06-26 04:58:39 +00001325 StringLiteralParser Literal(StrTok, *this);
Douglas Gregorfb65e592011-07-27 05:40:30 +00001326 assert(Literal.isAscii() && "Didn't allow wide strings in");
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001327 if (Literal.hadError)
1328 return DiscardUntilEndOfDirective();
1329 if (Literal.Pascal) {
1330 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1331 return DiscardUntilEndOfDirective();
1332 }
Jay Foad9a6b0982011-06-21 15:13:30 +00001333 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
Mike Stump11289f42009-09-09 15:08:12 +00001334
Chris Lattner76e68962009-01-26 06:19:46 +00001335 // If a filename was present, read any flags that are present.
Mike Stump11289f42009-09-09 15:08:12 +00001336 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit,
Chris Lattnerb5fba6f2009-01-26 07:57:50 +00001337 IsSystemHeader, IsExternCHeader, *this))
Chris Lattner76e68962009-01-26 06:19:46 +00001338 return;
Chris Lattner76e68962009-01-26 06:19:46 +00001339 }
Mike Stump11289f42009-09-09 15:08:12 +00001340
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001341 // Create a line note with this information.
1342 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID,
Mike Stump11289f42009-09-09 15:08:12 +00001343 IsFileEntry, IsFileExit,
Chris Lattner0a1a8d82009-02-04 05:21:58 +00001344 IsSystemHeader, IsExternCHeader);
Mike Stump11289f42009-09-09 15:08:12 +00001345
Chris Lattner839150e2009-03-27 17:13:49 +00001346 // If the preprocessor has callbacks installed, notify them of the #line
1347 // change. This is used so that the line marker comes out in -E mode for
1348 // example.
1349 if (Callbacks) {
1350 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1351 if (IsFileEntry)
1352 Reason = PPCallbacks::EnterFile;
1353 else if (IsFileExit)
1354 Reason = PPCallbacks::ExitFile;
1355 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
1356 if (IsExternCHeader)
1357 FileKind = SrcMgr::C_ExternCSystem;
1358 else if (IsSystemHeader)
1359 FileKind = SrcMgr::C_System;
Mike Stump11289f42009-09-09 15:08:12 +00001360
Chris Lattnerc745cec2010-04-14 04:28:50 +00001361 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
Chris Lattner839150e2009-03-27 17:13:49 +00001362 }
Chris Lattner76e68962009-01-26 06:19:46 +00001363}
1364
Chris Lattner38d7fd22009-01-26 05:30:54 +00001365/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1366///
Mike Stump11289f42009-09-09 15:08:12 +00001367void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001368 bool isWarning) {
Chris Lattner38d7fd22009-01-26 05:30:54 +00001369 // PTH doesn't emit #warning or #error directives.
1370 if (CurPTHLexer)
Chris Lattner100c65e2009-01-26 05:29:08 +00001371 return CurPTHLexer->DiscardToEndOfLine();
1372
Chris Lattnerf64b3522008-03-09 01:54:53 +00001373 // Read the rest of the line raw. We do this because we don't want macros
1374 // to be expanded and we don't require that the tokens be valid preprocessing
1375 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
1376 // collapse multiple consequtive white space between tokens, but this isn't
1377 // specified by the standard.
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001378 SmallString<128> Message;
1379 CurLexer->ReadToEndOfLine(&Message);
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001380
1381 // Find the first non-whitespace character, so that we can make the
1382 // diagnostic more succinct.
David Majnemerbf7e0c62016-02-24 22:07:26 +00001383 StringRef Msg = StringRef(Message).ltrim(' ');
Benjamin Kramere5fbc6c2012-05-18 19:32:16 +00001384
Chris Lattner100c65e2009-01-26 05:29:08 +00001385 if (isWarning)
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001386 Diag(Tok, diag::pp_hash_warning) << Msg;
Chris Lattner100c65e2009-01-26 05:29:08 +00001387 else
Ted Kremenek7f4bd162012-02-02 00:16:13 +00001388 Diag(Tok, diag::err_pp_hash_error) << Msg;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001389}
1390
1391/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1392///
1393void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1394 // Yes, this directive is an extension.
1395 Diag(Tok, diag::ext_pp_ident_directive);
Mike Stump11289f42009-09-09 15:08:12 +00001396
Chris Lattnerf64b3522008-03-09 01:54:53 +00001397 // Read the string argument.
1398 Token StrTok;
1399 Lex(StrTok);
Mike Stump11289f42009-09-09 15:08:12 +00001400
Chris Lattnerf64b3522008-03-09 01:54:53 +00001401 // If the token kind isn't a string, it's a malformed directive.
1402 if (StrTok.isNot(tok::string_literal) &&
Chris Lattner907dfe92008-11-18 07:59:24 +00001403 StrTok.isNot(tok::wide_string_literal)) {
1404 Diag(StrTok, diag::err_pp_malformed_ident);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001405 if (StrTok.isNot(tok::eod))
Chris Lattner38d7fd22009-01-26 05:30:54 +00001406 DiscardUntilEndOfDirective();
Chris Lattner907dfe92008-11-18 07:59:24 +00001407 return;
1408 }
Mike Stump11289f42009-09-09 15:08:12 +00001409
Richard Smithd67aea22012-03-06 03:21:47 +00001410 if (StrTok.hasUDSuffix()) {
1411 Diag(StrTok, diag::err_invalid_string_udl);
1412 return DiscardUntilEndOfDirective();
1413 }
1414
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001415 // Verify that there is nothing after the string, other than EOD.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00001416 CheckEndOfDirective("ident");
Chris Lattnerf64b3522008-03-09 01:54:53 +00001417
Douglas Gregordc970f02010-03-16 22:30:13 +00001418 if (Callbacks) {
1419 bool Invalid = false;
1420 std::string Str = getSpelling(StrTok, &Invalid);
1421 if (!Invalid)
1422 Callbacks->Ident(Tok.getLocation(), Str);
1423 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00001424}
1425
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001426/// \brief Handle a #public directive.
1427void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001428 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001429 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001430
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001431 // Error reading macro name? If so, diagnostic already issued.
1432 if (MacroNameTok.is(tok::eod))
1433 return;
1434
Douglas Gregor663b48f2012-01-03 19:48:16 +00001435 // Check to see if this is the last token on the #__public_macro line.
1436 CheckEndOfDirective("__public_macro");
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001437
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001438 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001439 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001440 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001441
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001442 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001443 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001444 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001445 return;
1446 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001447
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001448 // Note that this macro has now been exported.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001449 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1450 MacroNameTok.getLocation(), /*IsPublic=*/true));
Douglas Gregorebf00492011-10-17 15:32:29 +00001451}
1452
Douglas Gregor0bf886d2012-01-03 18:24:14 +00001453/// \brief Handle a #private directive.
Erik Verbruggen4bddef92016-10-26 08:52:41 +00001454void Preprocessor::HandleMacroPrivateDirective() {
Douglas Gregorebf00492011-10-17 15:32:29 +00001455 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00001456 ReadMacroName(MacroNameTok, MU_Undef);
Taewook Oh755e4d22016-06-13 21:55:33 +00001457
Douglas Gregorebf00492011-10-17 15:32:29 +00001458 // Error reading macro name? If so, diagnostic already issued.
1459 if (MacroNameTok.is(tok::eod))
1460 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001461
Douglas Gregor663b48f2012-01-03 19:48:16 +00001462 // Check to see if this is the last token on the #__private_macro line.
1463 CheckEndOfDirective("__private_macro");
Taewook Oh755e4d22016-06-13 21:55:33 +00001464
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001465 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
Douglas Gregorebf00492011-10-17 15:32:29 +00001466 // Okay, we finally have a valid identifier to undef.
Richard Smith20e883e2015-04-29 23:20:19 +00001467 MacroDirective *MD = getLocalMacroDirective(II);
Taewook Oh755e4d22016-06-13 21:55:33 +00001468
Douglas Gregorebf00492011-10-17 15:32:29 +00001469 // If the macro is not defined, this is an error.
Craig Topperd2d442c2014-05-17 23:10:59 +00001470 if (!MD) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001471 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
Douglas Gregorebf00492011-10-17 15:32:29 +00001472 return;
1473 }
Taewook Oh755e4d22016-06-13 21:55:33 +00001474
Douglas Gregorebf00492011-10-17 15:32:29 +00001475 // Note that this macro has now been marked private.
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001476 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1477 MacroNameTok.getLocation(), /*IsPublic=*/false));
Douglas Gregor4a69c2e2011-09-01 17:04:32 +00001478}
1479
Chris Lattnerf64b3522008-03-09 01:54:53 +00001480//===----------------------------------------------------------------------===//
1481// Preprocessor Include Directive Handling.
1482//===----------------------------------------------------------------------===//
1483
1484/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
James Dennettf6333ac2012-06-22 05:46:07 +00001485/// checked and spelled filename, e.g. as an operand of \#include. This returns
Chris Lattnerf64b3522008-03-09 01:54:53 +00001486/// true if the input filename was in <>'s or false if it were in ""'s. The
1487/// caller is expected to provide a buffer that is large enough to hold the
1488/// spelling of the filename, but is also expected to handle the case when
1489/// this method decides to use a different buffer.
1490bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001491 StringRef &Buffer) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001492 // Get the text form of the filename.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001493 assert(!Buffer.empty() && "Can't have tokens with empty spellings!");
Mike Stump11289f42009-09-09 15:08:12 +00001494
Chris Lattnerf64b3522008-03-09 01:54:53 +00001495 // Make sure the filename is <x> or "x".
1496 bool isAngled;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001497 if (Buffer[0] == '<') {
1498 if (Buffer.back() != '>') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001499 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001500 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001501 return true;
1502 }
1503 isAngled = true;
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001504 } else if (Buffer[0] == '"') {
1505 if (Buffer.back() != '"') {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001506 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001507 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001508 return true;
1509 }
1510 isAngled = false;
1511 } else {
1512 Diag(Loc, diag::err_pp_expects_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001513 Buffer = StringRef();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001514 return true;
1515 }
Mike Stump11289f42009-09-09 15:08:12 +00001516
Chris Lattnerf64b3522008-03-09 01:54:53 +00001517 // Diagnose #include "" as invalid.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001518 if (Buffer.size() <= 2) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001519 Diag(Loc, diag::err_pp_empty_filename);
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001520 Buffer = StringRef();
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001521 return true;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001522 }
Mike Stump11289f42009-09-09 15:08:12 +00001523
Chris Lattnerf64b3522008-03-09 01:54:53 +00001524 // Skip the brackets.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001525 Buffer = Buffer.substr(1, Buffer.size()-2);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001526 return isAngled;
1527}
1528
James Dennett4a4f72d2013-11-27 01:27:40 +00001529// \brief Handle cases where the \#include name is expanded from a macro
1530// as multiple tokens, which need to be glued together.
1531//
1532// This occurs for code like:
1533// \code
1534// \#define FOO <a/b.h>
1535// \#include FOO
1536// \endcode
1537// because in this case, "<a/b.h>" is returned as 7 tokens, not one.
1538//
1539// This code concatenates and consumes tokens up to the '>' token. It returns
1540// false if the > was found, otherwise it returns true if it finds and consumes
1541// the EOD marker.
1542bool Preprocessor::ConcatenateIncludeName(SmallString<128> &FilenameBuffer,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001543 SourceLocation &End) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001544 Token CurTok;
Mike Stump11289f42009-09-09 15:08:12 +00001545
John Thompsonb5353522009-10-30 13:49:06 +00001546 Lex(CurTok);
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001547 while (CurTok.isNot(tok::eod)) {
Douglas Gregor796d76a2010-10-20 22:00:55 +00001548 End = CurTok.getLocation();
Taewook Oh755e4d22016-06-13 21:55:33 +00001549
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001550 // FIXME: Provide code completion for #includes.
1551 if (CurTok.is(tok::code_completion)) {
Argyrios Kyrtzidis5cec2ae2011-09-04 03:32:15 +00001552 setCodeCompletionReached();
Douglas Gregor9c7bd2f2010-12-09 23:35:36 +00001553 Lex(CurTok);
1554 continue;
1555 }
1556
Chris Lattnerf64b3522008-03-09 01:54:53 +00001557 // Append the spelling of this token to the buffer. If there was a space
1558 // before it, add it now.
1559 if (CurTok.hasLeadingSpace())
1560 FilenameBuffer.push_back(' ');
Mike Stump11289f42009-09-09 15:08:12 +00001561
Chris Lattnerf64b3522008-03-09 01:54:53 +00001562 // Get the spelling of the token, directly into FilenameBuffer if possible.
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001563 size_t PreAppendSize = FilenameBuffer.size();
Chris Lattnerf64b3522008-03-09 01:54:53 +00001564 FilenameBuffer.resize(PreAppendSize+CurTok.getLength());
Mike Stump11289f42009-09-09 15:08:12 +00001565
Chris Lattnerf64b3522008-03-09 01:54:53 +00001566 const char *BufPtr = &FilenameBuffer[PreAppendSize];
John Thompsonb5353522009-10-30 13:49:06 +00001567 unsigned ActualLen = getSpelling(CurTok, BufPtr);
Mike Stump11289f42009-09-09 15:08:12 +00001568
Chris Lattnerf64b3522008-03-09 01:54:53 +00001569 // If the token was spelled somewhere else, copy it into FilenameBuffer.
1570 if (BufPtr != &FilenameBuffer[PreAppendSize])
1571 memcpy(&FilenameBuffer[PreAppendSize], BufPtr, ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001572
Chris Lattnerf64b3522008-03-09 01:54:53 +00001573 // Resize FilenameBuffer to the correct size.
1574 if (CurTok.getLength() != ActualLen)
1575 FilenameBuffer.resize(PreAppendSize+ActualLen);
Mike Stump11289f42009-09-09 15:08:12 +00001576
Chris Lattnerf64b3522008-03-09 01:54:53 +00001577 // If we found the '>' marker, return success.
1578 if (CurTok.is(tok::greater))
1579 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001580
John Thompsonb5353522009-10-30 13:49:06 +00001581 Lex(CurTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001582 }
1583
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001584 // If we hit the eod marker, emit an error and return true so that the caller
1585 // knows the EOD has been read.
John Thompsonb5353522009-10-30 13:49:06 +00001586 Diag(CurTok.getLocation(), diag::err_pp_expects_filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001587 return true;
1588}
1589
Richard Smith34f30512013-11-23 04:06:09 +00001590/// \brief Push a token onto the token stream containing an annotation.
1591static void EnterAnnotationToken(Preprocessor &PP,
1592 SourceLocation Begin, SourceLocation End,
1593 tok::TokenKind Kind, void *AnnotationVal) {
Richard Smithdbbc5232015-05-14 02:25:44 +00001594 // FIXME: Produce this as the current token directly, rather than
1595 // allocating a new token for it.
David Blaikie2eabcc92016-02-09 18:52:09 +00001596 auto Tok = llvm::make_unique<Token[]>(1);
Richard Smith34f30512013-11-23 04:06:09 +00001597 Tok[0].startToken();
1598 Tok[0].setKind(Kind);
1599 Tok[0].setLocation(Begin);
1600 Tok[0].setAnnotationEndLoc(End);
1601 Tok[0].setAnnotationValue(AnnotationVal);
David Blaikie2eabcc92016-02-09 18:52:09 +00001602 PP.EnterTokenStream(std::move(Tok), 1, true);
Richard Smith34f30512013-11-23 04:06:09 +00001603}
1604
Richard Smith63b6fce2015-05-18 04:45:41 +00001605/// \brief Produce a diagnostic informing the user that a #include or similar
1606/// was implicitly treated as a module import.
1607static void diagnoseAutoModuleImport(
1608 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1609 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1610 SourceLocation PathEnd) {
1611 assert(PP.getLangOpts().ObjC2 && "no import syntax available");
1612
1613 SmallString<128> PathString;
Erik Verbruggen4d5b99a2016-10-26 09:58:31 +00001614 for (size_t I = 0, N = Path.size(); I != N; ++I) {
Richard Smith63b6fce2015-05-18 04:45:41 +00001615 if (I)
1616 PathString += '.';
1617 PathString += Path[I].first->getName();
1618 }
1619 int IncludeKind = 0;
Taewook Oh755e4d22016-06-13 21:55:33 +00001620
Richard Smith63b6fce2015-05-18 04:45:41 +00001621 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1622 case tok::pp_include:
1623 IncludeKind = 0;
1624 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001625
Richard Smith63b6fce2015-05-18 04:45:41 +00001626 case tok::pp_import:
1627 IncludeKind = 1;
Taewook Oh755e4d22016-06-13 21:55:33 +00001628 break;
1629
Richard Smith63b6fce2015-05-18 04:45:41 +00001630 case tok::pp_include_next:
1631 IncludeKind = 2;
1632 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001633
Richard Smith63b6fce2015-05-18 04:45:41 +00001634 case tok::pp___include_macros:
1635 IncludeKind = 3;
1636 break;
Taewook Oh755e4d22016-06-13 21:55:33 +00001637
Richard Smith63b6fce2015-05-18 04:45:41 +00001638 default:
1639 llvm_unreachable("unknown include directive kind");
1640 }
1641
1642 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1643 /*IsTokenRange=*/false);
1644 PP.Diag(HashLoc, diag::warn_auto_module_import)
1645 << IncludeKind << PathString
1646 << FixItHint::CreateReplacement(ReplaceRange,
1647 ("@import " + PathString + ";").str());
1648}
1649
Taewook Ohf42103c2016-06-13 20:40:21 +00001650// Given a vector of path components and a string containing the real
1651// path to the file, build a properly-cased replacement in the vector,
1652// and return true if the replacement should be suggested.
1653static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1654 StringRef RealPathName) {
1655 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1656 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1657 int Cnt = 0;
1658 bool SuggestReplacement = false;
1659 // Below is a best-effort to handle ".." in paths. It is admittedly
1660 // not 100% correct in the presence of symlinks.
1661 for (auto &Component : llvm::reverse(Components)) {
1662 if ("." == Component) {
1663 } else if (".." == Component) {
1664 ++Cnt;
1665 } else if (Cnt) {
1666 --Cnt;
1667 } else if (RealPathComponentIter != RealPathComponentEnd) {
1668 if (Component != *RealPathComponentIter) {
1669 // If these path components differ by more than just case, then we
1670 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1671 // noisy false positives.
1672 SuggestReplacement = RealPathComponentIter->equals_lower(Component);
1673 if (!SuggestReplacement)
1674 break;
1675 Component = *RealPathComponentIter;
1676 }
1677 ++RealPathComponentIter;
1678 }
1679 }
1680 return SuggestReplacement;
1681}
1682
James Dennettf6333ac2012-06-22 05:46:07 +00001683/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1684/// the file to be included from the lexer, then include it! This is a common
1685/// routine with functionality shared between \#include, \#include_next and
1686/// \#import. LookupFrom is set when this is a \#include_next directive, it
Mike Stump11289f42009-09-09 15:08:12 +00001687/// specifies the file to start searching from.
Taewook Oh755e4d22016-06-13 21:55:33 +00001688void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
Douglas Gregor796d76a2010-10-20 22:00:55 +00001689 Token &IncludeTok,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001690 const DirectoryLookup *LookupFrom,
Richard Smith25d50752014-10-20 00:15:49 +00001691 const FileEntry *LookupFromFile,
Chris Lattnerf64b3522008-03-09 01:54:53 +00001692 bool isImport) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001693 Token FilenameTok;
Ted Kremenek30cd88c2008-11-18 00:34:22 +00001694 CurPPLexer->LexIncludeFilename(FilenameTok);
Mike Stump11289f42009-09-09 15:08:12 +00001695
Chris Lattnerf64b3522008-03-09 01:54:53 +00001696 // Reserve a buffer to get the spelling.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001697 SmallString<128> FilenameBuffer;
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001698 StringRef Filename;
Douglas Gregor796d76a2010-10-20 22:00:55 +00001699 SourceLocation End;
Douglas Gregor41e115a2011-11-30 18:02:36 +00001700 SourceLocation CharEnd; // the end of this directive, in characters
Taewook Oh755e4d22016-06-13 21:55:33 +00001701
Chris Lattnerf64b3522008-03-09 01:54:53 +00001702 switch (FilenameTok.getKind()) {
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001703 case tok::eod:
1704 // If the token kind is EOD, the error has already been diagnosed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00001705 return;
Mike Stump11289f42009-09-09 15:08:12 +00001706
Chris Lattnerf64b3522008-03-09 01:54:53 +00001707 case tok::angle_string_literal:
Benjamin Kramer0a1abd42010-02-27 13:44:12 +00001708 case tok::string_literal:
1709 Filename = getSpelling(FilenameTok, FilenameBuffer);
Douglas Gregor796d76a2010-10-20 22:00:55 +00001710 End = FilenameTok.getLocation();
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001711 CharEnd = End.getLocWithOffset(FilenameTok.getLength());
Chris Lattnerf64b3522008-03-09 01:54:53 +00001712 break;
Mike Stump11289f42009-09-09 15:08:12 +00001713
Chris Lattnerf64b3522008-03-09 01:54:53 +00001714 case tok::less:
1715 // This could be a <foo/bar.h> file coming from a macro expansion. In this
1716 // case, glue the tokens together into FilenameBuffer and interpret those.
1717 FilenameBuffer.push_back('<');
Douglas Gregor796d76a2010-10-20 22:00:55 +00001718 if (ConcatenateIncludeName(FilenameBuffer, End))
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001719 return; // Found <eod> but no ">"? Diagnostic already emitted.
Yaron Keren92e1b622015-03-18 10:17:07 +00001720 Filename = FilenameBuffer;
Argyrios Kyrtzidis2edbc862012-11-01 17:52:58 +00001721 CharEnd = End.getLocWithOffset(1);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001722 break;
1723 default:
1724 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1725 DiscardUntilEndOfDirective();
1726 return;
1727 }
Mike Stump11289f42009-09-09 15:08:12 +00001728
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001729 CharSourceRange FilenameRange
1730 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
Aaron Ballman611306e2012-03-02 22:51:54 +00001731 StringRef OriginalFilename = Filename;
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001732 bool isAngled =
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001733 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001734 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1735 // error.
Chris Lattnerd081f8c2010-01-10 01:35:12 +00001736 if (Filename.empty()) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00001737 DiscardUntilEndOfDirective();
1738 return;
1739 }
Mike Stump11289f42009-09-09 15:08:12 +00001740
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00001741 // Verify that there is nothing after the filename, other than EOD. Note that
Chris Lattnerb40289b2009-04-17 23:56:52 +00001742 // we allow macros that expand to nothing after the filename, because this
1743 // falls into the category of "#include pp-tokens new-line" specified in
1744 // C99 6.10.2p4.
Daniel Dunbar2c422dc92009-10-18 20:26:12 +00001745 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00001746
1747 // Check that we don't have infinite #include recursion.
Chris Lattner907dfe92008-11-18 07:59:24 +00001748 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
1749 Diag(FilenameTok, diag::err_pp_include_too_deep);
1750 return;
1751 }
Mike Stump11289f42009-09-09 15:08:12 +00001752
John McCall32f5fe12011-09-30 05:12:12 +00001753 // Complain about attempts to #include files in an audit pragma.
1754 if (PragmaARCCFCodeAuditedLoc.isValid()) {
1755 Diag(HashLoc, diag::err_pp_include_in_arc_cf_code_audited);
1756 Diag(PragmaARCCFCodeAuditedLoc, diag::note_pragma_entered_here);
1757
1758 // Immediately leave the pragma.
1759 PragmaARCCFCodeAuditedLoc = SourceLocation();
1760 }
1761
Douglas Gregor2a20bd12015-06-19 18:25:57 +00001762 // Complain about attempts to #include files in an assume-nonnull pragma.
1763 if (PragmaAssumeNonNullLoc.isValid()) {
1764 Diag(HashLoc, diag::err_pp_include_in_assume_nonnull);
1765 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1766
1767 // Immediately leave the pragma.
1768 PragmaAssumeNonNullLoc = SourceLocation();
1769 }
1770
Aaron Ballman611306e2012-03-02 22:51:54 +00001771 if (HeaderInfo.HasIncludeAliasMap()) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001772 // Map the filename with the brackets still attached. If the name doesn't
1773 // map to anything, fall back on the filename we've already gotten the
Aaron Ballman611306e2012-03-02 22:51:54 +00001774 // spelling for.
1775 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1776 if (!NewName.empty())
1777 Filename = NewName;
1778 }
1779
Chris Lattnerf64b3522008-03-09 01:54:53 +00001780 // Search include directories.
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001781 bool IsMapped = false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00001782 const DirectoryLookup *CurDir;
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001783 SmallString<1024> SearchPath;
1784 SmallString<1024> RelativePath;
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001785 // We get the raw path only if we have 'Callbacks' to which we later pass
1786 // the path.
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001787 ModuleMap::KnownHeader SuggestedModule;
1788 SourceLocation FilenameLoc = FilenameTok.getLocation();
Saleem Abdulrasool729b7d32014-03-12 02:26:08 +00001789 SmallString<128> NormalizedPath;
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001790 if (LangOpts.MSVCCompat) {
1791 NormalizedPath = Filename.str();
Yaron Keren1801d1b2014-08-09 18:13:01 +00001792#ifndef LLVM_ON_WIN32
Rafael Espindolaf6002232014-08-08 21:31:04 +00001793 llvm::sys::path::native(NormalizedPath);
Yaron Keren1801d1b2014-08-09 18:13:01 +00001794#endif
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001795 }
Chandler Carruth3cc331a2011-03-16 18:34:36 +00001796 const FileEntry *File = LookupFile(
Saleem Abdulrasool19803412014-03-11 22:41:45 +00001797 FilenameLoc, LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename,
Richard Smith25d50752014-10-20 00:15:49 +00001798 isAngled, LookupFrom, LookupFromFile, CurDir,
1799 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001800 &SuggestedModule, &IsMapped);
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00001801
Richard Smithdbbc5232015-05-14 02:25:44 +00001802 if (!File) {
1803 if (Callbacks) {
Douglas Gregor11729f02011-11-30 18:12:06 +00001804 // Give the clients a chance to recover.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00001805 SmallString<128> RecoveryPath;
Douglas Gregor11729f02011-11-30 18:12:06 +00001806 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
1807 if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) {
1808 // Add the recovery path to the list of search paths.
Daniel Dunbarae4feb62013-01-25 01:50:28 +00001809 DirectoryLookup DL(DE, SrcMgr::C_User, false);
Douglas Gregor11729f02011-11-30 18:12:06 +00001810 HeaderInfo.AddSearchPath(DL, isAngled);
Taewook Oh755e4d22016-06-13 21:55:33 +00001811
Douglas Gregor11729f02011-11-30 18:12:06 +00001812 // Try the lookup again, skipping the cache.
Richard Smith25d50752014-10-20 00:15:49 +00001813 File = LookupFile(
1814 FilenameLoc,
1815 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1816 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001817 &SuggestedModule, &IsMapped, /*SkipCache*/ true);
Douglas Gregor11729f02011-11-30 18:12:06 +00001818 }
1819 }
1820 }
Craig Topperd2d442c2014-05-17 23:10:59 +00001821
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001822 if (!SuppressIncludeNotFoundError) {
Taewook Oh755e4d22016-06-13 21:55:33 +00001823 // If the file could not be located and it was included via angle
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001824 // brackets, we can attempt a lookup as though it were a quoted path to
1825 // provide the user with a possible fixit.
1826 if (isAngled) {
Daniel Jasper07e6c402013-08-05 20:26:17 +00001827 File = LookupFile(
Richard Smith25d50752014-10-20 00:15:49 +00001828 FilenameLoc,
1829 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, false,
1830 LookupFrom, LookupFromFile, CurDir,
1831 Callbacks ? &SearchPath : nullptr,
Duncan P. N. Exon Smithcfc1f6a2017-04-27 21:41:51 +00001832 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped);
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001833 if (File) {
1834 SourceRange Range(FilenameTok.getLocation(), CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001835 Diag(FilenameTok, diag::err_pp_file_not_found_not_fatal) <<
1836 Filename <<
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001837 FixItHint::CreateReplacement(Range, "\"" + Filename.str() + "\"");
1838 }
1839 }
Richard Smithdbbc5232015-05-14 02:25:44 +00001840
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001841 // If the file is still not found, just go with the vanilla diagnostic
1842 if (!File)
Erik Verbruggen45449542016-10-25 10:13:10 +00001843 Diag(FilenameTok, diag::err_pp_file_not_found) << Filename
1844 << FilenameRange;
Aaron Ballman8f94ac62012-07-17 23:19:16 +00001845 }
Douglas Gregor11729f02011-11-30 18:12:06 +00001846 }
1847
Richard Smith63b6fce2015-05-18 04:45:41 +00001848 // Should we enter the source file? Set to false if either the source file is
1849 // known to have no effect beyond its effect on module visibility -- that is,
1850 // if it's got an include guard that is already defined or is a modular header
1851 // we've imported or already built.
1852 bool ShouldEnter = true;
Richard Smithdbbc5232015-05-14 02:25:44 +00001853
Richard Smith63b6fce2015-05-18 04:45:41 +00001854 // Determine whether we should try to import the module for this #include, if
1855 // there is one. Don't do so if precompiled module support is disabled or we
1856 // are processing this module textually (because we're building the module).
1857 if (File && SuggestedModule && getLangOpts().Modules &&
1858 SuggestedModule.getModule()->getTopLevelModuleName() !=
Richard Smith7e82e012016-02-19 22:25:36 +00001859 getLangOpts().CurrentModule) {
Sean Silva8b7c0392015-08-17 16:39:30 +00001860 // If this include corresponds to a module but that module is
1861 // unavailable, diagnose the situation and bail out.
Richard Smith58df3432016-04-12 19:58:30 +00001862 // FIXME: Remove this; loadModule does the same check (but produces
1863 // slightly worse diagnostics).
Richard Smitha114c462016-12-06 00:40:17 +00001864 if (!SuggestedModule.getModule()->isAvailable()) {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00001865 Module::Requirement Requirement;
1866 Module::UnresolvedHeaderDirective MissingHeader;
Sean Silva8b7c0392015-08-17 16:39:30 +00001867 Module *M = SuggestedModule.getModule();
1868 // Identify the cause.
1869 (void)M->isAvailable(getLangOpts(), getTargetInfo(), Requirement,
1870 MissingHeader);
1871 if (MissingHeader.FileNameLoc.isValid()) {
1872 Diag(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1873 << MissingHeader.IsUmbrella << MissingHeader.FileName;
1874 } else {
1875 Diag(M->DefinitionLoc, diag::err_module_unavailable)
1876 << M->getFullModuleName() << Requirement.second << Requirement.first;
1877 }
1878 Diag(FilenameTok.getLocation(),
1879 diag::note_implicit_top_level_module_import_here)
1880 << M->getTopLevelModuleName();
1881 return;
1882 }
1883
Douglas Gregor71944202011-11-30 00:36:36 +00001884 // Compute the module access path corresponding to this module.
1885 // FIXME: Should we have a second loadModule() overload to avoid this
1886 // extra lookup step?
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001887 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001888 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
Douglas Gregor71944202011-11-30 00:36:36 +00001889 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
1890 FilenameTok.getLocation()));
1891 std::reverse(Path.begin(), Path.end());
1892
Douglas Gregor41e115a2011-11-30 18:02:36 +00001893 // Warn that we're replacing the include/import with a module import.
Richard Smith63b6fce2015-05-18 04:45:41 +00001894 // We only do this in Objective-C, where we have a module-import syntax.
1895 if (getLangOpts().ObjC2)
1896 diagnoseAutoModuleImport(*this, HashLoc, IncludeTok, Path, CharEnd);
Taewook Oh755e4d22016-06-13 21:55:33 +00001897
Richard Smith10434f32015-05-02 02:08:26 +00001898 // Load the module to import its macros. We'll make the declarations
Richard Smithce587f52013-11-15 04:24:58 +00001899 // visible when the parser gets here.
Richard Smithdbbc5232015-05-14 02:25:44 +00001900 // FIXME: Pass SuggestedModule in here rather than converting it to a path
1901 // and making the module loader convert it back again.
Richard Smith10434f32015-05-02 02:08:26 +00001902 ModuleLoadResult Imported = TheModuleLoader.loadModule(
1903 IncludeTok.getLocation(), Path, Module::Hidden,
1904 /*IsIncludeDirective=*/true);
Craig Topperd2d442c2014-05-17 23:10:59 +00001905 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&
Argyrios Kyrtzidis051b4432012-09-29 01:06:01 +00001906 "the imported module is different than the suggested one");
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001907
Richard Smith63b6fce2015-05-18 04:45:41 +00001908 if (Imported)
1909 ShouldEnter = false;
1910 else if (Imported.isMissingExpected()) {
1911 // We failed to find a submodule that we assumed would exist (because it
1912 // was in the directory of an umbrella header, for instance), but no
Richard Smitha114c462016-12-06 00:40:17 +00001913 // actual module containing it exists (because the umbrella header is
Richard Smith63b6fce2015-05-18 04:45:41 +00001914 // incomplete). Treat this as a textual inclusion.
1915 SuggestedModule = ModuleMap::KnownHeader();
Richard Smitha114c462016-12-06 00:40:17 +00001916 } else if (Imported.isConfigMismatch()) {
1917 // On a configuration mismatch, enter the header textually. We still know
1918 // that it's part of the corresponding module.
Richard Smith63b6fce2015-05-18 04:45:41 +00001919 } else {
1920 // We hit an error processing the import. Bail out.
1921 if (hadModuleLoaderFatalFailure()) {
1922 // With a fatal failure in the module loader, we abort parsing.
1923 Token &Result = IncludeTok;
1924 if (CurLexer) {
1925 Result.startToken();
1926 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
1927 CurLexer->cutOffLexing();
1928 } else {
1929 assert(CurPTHLexer && "#include but no current lexer set!");
1930 CurPTHLexer->getEOF(Result);
1931 }
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00001932 }
1933 return;
1934 }
Argyrios Kyrtzidis19d78b72012-09-29 01:06:10 +00001935 }
1936
Richard Smith63b6fce2015-05-18 04:45:41 +00001937 if (Callbacks) {
1938 // Notify the callback object that we've seen an inclusion directive.
1939 Callbacks->InclusionDirective(
1940 HashLoc, IncludeTok,
1941 LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
1942 FilenameRange, File, SearchPath, RelativePath,
1943 ShouldEnter ? nullptr : SuggestedModule.getModule());
Douglas Gregor97eec242011-09-15 22:00:41 +00001944 }
Richard Smith63b6fce2015-05-18 04:45:41 +00001945
1946 if (!File)
1947 return;
Taewook Oh755e4d22016-06-13 21:55:33 +00001948
Chris Lattnerc88a23e2008-09-26 20:12:23 +00001949 // The #included file will be considered to be a system header if either it is
1950 // in a system include directory, or if the #includer is a system include
1951 // header.
Mike Stump11289f42009-09-09 15:08:12 +00001952 SrcMgr::CharacteristicKind FileCharacter =
Chris Lattnerb03dc762008-09-26 21:18:42 +00001953 std::max(HeaderInfo.getFileDirFlavor(File),
Chris Lattnerc0334162009-01-19 07:59:15 +00001954 SourceMgr.getFileCharacteristic(FilenameTok.getLocation()));
Mike Stump11289f42009-09-09 15:08:12 +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
Chris Lattner72286d62010-04-19 20:44:31 +00001995 // Ask HeaderInfo if we should enter this #include file. If not, #including
Richard Smith54ef4c32015-05-19 19:58:11 +00001996 // this file will have no effect.
Manman Renffd3e9d2017-01-09 19:20:18 +00001997 bool SkipHeader = false;
Richard Smith63b6fce2015-05-18 04:45:41 +00001998 if (ShouldEnter &&
Richard Smith035f6dc2015-07-01 01:51:38 +00001999 !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport,
Bruno Cardoso Lopesba1b5c92017-01-11 02:14:51 +00002000 getLangOpts().Modules,
Richard Smith035f6dc2015-07-01 01:51:38 +00002001 SuggestedModule.getModule())) {
Richard Smith63b6fce2015-05-18 04:45:41 +00002002 ShouldEnter = false;
Manman Renffd3e9d2017-01-09 19:20:18 +00002003 SkipHeader = true;
Chris Lattnerfb24a3a2010-04-20 20:35:58 +00002004 if (Callbacks)
Chris Lattner72286d62010-04-19 20:44:31 +00002005 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
Richard Smith63b6fce2015-05-18 04:45:41 +00002006 }
Richard Smithdbbc5232015-05-14 02:25:44 +00002007
Richard Smith63b6fce2015-05-18 04:45:41 +00002008 // If we don't need to enter the file, stop now.
2009 if (!ShouldEnter) {
Richard Smithdbbc5232015-05-14 02:25:44 +00002010 // If this is a module import, make it visible if needed.
Richard Smitha0aafa32015-05-18 03:52:30 +00002011 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00002012 // When building a pch, -fmodule-name tells the compiler to textually
2013 // include headers in the specified module. But it is possible that
2014 // ShouldEnter is false because we are skipping the header. In that
2015 // case, We are not importing the specified module.
2016 if (SkipHeader && getLangOpts().CompilingPCH &&
2017 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2018 return;
2019
Richard Smitha0aafa32015-05-18 03:52:30 +00002020 makeModuleVisible(M, HashLoc);
Richard Smithdbbc5232015-05-14 02:25:44 +00002021
2022 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() !=
2023 tok::pp___include_macros)
Richard Smitha0aafa32015-05-18 03:52:30 +00002024 EnterAnnotationToken(*this, HashLoc, End, tok::annot_module_include, M);
Richard Smithdbbc5232015-05-14 02:25:44 +00002025 }
Chris Lattner72286d62010-04-19 20:44:31 +00002026 return;
2027 }
2028
Chris Lattnerf64b3522008-03-09 01:54:53 +00002029 // Look up the file, create a File ID for it.
Argyrios Kyrtzidisa9564502012-03-27 18:47:48 +00002030 SourceLocation IncludePos = End;
2031 // If the filename string was the result of macro expansions, set the include
2032 // position on the file where it will be included and after the expansions.
2033 if (IncludePos.isMacroID())
2034 IncludePos = SourceMgr.getExpansionRange(IncludePos).second;
2035 FileID FID = SourceMgr.createFileID(File, IncludePos, FileCharacter);
Yaron Keren8b563662015-10-03 10:46:20 +00002036 assert(FID.isValid() && "Expected valid file ID");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002037
Richard Smith34f30512013-11-23 04:06:09 +00002038 // If all is good, enter the new file!
Richard Smith67294e22014-01-31 20:47:44 +00002039 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
2040 return;
Richard Smith34f30512013-11-23 04:06:09 +00002041
Richard Smitha0aafa32015-05-18 03:52:30 +00002042 // Determine if we're switching to building a new submodule, and which one.
Richard Smitha0aafa32015-05-18 03:52:30 +00002043 if (auto *M = SuggestedModule.getModule()) {
Manman Renffd3e9d2017-01-09 19:20:18 +00002044 // When building a pch, -fmodule-name tells the compiler to textually
2045 // include headers in the specified module. We are not building the
2046 // specified module.
2047 if (getLangOpts().CompilingPCH &&
2048 M->getTopLevelModuleName() == getLangOpts().CurrentModule)
2049 return;
2050
Richard Smith67294e22014-01-31 20:47:44 +00002051 assert(!CurSubmodule && "should not have marked this as a module yet");
Richard Smitha0aafa32015-05-18 03:52:30 +00002052 CurSubmodule = M;
Richard Smith67294e22014-01-31 20:47:44 +00002053
Richard Smitha0aafa32015-05-18 03:52:30 +00002054 // Let the macro handling code know that any future macros are within
2055 // the new submodule.
2056 EnterSubmodule(M, HashLoc);
Richard Smithb8b2ed62015-04-23 18:18:26 +00002057
Richard Smitha0aafa32015-05-18 03:52:30 +00002058 // Let the parser know that any future declarations are within the new
2059 // submodule.
2060 // FIXME: There's no point doing this if we're handling a #__include_macros
2061 // directive.
2062 EnterAnnotationToken(*this, HashLoc, End, tok::annot_module_begin, M);
Richard Smith67294e22014-01-31 20:47:44 +00002063 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002064}
2065
James Dennettf6333ac2012-06-22 05:46:07 +00002066/// HandleIncludeNextDirective - Implements \#include_next.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002067///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002068void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2069 Token &IncludeNextTok) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002070 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
Mike Stump11289f42009-09-09 15:08:12 +00002071
Chris Lattnerf64b3522008-03-09 01:54:53 +00002072 // #include_next is like #include, except that we start searching after
2073 // the current found directory. If we can't do this, issue a
2074 // diagnostic.
2075 const DirectoryLookup *Lookup = CurDirLookup;
Richard Smith25d50752014-10-20 00:15:49 +00002076 const FileEntry *LookupFromFile = nullptr;
Erik Verbruggene0bde752016-10-27 14:17:10 +00002077 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2078 // If the main file is a header, then it's either for PCH/AST generation,
2079 // or libclang opened it. Either way, handle it as a normal include below
2080 // and do not complain about include_next.
2081 } else if (isInPrimaryFile()) {
Craig Topperd2d442c2014-05-17 23:10:59 +00002082 Lookup = nullptr;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002083 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
Richard Smith25d50752014-10-20 00:15:49 +00002084 } else if (CurSubmodule) {
2085 // Start looking up in the directory *after* the one in which the current
2086 // file would be found, if any.
2087 assert(CurPPLexer && "#include_next directive in macro?");
2088 LookupFromFile = CurPPLexer->getFileEntry();
2089 Lookup = nullptr;
Craig Topperd2d442c2014-05-17 23:10:59 +00002090 } else if (!Lookup) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002091 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2092 } else {
2093 // Start looking up in the next directory.
2094 ++Lookup;
2095 }
Mike Stump11289f42009-09-09 15:08:12 +00002096
Richard Smith25d50752014-10-20 00:15:49 +00002097 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2098 LookupFromFile);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002099}
2100
James Dennettf6333ac2012-06-22 05:46:07 +00002101/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
Aaron Ballman0467f552012-03-18 03:10:37 +00002102void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2103 // The Microsoft #import directive takes a type library and generates header
2104 // files from it, and includes those. This is beyond the scope of what clang
2105 // does, so we ignore it and error out. However, #import can optionally have
2106 // trailing attributes that span multiple lines. We're going to eat those
2107 // so we can continue processing from there.
2108 Diag(Tok, diag::err_pp_import_directive_ms );
2109
Taewook Oh755e4d22016-06-13 21:55:33 +00002110 // Read tokens until we get to the end of the directive. Note that the
Aaron Ballman0467f552012-03-18 03:10:37 +00002111 // directive can be split over multiple lines using the backslash character.
2112 DiscardUntilEndOfDirective();
2113}
2114
James Dennettf6333ac2012-06-22 05:46:07 +00002115/// HandleImportDirective - Implements \#import.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002116///
Douglas Gregor796d76a2010-10-20 22:00:55 +00002117void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2118 Token &ImportTok) {
Aaron Ballman0467f552012-03-18 03:10:37 +00002119 if (!LangOpts.ObjC1) { // #import is standard for ObjC.
Alp Tokerbfa39342014-01-14 12:51:41 +00002120 if (LangOpts.MSVCCompat)
Aaron Ballman0467f552012-03-18 03:10:37 +00002121 return HandleMicrosoftImportDirective(ImportTok);
Chris Lattnerd4a96732009-03-06 04:28:03 +00002122 Diag(ImportTok, diag::ext_pp_import_directive);
Aaron Ballman0467f552012-03-18 03:10:37 +00002123 }
Richard Smith25d50752014-10-20 00:15:49 +00002124 return HandleIncludeDirective(HashLoc, ImportTok, nullptr, nullptr, true);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002125}
2126
Chris Lattner58a1eb02009-04-08 18:46:40 +00002127/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2128/// pseudo directive in the predefines buffer. This handles it by sucking all
2129/// tokens through the preprocessor and discarding them (only keeping the side
2130/// effects on the preprocessor).
Douglas Gregor796d76a2010-10-20 22:00:55 +00002131void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2132 Token &IncludeMacrosTok) {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002133 // This directive should only occur in the predefines buffer. If not, emit an
2134 // error and reject it.
2135 SourceLocation Loc = IncludeMacrosTok.getLocation();
Mehdi Amini99d1b292016-10-01 16:38:28 +00002136 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
Chris Lattner58a1eb02009-04-08 18:46:40 +00002137 Diag(IncludeMacrosTok.getLocation(),
2138 diag::pp_include_macros_out_of_predefines);
2139 DiscardUntilEndOfDirective();
2140 return;
2141 }
Mike Stump11289f42009-09-09 15:08:12 +00002142
Chris Lattnere01d82b2009-04-08 20:53:24 +00002143 // Treat this as a normal #include for checking purposes. If this is
2144 // successful, it will push a new lexer onto the include stack.
Richard Smith25d50752014-10-20 00:15:49 +00002145 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
Mike Stump11289f42009-09-09 15:08:12 +00002146
Chris Lattnere01d82b2009-04-08 20:53:24 +00002147 Token TmpTok;
2148 do {
2149 Lex(TmpTok);
2150 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
2151 } while (TmpTok.isNot(tok::hashhash));
Chris Lattner58a1eb02009-04-08 18:46:40 +00002152}
2153
Chris Lattnerf64b3522008-03-09 01:54:53 +00002154//===----------------------------------------------------------------------===//
2155// Preprocessor Macro Directive Handling.
2156//===----------------------------------------------------------------------===//
2157
2158/// ReadMacroDefinitionArgList - The ( starting an argument list of a macro
2159/// definition has just been read. Lex the rest of the arguments and the
2160/// closing ), updating MI with what we learn. Return true if an error occurs
2161/// parsing the arg list.
Abramo Bagnarac9e48c02012-03-31 20:17:27 +00002162bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI, Token &Tok) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002163 SmallVector<IdentifierInfo*, 32> Arguments;
Mike Stump11289f42009-09-09 15:08:12 +00002164
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002165 while (true) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002166 LexUnexpandedToken(Tok);
2167 switch (Tok.getKind()) {
2168 case tok::r_paren:
2169 // Found the end of the argument list.
Chris Lattnerf87c5102009-02-20 22:31:31 +00002170 if (Arguments.empty()) // #define FOO()
Chris Lattnerf64b3522008-03-09 01:54:53 +00002171 return false;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002172 // Otherwise we have #define FOO(A,)
2173 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2174 return true;
2175 case tok::ellipsis: // #define X(... -> C99 varargs
David Blaikiebbafb8a2012-03-11 07:00:24 +00002176 if (!LangOpts.C99)
Taewook Oh755e4d22016-06-13 21:55:33 +00002177 Diag(Tok, LangOpts.CPlusPlus11 ?
Richard Smithacd4d3d2011-10-15 01:18:56 +00002178 diag::warn_cxx98_compat_variadic_macro :
2179 diag::ext_variadic_macro);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002180
Joey Gouly1d58cdb2013-01-17 17:35:00 +00002181 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2182 if (LangOpts.OpenCL) {
2183 Diag(Tok, diag::err_pp_opencl_variadic_macros);
2184 return true;
2185 }
2186
Chris Lattnerf64b3522008-03-09 01:54:53 +00002187 // Lex the token after the identifier.
2188 LexUnexpandedToken(Tok);
2189 if (Tok.isNot(tok::r_paren)) {
2190 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2191 return true;
2192 }
2193 // Add the __VA_ARGS__ identifier as an argument.
2194 Arguments.push_back(Ident__VA_ARGS__);
2195 MI->setIsC99Varargs();
Craig Topperd96b3f92015-10-22 04:59:52 +00002196 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002197 return false;
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002198 case tok::eod: // #define X(
Chris Lattnerf64b3522008-03-09 01:54:53 +00002199 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2200 return true;
2201 default:
2202 // Handle keywords and identifiers here to accept things like
2203 // #define Foo(for) for.
2204 IdentifierInfo *II = Tok.getIdentifierInfo();
Craig Topperd2d442c2014-05-17 23:10:59 +00002205 if (!II) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002206 // #define X(1
2207 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2208 return true;
2209 }
2210
2211 // If this is already used as an argument, it is used multiple times (e.g.
2212 // #define X(A,A.
Mike Stump11289f42009-09-09 15:08:12 +00002213 if (std::find(Arguments.begin(), Arguments.end(), II) !=
Chris Lattnerf64b3522008-03-09 01:54:53 +00002214 Arguments.end()) { // C99 6.10.3p6
Chris Lattnerc5cdade2008-11-19 07:33:58 +00002215 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002216 return true;
2217 }
Mike Stump11289f42009-09-09 15:08:12 +00002218
Chris Lattnerf64b3522008-03-09 01:54:53 +00002219 // Add the argument to the macro info.
2220 Arguments.push_back(II);
Mike Stump11289f42009-09-09 15:08:12 +00002221
Chris Lattnerf64b3522008-03-09 01:54:53 +00002222 // Lex the token after the identifier.
2223 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002224
Chris Lattnerf64b3522008-03-09 01:54:53 +00002225 switch (Tok.getKind()) {
2226 default: // #define X(A B
2227 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2228 return true;
2229 case tok::r_paren: // #define X(A)
Craig Topperd96b3f92015-10-22 04:59:52 +00002230 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002231 return false;
2232 case tok::comma: // #define X(A,
2233 break;
2234 case tok::ellipsis: // #define X(A... -> GCC extension
2235 // Diagnose extension.
2236 Diag(Tok, diag::ext_named_variadic_macro);
Mike Stump11289f42009-09-09 15:08:12 +00002237
Chris Lattnerf64b3522008-03-09 01:54:53 +00002238 // Lex the token after the identifier.
2239 LexUnexpandedToken(Tok);
2240 if (Tok.isNot(tok::r_paren)) {
2241 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2242 return true;
2243 }
Mike Stump11289f42009-09-09 15:08:12 +00002244
Chris Lattnerf64b3522008-03-09 01:54:53 +00002245 MI->setIsGNUVarargs();
Craig Topperd96b3f92015-10-22 04:59:52 +00002246 MI->setArgumentList(Arguments, BP);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002247 return false;
2248 }
2249 }
2250 }
2251}
2252
Serge Pavlov07c0f042014-12-18 11:14:21 +00002253static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2254 const LangOptions &LOptions) {
2255 if (MI->getNumTokens() == 1) {
2256 const Token &Value = MI->getReplacementToken(0);
2257
2258 // Macro that is identity, like '#define inline inline' is a valid pattern.
2259 if (MacroName.getKind() == Value.getKind())
2260 return true;
2261
2262 // Macro that maps a keyword to the same keyword decorated with leading/
2263 // trailing underscores is a valid pattern:
2264 // #define inline __inline
2265 // #define inline __inline__
2266 // #define inline _inline (in MS compatibility mode)
2267 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2268 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2269 if (!II->isKeyword(LOptions))
2270 return false;
2271 StringRef ValueText = II->getName();
2272 StringRef TrimmedValue = ValueText;
2273 if (!ValueText.startswith("__")) {
2274 if (ValueText.startswith("_"))
2275 TrimmedValue = TrimmedValue.drop_front(1);
2276 else
2277 return false;
2278 } else {
2279 TrimmedValue = TrimmedValue.drop_front(2);
2280 if (TrimmedValue.endswith("__"))
2281 TrimmedValue = TrimmedValue.drop_back(2);
2282 }
2283 return TrimmedValue.equals(MacroText);
2284 } else {
2285 return false;
2286 }
2287 }
2288
2289 // #define inline
Alexander Kornienkoa26c4952015-12-28 15:30:42 +00002290 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2291 tok::kw_const) &&
2292 MI->getNumTokens() == 0;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002293}
2294
James Dennettf6333ac2012-06-22 05:46:07 +00002295/// HandleDefineDirective - Implements \#define. This consumes the entire macro
Chris Lattnerf64b3522008-03-09 01:54:53 +00002296/// line then lets the caller lex the next real token.
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002297void Preprocessor::HandleDefineDirective(Token &DefineTok,
2298 bool ImmediatelyAfterHeaderGuard) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002299 ++NumDefined;
2300
2301 Token MacroNameTok;
Serge Pavlov07c0f042014-12-18 11:14:21 +00002302 bool MacroShadowsKeyword;
2303 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
Mike Stump11289f42009-09-09 15:08:12 +00002304
Chris Lattnerf64b3522008-03-09 01:54:53 +00002305 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002306 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002307 return;
2308
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002309 Token LastTok = MacroNameTok;
2310
Chris Lattnerf64b3522008-03-09 01:54:53 +00002311 // If we are supposed to keep comments in #defines, reenable comment saving
2312 // mode.
Ted Kremenek59e003e2008-11-18 00:43:07 +00002313 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
Mike Stump11289f42009-09-09 15:08:12 +00002314
Chris Lattnerf64b3522008-03-09 01:54:53 +00002315 // Create the new macro.
Ted Kremenek6c7ea112008-12-15 19:56:42 +00002316 MacroInfo *MI = AllocateMacroInfo(MacroNameTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002317
Chris Lattnerf64b3522008-03-09 01:54:53 +00002318 Token Tok;
2319 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002320
Chris Lattnerf64b3522008-03-09 01:54:53 +00002321 // If this is a function-like macro definition, parse the argument list,
2322 // marking each of the identifiers as being used as macro arguments. Also,
2323 // check other constraints on the first token of the macro body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002324 if (Tok.is(tok::eod)) {
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002325 if (ImmediatelyAfterHeaderGuard) {
2326 // Save this macro information since it may part of a header guard.
2327 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2328 MacroNameTok.getLocation());
2329 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002330 // If there is no body to this macro, we have no special handling here.
Chris Lattner2425bcb2009-04-18 02:23:25 +00002331 } else if (Tok.hasLeadingSpace()) {
2332 // This is a normal token with leading space. Clear the leading space
2333 // marker on the first token to get proper expansion.
2334 Tok.clearFlag(Token::LeadingSpace);
2335 } else if (Tok.is(tok::l_paren)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002336 // This is a function-like macro definition. Read the argument list.
2337 MI->setIsFunctionLike();
Abramo Bagnarac9e48c02012-03-31 20:17:27 +00002338 if (ReadMacroDefinitionArgList(MI, LastTok)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002339 // Throw away the rest of the line.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002340 if (CurPPLexer->ParsingPreprocessorDirective)
Chris Lattnerf64b3522008-03-09 01:54:53 +00002341 DiscardUntilEndOfDirective();
2342 return;
2343 }
2344
Chris Lattner249c38b2009-04-19 18:26:34 +00002345 // If this is a definition of a variadic C99 function-like macro, not using
2346 // the GNU named varargs extension, enabled __VA_ARGS__.
Mike Stump11289f42009-09-09 15:08:12 +00002347
Chris Lattner249c38b2009-04-19 18:26:34 +00002348 // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
2349 // This gets unpoisoned where it is allowed.
2350 assert(Ident__VA_ARGS__->isPoisoned() && "__VA_ARGS__ should be poisoned!");
2351 if (MI->isC99Varargs())
2352 Ident__VA_ARGS__->setIsPoisoned(false);
Mike Stump11289f42009-09-09 15:08:12 +00002353
Chris Lattnerf64b3522008-03-09 01:54:53 +00002354 // Read the first token after the arg list for down below.
2355 LexUnexpandedToken(Tok);
Richard Smith2bf7fdb2013-01-02 11:42:31 +00002356 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002357 // C99 requires whitespace between the macro definition and the body. Emit
2358 // a diagnostic for something like "#define X+".
Chris Lattner2425bcb2009-04-18 02:23:25 +00002359 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002360 } else {
Chris Lattner2425bcb2009-04-18 02:23:25 +00002361 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2362 // first character of a replacement list is not a character required by
2363 // subclause 5.2.1, then there shall be white-space separation between the
2364 // identifier and the replacement list.". 5.2.1 lists this set:
2365 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2366 // is irrelevant here.
2367 bool isInvalid = false;
2368 if (Tok.is(tok::at)) // @ is not in the list above.
2369 isInvalid = true;
2370 else if (Tok.is(tok::unknown)) {
2371 // If we have an unknown token, it is something strange like "`". Since
2372 // all of valid characters would have lexed into a single character
2373 // token of some sort, we know this is not a valid case.
2374 isInvalid = true;
2375 }
2376 if (isInvalid)
2377 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2378 else
2379 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002380 }
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002381
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002382 if (!Tok.is(tok::eod))
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002383 LastTok = Tok;
2384
Chris Lattnerf64b3522008-03-09 01:54:53 +00002385 // Read the rest of the macro body.
2386 if (MI->isObjectLike()) {
2387 // Object-like macros are very simple, just read their body.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002388 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002389 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002390 MI->AddTokenToBody(Tok);
2391 // Get the next token of the macro.
2392 LexUnexpandedToken(Tok);
2393 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002394 } else {
Chris Lattner83bd8282009-05-25 17:16:10 +00002395 // Otherwise, read the body of a function-like macro. While we are at it,
2396 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2397 // parameters in function-like macro expansions.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002398 while (Tok.isNot(tok::eod)) {
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002399 LastTok = Tok;
Chris Lattnerf64b3522008-03-09 01:54:53 +00002400
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002401 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002402 MI->AddTokenToBody(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002403
Chris Lattnerf64b3522008-03-09 01:54:53 +00002404 // Get the next token of the macro.
2405 LexUnexpandedToken(Tok);
2406 continue;
2407 }
Mike Stump11289f42009-09-09 15:08:12 +00002408
Richard Smith701a3522013-07-09 01:00:29 +00002409 // If we're in -traditional mode, then we should ignore stringification
2410 // and token pasting. Mark the tokens as unknown so as not to confuse
2411 // things.
2412 if (getLangOpts().TraditionalCPP) {
2413 Tok.setKind(tok::unknown);
2414 MI->AddTokenToBody(Tok);
2415
2416 // Get the next token of the macro.
2417 LexUnexpandedToken(Tok);
2418 continue;
2419 }
2420
Eli Friedman14d3c792012-11-14 02:18:46 +00002421 if (Tok.is(tok::hashhash)) {
Eli Friedman14d3c792012-11-14 02:18:46 +00002422 // If we see token pasting, check if it looks like the gcc comma
2423 // pasting extension. We'll use this information to suppress
2424 // diagnostics later on.
Taewook Oh755e4d22016-06-13 21:55:33 +00002425
Eli Friedman14d3c792012-11-14 02:18:46 +00002426 // Get the next token of the macro.
2427 LexUnexpandedToken(Tok);
2428
2429 if (Tok.is(tok::eod)) {
2430 MI->AddTokenToBody(LastTok);
2431 break;
2432 }
2433
2434 unsigned NumTokens = MI->getNumTokens();
2435 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2436 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2437 MI->setHasCommaPasting();
2438
David Majnemer76faf1f2013-11-05 09:30:17 +00002439 // Things look ok, add the '##' token to the macro.
Eli Friedman14d3c792012-11-14 02:18:46 +00002440 MI->AddTokenToBody(LastTok);
Eli Friedman14d3c792012-11-14 02:18:46 +00002441 continue;
2442 }
2443
Chris Lattnerf64b3522008-03-09 01:54:53 +00002444 // Get the next token of the macro.
2445 LexUnexpandedToken(Tok);
Mike Stump11289f42009-09-09 15:08:12 +00002446
Chris Lattner83bd8282009-05-25 17:16:10 +00002447 // Check for a valid macro arg identifier.
Craig Topperd2d442c2014-05-17 23:10:59 +00002448 if (Tok.getIdentifierInfo() == nullptr ||
Chris Lattner83bd8282009-05-25 17:16:10 +00002449 MI->getArgumentNum(Tok.getIdentifierInfo()) == -1) {
2450
2451 // If this is assembler-with-cpp mode, we accept random gibberish after
2452 // the '#' because '#' is often a comment character. However, change
2453 // the kind of the token to tok::unknown so that the preprocessor isn't
2454 // confused.
David Blaikiebbafb8a2012-03-11 07:00:24 +00002455 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
Chris Lattner83bd8282009-05-25 17:16:10 +00002456 LastTok.setKind(tok::unknown);
Eli Friedmancdf8b882013-06-18 21:33:38 +00002457 MI->AddTokenToBody(LastTok);
2458 continue;
Chris Lattner83bd8282009-05-25 17:16:10 +00002459 } else {
Andy Gibbs6f8cfccb2016-04-01 19:02:20 +00002460 Diag(Tok, diag::err_pp_stringize_not_parameter)
2461 << LastTok.is(tok::hashat);
Mike Stump11289f42009-09-09 15:08:12 +00002462
Chris Lattner83bd8282009-05-25 17:16:10 +00002463 // Disable __VA_ARGS__ again.
2464 Ident__VA_ARGS__->setIsPoisoned(true);
2465 return;
2466 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002467 }
Mike Stump11289f42009-09-09 15:08:12 +00002468
Chris Lattner83bd8282009-05-25 17:16:10 +00002469 // Things look ok, add the '#' and param name tokens to the macro.
2470 MI->AddTokenToBody(LastTok);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002471 MI->AddTokenToBody(Tok);
Chris Lattner83bd8282009-05-25 17:16:10 +00002472 LastTok = Tok;
Mike Stump11289f42009-09-09 15:08:12 +00002473
Chris Lattnerf64b3522008-03-09 01:54:53 +00002474 // Get the next token of the macro.
2475 LexUnexpandedToken(Tok);
2476 }
2477 }
Mike Stump11289f42009-09-09 15:08:12 +00002478
Serge Pavlov07c0f042014-12-18 11:14:21 +00002479 if (MacroShadowsKeyword &&
2480 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2481 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
2482 }
Mike Stump11289f42009-09-09 15:08:12 +00002483
Chris Lattnerf64b3522008-03-09 01:54:53 +00002484 // Disable __VA_ARGS__ again.
2485 Ident__VA_ARGS__->setIsPoisoned(true);
2486
Chris Lattner57540c52011-04-15 05:22:18 +00002487 // Check that there is no paste (##) operator at the beginning or end of the
Chris Lattnerf64b3522008-03-09 01:54:53 +00002488 // replacement list.
2489 unsigned NumTokens = MI->getNumTokens();
2490 if (NumTokens != 0) {
2491 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2492 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002493 return;
2494 }
2495 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2496 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002497 return;
2498 }
2499 }
Mike Stump11289f42009-09-09 15:08:12 +00002500
Chris Lattnerd6e97af2009-04-21 04:46:33 +00002501 MI->setDefinitionEndLoc(LastTok.getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002502
Chris Lattnerf64b3522008-03-09 01:54:53 +00002503 // Finally, if this identifier already had a macro defined for it, verify that
Alexander Kornienko8b3f6232012-08-29 00:20:03 +00002504 // the macro bodies are identical, and issue diagnostics if they are not.
Argyrios Kyrtzidis09c9e812013-02-20 00:54:57 +00002505 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
John McCall83760372015-12-10 23:31:01 +00002506 // In Objective-C, ignore attempts to directly redefine the builtin
2507 // definitions of the ownership qualifiers. It's still possible to
2508 // #undef them.
2509 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2510 return II->isStr("__strong") ||
2511 II->isStr("__weak") ||
2512 II->isStr("__unsafe_unretained") ||
2513 II->isStr("__autoreleasing");
2514 };
2515 if (getLangOpts().ObjC1 &&
2516 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2517 == getPredefinesFileID() &&
2518 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2519 // Warn if it changes the tokens.
2520 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2521 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2522 !MI->isIdenticalTo(*OtherMI, *this,
2523 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2524 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2525 }
2526 assert(!OtherMI->isWarnIfUnused());
2527 return;
2528 }
2529
Chris Lattner5244f342009-01-16 19:50:11 +00002530 // It is very common for system headers to have tons of macro redefinitions
2531 // and for warnings to be disabled in system headers. If this is the case,
2532 // then don't bother calling MacroInfo::isIdenticalTo.
Chris Lattner80c21df2009-03-13 21:17:23 +00002533 if (!getDiagnostics().getSuppressSystemWarnings() ||
Chris Lattner5244f342009-01-16 19:50:11 +00002534 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002535 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
Chris Lattner5244f342009-01-16 19:50:11 +00002536 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002537
Taewook Oh755e4d22016-06-13 21:55:33 +00002538 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
Richard Smith7b242542013-03-06 00:46:00 +00002539 // C++ [cpp.predefined]p4, but allow it as an extension.
2540 if (OtherMI->isBuiltinMacro())
2541 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
Chris Lattnerc0a585d2010-08-17 15:55:45 +00002542 // Macros must be identical. This means all tokens and whitespace
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002543 // separation must be the same. C99 6.10.3p2.
Richard Smith7b242542013-03-06 00:46:00 +00002544 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
Argyrios Kyrtzidis0c2f30b2013-04-03 17:39:30 +00002545 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
Chris Lattner5244f342009-01-16 19:50:11 +00002546 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2547 << MacroNameTok.getIdentifierInfo();
2548 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2549 }
Chris Lattnerf64b3522008-03-09 01:54:53 +00002550 }
Argyrios Kyrtzidisb495cc12011-01-18 19:50:15 +00002551 if (OtherMI->isWarnIfUnused())
2552 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002553 }
Mike Stump11289f42009-09-09 15:08:12 +00002554
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002555 DefMacroDirective *MD =
2556 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
Mike Stump11289f42009-09-09 15:08:12 +00002557
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002558 assert(!MI->isUsed());
2559 // If we need warning for not using the macro, add its location in the
2560 // warn-because-unused-macro set. If it gets used it will be removed from set.
Eli Friedman5ba37d52013-08-22 00:27:10 +00002561 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
Alp Tokerd4a3f0e2014-06-15 23:30:39 +00002562 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc())) {
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002563 MI->setIsWarnIfUnused(true);
2564 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2565 }
2566
Chris Lattner928e9092009-04-12 01:39:54 +00002567 // If the callbacks want to know, tell them about the macro definition.
2568 if (Callbacks)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002569 Callbacks->MacroDefined(MacroNameTok, MD);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002570}
2571
James Dennettf6333ac2012-06-22 05:46:07 +00002572/// HandleUndefDirective - Implements \#undef.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002573///
Erik Verbruggen4bddef92016-10-26 08:52:41 +00002574void Preprocessor::HandleUndefDirective() {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002575 ++NumUndefined;
2576
2577 Token MacroNameTok;
Serge Pavlovd024f522014-10-24 17:31:32 +00002578 ReadMacroName(MacroNameTok, MU_Undef);
Mike Stump11289f42009-09-09 15:08:12 +00002579
Chris Lattnerf64b3522008-03-09 01:54:53 +00002580 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002581 if (MacroNameTok.is(tok::eod))
Chris Lattnerf64b3522008-03-09 01:54:53 +00002582 return;
Mike Stump11289f42009-09-09 15:08:12 +00002583
Chris Lattnerf64b3522008-03-09 01:54:53 +00002584 // Check to see if this is the last token on the #undef line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002585 CheckEndOfDirective("undef");
Mike Stump11289f42009-09-09 15:08:12 +00002586
Richard Smith20e883e2015-04-29 23:20:19 +00002587 // Okay, we have a valid identifier to undef.
2588 auto *II = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002589 auto MD = getMacroDefinition(II);
Vedant Kumar349a6242017-04-26 21:05:44 +00002590 UndefMacroDirective *Undef = nullptr;
2591
2592 // If the macro is not defined, this is a noop undef.
2593 if (const MacroInfo *MI = MD.getMacroInfo()) {
2594 if (!MI->isUsed() && MI->isWarnIfUnused())
2595 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
2596
2597 if (MI->isWarnIfUnused())
2598 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
2599
2600 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
2601 }
Mike Stump11289f42009-09-09 15:08:12 +00002602
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002603 // If the callbacks want to know, tell them about the macro #undef.
2604 // Note: no matter if the macro was defined or not.
Richard Smith36bd40d2015-05-04 03:15:40 +00002605 if (Callbacks)
Vedant Kumar349a6242017-04-26 21:05:44 +00002606 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
Argyrios Kyrtzidis99b0a6a2013-01-16 16:52:44 +00002607
Vedant Kumar349a6242017-04-26 21:05:44 +00002608 if (Undef)
2609 appendMacroDirective(II, Undef);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002610}
2611
Chris Lattnerf64b3522008-03-09 01:54:53 +00002612//===----------------------------------------------------------------------===//
2613// Preprocessor Conditional Directive Handling.
2614//===----------------------------------------------------------------------===//
2615
James Dennettf6333ac2012-06-22 05:46:07 +00002616/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
2617/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
2618/// true if any tokens have been returned or pp-directives activated before this
2619/// \#ifndef has been lexed.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002620///
2621void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
2622 bool ReadAnyTokensBeforeDirective) {
2623 ++NumIf;
2624 Token DirectiveTok = Result;
2625
2626 Token MacroNameTok;
2627 ReadMacroName(MacroNameTok);
Mike Stump11289f42009-09-09 15:08:12 +00002628
Chris Lattnerf64b3522008-03-09 01:54:53 +00002629 // Error reading macro name? If so, diagnostic already issued.
Peter Collingbourne2f1e36b2011-02-28 02:37:51 +00002630 if (MacroNameTok.is(tok::eod)) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002631 // Skip code until we get to #endif. This helps with recovery by not
2632 // emitting an error when the #endif is reached.
2633 SkipExcludedConditionalBlock(DirectiveTok.getLocation(),
2634 /*Foundnonskip*/false, /*FoundElse*/false);
2635 return;
2636 }
Mike Stump11289f42009-09-09 15:08:12 +00002637
Chris Lattnerf64b3522008-03-09 01:54:53 +00002638 // Check to see if this is the last token on the #if[n]def line.
Chris Lattnerce2ab6f2009-04-14 05:07:49 +00002639 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
Chris Lattnerf64b3522008-03-09 01:54:53 +00002640
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002641 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
Richard Smith36bd40d2015-05-04 03:15:40 +00002642 auto MD = getMacroDefinition(MII);
2643 MacroInfo *MI = MD.getMacroInfo();
Kovarththanan Rajaratnamba2c6522010-03-13 10:17:05 +00002644
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002645 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002646 // If the start of a top-level #ifdef and if the macro is not defined,
2647 // inform MIOpt that this might be the start of a proper include guard.
2648 // Otherwise it is some other form of unknown conditional which we can't
2649 // handle.
Craig Topperd2d442c2014-05-17 23:10:59 +00002650 if (!ReadAnyTokensBeforeDirective && !MI) {
Chris Lattnerf64b3522008-03-09 01:54:53 +00002651 assert(isIfndef && "#ifdef shouldn't reach here");
Richard Trieu33a4b3d2013-06-12 21:20:57 +00002652 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002653 } else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002654 CurPPLexer->MIOpt.EnterTopLevelConditional();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002655 }
2656
Chris Lattnerf64b3522008-03-09 01:54:53 +00002657 // If there is a macro, process it.
2658 if (MI) // Mark it used.
Argyrios Kyrtzidis1cb0de12010-12-15 18:44:22 +00002659 markMacroAsUsed(MI);
Mike Stump11289f42009-09-09 15:08:12 +00002660
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002661 if (Callbacks) {
2662 if (isIfndef)
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002663 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002664 else
Argyrios Kyrtzidisfead64b2013-02-24 00:05:14 +00002665 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002666 }
2667
Chris Lattnerf64b3522008-03-09 01:54:53 +00002668 // Should we include the stuff contained by this directive?
2669 if (!MI == isIfndef) {
2670 // Yes, remember that we are inside a conditional, then lex the next token.
Chris Lattner8cf1f932009-12-14 04:54:40 +00002671 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
2672 /*wasskip*/false, /*foundnonskip*/true,
2673 /*foundelse*/false);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002674 } else {
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002675 // No, skip the contents of this block.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002676 SkipExcludedConditionalBlock(DirectiveTok.getLocation(),
Mike Stump11289f42009-09-09 15:08:12 +00002677 /*Foundnonskip*/false,
Chris Lattnerf64b3522008-03-09 01:54:53 +00002678 /*FoundElse*/false);
2679 }
2680}
2681
James Dennettf6333ac2012-06-22 05:46:07 +00002682/// HandleIfDirective - Implements the \#if directive.
Chris Lattnerf64b3522008-03-09 01:54:53 +00002683///
2684void Preprocessor::HandleIfDirective(Token &IfToken,
2685 bool ReadAnyTokensBeforeDirective) {
2686 ++NumIf;
Mike Stump11289f42009-09-09 15:08:12 +00002687
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002688 // Parse and evaluate the conditional expression.
Craig Topperd2d442c2014-05-17 23:10:59 +00002689 IdentifierInfo *IfNDefMacro = nullptr;
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002690 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
2691 const bool ConditionalTrue = EvaluateDirectiveExpression(IfNDefMacro);
2692 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Nuno Lopes363212b2008-06-01 18:31:24 +00002693
2694 // If this condition is equivalent to #ifndef X, and if this is the first
2695 // directive seen, handle it for the multiple-include optimization.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002696 if (CurPPLexer->getConditionalStackDepth() == 0) {
Chris Lattneraa1cccbb2010-02-12 08:03:27 +00002697 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
Richard Smith089ee152013-06-16 05:05:39 +00002698 // FIXME: Pass in the location of the macro name, not the 'if' token.
2699 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
Nuno Lopes363212b2008-06-01 18:31:24 +00002700 else
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002701 CurPPLexer->MIOpt.EnterTopLevelConditional();
Nuno Lopes363212b2008-06-01 18:31:24 +00002702 }
2703
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002704 if (Callbacks)
2705 Callbacks->If(IfToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002706 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002707 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002708
Chris Lattnerf64b3522008-03-09 01:54:53 +00002709 // Should we include the stuff contained by this directive?
2710 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
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002771 // Finally, skip the rest of the contents of this block.
2772 SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +00002773 /*FoundElse*/true, Result.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002774}
2775
James Dennettf6333ac2012-06-22 05:46:07 +00002776/// HandleElifDirective - Implements the \#elif directive.
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002777///
Chris Lattnerf64b3522008-03-09 01:54:53 +00002778void Preprocessor::HandleElifDirective(Token &ElifToken) {
2779 ++NumElse;
Mike Stump11289f42009-09-09 15:08:12 +00002780
Chris Lattnerf64b3522008-03-09 01:54:53 +00002781 // #elif directive in a non-skipping conditional... start skipping.
2782 // We don't care what the condition is, because we will always skip it (since
2783 // the block immediately before it was included).
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002784 const SourceLocation ConditionalBegin = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002785 DiscardUntilEndOfDirective();
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002786 const SourceLocation ConditionalEnd = CurPPLexer->getSourceLocation();
Chris Lattnerf64b3522008-03-09 01:54:53 +00002787
2788 PPConditionalInfo CI;
Chris Lattner907dfe92008-11-18 07:59:24 +00002789 if (CurPPLexer->popConditionalLevel(CI)) {
2790 Diag(ElifToken, diag::pp_err_elif_without_if);
2791 return;
2792 }
Mike Stump11289f42009-09-09 15:08:12 +00002793
Chris Lattnerf64b3522008-03-09 01:54:53 +00002794 // If this is a top-level #elif, inform the MIOpt.
Ted Kremenek30cd88c2008-11-18 00:34:22 +00002795 if (CurPPLexer->getConditionalStackDepth() == 0)
2796 CurPPLexer->MIOpt.EnterTopLevelConditional();
Mike Stump11289f42009-09-09 15:08:12 +00002797
Chris Lattnerf64b3522008-03-09 01:54:53 +00002798 // If this is a #elif with a #else before it, report the error.
2799 if (CI.FoundElse) Diag(ElifToken, diag::pp_err_elif_after_else);
Taewook Oh755e4d22016-06-13 21:55:33 +00002800
Argyrios Kyrtzidisc793a612012-03-05 05:48:09 +00002801 if (Callbacks)
2802 Callbacks->Elif(ElifToken.getLocation(),
John Thompsonb1028562013-07-18 00:00:36 +00002803 SourceRange(ConditionalBegin, ConditionalEnd),
John Thompson87f9fef2013-12-07 08:41:15 +00002804 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
Chris Lattnerf64b3522008-03-09 01:54:53 +00002805
Craig Silverstein8e3d95e2010-11-06 01:19:03 +00002806 // Finally, skip the rest of the contents of this block.
2807 SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
Argyrios Kyrtzidis18bcfd52011-09-27 17:32:05 +00002808 /*FoundElse*/CI.FoundElse,
2809 ElifToken.getLocation());
Chris Lattnerf64b3522008-03-09 01:54:53 +00002810}