PPMacroExpansion.cpp revision 9fe8c74a93ac8e92512615c5f83e7a328b3b0544
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"
2432592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer#include "llvm/ADT/StringSwitch.h"
255b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis#include "llvm/ADT/STLExtras.h"
266665ffbfc397f68e3fb15844597674d5861995b6Douglas Gregor#include "llvm/Config/config.h"
27b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer#include "llvm/Support/raw_ostream.h"
289fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h"
293daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio>
30f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime>
31a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang;
32a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
33295a2a617ac335f590e430ab7fcd98f8ce109251Douglas GregorMacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const {
34295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(II->hasMacroDefinition() && "Identifier is not a macro!");
35295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
36295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos
37295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    = Macros.find(II);
38295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  if (Pos == Macros.end()) {
39295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    // Load this macro from the external source.
40295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    getExternalSource()->LoadMacroDefinition(II);
41295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    Pos = Macros.find(II);
42295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  }
43295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(Pos != Macros.end() && "Identifier macro info is missing!");
44295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  return Pos->second;
45295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
46295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
47a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier.
48a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner///
49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) {
50555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  if (MI) {
51a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Macros[II] = MI;
52a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    II->setHasMacroDefinition(true);
53555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  } else if (II->hasMacroDefinition()) {
54555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    Macros.erase(II);
55555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    II->setHasMacroDefinition(false);
56a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
58a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
59a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier
60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded.
61148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){
62a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Get the identifier.
63148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  IdentifierInfo *Id = PP.getIdentifierInfo(Name);
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Mark it as being a macro that is builtin.
66148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation());
67a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MI->setIsBuiltinMacro();
68148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  PP.setMacroInfo(Id, MI);
69a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return Id;
70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the
74a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table.
75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() {
76148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__");
77148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__");
78148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__");
79148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__");
80148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__");
81148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident_Pragma  = RegisterBuiltinMacro(*this, "_Pragma");
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // GCC Extensions.
84148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__BASE_FILE__     = RegisterBuiltinMacro(*this, "__BASE_FILE__");
85148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__");
86148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIMESTAMP__     = RegisterBuiltinMacro(*this, "__TIMESTAMP__");
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
88148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  // Clang Extensions.
8992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_feature      = RegisterBuiltinMacro(*this, "__has_feature");
90c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  Ident__has_extension    = RegisterBuiltinMacro(*this, "__has_extension");
9192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_builtin      = RegisterBuiltinMacro(*this, "__has_builtin");
92cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson  Ident__has_attribute    = RegisterBuiltinMacro(*this, "__has_attribute");
9392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include      = RegisterBuiltinMacro(*this, "__has_include");
9492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next");
951ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall
961ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // Microsoft Extensions.
9762ec1f2fd7368542bb926c04797fb07023547694Francois Pichet  if (Features.MicrosoftExt)
981ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = RegisterBuiltinMacro(*this, "__pragma");
991ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else
1001ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = 0;
101a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
102a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token
104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally.
105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI,
106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          const IdentifierInfo *MacroIdent,
107a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          Preprocessor &PP) {
108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo();
109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the token isn't an identifier, it's always literally expanded.
111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == 0) return true;
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the identifier is a macro, and if that macro is enabled, it may be
114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expanded so it's not a trivial expansion.
115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() &&
116a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Fast expanding "#define X X" is ok, because X would be disabled.
117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      II != MacroIdent)
118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is an object-like macro invocation, it is safe to trivially expand
121a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // it.
122a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isObjectLike()) return true;
123a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro invocation, it's safe to trivially expand
125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // as long as the identifier is not a macro argument.
126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end();
127a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner       I != E; ++I)
128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (*I == II)
129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;   // Identifier is a macro argument.
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
131a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return true;
132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be
136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('.  If so, consume the token and return true, if not, this
137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens.
138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() {
139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Do some quick tests for rejection cases.
140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned Val;
141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (CurLexer)
142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurLexer->isNextPPTokenLParen();
1431a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  else if (CurPTHLexer)
1441a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek    Val = CurPTHLexer->isNextPPTokenLParen();
145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  else
146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurTokenLexer->isNextTokenLParen();
1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (Val == 2) {
149a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // We have run off the end.  If it's a source file we don't
150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // examine enclosing ones (C99 5.1.1.2p4).  Otherwise walk up the
151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // macro stack.
15217ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek    if (CurPPLexer)
153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;
154a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    for (unsigned i = IncludeMacroStack.size(); i != 0; --i) {
155a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      IncludeStackInfo &Entry = IncludeMacroStack[i-1];
156a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Entry.TheLexer)
157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheLexer->isNextPPTokenLParen();
158dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      else if (Entry.ThePTHLexer)
159dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek        Val = Entry.ThePTHLexer->isNextPPTokenLParen();
160a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      else
161a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheTokenLexer->isNextTokenLParen();
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Val != 2)
164a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        break;
1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Ran off the end of a source file?
167dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      if (Entry.ThePPLexer)
168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return false;
169a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
171a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, if we know that the token is a '(', lex it and return.  Otherwise we
173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // have found something that isn't a '(' or we found the end of the
174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // translation unit.  In either case, return false.
1750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  return Val == 1;
176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
177a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be
179a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'.
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                                 MacroInfo *MI) {
1821367897633c2f5bb77f97cb05c76d5f80ead9976Douglas Gregor  // If this is a macro expansion in the "#if !defined(x)" line for the file,
183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // then the macro could expand to different things in other contexts, we need
184a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // to disable the optimization in this case.
18568a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek  if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro();
1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
187a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially.
188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isBuiltinMacro()) {
1891b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis    if (Callbacks) Callbacks->MacroExpands(Identifier, MI,
1901b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis                                           Identifier.getLocation());
191a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ExpandBuiltinMacro(Identifier);
192a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// Args - If this is a function-like macro expansion, this contains,
196a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// for each macro argument, the list of tokens that were provided to the
197a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// invocation.
198a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MacroArgs *Args = 0;
1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2009e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  // Remember where the end of the expansion occurred.  For an object-like
201e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  // macro, this is the identifier.  For a function-like macro, this is the ')'.
2029e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  SourceLocation ExpansionEnd = Identifier.getLocation();
2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
204a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro, read the arguments.
205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isFunctionLike()) {
206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p10: If the preprocessing token immediately after the the macro
2070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // name isn't a '(', this macro should not be expanded.
208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!isNextPPTokenLParen())
209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return true;
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Remember that we are now parsing the arguments to a macro invocation.
212a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Preprocessor directives used inside macro arguments are not portable, and
213a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // this enables the warning.
214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = true;
2159e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    Args = ReadFunctionLikeMacroArgs(Identifier, MI, ExpansionEnd);
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Finished parsing args.
218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = false;
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If there was an error parsing the arguments, bail out.
221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (Args == 0) return false;
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFnMacroExpanded;
224a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumMacroExpanded;
226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
228a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Notice that this macro has been used.
2290827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  markMacroAsUsed(MI);
2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2319e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  // Remember where the token is expanded.
2329e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  SourceLocation ExpandLoc = Identifier.getLocation();
233b7d98d35ea723624345f06e5895ddce2e0388ef0Argyrios Kyrtzidis
2341b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis  if (Callbacks) Callbacks->MacroExpands(Identifier, MI,
2351b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis                                         SourceRange(ExpandLoc, ExpansionEnd));
2361b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis
2371b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis  // If we started lexing a macro, enter the macro expansion body.
2381b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis
239a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this macro expands to no tokens, don't bother to push it onto the
240a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expansion stack, only to take it right back off.
241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->getNumTokens() == 0) {
242a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // No need for arg info.
243561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
245a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Ignore this macro use, just return the next token in the current
246a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // buffer.
247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool HadLeadingSpace = Identifier.hasLeadingSpace();
248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool IsAtStartOfLine = Identifier.isAtStartOfLine();
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
250a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Lex(Identifier);
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If the identifier isn't on some OTHER line, inherit the leading
253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // whitespace/first-on-a-line property of this token.  This handles
254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // stuff like "! XX," -> "! ," and "   XX," -> "    ,", when XX is
255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // empty.
256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!Identifier.isAtStartOfLine()) {
257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine);
258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace);
259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
26044aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis    Identifier.setFlag(Token::LeadingEmptyMacro);
261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
262a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (MI->getNumTokens() == 1 &&
265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner             isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(),
266de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner                                           *this)) {
267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Otherwise, if this macro expands into a single trivially-expanded
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // token: expand it now.  This handles common cases like
269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // "#define VAL 42".
2709a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
2719a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop    // No need for arg info.
272561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2739a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro
275a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // identifier to the expanded token.
276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool isAtStartOfLine = Identifier.isAtStartOfLine();
277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool hasLeadingSpace = Identifier.hasLeadingSpace();
2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
279a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Replace the result token.
280a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier = MI->getReplacementToken(0);
2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Restore the StartOfLine/LeadingSpace markers.
283a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine);
284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace);
2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2869e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // Update the tokens location to include both its expansion and physical
287a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // locations.
288a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation Loc =
289bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth      SourceMgr.createExpansionLoc(Identifier.getLocation(), ExpandLoc,
290bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                   ExpansionEnd,Identifier.getLength());
291a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setLocation(Loc);
2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2938ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // If this is a disabled macro or #define X X, we must mark the result as
2948ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // unexpandable.
2958ff66de0d036842450eb979882f826d5252100f4Chris Lattner    if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) {
2968ff66de0d036842450eb979882f826d5252100f4Chris Lattner      if (MacroInfo *NewMI = getMacroInfo(NewII))
2978ff66de0d036842450eb979882f826d5252100f4Chris Lattner        if (!NewMI->isEnabled() || NewMI == MI)
2988ff66de0d036842450eb979882f826d5252100f4Chris Lattner          Identifier.setFlag(Token::DisableExpand);
2998ff66de0d036842450eb979882f826d5252100f4Chris Lattner    }
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Since this is not an identifier token, it can't be macro expanded, so
302a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // we're done.
303a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Start expanding the macro.
3089e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  EnterMacro(Identifier, ExpansionEnd, Args);
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Now that the macro is at the top of the include stack, ask the
311a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // preprocessor to read the next token from it.
312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Lex(Identifier);
313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return false;
314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3160a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next
3170a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the
3180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation.  This returns null on
3190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error.
320a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
321e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   MacroInfo *MI,
322e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   SourceLocation &MacroEnd) {
323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // The number of fixed arguments to parse.
324a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumFixedArgsLeft = MI->getNumArgs();
325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVariadic = MI->isVariadic();
3261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Outer loop, while there are more arguments, keep reading them.
328a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Token Tok;
329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3300a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
3310a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // an argument value in a macro could expand to ',' or '(' or ')'.
3320a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  LexUnexpandedToken(Tok);
3330a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?");
3341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
335a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // ArgTokens - Build up a list of tokens that make up each argument.  Each
336a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // argument is separated by an EOF token.  Use a SmallVector so we can avoid
337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // heap allocations in the common case.
3385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Token, 64> ArgTokens;
339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
340a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumActuals = 0;
3410a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  while (Tok.isNot(tok::r_paren)) {
3420a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) &&
3430a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner           "only expect argument separators here");
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3450a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    unsigned ArgTokenStart = ArgTokens.size();
3460a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    SourceLocation ArgStartLoc = Tok.getLocation();
3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p11: Keep track of the number of l_parens we have seen.  Note
349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // that we already consumed the first one.
350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned NumParens = 0;
3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    while (1) {
353a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
354a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // an argument value in a macro could expand to ',' or '(' or ')'.
355a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      LexUnexpandedToken(Tok);
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35784021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne      if (Tok.is(tok::eof) || Tok.is(tok::eod)) { // "#if f(<eof>" & "#if f(\n"
358a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Diag(MacroName, diag::err_unterm_macro_invoc);
35984021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne        // Do not lose the EOF/EOD.  Return it to the client.
360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        MacroName = Tok;
361a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return 0;
362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::r_paren)) {
363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If we found the ) token, the macro arg list is done.
364e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        if (NumParens-- == 0) {
365e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner          MacroEnd = Tok.getLocation();
366a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
367e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        }
368a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::l_paren)) {
369a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        ++NumParens;
370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comma) && NumParens == 0) {
371a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Comma ends this argument if there are more fixed arguments expected.
3720a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        // However, if this is a variadic macro, and this is part of the
3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // variadic part, then the comma is just an argument token.
3740a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (!isVariadic) break;
3750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (NumFixedArgsLeft > 1)
376a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
377a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comment) && !KeepMacroComments) {
378a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If this is a comment token in the argument list and we're just in
379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // -C mode (not -CC mode), discard the comment.
380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        continue;
3815c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner      } else if (Tok.getIdentifierInfo() != 0) {
382a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Reading macro arguments can cause macros that we are currently
383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // expanding from to be popped off the expansion stack.  Doing so causes
384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // them to be reenabled for expansion.  Here we record whether any
385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // identifiers we lex as macro arguments correspond to disabled macros.
3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // If so, we mark the token as noexpand.  This is a subtle aspect of
387a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // C99 6.10.3.4p2.
388a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo()))
389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          if (!MI->isEnabled())
390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner            Tok.setFlag(Token::DisableExpand);
3917d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis      } else if (Tok.is(tok::code_completion)) {
3927d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        if (CodeComplete)
3937d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis          CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(),
3947d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                                  MI, NumActuals);
3957d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // Don't mark that we reached the code-completion point because the
3967d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // parser is going to handle the token and there will be another
3977d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // code-completion callback.
398a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
3997d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ArgTokens.push_back(Tok);
401a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4030a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this was an empty argument list foo(), don't add this as an empty
4040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // argument.
4050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (ArgTokens.empty() && Tok.getKind() == tok::r_paren)
4060a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      break;
407a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this is not a variadic macro, and too many args were specified, emit
4090a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // an error.
4100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (!isVariadic && NumFixedArgsLeft == 0) {
4110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      if (ArgTokens.size() != ArgTokenStart)
4120a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        ArgStartLoc = ArgTokens[ArgTokenStart].getLocation();
4131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4140a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emit the diagnostic at the macro name in case there is a missing ).
4150a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emitting it at the , could be far away from the macro name.
4160a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc);
4170a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      return 0;
4180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    }
4191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42032c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner    // Empty arguments are standard in C99 and C++0x, and are supported as an extension in
421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // other modes.
42232c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner    if (ArgTokens.size() == ArgTokenStart && !Features.C99 && !Features.CPlusPlus0x)
423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_empty_fnmacro_arg);
4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
426a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Token EOFTok;
427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.startToken();
428a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setKind(tok::eof);
429e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner    EOFTok.setLocation(Tok.getLocation());
430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setLength(0);
431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(EOFTok);
432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumActuals;
4330a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert(NumFixedArgsLeft != 0 && "Too many arguments parsed");
434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    --NumFixedArgsLeft;
435e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  }
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
437a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, we either found the r_paren.  Check to see if we parsed too few
438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // arguments.
439a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned MinArgsExpected = MI->getNumArgs();
4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // See MacroArgs instance var for description of this.
442a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVarargsElided = false;
4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (NumActuals < MinArgsExpected) {
445a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // There are several cases where too few arguments is ok, handle them now.
44697e2de171de555feb1ef422e71874082a67498c9Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 1) {
44797e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // #define A(X)  or  #define A(...)   ---> A()
4481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44997e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // If there is exactly one argument, and that argument is missing,
45097e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // then we have an empty "()" argument empty list.  This is fine, even if
45197e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // the macro expects one argument (the argument is just empty).
45297e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = MI->isVariadic();
45397e2de171de555feb1ef422e71874082a67498c9Chris Lattner    } else if (MI->isVariadic() &&
45497e2de171de555feb1ef422e71874082a67498c9Chris Lattner               (NumActuals+1 == MinArgsExpected ||  // A(x, ...) -> A(X)
45597e2de171de555feb1ef422e71874082a67498c9Chris Lattner                (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A()
456a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Varargs where the named vararg parameter is missing: ok as extension.
457a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // #define A(x, ...)
458a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // A("blah")
459a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_missing_varargs_arg);
460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4610a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Remember this occurred, allowing us to elide the comma when used for
46263bc0358706e63faf705803c4799e073b91a63f0Chris Lattner      // cases like:
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define A(x, foo...) blah(a, ## foo)
4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define B(x, ...) blah(a, ## __VA_ARGS__)
4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define C(...) blah(a, ## __VA_ARGS__)
4660a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      //  A(x) B(x) C()
46797e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = true;
468a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
469a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Otherwise, emit the error.
470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::err_too_few_args_in_macro_invoc);
471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return 0;
472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
475a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation EndLoc = Tok.getLocation();
476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.startToken();
477a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::eof);
478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLocation(EndLoc);
479a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(0);
480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(Tok);
4819fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner
4829fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    // If we expect two arguments, add both as empty.
4839fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 2)
4849fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner      ArgTokens.push_back(Tok);
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4860a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) {
4870a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emit the diagnostic at the macro name in case there is a missing ).
4880a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emitting it at the , could be far away from the macro name.
4890a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    Diag(MacroName, diag::err_too_many_args_in_macro_invoc);
4900a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    return 0;
491a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
493d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie  return MacroArgs::create(MI, ArgTokens, isVarargsElided, *this);
494a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4965b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// \brief Keeps macro expanded tokens for TokenLexers.
4975b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis//
4985b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// Works like a stack; a TokenLexer adds the macro expanded tokens that is
4995b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// going to lex in the cache and when it finishes the tokens are removed
5005b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// from the end of the cache.
5015b3284a9275a27f5c4410e25eb8933be540601d6Argyrios KyrtzidisToken *Preprocessor::cacheMacroExpandedTokens(TokenLexer *tokLexer,
5022d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner                                              ArrayRef<Token> tokens) {
5035b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(tokLexer);
5045b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  if (tokens.empty())
5055b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    return 0;
5065b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5075b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  size_t newIndex = MacroExpandedTokens.size();
5085b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  bool cacheNeedsToGrow = tokens.size() >
5095b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis                      MacroExpandedTokens.capacity()-MacroExpandedTokens.size();
5105b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandedTokens.append(tokens.begin(), tokens.end());
5115b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5125b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  if (cacheNeedsToGrow) {
5135b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    // Go through all the TokenLexers whose 'Tokens' pointer points in the
5145b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    // buffer and update the pointers to the (potential) new buffer array.
5155b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    for (unsigned i = 0, e = MacroExpandingLexersStack.size(); i != e; ++i) {
5165b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      TokenLexer *prevLexer;
5175b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      size_t tokIndex;
5185b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      llvm::tie(prevLexer, tokIndex) = MacroExpandingLexersStack[i];
5195b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex;
5205b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    }
5215b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  }
5225b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5235b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex));
5245b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  return MacroExpandedTokens.data() + newIndex;
5255b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis}
5265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5275b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidisvoid Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() {
5285b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(!MacroExpandingLexersStack.empty());
5295b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  size_t tokIndex = MacroExpandingLexersStack.back().second;
5305b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(tokIndex < MacroExpandedTokens.size());
5315b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  // Pop the cached macro expanded tokens from the end.
5325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandedTokens.resize(tokIndex);
5335b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandingLexersStack.pop_back();
5345b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis}
5355b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
536a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified
537a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of
538a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted.
539a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc,
540a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                             Preprocessor &PP) {
541a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  time_t TT = time(0);
542a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  struct tm *TM = localtime(&TT);
5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
544a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  static const char * const Months[] = {
545a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
546a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  };
5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5485e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  char TmpBuffer[32];
549b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32
550b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor  sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
551b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor          TM->tm_year+1900);
552b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else
5535e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
554a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          TM->tm_year+1900);
555b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif
5561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Token TmpTok;
55847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TmpTok.startToken();
55947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
56047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  DATELoc = TmpTok.getLocation();
561a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
562513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32
563513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi  sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
564513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else
5655e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
566513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif
56747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
56847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TIMELoc = TmpTok.getLocation();
569a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
570a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
571148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
572c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasFeature - Return true if we recognize and implement the feature
573c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier as a standard language feature.
574148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
575148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  const LangOptions &LangOpts = PP.getLangOptions();
5761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57732592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer  return llvm::StringSwitch<bool>(II->getName())
5786d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_analyzer_noreturn", true)
579dceb53180ae145915673913a9398ba4a00b05584Douglas Gregor           .Case("attribute_availability", true)
5806d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_not_retained", true)
5816d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_retained", true)
5824820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_deprecated_with_message", true)
5836d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ext_vector_type", true)
5846d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_not_retained", true)
5856d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_retained", true)
58612b9434d5bf801e24242b1f6fd04899f8a7fa92cTed Kremenek           .Case("attribute_ns_consumes_self", true)
58711fe175346242744bd9cb4040f3c84e243934134Ted Kremenek           .Case("attribute_ns_consumed", true)
58811fe175346242744bd9cb4040f3c84e243934134Ted Kremenek           .Case("attribute_cf_consumed", true)
5896d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_objc_ivar_unused", true)
590d5313b0bbf3948fe7c63bf46a7da330c96d07309John McCall           .Case("attribute_objc_method_family", true)
5916d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_overloadable", true)
5924820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_unavailable_with_message", true)
59332592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("blocks", LangOpts.Blocks)
59432592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("cxx_exceptions", LangOpts.Exceptions)
5956d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("cxx_rtti", LangOpts.RTTI)
5964820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("enumerator_attributes", true)
597f85e193739c953358c865005855253af4f68a497John McCall           // Objective-C features
598f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
599f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arc", LangOpts.ObjCAutoRefCount)
600f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arc_weak", LangOpts.ObjCAutoRefCount &&
6019f084a3166b684573ba49df28fc5792bc37d92e1John McCall                 LangOpts.ObjCRuntimeHasWeak)
6025471bc85b69912e3b448de004498a80c0de32296Douglas Gregor           .Case("objc_fixed_enum", LangOpts.ObjC2)
603e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor           .Case("objc_instancetype", LangOpts.ObjC2)
60432592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI)
6053ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek           .Case("objc_weak_class", LangOpts.ObjCNonFragileABI)
606dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_holds", true)
607dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_returns", true)
608dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_takes", true)
609c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C1X features
610c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_generic_selections", LangOpts.C1X)
611c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_static_assert", LangOpts.C1X)
612c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           // C++0x features
6137822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor           .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus0x)
6143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith           .Case("cxx_alias_templates", LangOpts.CPlusPlus0x)
615c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_attributes", LangOpts.CPlusPlus0x)
616738291eedac0f3f3628e34b0b32d6155f280fab2Richard Smith           .Case("cxx_auto_type", LangOpts.CPlusPlus0x)
617ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_constexpr", false);
618c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_decltype", LangOpts.CPlusPlus0x)
6190750800623dc6d14c4c0c721996ffd4210fcdff3Douglas Gregor           .Case("cxx_default_function_template_args", LangOpts.CPlusPlus0x)
620059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt           .Case("cxx_delegating_constructors", LangOpts.CPlusPlus0x)
621c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x)
622ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_explicit_conversions", LangOpts.CPlusPlus0x)
623e1f6dea1c9593651116fa9a5faa05647d18f3193Sean Hunt         //.Case("cxx_generalized_initializers", LangOpts.CPlusPlus0x)
62474e611a5fd0b5977c664d13a07b625ae23527d0dSebastian Redl           .Case("cxx_implicit_moves", LangOpts.CPlusPlus0x)
625ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_inheriting_constructors", false)
626c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x)
6276d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek         //.Case("cxx_lambdas", false)
628ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus0x)
6294561ecdf27b68d80b3cecc2d80ec32bea0ac2127Sebastian Redl           .Case("cxx_noexcept", LangOpts.CPlusPlus0x)
63084ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor           .Case("cxx_nullptr", LangOpts.CPlusPlus0x)
631c8b9f7977094d0169ec59f9042e85ca854735299Anders Carlsson           .Case("cxx_override_control", LangOpts.CPlusPlus0x)
632a391a4642c5eb98aae606f2a2b7219b1a3619d11Richard Smith           .Case("cxx_range_for", LangOpts.CPlusPlus0x)
633ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_raw_string_literals", false)
63456209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x)
635c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x)
636c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_strong_enums", LangOpts.CPlusPlus0x)
637c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_static_assert", LangOpts.CPlusPlus0x)
638c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_trailing_return", LangOpts.CPlusPlus0x)
639ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_unicode_literals", false)
640ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_unrestricted_unions", false)
641ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_user_literals", false)
642c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x)
643afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           // Type traits
644afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_assign", LangOpts.CPlusPlus)
645afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_copy", LangOpts.CPlusPlus)
646afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_constructor", LangOpts.CPlusPlus)
647afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_assign", LangOpts.CPlusPlus)
648afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_copy", LangOpts.CPlusPlus)
649afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_constructor", LangOpts.CPlusPlus)
650afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_destructor", LangOpts.CPlusPlus)
651afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_virtual_destructor", LangOpts.CPlusPlus)
652afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_abstract", LangOpts.CPlusPlus)
653afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_base_of", LangOpts.CPlusPlus)
654afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_class", LangOpts.CPlusPlus)
655afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_convertible_to", LangOpts.CPlusPlus)
656b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // __is_empty is available only if the horrible
657b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // "struct __is_empty" parsing hack hasn't been needed in this
658b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // translation unit. If it has, __is_empty reverts to a normal
659b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // identifier and __has_feature(is_empty) evaluates false.
660688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor           .Case("is_empty",
6619a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 LangOpts.CPlusPlus &&
6629a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 PP.getIdentifierInfo("__is_empty")->getTokenID()
6639a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                                                            != tok::identifier)
664afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_enum", LangOpts.CPlusPlus)
6654e61ddd644e9c6293697a966d98d7c1905cf63a8Chandler Carruth           .Case("is_literal", LangOpts.CPlusPlus)
666a55e68b7f961d6ef4551c9be9ac18a1e25c7c927Howard Hinnant           .Case("is_standard_layout", LangOpts.CPlusPlus)
667b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // __is_pod is available only if the horrible
668b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // "struct __is_pod" parsing hack hasn't been needed in this
669b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // translation unit. If it has, __is_pod reverts to a normal
670b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // identifier and __has_feature(is_pod) evaluates false.
671688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor           .Case("is_pod",
6729a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 LangOpts.CPlusPlus &&
6739a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 PP.getIdentifierInfo("__is_pod")->getTokenID()
6749a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                                                            != tok::identifier)
675afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_polymorphic", LangOpts.CPlusPlus)
676b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth           .Case("is_trivial", LangOpts.CPlusPlus)
677feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt           .Case("is_trivially_copyable", LangOpts.CPlusPlus)
678afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_union", LangOpts.CPlusPlus)
6791f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher           .Case("tls", PP.getTargetInfo().isTLSSupported())
680858a325e5f250c83409137c5609b162983ea6d1eSean Hunt           .Case("underlying_type", LangOpts.CPlusPlus)
68132592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Default(false);
682148772a841cae6f32db16d890e788b92a763bb3fChris Lattner}
683148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
684c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasExtension - Return true if we recognize and implement the feature
685c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier, either as an extension or a standard language
686c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// feature.
687c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbournestatic bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) {
688c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  if (HasFeature(PP, II))
689c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    return true;
690c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
691c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // If the use of an extension results in an error diagnostic, extensions are
692c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // effectively unavailable, so just return false here.
693c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  if (PP.getDiagnostics().getExtensionHandlingBehavior()==Diagnostic::Ext_Error)
694c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    return false;
695c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
696c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  const LangOptions &LangOpts = PP.getLangOptions();
697c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
698c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // Because we inherit the feature list from HasFeature, this string switch
699c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // must be less restrictive than HasFeature's.
700c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  return llvm::StringSwitch<bool>(II->getName())
701c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C1X features supported by other languages as extensions.
702c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_generic_selections", true)
703c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_static_assert", true)
704c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C++0x features supported by other languages as extensions.
705c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_deleted_functions", LangOpts.CPlusPlus)
706ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_explicit_conversions", LangOpts.CPlusPlus)
707c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus)
708ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus)
709c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_override_control", LangOpts.CPlusPlus)
7107640c0070361bd365e30fc2eb3b6a64361fa7377Richard Smith           .Case("cxx_range_for", LangOpts.CPlusPlus)
711c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus)
712c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_rvalue_references", LangOpts.CPlusPlus)
713c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Default(false);
714c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne}
715c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
716cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute -  Return true if we recognize and implement the attribute
717cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier.
718cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) {
719cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    return llvm::StringSwitch<bool>(II->getName())
720cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc"
721cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson        .Default(false);
722cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson}
723cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson
72492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")'
72592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression.
72692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
7273ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok,
7283ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     IdentifierInfo *II, Preprocessor &PP,
7293ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     const DirectoryLookup *LookupFrom) {
73092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  SourceLocation LParenLoc;
73192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
73292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get '('.
73392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
73492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
73592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a '('.
73692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::l_paren)) {
73792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName();
73892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
73992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
74092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
74192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Save '(' location for possible missing ')' message.
74292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  LParenLoc = Tok.getLocation();
74392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
74492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the file name.
74592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.getCurrentLexer()->LexIncludeFilename(Tok);
74692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
74792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Reserve a buffer to get the spelling.
748a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  llvm::SmallString<128> FilenameBuffer;
7495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef Filename;
750ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  SourceLocation EndLoc;
751ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
75292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  switch (Tok.getKind()) {
75384021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  case tok::eod:
75484021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne    // If the token kind is EOD, the error has already been diagnosed.
75592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
75692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
75792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::angle_string_literal:
758453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  case tok::string_literal: {
759453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    bool Invalid = false;
760453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid);
761453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    if (Invalid)
762453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor      return false;
76392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
764453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  }
76592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
76692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::less:
76792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // This could be a <foo/bar.h> file coming from a macro expansion.  In this
76892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // case, glue the tokens together into FilenameBuffer and interpret those.
76992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    FilenameBuffer.push_back('<');
770ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc))
77184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne      return false;   // Found <eod> but no ">"?  Diagnostic already emitted.
772a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner    Filename = FilenameBuffer.str();
77392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
77492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  default:
77592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename);
77692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
77792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
77892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
779a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename);
78092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // If GetIncludeFilenameSpelling set the start ptr to null, there was an
78192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // error.
782a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  if (Filename.empty())
78392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
78492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
78592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Search include directories.
78692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *CurDir;
787b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth  const FileEntry *File =
788fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor      PP.LookupFile(Filename, isAngled, LookupFrom, CurDir, NULL, NULL, NULL);
78992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the result value.  Result = true means the file exists.
7913ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  bool Result = File != 0;
79292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get ')'.
79492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
79592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a trailing ).
79792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::r_paren)) {
79892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName();
79992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(LParenLoc, diag::note_matching) << "(";
80092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
80192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
80292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
8033ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return Result;
80492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
80592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
80692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression.
80792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
8083ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II,
80992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                               Preprocessor &PP) {
8103ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, NULL);
81192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
81292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
81392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression.
81492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
8153ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok,
81692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                                   IdentifierInfo *II, Preprocessor &PP) {
81792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // __has_include_next is like __has_include, except that we start
81892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // searching after the current found directory.  If we can't do this,
81992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // issue a diagnostic.
82092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *Lookup = PP.GetCurDirLookup();
82192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (PP.isInPrimaryFile()) {
82292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Lookup = 0;
82392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_in_primary);
82492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (Lookup == 0) {
82592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_absolute_path);
82692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else {
82792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // Start looking up in the next directory.
82892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    ++Lookup;
82992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
83092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
8313ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, Lookup);
83292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
833148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
834a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded
835a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'.
836a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) {
837a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Figure out which token this is.
838a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = Tok.getIdentifierInfo();
839a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  assert(II && "Can't be a macro without id info!");
8401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8411ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // If this is an _Pragma or Microsoft __pragma directive, expand it,
8421ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // invoke the pragma handler, then lex the token after it.
843a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident_Pragma)
844a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return Handle_Pragma(Tok);
8451ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else if (II == Ident__pragma) // in non-MS mode this is null
8461ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    return HandleMicrosoft__pragma(Tok);
8471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
848a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  ++NumBuiltinMacroExpanded;
849a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
850b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::SmallString<128> TmpBuffer;
851b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::raw_svector_ostream OS(TmpBuffer);
852a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
853a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Set up the return result.
854a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.setIdentifierInfo(0);
855a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.clearFlag(Token::NeedsCleaning);
8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
857a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident__LINE__) {
858b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__LINE__: The presumed line number (within the current
859b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // source file) of the current source line (an integer constant)".  This can
860b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // be affected by #line.
861081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    SourceLocation Loc = Tok.getLocation();
8621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
863dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // Advance to the location of the first _, this might not be the first byte
864dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // of the token if it starts with an escaped newline.
865dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    Loc = AdvanceToTokenCharacter(Loc, 0);
8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
867081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // One wrinkle here is that GCC expands __LINE__ to location of the *end* of
8689e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // a macro expansion.  This doesn't matter for object-like macros, but
869081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // can matter for a function-like macro that expands to contain __LINE__.
8709e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // Skip down through expansion points until we find a file loc for the
8719e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // end of the expansion history.
872edc3dccece244a584f8ebdb81da6c962c08e79beChandler Carruth    Loc = SourceMgr.getExpansionRange(Loc).second;
873081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8751fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __LINE__ expands to a simple numeric value.
876cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << (PLoc.isValid()? PLoc.getLine() : 1);
877a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
878a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) {
879b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__FILE__: The presumed name of the current source file (a
880b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // character string literal)". This can be affected by #line.
881b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
882b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
883b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // __BASE_FILE__ is a GNU extension that returns the top of the presumed
884b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // #include stack instead of the current file.
885cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (II == Ident__BASE_FILE__ && PLoc.isValid()) {
886b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      SourceLocation NextLoc = PLoc.getIncludeLoc();
887a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      while (NextLoc.isValid()) {
888b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        PLoc = SourceMgr.getPresumedLoc(NextLoc);
889cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        if (PLoc.isInvalid())
890cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor          break;
891cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
892b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        NextLoc = PLoc.getIncludeLoc();
893a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
894a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
896a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Escape this filename.  Turn '\' -> '\\' '"' -> '\"'
897b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    llvm::SmallString<128> FN;
898cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
899cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      FN += PLoc.getFilename();
900cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      Lexer::Stringify(FN);
901cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      OS << '"' << FN.str() << '"';
902cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
903a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
904a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__DATE__) {
905a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!DATELoc.isValid())
906a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
907a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
908a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"Mmm dd yyyy\""));
909bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    Tok.setLocation(SourceMgr.createExpansionLoc(DATELoc, Tok.getLocation(),
910bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLocation(),
911bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLength()));
912b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
913a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIME__) {
914a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!TIMELoc.isValid())
915a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
916a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
917a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"hh:mm:ss\""));
918bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    Tok.setLocation(SourceMgr.createExpansionLoc(TIMELoc, Tok.getLocation(),
919bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLocation(),
920bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLength()));
921b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
922a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__INCLUDE_LEVEL__) {
923b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // Compute the presumed include depth of this token.  This can be affected
924b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // by GNU line markers.
925a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned Depth = 0;
9261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
927b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
928cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
929b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
930cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      for (; PLoc.isValid(); ++Depth)
931cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
932cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9341fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __INCLUDE_LEVEL__ expands to a simple numeric value.
935b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << Depth;
936a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
937a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIMESTAMP__) {
938a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // MSVC, ICC, GCC, VisualAge C++ extension.  The generated string should be
939a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime.
940a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
941a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Get the file that we are lexing out of.  If we're currently lexing from
942a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // a macro, dig into the include stack.
943a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const FileEntry *CurFile = 0;
944a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek    PreprocessorLexer *TheLexer = getCurrentFileLexer();
9451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
946a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (TheLexer)
947ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek      CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID());
9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
949a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const char *Result;
950a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (CurFile) {
951a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      time_t TT = CurFile->getModificationTime();
952a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      struct tm *TM = localtime(&TT);
953a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = asctime(TM);
954a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
955a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = "??? ??? ?? ??:??:?? ????\n";
956a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
957b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    // Surround the string with " and strip the trailing newline.
9585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    OS << '"' << StringRef(Result, strlen(Result)-1) << '"';
959a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
960c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner  } else if (II == Ident__COUNTER__) {
961c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    // __COUNTER__ expands to a simple numeric value.
962b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << CounterValue++;
963c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    Tok.setKind(tok::numeric_constant);
964c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  } else if (II == Ident__has_feature   ||
965c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne             II == Ident__has_extension ||
966c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne             II == Ident__has_builtin   ||
967cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson             II == Ident__has_attribute) {
968c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    // The argument to these builtins should be a parenthesized identifier.
969148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    SourceLocation StartLoc = Tok.getLocation();
9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
971148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool IsValid = false;
972148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    IdentifierInfo *FeatureII = 0;
9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
974148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    // Read the '('.
975148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Lex(Tok);
976148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (Tok.is(tok::l_paren)) {
977148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      // Read the identifier
978148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Lex(Tok);
979148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      if (Tok.is(tok::identifier)) {
980148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        FeatureII = Tok.getIdentifierInfo();
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
982148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        // Read the ')'.
983148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        Lex(Tok);
984148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        if (Tok.is(tok::r_paren))
985148772a841cae6f32db16d890e788b92a763bb3fChris Lattner          IsValid = true;
986148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      }
987148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
989148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool Value = false;
990148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (!IsValid)
991148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Diag(StartLoc, diag::err_feature_check_malformed);
992148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    else if (II == Ident__has_builtin) {
9931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Check for a builtin is trivial.
994148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = FeatureII->getBuiltinID() != 0;
995cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    } else if (II == Ident__has_attribute)
996cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson      Value = HasAttribute(FeatureII);
997c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    else if (II == Ident__has_extension)
998c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne      Value = HasExtension(*this, FeatureII);
999cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    else {
1000148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      assert(II == Ident__has_feature && "Must be feature check");
1001148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = HasFeature(*this, FeatureII);
1002148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1004b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
1005148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Tok.setKind(tok::numeric_constant);
100692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (II == Ident__has_include ||
100792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson             II == Ident__has_include_next) {
100892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // The argument to these two builtins should be a parenthesized
100992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // file name string literal using angle brackets (<>) or
101092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // double-quotes ("").
10113ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner    bool Value;
101292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    if (II == Ident__has_include)
10133ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasInclude(Tok, II, *this);
101492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    else
10153ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasIncludeNext(Tok, II, *this);
1016b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
101792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Tok.setKind(tok::numeric_constant);
1018a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
1019b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unknown identifier!");
1020a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
1021b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  CreateString(OS.str().data(), OS.str().size(), Tok, Tok.getLocation());
1022a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
10230827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis
10240827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) {
10250827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // If the 'used' status changed, and the macro requires 'unused' warning,
10260827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // remove its SourceLocation from the warn-for-unused-macro locations.
10270827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  if (MI->isWarnIfUnused() && !MI->isUsed())
10280827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis    WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
10290827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  MI->setIsUsed(true);
10300827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis}
1031