PPMacroExpansion.cpp revision 56209ffed29ab82d0d65ac0d1d026fe179321afd
1a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===--- MacroExpansion.cpp - Top level Macro Expansion -------------------===//
2a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
3a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//                     The LLVM Compiler Infrastructure
4a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
5a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file is distributed under the University of Illinois Open Source
6a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// License. See LICENSE.TXT for details.
7a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
8a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===//
9a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
10a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file implements the top level handling of macro expasion for the
11a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// preprocessor.
12a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//
13a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===//
14a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
15a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/Preprocessor.h"
16a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "MacroArgs.h"
17a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/MacroInfo.h"
18a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/SourceManager.h"
19a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/FileManager.h"
201f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher#include "clang/Basic/TargetInfo.h"
21500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h"
22f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor#include "clang/Lex/CodeCompletionHandler.h"
23295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h"
2432592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer#include "llvm/ADT/StringSwitch.h"
256665ffbfc397f68e3fb15844597674d5861995b6Douglas Gregor#include "llvm/Config/config.h"
26b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer#include "llvm/Support/raw_ostream.h"
273daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio>
28f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime>
29a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang;
30a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
31295a2a617ac335f590e430ab7fcd98f8ce109251Douglas GregorMacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const {
32295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(II->hasMacroDefinition() && "Identifier is not a macro!");
33295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
34295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos
35295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    = Macros.find(II);
36295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  if (Pos == Macros.end()) {
37295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    // Load this macro from the external source.
38295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    getExternalSource()->LoadMacroDefinition(II);
39295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    Pos = Macros.find(II);
40295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  }
41295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(Pos != Macros.end() && "Identifier macro info is missing!");
42295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  return Pos->second;
43295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
44295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
45a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier.
46a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner///
47a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) {
48555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  if (MI) {
49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Macros[II] = MI;
50a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    II->setHasMacroDefinition(true);
51555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner  } else if (II->hasMacroDefinition()) {
52555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    Macros.erase(II);
53555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner    II->setHasMacroDefinition(false);
54a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
55a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
56a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier
58a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded.
59148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){
60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Get the identifier.
61148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  IdentifierInfo *Id = PP.getIdentifierInfo(Name);
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Mark it as being a macro that is builtin.
64148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation());
65a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MI->setIsBuiltinMacro();
66148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  PP.setMacroInfo(Id, MI);
67a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return Id;
68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
69a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the
72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table.
73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() {
74148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__");
75148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__");
76148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__");
77148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__");
78148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__");
79148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident_Pragma  = RegisterBuiltinMacro(*this, "_Pragma");
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // GCC Extensions.
82148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__BASE_FILE__     = RegisterBuiltinMacro(*this, "__BASE_FILE__");
83148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__");
84148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  Ident__TIMESTAMP__     = RegisterBuiltinMacro(*this, "__TIMESTAMP__");
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  // Clang Extensions.
8792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_feature      = RegisterBuiltinMacro(*this, "__has_feature");
8892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_builtin      = RegisterBuiltinMacro(*this, "__has_builtin");
89cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson  Ident__has_attribute    = RegisterBuiltinMacro(*this, "__has_attribute");
9092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include      = RegisterBuiltinMacro(*this, "__has_include");
9192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next");
921ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall
931ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // Microsoft Extensions.
941ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  if (Features.Microsoft)
951ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = RegisterBuiltinMacro(*this, "__pragma");
961ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else
971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    Ident__pragma = 0;
98a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
99a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
100a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token
101a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally.
102a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI,
103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          const IdentifierInfo *MacroIdent,
104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                          Preprocessor &PP) {
105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo();
106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
107a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the token isn't an identifier, it's always literally expanded.
108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == 0) return true;
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If the identifier is a macro, and if that macro is enabled, it may be
111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expanded so it's not a trivial expansion.
112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() &&
113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Fast expanding "#define X X" is ok, because X would be disabled.
114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      II != MacroIdent)
115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is an object-like macro invocation, it is safe to trivially expand
118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // it.
119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isObjectLike()) return true;
120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
121a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro invocation, it's safe to trivially expand
122a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // as long as the identifier is not a macro argument.
123a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end();
124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner       I != E; ++I)
125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (*I == II)
126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;   // Identifier is a macro argument.
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return true;
129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
131a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be
133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('.  If so, consume the token and return true, if not, this
134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens.
135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() {
136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Do some quick tests for rejection cases.
137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned Val;
138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (CurLexer)
139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurLexer->isNextPPTokenLParen();
1401a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  else if (CurPTHLexer)
1411a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek    Val = CurPTHLexer->isNextPPTokenLParen();
142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  else
143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Val = CurTokenLexer->isNextTokenLParen();
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (Val == 2) {
146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // We have run off the end.  If it's a source file we don't
147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // examine enclosing ones (C99 5.1.1.2p4).  Otherwise walk up the
148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // macro stack.
14917ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek    if (CurPPLexer)
150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return false;
151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    for (unsigned i = IncludeMacroStack.size(); i != 0; --i) {
152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      IncludeStackInfo &Entry = IncludeMacroStack[i-1];
153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Entry.TheLexer)
154a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheLexer->isNextPPTokenLParen();
155dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      else if (Entry.ThePTHLexer)
156dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek        Val = Entry.ThePTHLexer->isNextPPTokenLParen();
157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      else
158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Val = Entry.TheTokenLexer->isNextTokenLParen();
1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
160a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Val != 2)
161a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        break;
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Ran off the end of a source file?
164dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek      if (Entry.ThePPLexer)
165a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return false;
166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
167a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
169a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, if we know that the token is a '(', lex it and return.  Otherwise we
170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // have found something that isn't a '(' or we found the end of the
171a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // translation unit.  In either case, return false.
1720a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  return Val == 1;
173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be
176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'.
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                                                 MacroInfo *MI) {
179ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner  if (Callbacks) Callbacks->MacroExpands(Identifier, MI);
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1811367897633c2f5bb77f97cb05c76d5f80ead9976Douglas Gregor  // If this is a macro expansion in the "#if !defined(x)" line for the file,
182a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // then the macro could expand to different things in other contexts, we need
183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // to disable the optimization in this case.
18468a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek  if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro();
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially.
187a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isBuiltinMacro()) {
188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ExpandBuiltinMacro(Identifier);
189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
192a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// Args - If this is a function-like macro expansion, this contains,
193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// for each macro argument, the list of tokens that were provided to the
194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  /// invocation.
195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  MacroArgs *Args = 0;
1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  // Remember where the end of the instantiation occurred.  For an object-like
198e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  // macro, this is the identifier.  For a function-like macro, this is the ')'.
199e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  SourceLocation InstantiationEnd = Identifier.getLocation();
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
201a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this is a function-like macro, read the arguments.
202a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->isFunctionLike()) {
203a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p10: If the preprocessing token immediately after the the macro
2040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // name isn't a '(', this macro should not be expanded.
205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!isNextPPTokenLParen())
206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return true;
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Remember that we are now parsing the arguments to a macro invocation.
209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Preprocessor directives used inside macro arguments are not portable, and
210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // this enables the warning.
211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = true;
212e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner    Args = ReadFunctionLikeMacroArgs(Identifier, MI, InstantiationEnd);
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Finished parsing args.
215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    InMacroArgs = false;
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If there was an error parsing the arguments, bail out.
218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (Args == 0) return false;
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFnMacroExpanded;
221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumMacroExpanded;
223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Notice that this macro has been used.
2260827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  markMacroAsUsed(MI);
2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
228a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If we started lexing a macro, enter the macro expansion body.
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
230a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // If this macro expands to no tokens, don't bother to push it onto the
231a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // expansion stack, only to take it right back off.
232a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (MI->getNumTokens() == 0) {
233a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // No need for arg info.
234561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
236a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Ignore this macro use, just return the next token in the current
237a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // buffer.
238a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool HadLeadingSpace = Identifier.hasLeadingSpace();
239a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool IsAtStartOfLine = Identifier.isAtStartOfLine();
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Lex(Identifier);
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // If the identifier isn't on some OTHER line, inherit the leading
244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // whitespace/first-on-a-line property of this token.  This handles
245a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // stuff like "! XX," -> "! ," and "   XX," -> "    ,", when XX is
246a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // empty.
247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!Identifier.isAtStartOfLine()) {
248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine);
249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace);
250a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
25144aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis    Identifier.setFlag(Token::LeadingEmptyMacro);
252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (MI->getNumTokens() == 1 &&
256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner             isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(),
257de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner                                           *this)) {
258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Otherwise, if this macro expands into a single trivially-expanded
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // token: expand it now.  This handles common cases like
260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // "#define VAL 42".
2619a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
2629a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop    // No need for arg info.
263561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner    if (Args) Args->destroy(*this);
2649a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop
265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro
266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // identifier to the expanded token.
267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool isAtStartOfLine = Identifier.isAtStartOfLine();
268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    bool hasLeadingSpace = Identifier.hasLeadingSpace();
2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Remember where the token is instantiated.
271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation InstantiateLoc = Identifier.getLocation();
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
273a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Replace the result token.
274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier = MI->getReplacementToken(0);
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Restore the StartOfLine/LeadingSpace markers.
277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine);
278a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace);
2791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
280f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner    // Update the tokens location to include both its instantiation and physical
281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // locations.
282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation Loc =
283de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner      SourceMgr.createInstantiationLoc(Identifier.getLocation(), InstantiateLoc,
284e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                       InstantiationEnd,Identifier.getLength());
285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Identifier.setLocation(Loc);
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2878ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // If this is a disabled macro or #define X X, we must mark the result as
2888ff66de0d036842450eb979882f826d5252100f4Chris Lattner    // unexpandable.
2898ff66de0d036842450eb979882f826d5252100f4Chris Lattner    if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) {
2908ff66de0d036842450eb979882f826d5252100f4Chris Lattner      if (MacroInfo *NewMI = getMacroInfo(NewII))
2918ff66de0d036842450eb979882f826d5252100f4Chris Lattner        if (!NewMI->isEnabled() || NewMI == MI)
2928ff66de0d036842450eb979882f826d5252100f4Chris Lattner          Identifier.setFlag(Token::DisableExpand);
2938ff66de0d036842450eb979882f826d5252100f4Chris Lattner    }
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
295a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Since this is not an identifier token, it can't be macro expanded, so
296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // we're done.
297a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumFastMacroExpanded;
298a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return false;
299a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Start expanding the macro.
302e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  EnterMacro(Identifier, InstantiationEnd, Args);
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Now that the macro is at the top of the include stack, ask the
305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // preprocessor to read the next token from it.
306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Lex(Identifier);
307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  return false;
308a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next
3110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the
3120a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation.  This returns null on
3130a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error.
314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
315e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   MacroInfo *MI,
316e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                   SourceLocation &MacroEnd) {
317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // The number of fixed arguments to parse.
318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumFixedArgsLeft = MI->getNumArgs();
319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVariadic = MI->isVariadic();
3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
321a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Outer loop, while there are more arguments, keep reading them.
322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Token Tok;
323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
3240a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
3250a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  // an argument value in a macro could expand to ',' or '(' or ')'.
3260a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  LexUnexpandedToken(Tok);
3270a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?");
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // ArgTokens - Build up a list of tokens that make up each argument.  Each
330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // argument is separated by an EOF token.  Use a SmallVector so we can avoid
331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // heap allocations in the common case.
332a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  llvm::SmallVector<Token, 64> ArgTokens;
333a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
334a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned NumActuals = 0;
3350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  while (Tok.isNot(tok::r_paren)) {
3360a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) &&
3370a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner           "only expect argument separators here");
3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3390a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    unsigned ArgTokenStart = ArgTokens.size();
3400a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    SourceLocation ArgStartLoc = Tok.getLocation();
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // C99 6.10.3p11: Keep track of the number of l_parens we have seen.  Note
343a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // that we already consumed the first one.
344a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned NumParens = 0;
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    while (1) {
347a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Read arguments as unexpanded tokens.  This avoids issues, e.g., where
348a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // an argument value in a macro could expand to ',' or '(' or ')'.
349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      LexUnexpandedToken(Tok);
3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor      if (Tok.is(tok::code_completion)) {
352f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor        if (CodeComplete)
353f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor          CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(),
354f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor                                                  MI, NumActuals);
355f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor        LexUnexpandedToken(Tok);
356f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor      }
357f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor
358a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      if (Tok.is(tok::eof) || Tok.is(tok::eom)) { // "#if f(<eof>" & "#if f(\n"
359a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        Diag(MacroName, diag::err_unterm_macro_invoc);
360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Do not lose the EOF/EOM.  Return it to the client.
361a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        MacroName = Tok;
362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        return 0;
363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::r_paren)) {
364a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If we found the ) token, the macro arg list is done.
365e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        if (NumParens-- == 0) {
366e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner          MacroEnd = Tok.getLocation();
367a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
368e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner        }
369a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::l_paren)) {
370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        ++NumParens;
371a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comma) && NumParens == 0) {
372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Comma ends this argument if there are more fixed arguments expected.
3730a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        // However, if this is a variadic macro, and this is part of the
3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // variadic part, then the comma is just an argument token.
3750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (!isVariadic) break;
3760a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        if (NumFixedArgsLeft > 1)
377a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          break;
378a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      } else if (Tok.is(tok::comment) && !KeepMacroComments) {
379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // If this is a comment token in the argument list and we're just in
380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // -C mode (not -CC mode), discard the comment.
381a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        continue;
3825c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner      } else if (Tok.getIdentifierInfo() != 0) {
383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // Reading macro arguments can cause macros that we are currently
384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // expanding from to be popped off the expansion stack.  Doing so causes
385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // them to be reenabled for expansion.  Here we record whether any
386a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // identifiers we lex as macro arguments correspond to disabled macros.
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // If so, we mark the token as noexpand.  This is a subtle aspect of
388a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        // C99 6.10.3.4p2.
389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner        if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo()))
390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          if (!MI->isEnabled())
391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner            Tok.setFlag(Token::DisableExpand);
392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
393a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ArgTokens.push_back(Tok);
394a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3960a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this was an empty argument list foo(), don't add this as an empty
3970a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // argument.
3980a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (ArgTokens.empty() && Tok.getKind() == tok::r_paren)
3990a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      break;
400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4010a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // If this is not a variadic macro, and too many args were specified, emit
4020a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // an error.
4030a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (!isVariadic && NumFixedArgsLeft == 0) {
4040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      if (ArgTokens.size() != ArgTokenStart)
4050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner        ArgStartLoc = ArgTokens[ArgTokenStart].getLocation();
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emit the diagnostic at the macro name in case there is a missing ).
4080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Emitting it at the , could be far away from the macro name.
4090a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc);
4100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      return 0;
4110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    }
4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
413a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Empty arguments are standard in C99 and supported as an extension in
414a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // other modes.
4150a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    if (ArgTokens.size() == ArgTokenStart && !Features.C99)
416a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_empty_fnmacro_arg);
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
418a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
419a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Token EOFTok;
420a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.startToken();
421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setKind(tok::eof);
422e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner    EOFTok.setLocation(Tok.getLocation());
423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    EOFTok.setLength(0);
424a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(EOFTok);
425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ++NumActuals;
4260a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    assert(NumFixedArgsLeft != 0 && "Too many arguments parsed");
427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    --NumFixedArgsLeft;
428e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner  }
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Okay, we either found the r_paren.  Check to see if we parsed too few
431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // arguments.
432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  unsigned MinArgsExpected = MI->getNumArgs();
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // See MacroArgs instance var for description of this.
435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  bool isVarargsElided = false;
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
437a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (NumActuals < MinArgsExpected) {
438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // There are several cases where too few arguments is ok, handle them now.
43997e2de171de555feb1ef422e71874082a67498c9Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 1) {
44097e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // #define A(X)  or  #define A(...)   ---> A()
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44297e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // If there is exactly one argument, and that argument is missing,
44397e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // then we have an empty "()" argument empty list.  This is fine, even if
44497e2de171de555feb1ef422e71874082a67498c9Chris Lattner      // the macro expects one argument (the argument is just empty).
44597e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = MI->isVariadic();
44697e2de171de555feb1ef422e71874082a67498c9Chris Lattner    } else if (MI->isVariadic() &&
44797e2de171de555feb1ef422e71874082a67498c9Chris Lattner               (NumActuals+1 == MinArgsExpected ||  // A(x, ...) -> A(X)
44897e2de171de555feb1ef422e71874082a67498c9Chris Lattner                (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A()
449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Varargs where the named vararg parameter is missing: ok as extension.
450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // #define A(x, ...)
451a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // A("blah")
452a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::ext_missing_varargs_arg);
453a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
4540a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      // Remember this occurred, allowing us to elide the comma when used for
45563bc0358706e63faf705803c4799e073b91a63f0Chris Lattner      // cases like:
4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define A(x, foo...) blah(a, ## foo)
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define B(x, ...) blah(a, ## __VA_ARGS__)
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      //   #define C(...) blah(a, ## __VA_ARGS__)
4590a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner      //  A(x) B(x) C()
46097e2de171de555feb1ef422e71874082a67498c9Chris Lattner      isVarargsElided = true;
461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      // Otherwise, emit the error.
463a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Diag(Tok, diag::err_too_few_args_in_macro_invoc);
464a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      return 0;
465a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
467a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Add a marker EOF token to the end of the token list for this argument.
468a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    SourceLocation EndLoc = Tok.getLocation();
469a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.startToken();
470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::eof);
471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLocation(EndLoc);
472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(0);
473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    ArgTokens.push_back(Tok);
4749fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner
4759fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    // If we expect two arguments, add both as empty.
4769fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner    if (NumActuals == 0 && MinArgsExpected == 2)
4779fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner      ArgTokens.push_back(Tok);
4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4790a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner  } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) {
4800a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emit the diagnostic at the macro name in case there is a missing ).
4810a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    // Emitting it at the , could be far away from the macro name.
4820a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    Diag(MacroName, diag::err_too_many_args_in_macro_invoc);
4830a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner    return 0;
484a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
486beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad  return MacroArgs::create(MI, ArgTokens.data(), ArgTokens.size(),
487561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner                           isVarargsElided, *this);
488a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
489a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
490a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified
491a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of
492a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted.
493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc,
494a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner                             Preprocessor &PP) {
495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  time_t TT = time(0);
496a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  struct tm *TM = localtime(&TT);
4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
498a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  static const char * const Months[] = {
499a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
500a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  };
5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5025e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  char TmpBuffer[32];
503b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32
504b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor  sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
505b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor          TM->tm_year+1900);
506b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else
5075e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday,
508a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner          TM->tm_year+1900);
509b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif
5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Token TmpTok;
51247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TmpTok.startToken();
51347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
51447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  DATELoc = TmpTok.getLocation();
515a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
516513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32
517513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi  sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
518513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else
5195e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor  snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec);
520513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif
52147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok);
52247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  TIMELoc = TmpTok.getLocation();
523a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
524a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
525148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
526148772a841cae6f32db16d890e788b92a763bb3fChris Lattner/// HasFeature - Return true if we recognize and implement the specified feature
527148772a841cae6f32db16d890e788b92a763bb3fChris Lattner/// specified by the identifier.
528148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
529148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  const LangOptions &LangOpts = PP.getLangOptions();
5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53132592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer  return llvm::StringSwitch<bool>(II->getName())
5326d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_analyzer_noreturn", true)
5336d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_not_retained", true)
5346d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_cf_returns_retained", true)
5354820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_deprecated_with_message", true)
5366d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ext_vector_type", true)
5376d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_not_retained", true)
5386d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_ns_returns_retained", true)
5396d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_objc_ivar_unused", true)
5406d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("attribute_overloadable", true)
5414820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("attribute_unavailable_with_message", true)
54232592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("blocks", LangOpts.Blocks)
54332592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("cxx_exceptions", LangOpts.Exceptions)
5446d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek           .Case("cxx_rtti", LangOpts.RTTI)
5454820908be98f340a4c2a563a622ae693a7219c50John McCall           .Case("enumerator_attributes", true)
54632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI)
5473ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek           .Case("objc_weak_class", LangOpts.ObjCNonFragileABI)
548dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_holds", true)
549dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_returns", true)
550dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek           .Case("ownership_takes", true)
551c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           // C++0x features
552c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_attributes", LangOpts.CPlusPlus0x)
553c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor         //.Case("cxx_auto_type", false)
554c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_decltype", LangOpts.CPlusPlus0x)
555c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x)
556c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x)
5576d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek         //.Case("cxx_lambdas", false)
5586d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek         //.Case("cxx_nullptr", false)
55956209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor           .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x)
560c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x)
561c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_strong_enums", LangOpts.CPlusPlus0x)
562c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_static_assert", LangOpts.CPlusPlus0x)
563c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_trailing_return", LangOpts.CPlusPlus0x)
564c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor           .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x)
5651f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher           .Case("tls", PP.getTargetInfo().isTLSSupported())
56632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer           .Default(false);
567148772a841cae6f32db16d890e788b92a763bb3fChris Lattner}
568148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
569cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute -  Return true if we recognize and implement the attribute
570cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier.
571cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) {
572cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    return llvm::StringSwitch<bool>(II->getName())
573cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc"
574cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson        .Default(false);
575cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson}
576cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson
57792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")'
57892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression.
57992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
5803ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok,
5813ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     IdentifierInfo *II, Preprocessor &PP,
5823ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner                                     const DirectoryLookup *LookupFrom) {
58392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  SourceLocation LParenLoc;
58492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
58592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get '('.
58692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
58792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
58892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a '('.
58992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::l_paren)) {
59092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName();
59192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
59292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
59392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
59492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Save '(' location for possible missing ')' message.
59592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  LParenLoc = Tok.getLocation();
59692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
59792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the file name.
59892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.getCurrentLexer()->LexIncludeFilename(Tok);
59992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
60092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Reserve a buffer to get the spelling.
601a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  llvm::SmallString<128> FilenameBuffer;
602a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  llvm::StringRef Filename;
603ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  SourceLocation EndLoc;
604ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
60592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  switch (Tok.getKind()) {
60692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::eom:
60792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // If the token kind is EOM, the error has already been diagnosed.
60892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
60992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
61092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::angle_string_literal:
611453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  case tok::string_literal: {
612453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    bool Invalid = false;
613453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid);
614453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor    if (Invalid)
615453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor      return false;
61692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
617453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor  }
61892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
61992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  case tok::less:
62092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // This could be a <foo/bar.h> file coming from a macro expansion.  In this
62192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // case, glue the tokens together into FilenameBuffer and interpret those.
62292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    FilenameBuffer.push_back('<');
623ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc))
62492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson      return false;   // Found <eom> but no ">"?  Diagnostic already emitted.
625a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner    Filename = FilenameBuffer.str();
62692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    break;
62792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  default:
62892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename);
62992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
63092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
63192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
632a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename);
63392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // If GetIncludeFilenameSpelling set the start ptr to null, there was an
63492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // error.
635a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner  if (Filename.empty())
63692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
63792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
63892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Search include directories.
63992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *CurDir;
640f45b646244705410866d62f1d8bf017a047ed662Chris Lattner  const FileEntry *File = PP.LookupFile(Filename, isAngled, LookupFrom, CurDir);
64192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
64292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get the result value.  Result = true means the file exists.
6433ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  bool Result = File != 0;
64492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
64592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Get ')'.
64692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  PP.LexNonComment(Tok);
64792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
64892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // Ensure we have a trailing ).
64992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (Tok.isNot(tok::r_paren)) {
65092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName();
65192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(LParenLoc, diag::note_matching) << "(";
65292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    return false;
65392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
65492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
6553ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return Result;
65692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
65792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
65892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression.
65992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
6603ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II,
66192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                               Preprocessor &PP) {
6623ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, NULL);
66392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
66492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
66592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression.
66692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful.
6673ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok,
66892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson                                   IdentifierInfo *II, Preprocessor &PP) {
66992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // __has_include_next is like __has_include, except that we start
67092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // searching after the current found directory.  If we can't do this,
67192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  // issue a diagnostic.
67292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  const DirectoryLookup *Lookup = PP.GetCurDirLookup();
67392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  if (PP.isInPrimaryFile()) {
67492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Lookup = 0;
67592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_in_primary);
67692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (Lookup == 0) {
67792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    PP.Diag(Tok, diag::pp_include_next_absolute_path);
67892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else {
67992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // Start looking up in the next directory.
68092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    ++Lookup;
68192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  }
68292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson
6833ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner  return EvaluateHasIncludeCommon(Tok, II, PP, Lookup);
68492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}
685148772a841cae6f32db16d890e788b92a763bb3fChris Lattner
686a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded
687a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'.
688a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) {
689a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Figure out which token this is.
690a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  IdentifierInfo *II = Tok.getIdentifierInfo();
691a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  assert(II && "Can't be a macro without id info!");
6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6931ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // If this is an _Pragma or Microsoft __pragma directive, expand it,
6941ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  // invoke the pragma handler, then lex the token after it.
695a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident_Pragma)
696a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    return Handle_Pragma(Tok);
6971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall  else if (II == Ident__pragma) // in non-MS mode this is null
6981ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall    return HandleMicrosoft__pragma(Tok);
6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
700a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  ++NumBuiltinMacroExpanded;
701a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
702b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::SmallString<128> TmpBuffer;
703b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  llvm::raw_svector_ostream OS(TmpBuffer);
704a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
705a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  // Set up the return result.
706a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.setIdentifierInfo(0);
707a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  Tok.clearFlag(Token::NeedsCleaning);
7081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
709a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  if (II == Ident__LINE__) {
710b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__LINE__: The presumed line number (within the current
711b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // source file) of the current source line (an integer constant)".  This can
712b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // be affected by #line.
713081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    SourceLocation Loc = Tok.getLocation();
7141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
715dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // Advance to the location of the first _, this might not be the first byte
716dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    // of the token if it starts with an escaped newline.
717dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner    Loc = AdvanceToTokenCharacter(Loc, 0);
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
719081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // One wrinkle here is that GCC expands __LINE__ to location of the *end* of
720081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // a macro instantiation.  This doesn't matter for object-like macros, but
721081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // can matter for a function-like macro that expands to contain __LINE__.
722081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // Skip down through instantiation points until we find a file loc for the
723081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    // end of the instantiation history.
7246678133b8ce642f93e5141f056fa643112041ad0Chris Lattner    Loc = SourceMgr.getInstantiationRange(Loc).second;
725081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc);
7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7271fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __LINE__ expands to a simple numeric value.
728cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << (PLoc.isValid()? PLoc.getLine() : 1);
729a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
730a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) {
731b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // C99 6.10.8: "__FILE__: The presumed name of the current source file (a
732b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // character string literal)". This can be affected by #line.
733b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
734b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
735b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // __BASE_FILE__ is a GNU extension that returns the top of the presumed
736b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // #include stack instead of the current file.
737cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (II == Ident__BASE_FILE__ && PLoc.isValid()) {
738b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      SourceLocation NextLoc = PLoc.getIncludeLoc();
739a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      while (NextLoc.isValid()) {
740b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        PLoc = SourceMgr.getPresumedLoc(NextLoc);
741cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        if (PLoc.isInvalid())
742cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor          break;
743cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
744b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner        NextLoc = PLoc.getIncludeLoc();
745a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      }
746a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
7471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
748a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Escape this filename.  Turn '\' -> '\\' '"' -> '\"'
749b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    llvm::SmallString<128> FN;
750cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
751cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      FN += PLoc.getFilename();
752cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      Lexer::Stringify(FN);
753cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      OS << '"' << FN.str() << '"';
754cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
755a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
756a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__DATE__) {
757a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!DATELoc.isValid())
758a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
759a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
760a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"Mmm dd yyyy\""));
761de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner    Tok.setLocation(SourceMgr.createInstantiationLoc(DATELoc, Tok.getLocation(),
762e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                     Tok.getLocation(),
763de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner                                                     Tok.getLength()));
764b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
765a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIME__) {
766a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (!TIMELoc.isValid())
767a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      ComputeDATE_TIME(DATELoc, TIMELoc, *this);
768a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
769a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setLength(strlen("\"hh:mm:ss\""));
770de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner    Tok.setLocation(SourceMgr.createInstantiationLoc(TIMELoc, Tok.getLocation(),
771e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                                     Tok.getLocation(),
772de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner                                                     Tok.getLength()));
773b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    return;
774a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__INCLUDE_LEVEL__) {
775b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // Compute the presumed include depth of this token.  This can be affected
776b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    // by GNU line markers.
777a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    unsigned Depth = 0;
7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
779b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
780cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    if (PLoc.isValid()) {
781b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner      PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
782cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor      for (; PLoc.isValid(); ++Depth)
783cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor        PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc());
784cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    }
7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7861fa495304c81e03f07f278a47b5efe9317104aabChris Lattner    // __INCLUDE_LEVEL__ expands to a simple numeric value.
787b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << Depth;
788a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::numeric_constant);
789a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else if (II == Ident__TIMESTAMP__) {
790a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // MSVC, ICC, GCC, VisualAge C++ extension.  The generated string should be
791a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime.
792a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner
793a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // Get the file that we are lexing out of.  If we're currently lexing from
794a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    // a macro, dig into the include stack.
795a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const FileEntry *CurFile = 0;
796a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek    PreprocessorLexer *TheLexer = getCurrentFileLexer();
7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
798a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (TheLexer)
799ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek      CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID());
8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
801a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    const char *Result;
802a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    if (CurFile) {
803a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      time_t TT = CurFile->getModificationTime();
804a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      struct tm *TM = localtime(&TT);
805a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = asctime(TM);
806a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    } else {
807a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner      Result = "??? ??? ?? ??:??:?? ????\n";
808a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    }
809b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    // Surround the string with " and strip the trailing newline.
810b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << '"' << llvm::StringRef(Result, strlen(Result)-1) << '"';
811a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    Tok.setKind(tok::string_literal);
812c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner  } else if (II == Ident__COUNTER__) {
813c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    // __COUNTER__ expands to a simple numeric value.
814b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << CounterValue++;
815c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner    Tok.setKind(tok::numeric_constant);
816148772a841cae6f32db16d890e788b92a763bb3fChris Lattner  } else if (II == Ident__has_feature ||
817cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson             II == Ident__has_builtin ||
818cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson             II == Ident__has_attribute) {
819148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    // The argument to these two builtins should be a parenthesized identifier.
820148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    SourceLocation StartLoc = Tok.getLocation();
8211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
822148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool IsValid = false;
823148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    IdentifierInfo *FeatureII = 0;
8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
825148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    // Read the '('.
826148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Lex(Tok);
827148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (Tok.is(tok::l_paren)) {
828148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      // Read the identifier
829148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Lex(Tok);
830148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      if (Tok.is(tok::identifier)) {
831148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        FeatureII = Tok.getIdentifierInfo();
8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
833148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        // Read the ')'.
834148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        Lex(Tok);
835148772a841cae6f32db16d890e788b92a763bb3fChris Lattner        if (Tok.is(tok::r_paren))
836148772a841cae6f32db16d890e788b92a763bb3fChris Lattner          IsValid = true;
837148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      }
838148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
840148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    bool Value = false;
841148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    if (!IsValid)
842148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Diag(StartLoc, diag::err_feature_check_malformed);
843148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    else if (II == Ident__has_builtin) {
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Check for a builtin is trivial.
845148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = FeatureII->getBuiltinID() != 0;
846cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    } else if (II == Ident__has_attribute)
847cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson      Value = HasAttribute(FeatureII);
848cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson    else {
849148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      assert(II == Ident__has_feature && "Must be feature check");
850148772a841cae6f32db16d890e788b92a763bb3fChris Lattner      Value = HasFeature(*this, FeatureII);
851148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    }
8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
853b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
854148772a841cae6f32db16d890e788b92a763bb3fChris Lattner    Tok.setKind(tok::numeric_constant);
85592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson  } else if (II == Ident__has_include ||
85692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson             II == Ident__has_include_next) {
85792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // The argument to these two builtins should be a parenthesized
85892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // file name string literal using angle brackets (<>) or
85992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    // double-quotes ("").
8603ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner    bool Value;
86192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    if (II == Ident__has_include)
8623ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasInclude(Tok, II, *this);
86392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    else
8643ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner      Value = EvaluateHasIncludeNext(Tok, II, *this);
865b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer    OS << (int)Value;
86692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson    Tok.setKind(tok::numeric_constant);
867a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  } else {
868a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner    assert(0 && "Unknown identifier!");
869a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner  }
870b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer  CreateString(OS.str().data(), OS.str().size(), Tok, Tok.getLocation());
871a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner}
8720827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis
8730827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) {
8740827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // If the 'used' status changed, and the macro requires 'unused' warning,
8750827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  // remove its SourceLocation from the warn-for-unused-macro locations.
8760827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  if (MI->isWarnIfUnused() && !MI->isUsed())
8770827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis    WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
8780827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  MI->setIsUsed(true);
8790827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis}
880