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