1a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===--- MacroExpansion.cpp - Top level Macro Expansion -------------------===//
2a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
3a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//                     The LLVM Compiler Infrastructure
4a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
5a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file is distributed under the University of Illinois Open Source
6a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// License. See LICENSE.TXT for details.
7a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
8a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===//
9a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
10a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file implements the top level handling of macro expasion for the
11a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// preprocessor.
12a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
13a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===//
14a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
15a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/Preprocessor.h"
16a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "MacroArgs.h"
17a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/MacroInfo.h"
18a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/SourceManager.h"
19a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/FileManager.h"
201f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher#include "clang/Basic/TargetInfo.h"
21500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h"
22f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor#include "clang/Lex/CodeCompletionHandler.h"
23295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h"
24d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek#include "clang/Lex/LiteralSupport.h"
2532592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer#include "llvm/ADT/StringSwitch.h"
265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis#include "llvm/ADT/STLExtras.h"
271770e0dadcab966990cca4d7516253c886fd907cDylan Noblesmith#include "llvm/Config/llvm-config.h"
28b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer#include "llvm/Support/raw_ostream.h"
299fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h"
303daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio>
31f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime>
32a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang;
33a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
34295a2a617ac335f590e430ab7fcd98f8ce109251Douglas GregorMacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const {
35295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(II->hasMacroDefinition() && "Identifier is not a macro!");
36295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
37295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos
38295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    = Macros.find(II);
39295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  if (Pos == Macros.end()) {
40295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    // Load this macro from the external source.
41295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    getExternalSource()->LoadMacroDefinition(II);
42295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    Pos = Macros.find(II);
43295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  }
44295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(Pos != Macros.end() && "Identifier macro info is missing!");
45295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  return Pos->second;
46295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
47295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
48a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier.
49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner///
505d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregorvoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI,
515d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor                                bool LoadedFromAST) {
52555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  if (MI) {
53a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Macros[II] = MI;
54a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    II->setHasMacroDefinition(true);
555d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor    if (II->isFromAST() && !LoadedFromAST)
56eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      II->setChangedSinceDeserialization();
57555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  } else if (II->hasMacroDefinition()) {
58555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    Macros.erase(II);
59555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    II->setHasMacroDefinition(false);
605d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor    if (II->isFromAST() && !LoadedFromAST)
61eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      II->setChangedSinceDeserialization();
62a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
64a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
65a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier
66a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded.
67148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){
68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Get the identifier.
69148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  IdentifierInfo *Id = PP.getIdentifierInfo(Name);
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Mark it as being a macro that is builtin.
72148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation());
73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MI->setIsBuiltinMacro();
74148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  PP.setMacroInfo(Id, MI);
75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return Id;
76a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
77a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
78a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
79a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the
80a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table.
81a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() {
82148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__");
83148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__");
84148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__");
85148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__");
86148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__");
87148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident_Pragma  = RegisterBuiltinMacro(*this, "_Pragma");
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
89a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // GCC Extensions.
90148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__BASE_FILE__     = RegisterBuiltinMacro(*this, "__BASE_FILE__");
91148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__");
92148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIMESTAMP__     = RegisterBuiltinMacro(*this, "__TIMESTAMP__");
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
94148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  // Clang Extensions.
9592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_feature      = RegisterBuiltinMacro(*this, "__has_feature");
96c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  Ident__has_extension    = RegisterBuiltinMacro(*this, "__has_extension");
9792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_builtin      = RegisterBuiltinMacro(*this, "__has_builtin");
98cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson  Ident__has_attribute    = RegisterBuiltinMacro(*this, "__has_attribute");
9992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include      = RegisterBuiltinMacro(*this, "__has_include");
10092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next");
101d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek  Ident__has_warning      = RegisterBuiltinMacro(*this, "__has_warning");
1021ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall
1031ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // Microsoft Extensions.
1044e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (LangOpts.MicrosoftExt)
1051ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = RegisterBuiltinMacro(*this, "__pragma");
1061ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else
1071ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = 0;
108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token
111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally.
112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI,
113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          const IdentifierInfo *MacroIdent,
114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          Preprocessor &PP) {
115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo();
116a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the token isn't an identifier, it's always literally expanded.
118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == 0) return true;
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120373cb7832090dd5a380be73fdff79881721eed00Argyrios Kyrtzidis  // If the information about this identifier is out of date, update it from
121373cb7832090dd5a380be73fdff79881721eed00Argyrios Kyrtzidis  // the external source.
122373cb7832090dd5a380be73fdff79881721eed00Argyrios Kyrtzidis  if (II->isOutOfDate())
123373cb7832090dd5a380be73fdff79881721eed00Argyrios Kyrtzidis    PP.getExternalSource()->updateOutOfDateIdentifier(*II);
124373cb7832090dd5a380be73fdff79881721eed00Argyrios Kyrtzidis
125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the identifier is a macro, and if that macro is enabled, it may be
126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expanded so it's not a trivial expansion.
127a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() &&
128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Fast expanding "#define X X" is ok, because X would be disabled.
129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      II != MacroIdent)
130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is an object-like macro invocation, it is safe to trivially expand
133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // it.
134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isObjectLike()) return true;
135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro invocation, it's safe to trivially expand
137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // as long as the identifier is not a macro argument.
138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end();
139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner       I != E; ++I)
140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (*I == II)
141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;   // Identifier is a macro argument.
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return true;
144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be
148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('.  If so, consume the token and return true, if not, this
149a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens.
150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() {
151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Do some quick tests for rejection cases.
152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned Val;
153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (CurLexer)
154a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurLexer->isNextPPTokenLParen();
1551a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  else if (CurPTHLexer)
1561a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek    Val = CurPTHLexer->isNextPPTokenLParen();
157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  else
158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurTokenLexer->isNextTokenLParen();
1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
160a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (Val == 2) {
161a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // We have run off the end.  If it's a source file we don't
162a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // examine enclosing ones (C99 5.1.1.2p4).  Otherwise walk up the
163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // macro stack.
16417ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek    if (CurPPLexer)
165a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;
166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    for (unsigned i = IncludeMacroStack.size(); i != 0; --i) {
167a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      IncludeStackInfo &Entry = IncludeMacroStack[i-1];
168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Entry.TheLexer)
169a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheLexer->isNextPPTokenLParen();
170dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      else if (Entry.ThePTHLexer)
171dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek        Val = Entry.ThePTHLexer->isNextPPTokenLParen();
172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      else
173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheTokenLexer->isNextTokenLParen();
1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Val != 2)
176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        break;
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Ran off the end of a source file?
179dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      if (Entry.ThePPLexer)
180a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return false;
181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
182a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
184a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, if we know that the token is a '(', lex it and return.  Otherwise we
185a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // have found something that isn't a '(' or we found the end of the
186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // translation unit.  In either case, return false.
1870a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  return Val == 1;
188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be
191a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'.
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                                 MacroInfo *MI) {
1941367897633c2f5bb77f97cb05c76d5f80ead9976Douglas Gregor  // If this is a macro expansion in the "#if !defined(x)" line for the file,
195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // then the macro could expand to different things in other contexts, we need
196a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // to disable the optimization in this case.
19768a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek  if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro();
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially.
200a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isBuiltinMacro()) {
2011b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis    if (Callbacks) Callbacks->MacroExpands(Identifier, MI,
2021b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis                                           Identifier.getLocation());
203a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ExpandBuiltinMacro(Identifier);
204a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
2061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
207a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// Args - If this is a function-like macro expansion, this contains,
208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// for each macro argument, the list of tokens that were provided to the
209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// invocation.
210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MacroArgs *Args = 0;
2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2129e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  // Remember where the end of the expansion occurred.  For an object-like
213e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  // macro, this is the identifier.  For a function-like macro, this is the ')'.
2149e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  SourceLocation ExpansionEnd = Identifier.getLocation();
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
216a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro, read the arguments.
217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isFunctionLike()) {
218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p10: If the preprocessing token immediately after the the macro
2190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // name isn't a '(', this macro should not be expanded.
220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!isNextPPTokenLParen())
221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return true;
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Remember that we are now parsing the arguments to a macro invocation.
224a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Preprocessor directives used inside macro arguments are not portable, and
225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // this enables the warning.
226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = true;
2279e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    Args = ReadFunctionLikeMacroArgs(Identifier, MI, ExpansionEnd);
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
229a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Finished parsing args.
230a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = false;
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
232a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If there was an error parsing the arguments, bail out.
233a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (Args == 0) return false;
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFnMacroExpanded;
236a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
237a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumMacroExpanded;
238a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
2391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
240a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Notice that this macro has been used.
2410827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  markMacroAsUsed(MI);
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2439e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  // Remember where the token is expanded.
2449e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  SourceLocation ExpandLoc = Identifier.getLocation();
245b7d98d35ea723624345f06e5895ddce2e0388ef0Argyrios Kyrtzidis
2461b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis  if (Callbacks) Callbacks->MacroExpands(Identifier, MI,
2471b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis                                         SourceRange(ExpandLoc, ExpansionEnd));
2481b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis
2491b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis  // If we started lexing a macro, enter the macro expansion body.
2501b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis
251a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this macro expands to no tokens, don't bother to push it onto the
252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expansion stack, only to take it right back off.
253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->getNumTokens() == 0) {
254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // No need for arg info.
255561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Ignore this macro use, just return the next token in the current
258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // buffer.
259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool HadLeadingSpace = Identifier.hasLeadingSpace();
260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool IsAtStartOfLine = Identifier.isAtStartOfLine();
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
262a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Lex(Identifier);
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If the identifier isn't on some OTHER line, inherit the leading
265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // whitespace/first-on-a-line property of this token.  This handles
266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // stuff like "! XX," -> "! ," and "   XX," -> "    ,", when XX is
267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // empty.
268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!Identifier.isAtStartOfLine()) {
269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine);
270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace);
271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
27244aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis    Identifier.setFlag(Token::LeadingEmptyMacro);
273a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (MI->getNumTokens() == 1 &&
277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner             isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(),
278de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner                                           *this)) {
279a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Otherwise, if this macro expands into a single trivially-expanded
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // token: expand it now.  This handles common cases like
281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // "#define VAL 42".
2829a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
2839a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop    // No need for arg info.
284561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2859a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro
287a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // identifier to the expanded token.
288a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool isAtStartOfLine = Identifier.isAtStartOfLine();
289a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool hasLeadingSpace = Identifier.hasLeadingSpace();
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Replace the result token.
292a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier = MI->getReplacementToken(0);
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
294a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Restore the StartOfLine/LeadingSpace markers.
295a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine);
296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace);
2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2989e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // Update the tokens location to include both its expansion and physical
299a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // locations.
300a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation Loc =
301bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth      SourceMgr.createExpansionLoc(Identifier.getLocation(), ExpandLoc,
302bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                   ExpansionEnd,Identifier.getLength());
303a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setLocation(Loc);
3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3058ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // If this is a disabled macro or #define X X, we must mark the result as
3068ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // unexpandable.
3078ff66de0d036842450eb979882f826d5252100f4Chris Lattner    if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) {
3088ff66de0d036842450eb979882f826d5252100f4Chris Lattner      if (MacroInfo *NewMI = getMacroInfo(NewII))
3091e8a0678df724a28fe47e0034246f2604056a278Abramo Bagnara        if (!NewMI->isEnabled() || NewMI == MI) {
3108ff66de0d036842450eb979882f826d5252100f4Chris Lattner          Identifier.setFlag(Token::DisableExpand);
3111e8a0678df724a28fe47e0034246f2604056a278Abramo Bagnara          Diag(Identifier, diag::pp_disabled_macro_expansion);
3121e8a0678df724a28fe47e0034246f2604056a278Abramo Bagnara        }
3138ff66de0d036842450eb979882f826d5252100f4Chris Lattner    }
3141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Since this is not an identifier token, it can't be macro expanded, so
316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // we're done.
317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
321a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Start expanding the macro.
3229e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth  EnterMacro(Identifier, ExpansionEnd, Args);
3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Now that the macro is at the top of the include stack, ask the
325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // preprocessor to read the next token from it.
326a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Lex(Identifier);
327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return false;
328a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3300a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next
3310a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the
3320a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation.  This returns null on
3330a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error.
334a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
335e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   MacroInfo *MI,
336e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   SourceLocation &MacroEnd) {
337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // The number of fixed arguments to parse.
338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumFixedArgsLeft = MI->getNumArgs();
339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVariadic = MI->isVariadic();
3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Outer loop, while there are more arguments, keep reading them.
342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Token Tok;
343a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3440a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
3450a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // an argument value in a macro could expand to ',' or '(' or ')'.
3460a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  LexUnexpandedToken(Tok);
3470a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?");
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // ArgTokens - Build up a list of tokens that make up each argument.  Each
350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // argument is separated by an EOF token.  Use a SmallVector so we can avoid
351a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // heap allocations in the common case.
3525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Token, 64> ArgTokens;
353a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
354a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumActuals = 0;
3550a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  while (Tok.isNot(tok::r_paren)) {
3560a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) &&
3570a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner           "only expect argument separators here");
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3590a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    unsigned ArgTokenStart = ArgTokens.size();
3600a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    SourceLocation ArgStartLoc = Tok.getLocation();
3611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p11: Keep track of the number of l_parens we have seen.  Note
363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // that we already consumed the first one.
364a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned NumParens = 0;
3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
366a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    while (1) {
367a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
368a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // an argument value in a macro could expand to ',' or '(' or ')'.
369a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      LexUnexpandedToken(Tok);
3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne      if (Tok.is(tok::eof) || Tok.is(tok::eod)) { // "#if f(<eof>" & "#if f(\n"
372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Diag(MacroName, diag::err_unterm_macro_invoc);
37384021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne        // Do not lose the EOF/EOD.  Return it to the client.
374a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        MacroName = Tok;
375a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return 0;
376a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::r_paren)) {
377a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If we found the ) token, the macro arg list is done.
378e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        if (NumParens-- == 0) {
379e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner          MacroEnd = Tok.getLocation();
380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
381e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        }
382a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::l_paren)) {
383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        ++NumParens;
384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comma) && NumParens == 0) {
385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Comma ends this argument if there are more fixed arguments expected.
3860a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        // However, if this is a variadic macro, and this is part of the
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // variadic part, then the comma is just an argument token.
3880a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (!isVariadic) break;
3890a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (NumFixedArgsLeft > 1)
390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comment) && !KeepMacroComments) {
392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If this is a comment token in the argument list and we're just in
393a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // -C mode (not -CC mode), discard the comment.
394a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        continue;
3955c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner      } else if (Tok.getIdentifierInfo() != 0) {
396a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Reading macro arguments can cause macros that we are currently
397a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // expanding from to be popped off the expansion stack.  Doing so causes
398a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // them to be reenabled for expansion.  Here we record whether any
399a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // identifiers we lex as macro arguments correspond to disabled macros.
4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // If so, we mark the token as noexpand.  This is a subtle aspect of
401a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // C99 6.10.3.4p2.
402a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo()))
403a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          if (!MI->isEnabled())
404a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner            Tok.setFlag(Token::DisableExpand);
4057d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis      } else if (Tok.is(tok::code_completion)) {
4067d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        if (CodeComplete)
4077d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis          CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(),
4087d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                                  MI, NumActuals);
4097d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // Don't mark that we reached the code-completion point because the
4107d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // parser is going to handle the token and there will be another
4117d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        // code-completion callback.
412a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
4137d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
414a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ArgTokens.push_back(Tok);
415a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4170a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this was an empty argument list foo(), don't add this as an empty
4180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // argument.
4190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (ArgTokens.empty() && Tok.getKind() == tok::r_paren)
4200a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      break;
421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4220a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this is not a variadic macro, and too many args were specified, emit
4230a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // an error.
4240a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (!isVariadic && NumFixedArgsLeft == 0) {
4250a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      if (ArgTokens.size() != ArgTokenStart)
4260a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        ArgStartLoc = ArgTokens[ArgTokenStart].getLocation();
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emit the diagnostic at the macro name in case there is a missing ).
4290a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emitting it at the , could be far away from the macro name.
4300a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc);
4310a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      return 0;
4320a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    }
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43432c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner    // Empty arguments are standard in C99 and C++0x, and are supported as an extension in
435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // other modes.
4364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    if (ArgTokens.size() == ArgTokenStart && !LangOpts.C99)
4374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie      Diag(Tok, LangOpts.CPlusPlus0x ?
438661a99690bc133bbaa029da925481d4a860dec90Richard Smith           diag::warn_cxx98_compat_empty_fnmacro_arg :
439661a99690bc133bbaa029da925481d4a860dec90Richard Smith           diag::ext_empty_fnmacro_arg);
4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
442a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Token EOFTok;
443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.startToken();
444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setKind(tok::eof);
445e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner    EOFTok.setLocation(Tok.getLocation());
446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setLength(0);
447a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(EOFTok);
448a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumActuals;
4490a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert(NumFixedArgsLeft != 0 && "Too many arguments parsed");
450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    --NumFixedArgsLeft;
451e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  }
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
453a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, we either found the r_paren.  Check to see if we parsed too few
454a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // arguments.
455a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned MinArgsExpected = MI->getNumArgs();
4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
457a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // See MacroArgs instance var for description of this.
458a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVarargsElided = false;
4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (NumActuals < MinArgsExpected) {
461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // There are several cases where too few arguments is ok, handle them now.
46297e2de171de555feb1ef422e71874082a67498c9Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 1) {
46397e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // #define A(X)  or  #define A(...)   ---> A()
4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46597e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // If there is exactly one argument, and that argument is missing,
46697e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // then we have an empty "()" argument empty list.  This is fine, even if
46797e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // the macro expects one argument (the argument is just empty).
46897e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = MI->isVariadic();
46997e2de171de555feb1ef422e71874082a67498c9Chris Lattner    } else if (MI->isVariadic() &&
47097e2de171de555feb1ef422e71874082a67498c9Chris Lattner               (NumActuals+1 == MinArgsExpected ||  // A(x, ...) -> A(X)
47197e2de171de555feb1ef422e71874082a67498c9Chris Lattner                (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A()
472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Varargs where the named vararg parameter is missing: ok as extension.
473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // #define A(x, ...)
474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // A("blah")
475a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_missing_varargs_arg);
476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4770a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Remember this occurred, allowing us to elide the comma when used for
47863bc0358706e63faf705803c4799e073b91a63f0Chris Lattner      // cases like:
4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define A(x, foo...) blah(a, ## foo)
4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define B(x, ...) blah(a, ## __VA_ARGS__)
4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define C(...) blah(a, ## __VA_ARGS__)
4820a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      //  A(x) B(x) C()
48397e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = true;
484a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
485a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Otherwise, emit the error.
486a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::err_too_few_args_in_macro_invoc);
487a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return 0;
488a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
490a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
491a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation EndLoc = Tok.getLocation();
492a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.startToken();
493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::eof);
494a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLocation(EndLoc);
495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(0);
496a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(Tok);
4979fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner
4989fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    // If we expect two arguments, add both as empty.
4999fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 2)
5009fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner      ArgTokens.push_back(Tok);
5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5020a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) {
5030a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emit the diagnostic at the macro name in case there is a missing ).
5040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emitting it at the , could be far away from the macro name.
5050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    Diag(MacroName, diag::err_too_many_args_in_macro_invoc);
5060a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    return 0;
507a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
509d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie  return MacroArgs::create(MI, ArgTokens, isVarargsElided, *this);
510a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
511a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
5125b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// \brief Keeps macro expanded tokens for TokenLexers.
5135b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis//
5145b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// Works like a stack; a TokenLexer adds the macro expanded tokens that is
5155b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// going to lex in the cache and when it finishes the tokens are removed
5165b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// from the end of the cache.
5175b3284a9275a27f5c4410e25eb8933be540601d6Argyrios KyrtzidisToken *Preprocessor::cacheMacroExpandedTokens(TokenLexer *tokLexer,
5182d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner                                              ArrayRef<Token> tokens) {
5195b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(tokLexer);
5205b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  if (tokens.empty())
5215b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    return 0;
5225b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5235b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  size_t newIndex = MacroExpandedTokens.size();
5245b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  bool cacheNeedsToGrow = tokens.size() >
5255b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis                      MacroExpandedTokens.capacity()-MacroExpandedTokens.size();
5265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandedTokens.append(tokens.begin(), tokens.end());
5275b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5285b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  if (cacheNeedsToGrow) {
5295b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    // Go through all the TokenLexers whose 'Tokens' pointer points in the
5305b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    // buffer and update the pointers to the (potential) new buffer array.
5315b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    for (unsigned i = 0, e = MacroExpandingLexersStack.size(); i != e; ++i) {
5325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      TokenLexer *prevLexer;
5335b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      size_t tokIndex;
5345b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      llvm::tie(prevLexer, tokIndex) = MacroExpandingLexersStack[i];
5355b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis      prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex;
5365b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis    }
5375b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  }
5385b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5395b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex));
5405b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  return MacroExpandedTokens.data() + newIndex;
5415b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis}
5425b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
5435b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidisvoid Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() {
5445b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(!MacroExpandingLexersStack.empty());
5455b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  size_t tokIndex = MacroExpandingLexersStack.back().second;
5465b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  assert(tokIndex < MacroExpandedTokens.size());
5475b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  // Pop the cached macro expanded tokens from the end.
5485b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandedTokens.resize(tokIndex);
5495b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis  MacroExpandingLexersStack.pop_back();
5505b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis}
5515b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis
552a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified
553a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of
554a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted.
555a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc,
556a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                             Preprocessor &PP) {
557a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  time_t TT = time(0);
558a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  struct tm *TM = localtime(&TT);
5591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
560a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  static const char * const Months[] = {
561a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
562a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  };
5631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5645e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  char TmpBuffer[32];
565b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32
566b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor  sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
567b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor          TM->tm_year+1900);
568b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else
5695e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
570a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          TM->tm_year+1900);
571b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif
5721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Token TmpTok;
57447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TmpTok.startToken();
57547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
57647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  DATELoc = TmpTok.getLocation();
577a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
578513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32
579513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi  sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
580513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else
5815e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
582513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif
58347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
58447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TIMELoc = TmpTok.getLocation();
585a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
586a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
587148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
588c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasFeature - Return true if we recognize and implement the feature
589c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier as a standard language feature.
590148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
5914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &LangOpts = PP.getLangOpts();
5925297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  StringRef Feature = II->getName();
5931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5945297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  // Normalize the feature name, __foo__ becomes foo.
5955297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  if (Feature.startswith("__") && Feature.endswith("__") && Feature.size() >= 4)
5965297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith    Feature = Feature.substr(2, Feature.size() - 4);
5975297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith
5985297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  return llvm::StringSwitch<bool>(Feature)
599b61968857fd2c6579b4dcd7bad65736e89d21185Kostya Serebryany           .Case("address_sanitizer", LangOpts.AddressSanitizer)
6006d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_analyzer_noreturn", true)
601dceb53180ae145915673913a9398ba4a00b05584Douglas Gregor           .Case("attribute_availability", true)
6026d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_not_retained", true)
6036d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_retained", true)
6044820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_deprecated_with_message", true)
6056d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ext_vector_type", true)
6066d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_not_retained", true)
6076d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_retained", true)
60812b9434d5bf801e24242b1f6fd04899f8a7fa92cTed Kremenek           .Case("attribute_ns_consumes_self", true)
60911fe175346242744bd9cb4040f3c84e243934134Ted Kremenek           .Case("attribute_ns_consumed", true)
61011fe175346242744bd9cb4040f3c84e243934134Ted Kremenek           .Case("attribute_cf_consumed", true)
6116d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_objc_ivar_unused", true)
612d5313b0bbf3948fe7c63bf46a7da330c96d07309John McCall           .Case("attribute_objc_method_family", true)
6136d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_overloadable", true)
6144820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_unavailable_with_message", true)
61532592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("blocks", LangOpts.Blocks)
61632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("cxx_exceptions", LangOpts.Exceptions)
6176d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("cxx_rtti", LangOpts.RTTI)
6184820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("enumerator_attributes", true)
619f85e193739c953358c865005855253af4f68a497John McCall           // Objective-C features
620f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
621f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arc", LangOpts.ObjCAutoRefCount)
622f85e193739c953358c865005855253af4f68a497John McCall           .Case("objc_arc_weak", LangOpts.ObjCAutoRefCount &&
6239f084a3166b684573ba49df28fc5792bc37d92e1John McCall                 LangOpts.ObjCRuntimeHasWeak)
624f83a615ad0004fc4cca3e3c1ea2234a685487304Fariborz Jahanian           .Case("objc_default_synthesize_properties", LangOpts.ObjC2)
6255471bc85b69912e3b448de004498a80c0de32296Douglas Gregor           .Case("objc_fixed_enum", LangOpts.ObjC2)
626e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor           .Case("objc_instancetype", LangOpts.ObjC2)
627bd507c5ef3cfe58aa2c0eca901fcd53b45c673a1Douglas Gregor           .Case("objc_modules", LangOpts.ObjC2 && LangOpts.Modules)
62832592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI)
6293ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek           .Case("objc_weak_class", LangOpts.ObjCNonFragileABI)
630dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_holds", true)
631dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_returns", true)
632dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_takes", true)
633ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek           .Case("objc_bool", true)
634ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek           .Case("objc_subscripting", LangOpts.ObjCNonFragileABI)
635ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek           .Case("objc_array_literals", LangOpts.ObjC2)
636ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek           .Case("objc_dictionary_literals", LangOpts.ObjC2)
637eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard           .Case("objc_boxed_expressions", LangOpts.ObjC2)
638eb2ac8b349e181bdc71bfd64980c019be3180d76John McCall           .Case("arc_cf_code_audited", true)
639ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer           // C11 features
640ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer           .Case("c_alignas", LangOpts.C11)
6417a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall           .Case("c_atomic", LangOpts.C11)
642ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer           .Case("c_generic_selections", LangOpts.C11)
643ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer           .Case("c_static_assert", LangOpts.C11)
6449c1dda7d7b6336506764ce1b03baf4c03ed9ff92Richard Smith           // C++11 features
6457822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor           .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus0x)
6463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith           .Case("cxx_alias_templates", LangOpts.CPlusPlus0x)
647fd5f6866a7574f12ecac5cceb7359ff253f83145Peter Collingbourne           .Case("cxx_alignas", LangOpts.CPlusPlus0x)
6487a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall           .Case("cxx_atomic", LangOpts.CPlusPlus0x)
649c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_attributes", LangOpts.CPlusPlus0x)
650738291eedac0f3f3628e34b0b32d6155f280fab2Richard Smith           .Case("cxx_auto_type", LangOpts.CPlusPlus0x)
651b5216aaf803609d25eb8514266dd8531812b4877Richard Smith           .Case("cxx_constexpr", LangOpts.CPlusPlus0x)
652c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_decltype", LangOpts.CPlusPlus0x)
653316551f079a182d15c0e9b930c361428c968b5eeDouglas Gregor           .Case("cxx_decltype_incomplete_return_types", LangOpts.CPlusPlus0x)
6540750800623dc6d14c4c0c721996ffd4210fcdff3Douglas Gregor           .Case("cxx_default_function_template_args", LangOpts.CPlusPlus0x)
655f695a6952f111e79c685301c292755908473f297Douglas Gregor           .Case("cxx_defaulted_functions", LangOpts.CPlusPlus0x)
656059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt           .Case("cxx_delegating_constructors", LangOpts.CPlusPlus0x)
657c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x)
658ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_explicit_conversions", LangOpts.CPlusPlus0x)
659d1dc3aa25797301788f1c4f30f769b1d9e1fb22aSebastian Redl           .Case("cxx_generalized_initializers", LangOpts.CPlusPlus0x)
66074e611a5fd0b5977c664d13a07b625ae23527d0dSebastian Redl           .Case("cxx_implicit_moves", LangOpts.CPlusPlus0x)
661ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor         //.Case("cxx_inheriting_constructors", false)
662c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x)
6637c07e964d72a287aa3d5714731e202c3ffa17007Douglas Gregor           .Case("cxx_lambdas", LangOpts.CPlusPlus0x)
6647b156ddae822a546aa9e8b23d683ac76da8e8ac8Douglas Gregor           .Case("cxx_local_type_template_args", LangOpts.CPlusPlus0x)
665ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus0x)
6664561ecdf27b68d80b3cecc2d80ec32bea0ac2127Sebastian Redl           .Case("cxx_noexcept", LangOpts.CPlusPlus0x)
66784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor           .Case("cxx_nullptr", LangOpts.CPlusPlus0x)
668c8b9f7977094d0169ec59f9042e85ca854735299Anders Carlsson           .Case("cxx_override_control", LangOpts.CPlusPlus0x)
669a391a4642c5eb98aae606f2a2b7219b1a3619d11Richard Smith           .Case("cxx_range_for", LangOpts.CPlusPlus0x)
670172b221147ab56e60968d3f7ffdb42256622fa4cDouglas Gregor           .Case("cxx_raw_string_literals", LangOpts.CPlusPlus0x)
67156209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x)
672c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x)
673c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_strong_enums", LangOpts.CPlusPlus0x)
674c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_static_assert", LangOpts.CPlusPlus0x)
675c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_trailing_return", LangOpts.CPlusPlus0x)
676172b221147ab56e60968d3f7ffdb42256622fa4cDouglas Gregor           .Case("cxx_unicode_literals", LangOpts.CPlusPlus0x)
677ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith           .Case("cxx_unrestricted_unions", LangOpts.CPlusPlus0x)
6789c1dda7d7b6336506764ce1b03baf4c03ed9ff92Richard Smith           .Case("cxx_user_literals", LangOpts.CPlusPlus0x)
679c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x)
680afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           // Type traits
681afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_assign", LangOpts.CPlusPlus)
682afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_copy", LangOpts.CPlusPlus)
683afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_nothrow_constructor", LangOpts.CPlusPlus)
684afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_assign", LangOpts.CPlusPlus)
685afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_copy", LangOpts.CPlusPlus)
686afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_constructor", LangOpts.CPlusPlus)
687afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_trivial_destructor", LangOpts.CPlusPlus)
688afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("has_virtual_destructor", LangOpts.CPlusPlus)
689afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_abstract", LangOpts.CPlusPlus)
690afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_base_of", LangOpts.CPlusPlus)
691afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_class", LangOpts.CPlusPlus)
692afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_convertible_to", LangOpts.CPlusPlus)
693b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // __is_empty is available only if the horrible
694b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // "struct __is_empty" parsing hack hasn't been needed in this
695b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // translation unit. If it has, __is_empty reverts to a normal
696b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor            // identifier and __has_feature(is_empty) evaluates false.
697688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor           .Case("is_empty",
6989a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 LangOpts.CPlusPlus &&
6999a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 PP.getIdentifierInfo("__is_empty")->getTokenID()
7009a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                                                            != tok::identifier)
701afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_enum", LangOpts.CPlusPlus)
7025e9392ba18f5925e26cc5714d1412eda0d219826Douglas Gregor           .Case("is_final", LangOpts.CPlusPlus)
7034e61ddd644e9c6293697a966d98d7c1905cf63a8Chandler Carruth           .Case("is_literal", LangOpts.CPlusPlus)
704a55e68b7f961d6ef4551c9be9ac18a1e25c7c927Howard Hinnant           .Case("is_standard_layout", LangOpts.CPlusPlus)
705b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // __is_pod is available only if the horrible
706b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // "struct __is_pod" parsing hack hasn't been needed in this
707b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // translation unit. If it has, __is_pod reverts to a normal
708b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor           // identifier and __has_feature(is_pod) evaluates false.
709688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor           .Case("is_pod",
7109a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 LangOpts.CPlusPlus &&
7119a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                 PP.getIdentifierInfo("__is_pod")->getTokenID()
7129a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor                                                            != tok::identifier)
713afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_polymorphic", LangOpts.CPlusPlus)
714b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth           .Case("is_trivial", LangOpts.CPlusPlus)
71525d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor           .Case("is_trivially_assignable", LangOpts.CPlusPlus)
7164ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor           .Case("is_trivially_constructible", LangOpts.CPlusPlus)
717feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt           .Case("is_trivially_copyable", LangOpts.CPlusPlus)
718afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor           .Case("is_union", LangOpts.CPlusPlus)
719bd507c5ef3cfe58aa2c0eca901fcd53b45c673a1Douglas Gregor           .Case("modules", LangOpts.Modules)
7201f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher           .Case("tls", PP.getTargetInfo().isTLSSupported())
721858a325e5f250c83409137c5609b162983ea6d1eSean Hunt           .Case("underlying_type", LangOpts.CPlusPlus)
72232592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Default(false);
723148772a841cae6f32db16d890e788b92a763bb3fChris Lattner}
724148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
725c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasExtension - Return true if we recognize and implement the feature
726c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier, either as an extension or a standard language
727c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// feature.
728c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbournestatic bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) {
729c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  if (HasFeature(PP, II))
730c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    return true;
731c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
732c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // If the use of an extension results in an error diagnostic, extensions are
733c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // effectively unavailable, so just return false here.
734d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  if (PP.getDiagnostics().getExtensionHandlingBehavior() ==
735d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie      DiagnosticsEngine::Ext_Error)
736c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    return false;
737c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
7384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &LangOpts = PP.getLangOpts();
7395297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  StringRef Extension = II->getName();
7405297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith
7415297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  // Normalize the extension name, __foo__ becomes foo.
7425297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  if (Extension.startswith("__") && Extension.endswith("__") &&
7435297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith      Extension.size() >= 4)
7445297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith    Extension = Extension.substr(2, Extension.size() - 4);
745c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
746c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // Because we inherit the feature list from HasFeature, this string switch
747c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  // must be less restrictive than HasFeature's.
7485297d71e8c85f9b04dc31c690e91c6a2f7eddb90Richard Smith  return llvm::StringSwitch<bool>(Extension)
749ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer           // C11 features supported by other languages as extensions.
750fd5f6866a7574f12ecac5cceb7359ff253f83145Peter Collingbourne           .Case("c_alignas", true)
7517a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall           .Case("c_atomic", true)
752c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_generic_selections", true)
753c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("c_static_assert", true)
754c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           // C++0x features supported by other languages as extensions.
7557a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall           .Case("cxx_atomic", LangOpts.CPlusPlus)
756c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_deleted_functions", LangOpts.CPlusPlus)
757ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_explicit_conversions", LangOpts.CPlusPlus)
758c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus)
7597b156ddae822a546aa9e8b23d683ac76da8e8ac8Douglas Gregor           .Case("cxx_local_type_template_args", LangOpts.CPlusPlus)
760ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor           .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus)
761c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_override_control", LangOpts.CPlusPlus)
7627640c0070361bd365e30fc2eb3b6a64361fa7377Richard Smith           .Case("cxx_range_for", LangOpts.CPlusPlus)
763c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus)
764c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Case("cxx_rvalue_references", LangOpts.CPlusPlus)
765c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne           .Default(false);
766c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne}
767c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne
768cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute -  Return true if we recognize and implement the attribute
769cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier.
770cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) {
7718a5e7fdd2c7d3f46685396e13ed76798f4573c02Jean-Daniel Dupas  StringRef Name = II->getName();
7728a5e7fdd2c7d3f46685396e13ed76798f4573c02Jean-Daniel Dupas  // Normalize the attribute name, __foo__ becomes foo.
7738a5e7fdd2c7d3f46685396e13ed76798f4573c02Jean-Daniel Dupas  if (Name.startswith("__") && Name.endswith("__") && Name.size() >= 4)
7748a5e7fdd2c7d3f46685396e13ed76798f4573c02Jean-Daniel Dupas    Name = Name.substr(2, Name.size() - 4);
7758a5e7fdd2c7d3f46685396e13ed76798f4573c02Jean-Daniel Dupas
7768a5e7fdd2c7d3f46685396e13ed76798f4573c02Jean-Daniel Dupas  return llvm::StringSwitch<bool>(Name)
777cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc"
778cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson        .Default(false);
779cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson}
780cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson
78192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")'
78292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression.
78392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
7843ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok,
7853ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     IdentifierInfo *II, Preprocessor &PP,
7863ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     const DirectoryLookup *LookupFrom) {
78792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  SourceLocation LParenLoc;
78892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
78992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get '('.
79092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
79192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a '('.
79392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::l_paren)) {
79492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName();
79592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
79692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
79792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
79892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Save '(' location for possible missing ')' message.
79992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  LParenLoc = Tok.getLocation();
80092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
80192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the file name.
80292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.getCurrentLexer()->LexIncludeFilename(Tok);
80392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
80492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Reserve a buffer to get the spelling.
805f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> FilenameBuffer;
8065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef Filename;
807ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  SourceLocation EndLoc;
808ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
80992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  switch (Tok.getKind()) {
81084021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  case tok::eod:
81184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne    // If the token kind is EOD, the error has already been diagnosed.
81292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
81392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
81492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::angle_string_literal:
815453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  case tok::string_literal: {
816453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    bool Invalid = false;
817453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid);
818453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    if (Invalid)
819453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor      return false;
82092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
821453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  }
82292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
82392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::less:
82492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // This could be a <foo/bar.h> file coming from a macro expansion.  In this
82592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // case, glue the tokens together into FilenameBuffer and interpret those.
82692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    FilenameBuffer.push_back('<');
827ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc))
82884021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne      return false;   // Found <eod> but no ">"?  Diagnostic already emitted.
829a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner    Filename = FilenameBuffer.str();
83092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
83192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  default:
83292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename);
83392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
83492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
83592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
83699831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  // Get ')'.
83799831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  PP.LexNonComment(Tok);
83899831e4677a7e2e051af636221694d60ba31fcdbRichard Smith
83999831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  // Ensure we have a trailing ).
84099831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  if (Tok.isNot(tok::r_paren)) {
84199831e4677a7e2e051af636221694d60ba31fcdbRichard Smith    PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName();
84299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith    PP.Diag(LParenLoc, diag::note_matching) << "(";
84399831e4677a7e2e051af636221694d60ba31fcdbRichard Smith    return false;
84499831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  }
84599831e4677a7e2e051af636221694d60ba31fcdbRichard Smith
846a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename);
84792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // If GetIncludeFilenameSpelling set the start ptr to null, there was an
84892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // error.
849a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  if (Filename.empty())
85092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
85192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
85292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Search include directories.
85392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *CurDir;
854b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth  const FileEntry *File =
855fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor      PP.LookupFile(Filename, isAngled, LookupFrom, CurDir, NULL, NULL, NULL);
85692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
85799831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  // Get the result value.  A result of true means the file exists.
85899831e4677a7e2e051af636221694d60ba31fcdbRichard Smith  return File != 0;
85992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
86092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
86192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression.
86292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
8633ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II,
86492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                               Preprocessor &PP) {
8653ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, NULL);
86692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
86792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
86892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression.
86992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
8703ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok,
87192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                                   IdentifierInfo *II, Preprocessor &PP) {
87292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // __has_include_next is like __has_include, except that we start
87392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // searching after the current found directory.  If we can't do this,
87492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // issue a diagnostic.
87592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *Lookup = PP.GetCurDirLookup();
87692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (PP.isInPrimaryFile()) {
87792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Lookup = 0;
87892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_in_primary);
87992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (Lookup == 0) {
88092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_absolute_path);
88192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else {
88292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // Start looking up in the next directory.
88392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    ++Lookup;
88492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
88592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
8863ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, Lookup);
88792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
888148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
889a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded
890a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'.
891a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) {
892a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Figure out which token this is.
893a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = Tok.getIdentifierInfo();
894a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  assert(II && "Can't be a macro without id info!");
8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8961ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // If this is an _Pragma or Microsoft __pragma directive, expand it,
8971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // invoke the pragma handler, then lex the token after it.
898a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident_Pragma)
899a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return Handle_Pragma(Tok);
9001ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else if (II == Ident__pragma) // in non-MS mode this is null
9011ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    return HandleMicrosoft__pragma(Tok);
9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
903a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  ++NumBuiltinMacroExpanded;
904a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
905f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> TmpBuffer;
906b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::raw_svector_ostream OS(TmpBuffer);
907a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
908a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Set up the return result.
909a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.setIdentifierInfo(0);
910a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.clearFlag(Token::NeedsCleaning);
9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
912a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident__LINE__) {
913b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__LINE__: The presumed line number (within the current
914b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // source file) of the current source line (an integer constant)".  This can
915b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // be affected by #line.
916081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    SourceLocation Loc = Tok.getLocation();
9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
918dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // Advance to the location of the first _, this might not be the first byte
919dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // of the token if it starts with an escaped newline.
920dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    Loc = AdvanceToTokenCharacter(Loc, 0);
9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
922081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // One wrinkle here is that GCC expands __LINE__ to location of the *end* of
9239e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // a macro expansion.  This doesn't matter for object-like macros, but
924081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // can matter for a function-like macro that expands to contain __LINE__.
9259e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // Skip down through expansion points until we find a file loc for the
9269e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth    // end of the expansion history.
927edc3dccece244a584f8ebdb81da6c962c08e79beChandler Carruth    Loc = SourceMgr.getExpansionRange(Loc).second;
928081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9301fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __LINE__ expands to a simple numeric value.
931cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << (PLoc.isValid()? PLoc.getLine() : 1);
932a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
933a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) {
934b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__FILE__: The presumed name of the current source file (a
935b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // character string literal)". This can be affected by #line.
936b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
937b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
938b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // __BASE_FILE__ is a GNU extension that returns the top of the presumed
939b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // #include stack instead of the current file.
940cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (II == Ident__BASE_FILE__ && PLoc.isValid()) {
941b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      SourceLocation NextLoc = PLoc.getIncludeLoc();
942a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      while (NextLoc.isValid()) {
943b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        PLoc = SourceMgr.getPresumedLoc(NextLoc);
944cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        if (PLoc.isInvalid())
945cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor          break;
946cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
947b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        NextLoc = PLoc.getIncludeLoc();
948a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
949a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
9501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
951a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Escape this filename.  Turn '\' -> '\\' '"' -> '\"'
952f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<128> FN;
953cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
954cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      FN += PLoc.getFilename();
955cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      Lexer::Stringify(FN);
956cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      OS << '"' << FN.str() << '"';
957cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
958a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
959a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__DATE__) {
960a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!DATELoc.isValid())
961a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
962a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
963a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"Mmm dd yyyy\""));
964bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    Tok.setLocation(SourceMgr.createExpansionLoc(DATELoc, Tok.getLocation(),
965bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLocation(),
966bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLength()));
967b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
968a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIME__) {
969a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!TIMELoc.isValid())
970a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
971a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
972a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"hh:mm:ss\""));
973bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    Tok.setLocation(SourceMgr.createExpansionLoc(TIMELoc, Tok.getLocation(),
974bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLocation(),
975bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth                                                 Tok.getLength()));
976b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
977a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__INCLUDE_LEVEL__) {
978b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // Compute the presumed include depth of this token.  This can be affected
979b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // by GNU line markers.
980a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned Depth = 0;
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
982b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
983cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
984b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
985cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      for (; PLoc.isValid(); ++Depth)
986cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
987cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9891fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __INCLUDE_LEVEL__ expands to a simple numeric value.
990b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << Depth;
991a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
992a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIMESTAMP__) {
993a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // MSVC, ICC, GCC, VisualAge C++ extension.  The generated string should be
994a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime.
995a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
996a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Get the file that we are lexing out of.  If we're currently lexing from
997a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // a macro, dig into the include stack.
998a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const FileEntry *CurFile = 0;
999a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek    PreprocessorLexer *TheLexer = getCurrentFileLexer();
10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1001a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (TheLexer)
1002ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek      CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID());
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1004a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const char *Result;
1005a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (CurFile) {
1006a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      time_t TT = CurFile->getModificationTime();
1007a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      struct tm *TM = localtime(&TT);
1008a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = asctime(TM);
1009a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
1010a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = "??? ??? ?? ??:??:?? ????\n";
1011a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
1012b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    // Surround the string with " and strip the trailing newline.
10135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    OS << '"' << StringRef(Result, strlen(Result)-1) << '"';
1014a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
1015c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner  } else if (II == Ident__COUNTER__) {
1016c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    // __COUNTER__ expands to a simple numeric value.
1017b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << CounterValue++;
1018c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    Tok.setKind(tok::numeric_constant);
1019c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne  } else if (II == Ident__has_feature   ||
1020c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne             II == Ident__has_extension ||
1021c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne             II == Ident__has_builtin   ||
1022cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson             II == Ident__has_attribute) {
1023c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    // The argument to these builtins should be a parenthesized identifier.
1024148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    SourceLocation StartLoc = Tok.getLocation();
10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1026148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool IsValid = false;
1027148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    IdentifierInfo *FeatureII = 0;
10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1029148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    // Read the '('.
1030148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Lex(Tok);
1031148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (Tok.is(tok::l_paren)) {
1032148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      // Read the identifier
1033148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Lex(Tok);
1034148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      if (Tok.is(tok::identifier)) {
1035148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        FeatureII = Tok.getIdentifierInfo();
10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1037148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        // Read the ')'.
1038148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        Lex(Tok);
1039148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        if (Tok.is(tok::r_paren))
1040148772a841cae6f32db16d890e788b92a763bb3fChris Lattner          IsValid = true;
1041148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      }
1042148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
10431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1044148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool Value = false;
1045148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (!IsValid)
1046148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Diag(StartLoc, diag::err_feature_check_malformed);
1047148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    else if (II == Ident__has_builtin) {
10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Check for a builtin is trivial.
1049148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = FeatureII->getBuiltinID() != 0;
1050cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    } else if (II == Ident__has_attribute)
1051cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson      Value = HasAttribute(FeatureII);
1052c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne    else if (II == Ident__has_extension)
1053c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne      Value = HasExtension(*this, FeatureII);
1054cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    else {
1055148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      assert(II == Ident__has_feature && "Must be feature check");
1056148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = HasFeature(*this, FeatureII);
1057148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
10581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1059b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
10602831092e8063c01aa307bc62ff5e9eb8db2ceedcChris Lattner    if (IsValid)
10612831092e8063c01aa307bc62ff5e9eb8db2ceedcChris Lattner      Tok.setKind(tok::numeric_constant);
106292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (II == Ident__has_include ||
106392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson             II == Ident__has_include_next) {
106492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // The argument to these two builtins should be a parenthesized
106592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // file name string literal using angle brackets (<>) or
106692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // double-quotes ("").
10673ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner    bool Value;
106892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    if (II == Ident__has_include)
10693ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasInclude(Tok, II, *this);
107092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    else
10713ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasIncludeNext(Tok, II, *this);
1072b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
107392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Tok.setKind(tok::numeric_constant);
1074d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek  } else if (II == Ident__has_warning) {
1075d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    // The argument should be a parenthesized string literal.
1076d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    // The argument to these builtins should be a parenthesized identifier.
1077d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    SourceLocation StartLoc = Tok.getLocation();
1078d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    bool IsValid = false;
1079d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    bool Value = false;
1080d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    // Read the '('.
1081d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    Lex(Tok);
1082d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    do {
1083d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek      if (Tok.is(tok::l_paren)) {
1084d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Read the string.
1085d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        Lex(Tok);
1086d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1087d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // We need at least one string literal.
1088d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (!Tok.is(tok::string_literal)) {
1089d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          StartLoc = Tok.getLocation();
1090d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          IsValid = false;
1091d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          // Eat tokens until ')'.
1092d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          do Lex(Tok); while (!(Tok.is(tok::r_paren) || Tok.is(tok::eod)));
1093d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1094d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1095d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1096d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // String concatenation allows multiple strings, which can even come
1097d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // from macro expansion.
1098d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        SmallVector<Token, 4> StrToks;
1099d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        while (Tok.is(tok::string_literal)) {
110099831e4677a7e2e051af636221694d60ba31fcdbRichard Smith          // Complain about, and drop, any ud-suffix.
110199831e4677a7e2e051af636221694d60ba31fcdbRichard Smith          if (Tok.hasUDSuffix())
110299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith            Diag(Tok, diag::err_invalid_string_udl);
1103d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          StrToks.push_back(Tok);
1104d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          LexUnexpandedToken(Tok);
1105d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1106d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1107d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Is the end a ')'?
1108d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (!(IsValid = Tok.is(tok::r_paren)))
1109d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1110d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1111d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Concatenate and parse the strings.
1112d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        StringLiteralParser Literal(&StrToks[0], StrToks.size(), *this);
1113d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        assert(Literal.isAscii() && "Didn't allow wide strings in");
1114d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (Literal.hadError)
1115d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1116d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (Literal.Pascal) {
1117d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          Diag(Tok, diag::warn_pragma_diagnostic_invalid);
1118d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1119d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1120d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1121d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        StringRef WarningName(Literal.GetString());
1122d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1123d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        if (WarningName.size() < 3 || WarningName[0] != '-' ||
1124d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek            WarningName[1] != 'W') {
1125d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          Diag(StrToks[0].getLocation(), diag::warn_has_warning_invalid_option);
1126d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          break;
1127d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        }
1128d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1129d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Finally, check if the warning flags maps to a diagnostic group.
1130d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // We construct a SmallVector here to talk to getDiagnosticIDs().
1131d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // Although we don't use the result, this isn't a hot path, and not
1132d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        // worth special casing.
1133d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        llvm::SmallVector<diag::kind, 10> Diags;
1134d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek        Value = !getDiagnostics().getDiagnosticIDs()->
1135d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek          getDiagnosticsInGroup(WarningName.substr(2), Diags);
1136d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek      }
1137d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    } while (false);
1138d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1139d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    if (!IsValid)
1140d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek      Diag(StartLoc, diag::err_warning_check_malformed);
1141d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek
1142d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    OS << (int)Value;
1143d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek    Tok.setKind(tok::numeric_constant);
1144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
1145b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unknown identifier!");
1146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
1147a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara  CreateString(OS.str().data(), OS.str().size(), Tok,
1148a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara               Tok.getLocation(), Tok.getLocation());
1149a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
11500827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis
11510827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) {
11520827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // If the 'used' status changed, and the macro requires 'unused' warning,
11530827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // remove its SourceLocation from the warn-for-unused-macro locations.
11540827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  if (MI->isWarnIfUnused() && !MI->isUsed())
11550827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis    WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
11560827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  MI->setIsUsed(true);
11570827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis}
1158