PPMacroExpansion.cpp revision d768150ef57f617c8d9fef48f3c92e8f21698024
1a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===--- MacroExpansion.cpp - Top level Macro Expansion -------------------===//
2a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
3a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//                     The LLVM Compiler Infrastructure
4a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
5a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file is distributed under the University of Illinois Open Source
6a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// License. See LICENSE.TXT for details.
7a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
8a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===//
9a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
10a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file implements the top level handling of macro expasion for the
11a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// preprocessor.
12a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
13a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===//
14a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
15a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/Preprocessor.h"
16a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "MacroArgs.h"
17a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/MacroInfo.h"
18a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/SourceManager.h"
19a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/FileManager.h"
201f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher#include "clang/Basic/TargetInfo.h"
21500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h"
22f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor#include "clang/Lex/CodeCompletionHandler.h"
23295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h"
24d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek#include "clang/Lex/LiteralSupport.h"
2532592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer#include "llvm/ADT/StringSwitch.h"
265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis#include "llvm/ADT/STLExtras.h"
276665ffbfc397f68e3fb15844597674d5861995b6Douglas Gregor#include "llvm/Config/config.h"
28b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer#include "llvm/Support/raw_ostream.h"
299fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h"
303daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio>
31f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime>
32a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang;
33a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
34295a2a617ac335f590e430ab7fcd98f8ce109251Douglas GregorMacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const {
35295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(II->hasMacroDefinition() && "Identifier is not a macro!");
36295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
37295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos
38295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    = Macros.find(II);
39295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  if (Pos == Macros.end()) {
40295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    // Load this macro from the external source.
41295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    getExternalSource()->LoadMacroDefinition(II);
42295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    Pos = Macros.find(II);
43295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  }
44295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(Pos != Macros.end() && "Identifier macro info is missing!");
45295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  return Pos->second;
46295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
47295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
48a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier.
49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner///
50a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) {
51555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  if (MI) {
52a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Macros[II] = MI;
53a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    II->setHasMacroDefinition(true);
54555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  } else if (II->hasMacroDefinition()) {
55555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    Macros.erase(II);
56555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    II->setHasMacroDefinition(false);
57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
58a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
59a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier
61a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded.
62148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){
63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Get the identifier.
64148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  IdentifierInfo *Id = PP.getIdentifierInfo(Name);
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Mark it as being a macro that is builtin.
67148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation());
68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MI->setIsBuiltinMacro();
69148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  PP.setMacroInfo(Id, MI);
70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return Id;
71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
74a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the
75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table.
76a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() {
77148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__");
78148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__");
79148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__");
80148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__");
81148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__");
82148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident_Pragma  = RegisterBuiltinMacro(*this, "_Pragma");
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // GCC Extensions.
85148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__BASE_FILE__     = RegisterBuiltinMacro(*this, "__BASE_FILE__");
86148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__");
87148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIMESTAMP__     = RegisterBuiltinMacro(*this, "__TIMESTAMP__");
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
89148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  // Clang Extensions.
9092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_feature      = RegisterBuiltinMacro(*this, "__has_feature");
91c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  Ident__has_extension    = RegisterBuiltinMacro(*this, "__has_extension");
9292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_builtin      = RegisterBuiltinMacro(*this, "__has_builtin");
93cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson  Ident__has_attribute    = RegisterBuiltinMacro(*this, "__has_attribute");
9492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include      = RegisterBuiltinMacro(*this, "__has_include");
9592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next");
96d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek  Ident__has_warning      = RegisterBuiltinMacro(*this, "__has_warning");
971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall
981ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // Microsoft Extensions.
9962ec1f2fd7368542bb926c04797fb07023547694Francois Pichet  if (Features.MicrosoftExt)
1001ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = RegisterBuiltinMacro(*this, "__pragma");
1011ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else
1021ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = 0;
103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token
106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally.
107a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI,
108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          const IdentifierInfo *MacroIdent,
109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          Preprocessor &PP) {
110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo();
111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the token isn't an identifier, it's always literally expanded.
113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == 0) return true;
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the identifier is a macro, and if that macro is enabled, it may be
116a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expanded so it's not a trivial expansion.
117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() &&
118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Fast expanding "#define X X" is ok, because X would be disabled.
119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      II != MacroIdent)
120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
122a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is an object-like macro invocation, it is safe to trivially expand
123a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // it.
124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isObjectLike()) return true;
125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro invocation, it's safe to trivially expand
127a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // as long as the identifier is not a macro argument.
128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end();
129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner       I != E; ++I)
130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (*I == II)
131a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;   // Identifier is a macro argument.
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return true;
134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be
138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('.  If so, consume the token and return true, if not, this
139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens.
140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() {
141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Do some quick tests for rejection cases.
142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned Val;
143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (CurLexer)
144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurLexer->isNextPPTokenLParen();
1451a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  else if (CurPTHLexer)
1461a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek    Val = CurPTHLexer->isNextPPTokenLParen();
147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  else
148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurTokenLexer->isNextTokenLParen();
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (Val == 2) {
151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // We have run off the end.  If it's a source file we don't
152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // examine enclosing ones (C99 5.1.1.2p4).  Otherwise walk up the
153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // macro stack.
15417ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek    if (CurPPLexer)
155a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;
156a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    for (unsigned i = IncludeMacroStack.size(); i != 0; --i) {
157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      IncludeStackInfo &Entry = IncludeMacroStack[i-1];
158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Entry.TheLexer)
159a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheLexer->isNextPPTokenLParen();
160dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      else if (Entry.ThePTHLexer)
161dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek        Val = Entry.ThePTHLexer->isNextPPTokenLParen();
162a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      else
163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheTokenLexer->isNextTokenLParen();
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
165a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Val != 2)
166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        break;
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Ran off the end of a source file?
169dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      if (Entry.ThePPLexer)
170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return false;
171a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, if we know that the token is a '(', lex it and return.  Otherwise we
175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // have found something that isn't a '(' or we found the end of the
176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // translation unit.  In either case, return false.
1770a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  return Val == 1;
178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
179a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
180a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be
181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'.
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                                 MacroInfo *MI) {
1841367897633c2f5bb77f97cb05c76d5f80ead9976Douglas Gregor  // If this is a macro expansion in the "#if !defined(x)" line for the file,
185a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // then the macro could expand to different things in other contexts, we need
186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // to disable the optimization in this case.
18768a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek  if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro();
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially.
190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isBuiltinMacro()) {
1911b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis    if (Callbacks) Callbacks->MacroExpands(Identifier, MI,
1921b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis                                           Identifier.getLocation());
193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ExpandBuiltinMacro(Identifier);
194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// Args - If this is a function-like macro expansion, this contains,
198a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// for each macro argument, the list of tokens that were provided to the
199a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// invocation.
200a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MacroArgs *Args = 0;
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2029e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  // Remember where the end of the expansion occurred.  For an object-like
203e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  // macro, this is the identifier.  For a function-like macro, this is the ')'.
2049e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  SourceLocation ExpansionEnd = Identifier.getLocation();
2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro, read the arguments.
207a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isFunctionLike()) {
208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p10: If the preprocessing token immediately after the the macro
2090a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // name isn't a '(', this macro should not be expanded.
210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!isNextPPTokenLParen())
211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return true;
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
213a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Remember that we are now parsing the arguments to a macro invocation.
214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Preprocessor directives used inside macro arguments are not portable, and
215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // this enables the warning.
216a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = true;
2179e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    Args = ReadFunctionLikeMacroArgs(Identifier, MI, ExpansionEnd);
2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
219a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Finished parsing args.
220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = false;
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If there was an error parsing the arguments, bail out.
223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (Args == 0) return false;
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFnMacroExpanded;
226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
227a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumMacroExpanded;
228a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
230a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Notice that this macro has been used.
2310827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  markMacroAsUsed(MI);
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2339e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  // Remember where the token is expanded.
2349e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  SourceLocation ExpandLoc = Identifier.getLocation();
235b7d98d35ea723624345f06e5895ddce2e0388ef0Argyrios Kyrtzidis
2361b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis  if (Callbacks) Callbacks->MacroExpands(Identifier, MI,
2371b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis                                         SourceRange(ExpandLoc, ExpansionEnd));
2381b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis
2391b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis  // If we started lexing a macro, enter the macro expansion body.
2401b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis
241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this macro expands to no tokens, don't bother to push it onto the
242a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expansion stack, only to take it right back off.
243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->getNumTokens() == 0) {
244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // No need for arg info.
245561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Ignore this macro use, just return the next token in the current
248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // buffer.
249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool HadLeadingSpace = Identifier.hasLeadingSpace();
250a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool IsAtStartOfLine = Identifier.isAtStartOfLine();
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Lex(Identifier);
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If the identifier isn't on some OTHER line, inherit the leading
255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // whitespace/first-on-a-line property of this token.  This handles
256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // stuff like "! XX," -> "! ," and "   XX," -> "    ,", when XX is
257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // empty.
258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!Identifier.isAtStartOfLine()) {
259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine);
260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace);
261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
26244aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis    Identifier.setFlag(Token::LeadingEmptyMacro);
263a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (MI->getNumTokens() == 1 &&
267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner             isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(),
268de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner                                           *this)) {
269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Otherwise, if this macro expands into a single trivially-expanded
2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // token: expand it now.  This handles common cases like
271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // "#define VAL 42".
2729a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
2739a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop    // No need for arg info.
274561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2759a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro
277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // identifier to the expanded token.
278a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool isAtStartOfLine = Identifier.isAtStartOfLine();
279a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool hasLeadingSpace = Identifier.hasLeadingSpace();
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Replace the result token.
282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier = MI->getReplacementToken(0);
2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Restore the StartOfLine/LeadingSpace markers.
285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine);
286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace);
2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2889e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // Update the tokens location to include both its expansion and physical
289a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // locations.
290a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation Loc =
291bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth      SourceMgr.createExpansionLoc(Identifier.getLocation(), ExpandLoc,
292bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                   ExpansionEnd,Identifier.getLength());
293a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setLocation(Loc);
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2958ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // If this is a disabled macro or #define X X, we must mark the result as
2968ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // unexpandable.
2978ff66de0d036842450eb979882f826d5252100f4Chris Lattner    if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) {
2988ff66de0d036842450eb979882f826d5252100f4Chris Lattner      if (MacroInfo *NewMI = getMacroInfo(NewII))
2998ff66de0d036842450eb979882f826d5252100f4Chris Lattner        if (!NewMI->isEnabled() || NewMI == MI)
3008ff66de0d036842450eb979882f826d5252100f4Chris Lattner          Identifier.setFlag(Token::DisableExpand);
3018ff66de0d036842450eb979882f826d5252100f4Chris Lattner    }
3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Since this is not an identifier token, it can't be macro expanded, so
304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // we're done.
305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Start expanding the macro.
3109e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  EnterMacro(Identifier, ExpansionEnd, Args);
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Now that the macro is at the top of the include stack, ask the
313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // preprocessor to read the next token from it.
314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Lex(Identifier);
315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return false;
316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next
3190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the
3200a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation.  This returns null on
3210a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error.
322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
323e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   MacroInfo *MI,
324e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   SourceLocation &MacroEnd) {
325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // The number of fixed arguments to parse.
326a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumFixedArgsLeft = MI->getNumArgs();
327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVariadic = MI->isVariadic();
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Outer loop, while there are more arguments, keep reading them.
330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Token Tok;
331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3320a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
3330a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // an argument value in a macro could expand to ',' or '(' or ')'.
3340a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  LexUnexpandedToken(Tok);
3350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?");
3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // ArgTokens - Build up a list of tokens that make up each argument.  Each
338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // argument is separated by an EOF token.  Use a SmallVector so we can avoid
339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // heap allocations in the common case.
3405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Token, 64> ArgTokens;
341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumActuals = 0;
3430a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  while (Tok.isNot(tok::r_paren)) {
3440a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) &&
3450a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner           "only expect argument separators here");
3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3470a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    unsigned ArgTokenStart = ArgTokens.size();
3480a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    SourceLocation ArgStartLoc = Tok.getLocation();
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p11: Keep track of the number of l_parens we have seen.  Note
351a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // that we already consumed the first one.
352a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned NumParens = 0;
3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
354a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    while (1) {
355a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
356a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // an argument value in a macro could expand to ',' or '(' or ')'.
357a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      LexUnexpandedToken(Tok);
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35984021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne      if (Tok.is(tok::eof) || Tok.is(tok::eod)) { // "#if f(<eof>" & "#if f(\n"
360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Diag(MacroName, diag::err_unterm_macro_invoc);
36184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne        // Do not lose the EOF/EOD.  Return it to the client.
362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        MacroName = Tok;
363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return 0;
364a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::r_paren)) {
365a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If we found the ) token, the macro arg list is done.
366e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        if (NumParens-- == 0) {
367e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner          MacroEnd = Tok.getLocation();
368a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
369e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        }
370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::l_paren)) {
371a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        ++NumParens;
372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comma) && NumParens == 0) {
373a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Comma ends this argument if there are more fixed arguments expected.
3740a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        // However, if this is a variadic macro, and this is part of the
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // variadic part, then the comma is just an argument token.
3760a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (!isVariadic) break;
3770a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (NumFixedArgsLeft > 1)
378a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comment) && !KeepMacroComments) {
380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If this is a comment token in the argument list and we're just in
381a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // -C mode (not -CC mode), discard the comment.
382a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        continue;
3835c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner      } else if (Tok.getIdentifierInfo() != 0) {
384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Reading macro arguments can cause macros that we are currently
385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // expanding from to be popped off the expansion stack.  Doing so causes
386a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // them to be reenabled for expansion.  Here we record whether any
387a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // identifiers we lex as macro arguments correspond to disabled macros.
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // If so, we mark the token as noexpand.  This is a subtle aspect of
389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // C99 6.10.3.4p2.
390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo()))
391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          if (!MI->isEnabled())
392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner            Tok.setFlag(Token::DisableExpand);
3937d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis      } else if (Tok.is(tok::code_completion)) {
3947d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        if (CodeComplete)
3957d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis          CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(),
3967d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                                  MI, NumActuals);
3977d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // Don't mark that we reached the code-completion point because the
3987d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // parser is going to handle the token and there will be another
3997d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // code-completion callback.
400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
4017d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
402a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ArgTokens.push_back(Tok);
403a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this was an empty argument list foo(), don't add this as an empty
4060a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // argument.
4070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (ArgTokens.empty() && Tok.getKind() == tok::r_paren)
4080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      break;
409a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this is not a variadic macro, and too many args were specified, emit
4110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // an error.
4120a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (!isVariadic && NumFixedArgsLeft == 0) {
4130a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      if (ArgTokens.size() != ArgTokenStart)
4140a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        ArgStartLoc = ArgTokens[ArgTokenStart].getLocation();
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4160a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emit the diagnostic at the macro name in case there is a missing ).
4170a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emitting it at the , could be far away from the macro name.
4180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc);
4190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      return 0;
4200a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    }
4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42232c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner    // Empty arguments are standard in C99 and C++0x, and are supported as an extension in
423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // other modes.
42432c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner    if (ArgTokens.size() == ArgTokenStart && !Features.C99 && !Features.CPlusPlus0x)
425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_empty_fnmacro_arg);
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
428a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Token EOFTok;
429a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.startToken();
430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setKind(tok::eof);
431e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner    EOFTok.setLocation(Tok.getLocation());
432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setLength(0);
433a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(EOFTok);
434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumActuals;
4350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert(NumFixedArgsLeft != 0 && "Too many arguments parsed");
436a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    --NumFixedArgsLeft;
437e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  }
4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
439a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, we either found the r_paren.  Check to see if we parsed too few
440a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // arguments.
441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned MinArgsExpected = MI->getNumArgs();
4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // See MacroArgs instance var for description of this.
444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVarargsElided = false;
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (NumActuals < MinArgsExpected) {
447a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // There are several cases where too few arguments is ok, handle them now.
44897e2de171de555feb1ef422e71874082a67498c9Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 1) {
44997e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // #define A(X)  or  #define A(...)   ---> A()
4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45197e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // If there is exactly one argument, and that argument is missing,
45297e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // then we have an empty "()" argument empty list.  This is fine, even if
45397e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // the macro expects one argument (the argument is just empty).
45497e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = MI->isVariadic();
45597e2de171de555feb1ef422e71874082a67498c9Chris Lattner    } else if (MI->isVariadic() &&
45697e2de171de555feb1ef422e71874082a67498c9Chris Lattner               (NumActuals+1 == MinArgsExpected ||  // A(x, ...) -> A(X)
45797e2de171de555feb1ef422e71874082a67498c9Chris Lattner                (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A()
458a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Varargs where the named vararg parameter is missing: ok as extension.
459a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // #define A(x, ...)
460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // A("blah")
461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_missing_varargs_arg);
462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4630a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Remember this occurred, allowing us to elide the comma when used for
46463bc0358706e63faf705803c4799e073b91a63f0Chris Lattner      // cases like:
4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define A(x, foo...) blah(a, ## foo)
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define B(x, ...) blah(a, ## __VA_ARGS__)
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define C(...) blah(a, ## __VA_ARGS__)
4680a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      //  A(x) B(x) C()
46997e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = true;
470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Otherwise, emit the error.
472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::err_too_few_args_in_macro_invoc);
473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return 0;
474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
477a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation EndLoc = Tok.getLocation();
478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.startToken();
479a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::eof);
480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLocation(EndLoc);
481a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(0);
482a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(Tok);
4839fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner
4849fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    // If we expect two arguments, add both as empty.
4859fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 2)
4869fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner      ArgTokens.push_back(Tok);
4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4880a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) {
4890a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emit the diagnostic at the macro name in case there is a missing ).
4900a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emitting it at the , could be far away from the macro name.
4910a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    Diag(MacroName, diag::err_too_many_args_in_macro_invoc);
4920a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    return 0;
493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
495d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie  return MacroArgs::create(MI, ArgTokens, isVarargsElided, *this);
496a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
497a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4985b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// \brief Keeps macro expanded tokens for TokenLexers.
4995b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis//
5005b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// Works like a stack; a TokenLexer adds the macro expanded tokens that is
5015b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// going to lex in the cache and when it finishes the tokens are removed
5025b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// from the end of the cache.
5035b3284a9275a27f5c4410e25eb8933be540601d6Argyrios KyrtzidisToken *Preprocessor::cacheMacroExpandedTokens(TokenLexer *tokLexer,
5042d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner                                              ArrayRef<Token> tokens) {
5055b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(tokLexer);
5065b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  if (tokens.empty())
5075b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    return 0;
5085b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5095b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  size_t newIndex = MacroExpandedTokens.size();
5105b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  bool cacheNeedsToGrow = tokens.size() >
5115b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis                      MacroExpandedTokens.capacity()-MacroExpandedTokens.size();
5125b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandedTokens.append(tokens.begin(), tokens.end());
5135b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5145b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  if (cacheNeedsToGrow) {
5155b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    // Go through all the TokenLexers whose 'Tokens' pointer points in the
5165b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    // buffer and update the pointers to the (potential) new buffer array.
5175b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    for (unsigned i = 0, e = MacroExpandingLexersStack.size(); i != e; ++i) {
5185b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      TokenLexer *prevLexer;
5195b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      size_t tokIndex;
5205b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      llvm::tie(prevLexer, tokIndex) = MacroExpandingLexersStack[i];
5215b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex;
5225b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    }
5235b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  }
5245b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5255b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex));
5265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  return MacroExpandedTokens.data() + newIndex;
5275b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis}
5285b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5295b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidisvoid Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() {
5305b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(!MacroExpandingLexersStack.empty());
5315b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  size_t tokIndex = MacroExpandingLexersStack.back().second;
5325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(tokIndex < MacroExpandedTokens.size());
5335b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  // Pop the cached macro expanded tokens from the end.
5345b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandedTokens.resize(tokIndex);
5355b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandingLexersStack.pop_back();
5365b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis}
5375b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
538a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified
539a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of
540a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted.
541a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc,
542a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                             Preprocessor &PP) {
543a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  time_t TT = time(0);
544a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  struct tm *TM = localtime(&TT);
5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
546a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  static const char * const Months[] = {
547a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
548a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  };
5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5505e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  char TmpBuffer[32];
551b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32
552b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor  sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
553b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor          TM->tm_year+1900);
554b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else
5555e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
556a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          TM->tm_year+1900);
557b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif
5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Token TmpTok;
56047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TmpTok.startToken();
56147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
56247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  DATELoc = TmpTok.getLocation();
563a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
564513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32
565513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi  sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
566513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else
5675e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
568513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif
56947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
57047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TIMELoc = TmpTok.getLocation();
571a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
572a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
573148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
574c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasFeature - Return true if we recognize and implement the feature
575c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier as a standard language feature.
576148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
577148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  const LangOptions &LangOpts = PP.getLangOptions();
5781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57932592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer  return llvm::StringSwitch<bool>(II->getName())
5806d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_analyzer_noreturn", true)
581dceb53180ae145915673913a9398ba4a00b05584Douglas Gregor           .Case("attribute_availability", true)
5826d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_not_retained", true)
5836d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_retained", true)
5844820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_deprecated_with_message", true)
5856d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ext_vector_type", true)
5866d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_not_retained", true)
5876d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_retained", true)
58812b9434d5bf801e24242b1f6fd04899f8a7fa92cTed Kremenek           .Case("attribute_ns_consumes_self", true)
58911fe175346242744bd9cb4040f3c84e243934134Ted Kremenek           .Case("attribute_ns_consumed", true)
59011fe175346242744bd9cb4040f3c84e243934134Ted Kremenek           .Case("attribute_cf_consumed", true)
5916d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_objc_ivar_unused", true)
592d5313b0bbf3948fe7c63bf46a7da330c96d07309John McCall           .Case("attribute_objc_method_family", true)
5936d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_overloadable", true)
5944820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_unavailable_with_message", true)
59532592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("blocks", LangOpts.Blocks)
59632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("cxx_exceptions", LangOpts.Exceptions)
5976d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("cxx_rtti", LangOpts.RTTI)
5984820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("enumerator_attributes", true)
599f85e193739c953358c865005855253af4f68a497John McCall           // Objective-C features
600f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
601f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arc", LangOpts.ObjCAutoRefCount)
602f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arc_weak", LangOpts.ObjCAutoRefCount &&
6039f084a3166b684573ba49df28fc5792bc37d92e1John McCall                 LangOpts.ObjCRuntimeHasWeak)
6045471bc85b69912e3b448de004498a80c0de32296Douglas Gregor           .Case("objc_fixed_enum", LangOpts.ObjC2)
605e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor           .Case("objc_instancetype", LangOpts.ObjC2)
60632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI)
6073ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek           .Case("objc_weak_class", LangOpts.ObjCNonFragileABI)
608dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_holds", true)
609dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_returns", true)
610dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_takes", true)
611c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C1X features
612c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_generic_selections", LangOpts.C1X)
613c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_static_assert", LangOpts.C1X)
614c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           // C++0x features
6157822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor           .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus0x)
6163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith           .Case("cxx_alias_templates", LangOpts.CPlusPlus0x)
617c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_attributes", LangOpts.CPlusPlus0x)
618738291eedac0f3f3628e34b0b32d6155f280fab2Richard Smith           .Case("cxx_auto_type", LangOpts.CPlusPlus0x)
619ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_constexpr", false);
620c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_decltype", LangOpts.CPlusPlus0x)
6210750800623dc6d14c4c0c721996ffd4210fcdff3Douglas Gregor           .Case("cxx_default_function_template_args", LangOpts.CPlusPlus0x)
622059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt           .Case("cxx_delegating_constructors", LangOpts.CPlusPlus0x)
623c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x)
624ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_explicit_conversions", LangOpts.CPlusPlus0x)
625e1f6dea1c9593651116fa9a5faa05647d18f3193Sean Hunt         //.Case("cxx_generalized_initializers", LangOpts.CPlusPlus0x)
62674e611a5fd0b5977c664d13a07b625ae23527d0dSebastian Redl           .Case("cxx_implicit_moves", LangOpts.CPlusPlus0x)
627ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_inheriting_constructors", false)
628c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x)
6296d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek         //.Case("cxx_lambdas", false)
630ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus0x)
6314561ecdf27b68d80b3cecc2d80ec32bea0ac2127Sebastian Redl           .Case("cxx_noexcept", LangOpts.CPlusPlus0x)
63284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor           .Case("cxx_nullptr", LangOpts.CPlusPlus0x)
633c8b9f7977094d0169ec59f9042e85ca854735299Anders Carlsson           .Case("cxx_override_control", LangOpts.CPlusPlus0x)
634a391a4642c5eb98aae606f2a2b7219b1a3619d11Richard Smith           .Case("cxx_range_for", LangOpts.CPlusPlus0x)
635ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_raw_string_literals", false)
63656209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x)
637c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x)
638c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_strong_enums", LangOpts.CPlusPlus0x)
639c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_static_assert", LangOpts.CPlusPlus0x)
640c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_trailing_return", LangOpts.CPlusPlus0x)
641ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_unicode_literals", false)
642ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_unrestricted_unions", false)
643ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_user_literals", false)
644c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x)
645afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           // Type traits
646afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_assign", LangOpts.CPlusPlus)
647afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_copy", LangOpts.CPlusPlus)
648afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_constructor", LangOpts.CPlusPlus)
649afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_assign", LangOpts.CPlusPlus)
650afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_copy", LangOpts.CPlusPlus)
651afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_constructor", LangOpts.CPlusPlus)
652afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_destructor", LangOpts.CPlusPlus)
653afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_virtual_destructor", LangOpts.CPlusPlus)
654afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_abstract", LangOpts.CPlusPlus)
655afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_base_of", LangOpts.CPlusPlus)
656afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_class", LangOpts.CPlusPlus)
657afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_convertible_to", LangOpts.CPlusPlus)
658b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // __is_empty is available only if the horrible
659b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // "struct __is_empty" parsing hack hasn't been needed in this
660b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // translation unit. If it has, __is_empty reverts to a normal
661b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // identifier and __has_feature(is_empty) evaluates false.
662688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor           .Case("is_empty",
6639a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 LangOpts.CPlusPlus &&
6649a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 PP.getIdentifierInfo("__is_empty")->getTokenID()
6659a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                                                            != tok::identifier)
666afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_enum", LangOpts.CPlusPlus)
6674e61ddd644e9c6293697a966d98d7c1905cf63a8Chandler Carruth           .Case("is_literal", LangOpts.CPlusPlus)
668a55e68b7f961d6ef4551c9be9ac18a1e25c7c927Howard Hinnant           .Case("is_standard_layout", LangOpts.CPlusPlus)
669b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // __is_pod is available only if the horrible
670b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // "struct __is_pod" parsing hack hasn't been needed in this
671b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // translation unit. If it has, __is_pod reverts to a normal
672b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // identifier and __has_feature(is_pod) evaluates false.
673688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor           .Case("is_pod",
6749a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 LangOpts.CPlusPlus &&
6759a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 PP.getIdentifierInfo("__is_pod")->getTokenID()
6769a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                                                            != tok::identifier)
677afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_polymorphic", LangOpts.CPlusPlus)
678b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth           .Case("is_trivial", LangOpts.CPlusPlus)
679feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt           .Case("is_trivially_copyable", LangOpts.CPlusPlus)
680afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_union", LangOpts.CPlusPlus)
6811f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher           .Case("tls", PP.getTargetInfo().isTLSSupported())
682858a325e5f250c83409137c5609b162983ea6d1eSean Hunt           .Case("underlying_type", LangOpts.CPlusPlus)
68332592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Default(false);
684148772a841cae6f32db16d890e788b92a763bb3fChris Lattner}
685148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
686c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasExtension - Return true if we recognize and implement the feature
687c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier, either as an extension or a standard language
688c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// feature.
689c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbournestatic bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) {
690c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  if (HasFeature(PP, II))
691c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    return true;
692c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
693c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // If the use of an extension results in an error diagnostic, extensions are
694c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // effectively unavailable, so just return false here.
695d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  if (PP.getDiagnostics().getExtensionHandlingBehavior() ==
696d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie      DiagnosticsEngine::Ext_Error)
697c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    return false;
698c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
699c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  const LangOptions &LangOpts = PP.getLangOptions();
700c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
701c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // Because we inherit the feature list from HasFeature, this string switch
702c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // must be less restrictive than HasFeature's.
703c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  return llvm::StringSwitch<bool>(II->getName())
704c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C1X features supported by other languages as extensions.
705c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_generic_selections", true)
706c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_static_assert", true)
707c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C++0x features supported by other languages as extensions.
708c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_deleted_functions", LangOpts.CPlusPlus)
709ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_explicit_conversions", LangOpts.CPlusPlus)
710c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus)
711ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus)
712c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_override_control", LangOpts.CPlusPlus)
7137640c0070361bd365e30fc2eb3b6a64361fa7377Richard Smith           .Case("cxx_range_for", LangOpts.CPlusPlus)
714c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus)
715c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_rvalue_references", LangOpts.CPlusPlus)
716c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Default(false);
717c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne}
718c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
719cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute -  Return true if we recognize and implement the attribute
720cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier.
721cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) {
722cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    return llvm::StringSwitch<bool>(II->getName())
723cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc"
724cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson        .Default(false);
725cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson}
726cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson
72792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")'
72892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression.
72992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
7303ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok,
7313ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     IdentifierInfo *II, Preprocessor &PP,
7323ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     const DirectoryLookup *LookupFrom) {
73392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  SourceLocation LParenLoc;
73492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
73592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get '('.
73692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
73792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
73892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a '('.
73992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::l_paren)) {
74092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName();
74192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
74292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
74392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
74492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Save '(' location for possible missing ')' message.
74592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  LParenLoc = Tok.getLocation();
74692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
74792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the file name.
74892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.getCurrentLexer()->LexIncludeFilename(Tok);
74992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
75092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Reserve a buffer to get the spelling.
751a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  llvm::SmallString<128> FilenameBuffer;
7525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef Filename;
753ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  SourceLocation EndLoc;
754ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
75592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  switch (Tok.getKind()) {
75684021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  case tok::eod:
75784021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne    // If the token kind is EOD, the error has already been diagnosed.
75892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
75992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
76092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::angle_string_literal:
761453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  case tok::string_literal: {
762453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    bool Invalid = false;
763453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid);
764453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    if (Invalid)
765453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor      return false;
76692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
767453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  }
76892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
76992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::less:
77092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // This could be a <foo/bar.h> file coming from a macro expansion.  In this
77192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // case, glue the tokens together into FilenameBuffer and interpret those.
77292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    FilenameBuffer.push_back('<');
773ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc))
77484021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne      return false;   // Found <eod> but no ">"?  Diagnostic already emitted.
775a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner    Filename = FilenameBuffer.str();
77692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
77792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  default:
77892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename);
77992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
78092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
78192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
782a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename);
78392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // If GetIncludeFilenameSpelling set the start ptr to null, there was an
78492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // error.
785a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  if (Filename.empty())
78692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
78792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
78892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Search include directories.
78992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *CurDir;
790b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth  const FileEntry *File =
791fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor      PP.LookupFile(Filename, isAngled, LookupFrom, CurDir, NULL, NULL, NULL);
79292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the result value.  Result = true means the file exists.
7943ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  bool Result = File != 0;
79592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get ')'.
79792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
79892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a trailing ).
80092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::r_paren)) {
80192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName();
80292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(LParenLoc, diag::note_matching) << "(";
80392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
80492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
80592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
8063ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return Result;
80792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
80892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
80992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression.
81092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
8113ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II,
81292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                               Preprocessor &PP) {
8133ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, NULL);
81492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
81592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
81692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression.
81792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
8183ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok,
81992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                                   IdentifierInfo *II, Preprocessor &PP) {
82092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // __has_include_next is like __has_include, except that we start
82192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // searching after the current found directory.  If we can't do this,
82292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // issue a diagnostic.
82392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *Lookup = PP.GetCurDirLookup();
82492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (PP.isInPrimaryFile()) {
82592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Lookup = 0;
82692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_in_primary);
82792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (Lookup == 0) {
82892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_absolute_path);
82992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else {
83092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // Start looking up in the next directory.
83192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    ++Lookup;
83292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
83392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
8343ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, Lookup);
83592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
836148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
837a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded
838a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'.
839a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) {
840a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Figure out which token this is.
841a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = Tok.getIdentifierInfo();
842a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  assert(II && "Can't be a macro without id info!");
8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8441ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // If this is an _Pragma or Microsoft __pragma directive, expand it,
8451ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // invoke the pragma handler, then lex the token after it.
846a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident_Pragma)
847a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return Handle_Pragma(Tok);
8481ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else if (II == Ident__pragma) // in non-MS mode this is null
8491ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    return HandleMicrosoft__pragma(Tok);
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
851a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  ++NumBuiltinMacroExpanded;
852a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
853b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::SmallString<128> TmpBuffer;
854b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::raw_svector_ostream OS(TmpBuffer);
855a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
856a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Set up the return result.
857a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.setIdentifierInfo(0);
858a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.clearFlag(Token::NeedsCleaning);
8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
860a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident__LINE__) {
861b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__LINE__: The presumed line number (within the current
862b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // source file) of the current source line (an integer constant)".  This can
863b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // be affected by #line.
864081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    SourceLocation Loc = Tok.getLocation();
8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
866dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // Advance to the location of the first _, this might not be the first byte
867dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // of the token if it starts with an escaped newline.
868dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    Loc = AdvanceToTokenCharacter(Loc, 0);
8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
870081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // One wrinkle here is that GCC expands __LINE__ to location of the *end* of
8719e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // a macro expansion.  This doesn't matter for object-like macros, but
872081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // can matter for a function-like macro that expands to contain __LINE__.
8739e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // Skip down through expansion points until we find a file loc for the
8749e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // end of the expansion history.
875edc3dccece244a584f8ebdb81da6c962c08e79beChandler Carruth    Loc = SourceMgr.getExpansionRange(Loc).second;
876081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8781fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __LINE__ expands to a simple numeric value.
879cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << (PLoc.isValid()? PLoc.getLine() : 1);
880a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
881a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) {
882b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__FILE__: The presumed name of the current source file (a
883b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // character string literal)". This can be affected by #line.
884b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
885b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
886b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // __BASE_FILE__ is a GNU extension that returns the top of the presumed
887b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // #include stack instead of the current file.
888cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (II == Ident__BASE_FILE__ && PLoc.isValid()) {
889b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      SourceLocation NextLoc = PLoc.getIncludeLoc();
890a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      while (NextLoc.isValid()) {
891b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        PLoc = SourceMgr.getPresumedLoc(NextLoc);
892cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        if (PLoc.isInvalid())
893cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor          break;
894cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
895b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        NextLoc = PLoc.getIncludeLoc();
896a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
897a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
899a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Escape this filename.  Turn '\' -> '\\' '"' -> '\"'
900b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    llvm::SmallString<128> FN;
901cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
902cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      FN += PLoc.getFilename();
903cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      Lexer::Stringify(FN);
904cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      OS << '"' << FN.str() << '"';
905cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
906a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
907a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__DATE__) {
908a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!DATELoc.isValid())
909a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
910a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
911a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"Mmm dd yyyy\""));
912bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    Tok.setLocation(SourceMgr.createExpansionLoc(DATELoc, Tok.getLocation(),
913bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLocation(),
914bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLength()));
915b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
916a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIME__) {
917a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!TIMELoc.isValid())
918a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
919a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
920a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"hh:mm:ss\""));
921bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    Tok.setLocation(SourceMgr.createExpansionLoc(TIMELoc, Tok.getLocation(),
922bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLocation(),
923bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLength()));
924b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
925a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__INCLUDE_LEVEL__) {
926b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // Compute the presumed include depth of this token.  This can be affected
927b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // by GNU line markers.
928a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned Depth = 0;
9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
930b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
931cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
932b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
933cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      for (; PLoc.isValid(); ++Depth)
934cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
935cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9371fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __INCLUDE_LEVEL__ expands to a simple numeric value.
938b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << Depth;
939a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
940a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIMESTAMP__) {
941a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // MSVC, ICC, GCC, VisualAge C++ extension.  The generated string should be
942a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime.
943a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
944a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Get the file that we are lexing out of.  If we're currently lexing from
945a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // a macro, dig into the include stack.
946a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const FileEntry *CurFile = 0;
947a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek    PreprocessorLexer *TheLexer = getCurrentFileLexer();
9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
949a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (TheLexer)
950ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek      CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID());
9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
952a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const char *Result;
953a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (CurFile) {
954a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      time_t TT = CurFile->getModificationTime();
955a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      struct tm *TM = localtime(&TT);
956a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = asctime(TM);
957a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
958a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = "??? ??? ?? ??:??:?? ????\n";
959a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
960b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    // Surround the string with " and strip the trailing newline.
9615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    OS << '"' << StringRef(Result, strlen(Result)-1) << '"';
962a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
963c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner  } else if (II == Ident__COUNTER__) {
964c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    // __COUNTER__ expands to a simple numeric value.
965b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << CounterValue++;
966c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    Tok.setKind(tok::numeric_constant);
967c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  } else if (II == Ident__has_feature   ||
968c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne             II == Ident__has_extension ||
969c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne             II == Ident__has_builtin   ||
970cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson             II == Ident__has_attribute) {
971c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    // The argument to these builtins should be a parenthesized identifier.
972148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    SourceLocation StartLoc = Tok.getLocation();
9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
974148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool IsValid = false;
975148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    IdentifierInfo *FeatureII = 0;
9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
977148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    // Read the '('.
978148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Lex(Tok);
979148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (Tok.is(tok::l_paren)) {
980148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      // Read the identifier
981148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Lex(Tok);
982148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      if (Tok.is(tok::identifier)) {
983148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        FeatureII = Tok.getIdentifierInfo();
9841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
985148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        // Read the ')'.
986148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        Lex(Tok);
987148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        if (Tok.is(tok::r_paren))
988148772a841cae6f32db16d890e788b92a763bb3fChris Lattner          IsValid = true;
989148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      }
990148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
992148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool Value = false;
993148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (!IsValid)
994148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Diag(StartLoc, diag::err_feature_check_malformed);
995148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    else if (II == Ident__has_builtin) {
9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Check for a builtin is trivial.
997148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = FeatureII->getBuiltinID() != 0;
998cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    } else if (II == Ident__has_attribute)
999cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson      Value = HasAttribute(FeatureII);
1000c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    else if (II == Ident__has_extension)
1001c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne      Value = HasExtension(*this, FeatureII);
1002cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    else {
1003148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      assert(II == Ident__has_feature && "Must be feature check");
1004148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = HasFeature(*this, FeatureII);
1005148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
10061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1007b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
1008148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Tok.setKind(tok::numeric_constant);
100992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (II == Ident__has_include ||
101092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson             II == Ident__has_include_next) {
101192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // The argument to these two builtins should be a parenthesized
101292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // file name string literal using angle brackets (<>) or
101392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // double-quotes ("").
10143ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner    bool Value;
101592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    if (II == Ident__has_include)
10163ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasInclude(Tok, II, *this);
101792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    else
10183ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasIncludeNext(Tok, II, *this);
1019b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
102092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Tok.setKind(tok::numeric_constant);
1021d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek  } else if (II == Ident__has_warning) {
1022d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    // The argument should be a parenthesized string literal.
1023d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    // The argument to these builtins should be a parenthesized identifier.
1024d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    SourceLocation StartLoc = Tok.getLocation();
1025d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    bool IsValid = false;
1026d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    bool Value = false;
1027d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    // Read the '('.
1028d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    Lex(Tok);
1029d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    do {
1030d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek      if (Tok.is(tok::l_paren)) {
1031d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Read the string.
1032d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        Lex(Tok);
1033d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1034d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // We need at least one string literal.
1035d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (!Tok.is(tok::string_literal)) {
1036d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          StartLoc = Tok.getLocation();
1037d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          IsValid = false;
1038d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          // Eat tokens until ')'.
1039d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          do Lex(Tok); while (!(Tok.is(tok::r_paren) || Tok.is(tok::eod)));
1040d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1041d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1042d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1043d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // String concatenation allows multiple strings, which can even come
1044d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // from macro expansion.
1045d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        SmallVector<Token, 4> StrToks;
1046d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        while (Tok.is(tok::string_literal)) {
1047d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          StrToks.push_back(Tok);
1048d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          LexUnexpandedToken(Tok);
1049d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1050d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1051d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Is the end a ')'?
1052d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (!(IsValid = Tok.is(tok::r_paren)))
1053d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1054d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1055d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Concatenate and parse the strings.
1056d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        StringLiteralParser Literal(&StrToks[0], StrToks.size(), *this);
1057d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        assert(Literal.isAscii() && "Didn't allow wide strings in");
1058d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (Literal.hadError)
1059d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1060d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (Literal.Pascal) {
1061d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          Diag(Tok, diag::warn_pragma_diagnostic_invalid);
1062d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1063d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1064d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1065d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        StringRef WarningName(Literal.GetString());
1066d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1067d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (WarningName.size() < 3 || WarningName[0] != '-' ||
1068d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek            WarningName[1] != 'W') {
1069d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          Diag(StrToks[0].getLocation(), diag::warn_has_warning_invalid_option);
1070d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1071d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1072d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1073d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Finally, check if the warning flags maps to a diagnostic group.
1074d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // We construct a SmallVector here to talk to getDiagnosticIDs().
1075d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Although we don't use the result, this isn't a hot path, and not
1076d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // worth special casing.
1077d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        llvm::SmallVector<diag::kind, 10> Diags;
1078d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        Value = !getDiagnostics().getDiagnosticIDs()->
1079d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          getDiagnosticsInGroup(WarningName.substr(2), Diags);
1080d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek      }
1081d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    } while (false);
1082d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1083d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    if (!IsValid)
1084d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek      Diag(StartLoc, diag::err_warning_check_malformed);
1085d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1086d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    OS << (int)Value;
1087d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    Tok.setKind(tok::numeric_constant);
1088a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
1089b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unknown identifier!");
1090a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
1091a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara  CreateString(OS.str().data(), OS.str().size(), Tok,
1092a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara               Tok.getLocation(), Tok.getLocation());
1093a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
10940827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis
10950827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) {
10960827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // If the 'used' status changed, and the macro requires 'unused' warning,
10970827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // remove its SourceLocation from the warn-for-unused-macro locations.
10980827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  if (MI->isWarnIfUnused() && !MI->isUsed())
10990827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis    WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
11000827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  MI->setIsUsed(true);
11010827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis}
1102