PPMacroExpansion.cpp revision eb2ac8b349e181bdc71bfd64980c019be3180d76
1a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===--- MacroExpansion.cpp - Top level Macro Expansion -------------------===// 2a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 3a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// The LLVM Compiler Infrastructure 4a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 5a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file is distributed under the University of Illinois Open Source 6a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// License. See LICENSE.TXT for details. 7a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 8a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===// 9a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 10a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file implements the top level handling of macro expasion for the 11a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// preprocessor. 12a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 13a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===// 14a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 15a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/Preprocessor.h" 16a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "MacroArgs.h" 17a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/MacroInfo.h" 18a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/SourceManager.h" 19a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/FileManager.h" 201f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher#include "clang/Basic/TargetInfo.h" 21500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h" 22f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor#include "clang/Lex/CodeCompletionHandler.h" 23295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h" 24d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek#include "clang/Lex/LiteralSupport.h" 2532592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer#include "llvm/ADT/StringSwitch.h" 265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis#include "llvm/ADT/STLExtras.h" 276665ffbfc397f68e3fb15844597674d5861995b6Douglas Gregor#include "llvm/Config/config.h" 28b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer#include "llvm/Support/raw_ostream.h" 299fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h" 303daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 31f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime> 32a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang; 33a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 34295a2a617ac335f590e430ab7fcd98f8ce109251Douglas GregorMacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const { 35295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor assert(II->hasMacroDefinition() && "Identifier is not a macro!"); 36295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor 37295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos 38295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor = Macros.find(II); 39295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor if (Pos == Macros.end()) { 40295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor // Load this macro from the external source. 41295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor getExternalSource()->LoadMacroDefinition(II); 42295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor Pos = Macros.find(II); 43295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor } 44295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor assert(Pos != Macros.end() && "Identifier macro info is missing!"); 45295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor return Pos->second; 46295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor} 47295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor 48a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier. 49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// 50a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { 51555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner if (MI) { 52a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Macros[II] = MI; 53a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II->setHasMacroDefinition(true); 54555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner } else if (II->hasMacroDefinition()) { 55555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner Macros.erase(II); 56555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner II->setHasMacroDefinition(false); 57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 58a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 59a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier 61a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded. 62148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){ 63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the identifier. 64148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *Id = PP.getIdentifierInfo(Name); 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Mark it as being a macro that is builtin. 67148772a841cae6f32db16d890e788b92a763bb3fChris Lattner MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation()); 68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsBuiltinMacro(); 69148772a841cae6f32db16d890e788b92a763bb3fChris Lattner PP.setMacroInfo(Id, MI); 70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Id; 71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 74a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the 75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table. 76a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() { 77148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__"); 78148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__"); 79148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__"); 80148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__"); 81148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__"); 82148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident_Pragma = RegisterBuiltinMacro(*this, "_Pragma"); 831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 84a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // GCC Extensions. 85148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__BASE_FILE__ = RegisterBuiltinMacro(*this, "__BASE_FILE__"); 86148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__"); 87148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__TIMESTAMP__ = RegisterBuiltinMacro(*this, "__TIMESTAMP__"); 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 89148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Clang Extensions. 9092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_feature = RegisterBuiltinMacro(*this, "__has_feature"); 91c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne Ident__has_extension = RegisterBuiltinMacro(*this, "__has_extension"); 9292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_builtin = RegisterBuiltinMacro(*this, "__has_builtin"); 93cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson Ident__has_attribute = RegisterBuiltinMacro(*this, "__has_attribute"); 9492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_include = RegisterBuiltinMacro(*this, "__has_include"); 9592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next"); 96d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Ident__has_warning = RegisterBuiltinMacro(*this, "__has_warning"); 971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall 981ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // Microsoft Extensions. 9962ec1f2fd7368542bb926c04797fb07023547694Francois Pichet if (Features.MicrosoftExt) 1001ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall Ident__pragma = RegisterBuiltinMacro(*this, "__pragma"); 1011ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall else 1021ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall Ident__pragma = 0; 103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token 106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally. 107a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI, 108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const IdentifierInfo *MacroIdent, 109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo(); 111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the token isn't an identifier, it's always literally expanded. 113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == 0) return true; 1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier is a macro, and if that macro is enabled, it may be 116a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanded so it's not a trivial expansion. 117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() && 118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Fast expanding "#define X X" is ok, because X would be disabled. 119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II != MacroIdent) 120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 122a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an object-like macro invocation, it is safe to trivially expand 123a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // it. 124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isObjectLike()) return true; 125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro invocation, it's safe to trivially expand 127a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // as long as the identifier is not a macro argument. 128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end(); 129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner I != E; ++I) 130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (*I == II) 131a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; // Identifier is a macro argument. 1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be 138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('. If so, consume the token and return true, if not, this 139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens. 140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() { 141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do some quick tests for rejection cases. 142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Val; 143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurLexer) 144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurLexer->isNextPPTokenLParen(); 1451a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek else if (CurPTHLexer) 1461a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek Val = CurPTHLexer->isNextPPTokenLParen(); 147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurTokenLexer->isNextTokenLParen(); 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val == 2) { 151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // We have run off the end. If it's a source file we don't 152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // examine enclosing ones (C99 5.1.1.2p4). Otherwise walk up the 153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // macro stack. 15417ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek if (CurPPLexer) 155a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 156a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { 157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IncludeStackInfo &Entry = IncludeMacroStack[i-1]; 158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Entry.TheLexer) 159a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheLexer->isNextPPTokenLParen(); 160dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek else if (Entry.ThePTHLexer) 161dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek Val = Entry.ThePTHLexer->isNextPPTokenLParen(); 162a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheTokenLexer->isNextTokenLParen(); 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val != 2) 166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ran off the end of a source file? 169dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek if (Entry.ThePPLexer) 170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 171a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, if we know that the token is a '(', lex it and return. Otherwise we 175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // have found something that isn't a '(' or we found the end of the 176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // translation unit. In either case, return false. 1770a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return Val == 1; 178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 179a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 180a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be 181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'. 1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, 183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 1841367897633c2f5bb77f97cb05c76d5f80ead9976Douglas Gregor // If this is a macro expansion in the "#if !defined(x)" line for the file, 185a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // then the macro could expand to different things in other contexts, we need 186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // to disable the optimization in this case. 18768a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro(); 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially. 190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isBuiltinMacro()) { 1911b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis if (Callbacks) Callbacks->MacroExpands(Identifier, MI, 1921b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis Identifier.getLocation()); 193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ExpandBuiltinMacro(Identifier); 194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 197a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// Args - If this is a function-like macro expansion, this contains, 198a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// for each macro argument, the list of tokens that were provided to the 199a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// invocation. 200a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroArgs *Args = 0; 2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2029e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // Remember where the end of the expansion occurred. For an object-like 203e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // macro, this is the identifier. For a function-like macro, this is the ')'. 2049e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth SourceLocation ExpansionEnd = Identifier.getLocation(); 2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro, read the arguments. 207a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isFunctionLike()) { 208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p10: If the preprocessing token immediately after the the macro 2090a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // name isn't a '(', this macro should not be expanded. 210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isNextPPTokenLParen()) 211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 213a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember that we are now parsing the arguments to a macro invocation. 214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Preprocessor directives used inside macro arguments are not portable, and 215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // this enables the warning. 216a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = true; 2179e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth Args = ReadFunctionLikeMacroArgs(Identifier, MI, ExpansionEnd); 2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 219a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Finished parsing args. 220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = false; 2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If there was an error parsing the arguments, bail out. 223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args == 0) return false; 2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFnMacroExpanded; 226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 227a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumMacroExpanded; 228a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 230a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Notice that this macro has been used. 2310827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis markMacroAsUsed(MI); 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2339e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // Remember where the token is expanded. 2349e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth SourceLocation ExpandLoc = Identifier.getLocation(); 235b7d98d35ea723624345f06e5895ddce2e0388ef0Argyrios Kyrtzidis 2361b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis if (Callbacks) Callbacks->MacroExpands(Identifier, MI, 2371b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis SourceRange(ExpandLoc, ExpansionEnd)); 2381b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis 2391b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis // If we started lexing a macro, enter the macro expansion body. 2401b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis 241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this macro expands to no tokens, don't bother to push it onto the 242a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expansion stack, only to take it right back off. 243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->getNumTokens() == 0) { 244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // No need for arg info. 245561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner if (Args) Args->destroy(*this); 2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ignore this macro use, just return the next token in the current 248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // buffer. 249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool HadLeadingSpace = Identifier.hasLeadingSpace(); 250a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool IsAtStartOfLine = Identifier.isAtStartOfLine(); 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier isn't on some OTHER line, inherit the leading 255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // whitespace/first-on-a-line property of this token. This handles 256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // stuff like "! XX," -> "! ," and " XX," -> " ,", when XX is 257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // empty. 258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!Identifier.isAtStartOfLine()) { 259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine); 260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace); 261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 26244aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis Identifier.setFlag(Token::LeadingEmptyMacro); 263a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (MI->getNumTokens() == 1 && 267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(), 268de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner *this)) { 269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, if this macro expands into a single trivially-expanded 2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // token: expand it now. This handles common cases like 271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // "#define VAL 42". 2729a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 2739a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop // No need for arg info. 274561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner if (Args) Args->destroy(*this); 2759a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro 277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifier to the expanded token. 278a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isAtStartOfLine = Identifier.isAtStartOfLine(); 279a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool hasLeadingSpace = Identifier.hasLeadingSpace(); 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Replace the result token. 282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier = MI->getReplacementToken(0); 2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Restore the StartOfLine/LeadingSpace markers. 285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine); 286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace); 2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2889e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // Update the tokens location to include both its expansion and physical 289a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // locations. 290a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = 291bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth SourceMgr.createExpansionLoc(Identifier.getLocation(), ExpandLoc, 292bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth ExpansionEnd,Identifier.getLength()); 293a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setLocation(Loc); 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2958ff66de0d036842450eb979882f826d5252100f4Chris Lattner // If this is a disabled macro or #define X X, we must mark the result as 2968ff66de0d036842450eb979882f826d5252100f4Chris Lattner // unexpandable. 2978ff66de0d036842450eb979882f826d5252100f4Chris Lattner if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) { 2988ff66de0d036842450eb979882f826d5252100f4Chris Lattner if (MacroInfo *NewMI = getMacroInfo(NewII)) 2998ff66de0d036842450eb979882f826d5252100f4Chris Lattner if (!NewMI->isEnabled() || NewMI == MI) 3008ff66de0d036842450eb979882f826d5252100f4Chris Lattner Identifier.setFlag(Token::DisableExpand); 3018ff66de0d036842450eb979882f826d5252100f4Chris Lattner } 3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Since this is not an identifier token, it can't be macro expanded, so 304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // we're done. 305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Start expanding the macro. 3109e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth EnterMacro(Identifier, ExpansionEnd, Args); 3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Now that the macro is at the top of the include stack, ask the 313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // preprocessor to read the next token from it. 314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 3180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next 3190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the 3200a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation. This returns null on 3210a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error. 322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 323e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroInfo *MI, 324e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation &MacroEnd) { 325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // The number of fixed arguments to parse. 326a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumFixedArgsLeft = MI->getNumArgs(); 327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVariadic = MI->isVariadic(); 3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Outer loop, while there are more arguments, keep reading them. 330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 3320a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 3330a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 3340a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner LexUnexpandedToken(Tok); 3350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?"); 3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // ArgTokens - Build up a list of tokens that make up each argument. Each 338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // argument is separated by an EOF token. Use a SmallVector so we can avoid 339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // heap allocations in the common case. 3405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Token, 64> ArgTokens; 341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumActuals = 0; 3430a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner while (Tok.isNot(tok::r_paren)) { 3440a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) && 3450a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner "only expect argument separators here"); 3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3470a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner unsigned ArgTokenStart = ArgTokens.size(); 3480a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner SourceLocation ArgStartLoc = Tok.getLocation(); 3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p11: Keep track of the number of l_parens we have seen. Note 351a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // that we already consumed the first one. 352a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumParens = 0; 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 354a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (1) { 355a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 356a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 357a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35984021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.is(tok::eof) || Tok.is(tok::eod)) { // "#if f(<eof>" & "#if f(\n" 360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_unterm_macro_invoc); 36184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne // Do not lose the EOF/EOD. Return it to the client. 362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroName = Tok; 363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 364a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::r_paren)) { 365a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we found the ) token, the macro arg list is done. 366e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner if (NumParens-- == 0) { 367e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroEnd = Tok.getLocation(); 368a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 369e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::l_paren)) { 371a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumParens; 372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comma) && NumParens == 0) { 373a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Comma ends this argument if there are more fixed arguments expected. 3740a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // However, if this is a variadic macro, and this is part of the 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // variadic part, then the comma is just an argument token. 3760a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic) break; 3770a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (NumFixedArgsLeft > 1) 378a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comment) && !KeepMacroComments) { 380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a comment token in the argument list and we're just in 381a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // -C mode (not -CC mode), discard the comment. 382a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner continue; 3835c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner } else if (Tok.getIdentifierInfo() != 0) { 384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Reading macro arguments can cause macros that we are currently 385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanding from to be popped off the expansion stack. Doing so causes 386a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // them to be reenabled for expansion. Here we record whether any 387a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifiers we lex as macro arguments correspond to disabled macros. 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If so, we mark the token as noexpand. This is a subtle aspect of 389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3.4p2. 390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo())) 391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!MI->isEnabled()) 392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setFlag(Token::DisableExpand); 3937d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis } else if (Tok.is(tok::code_completion)) { 3947d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis if (CodeComplete) 3957d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(), 3967d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis MI, NumActuals); 3977d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis // Don't mark that we reached the code-completion point because the 3987d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis // parser is going to handle the token and there will be another 3997d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis // code-completion callback. 400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4017d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis 402a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 403a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this was an empty argument list foo(), don't add this as an empty 4060a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // argument. 4070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.empty() && Tok.getKind() == tok::r_paren) 4080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner break; 409a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this is not a variadic macro, and too many args were specified, emit 4110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an error. 4120a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic && NumFixedArgsLeft == 0) { 4130a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() != ArgTokenStart) 4140a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner ArgStartLoc = ArgTokens[ArgTokenStart].getLocation(); 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4160a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4170a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc); 4190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 4200a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42232c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner // Empty arguments are standard in C99 and C++0x, and are supported as an extension in 423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // other modes. 424661a99690bc133bbaa029da925481d4a860dec90Richard Smith if (ArgTokens.size() == ArgTokenStart && !Features.C99) 425661a99690bc133bbaa029da925481d4a860dec90Richard Smith Diag(Tok, Features.CPlusPlus0x ? 426661a99690bc133bbaa029da925481d4a860dec90Richard Smith diag::warn_cxx98_compat_empty_fnmacro_arg : 427661a99690bc133bbaa029da925481d4a860dec90Richard Smith diag::ext_empty_fnmacro_arg); 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 429a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token EOFTok; 431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.startToken(); 432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setKind(tok::eof); 433e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner EOFTok.setLocation(Tok.getLocation()); 434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setLength(0); 435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(EOFTok); 436a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumActuals; 4370a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(NumFixedArgsLeft != 0 && "Too many arguments parsed"); 438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; 439e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, we either found the r_paren. Check to see if we parsed too few 442a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // arguments. 443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned MinArgsExpected = MI->getNumArgs(); 4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 445a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // See MacroArgs instance var for description of this. 446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVarargsElided = false; 4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 448a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals < MinArgsExpected) { 449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // There are several cases where too few arguments is ok, handle them now. 45097e2de171de555feb1ef422e71874082a67498c9Chris Lattner if (NumActuals == 0 && MinArgsExpected == 1) { 45197e2de171de555feb1ef422e71874082a67498c9Chris Lattner // #define A(X) or #define A(...) ---> A() 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45397e2de171de555feb1ef422e71874082a67498c9Chris Lattner // If there is exactly one argument, and that argument is missing, 45497e2de171de555feb1ef422e71874082a67498c9Chris Lattner // then we have an empty "()" argument empty list. This is fine, even if 45597e2de171de555feb1ef422e71874082a67498c9Chris Lattner // the macro expects one argument (the argument is just empty). 45697e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = MI->isVariadic(); 45797e2de171de555feb1ef422e71874082a67498c9Chris Lattner } else if (MI->isVariadic() && 45897e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals+1 == MinArgsExpected || // A(x, ...) -> A(X) 45997e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A() 460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Varargs where the named vararg parameter is missing: ok as extension. 461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x, ...) 462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A("blah") 463a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_missing_varargs_arg); 464a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4650a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Remember this occurred, allowing us to elide the comma when used for 46663bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // cases like: 4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define A(x, foo...) blah(a, ## foo) 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define B(x, ...) blah(a, ## __VA_ARGS__) 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define C(...) blah(a, ## __VA_ARGS__) 4700a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // A(x) B(x) C() 47197e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = true; 472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, emit the error. 474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::err_too_few_args_in_macro_invoc); 475a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 479a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation EndLoc = Tok.getLocation(); 480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.startToken(); 481a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::eof); 482a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(EndLoc); 483a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(0); 484a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 4859fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner 4869fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner // If we expect two arguments, add both as empty. 4879fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner if (NumActuals == 0 && MinArgsExpected == 2) 4889fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner ArgTokens.push_back(Tok); 4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4900a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) { 4910a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4920a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4930a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 4940a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 497d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie return MacroArgs::create(MI, ArgTokens, isVarargsElided, *this); 498a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 499a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 5005b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// \brief Keeps macro expanded tokens for TokenLexers. 5015b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis// 5025b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// Works like a stack; a TokenLexer adds the macro expanded tokens that is 5035b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// going to lex in the cache and when it finishes the tokens are removed 5045b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// from the end of the cache. 5055b3284a9275a27f5c4410e25eb8933be540601d6Argyrios KyrtzidisToken *Preprocessor::cacheMacroExpandedTokens(TokenLexer *tokLexer, 5062d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner ArrayRef<Token> tokens) { 5075b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(tokLexer); 5085b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis if (tokens.empty()) 5095b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis return 0; 5105b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5115b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis size_t newIndex = MacroExpandedTokens.size(); 5125b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis bool cacheNeedsToGrow = tokens.size() > 5135b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandedTokens.capacity()-MacroExpandedTokens.size(); 5145b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandedTokens.append(tokens.begin(), tokens.end()); 5155b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5165b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis if (cacheNeedsToGrow) { 5175b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis // Go through all the TokenLexers whose 'Tokens' pointer points in the 5185b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis // buffer and update the pointers to the (potential) new buffer array. 5195b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis for (unsigned i = 0, e = MacroExpandingLexersStack.size(); i != e; ++i) { 5205b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis TokenLexer *prevLexer; 5215b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis size_t tokIndex; 5225b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis llvm::tie(prevLexer, tokIndex) = MacroExpandingLexersStack[i]; 5235b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex; 5245b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis } 5255b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis } 5265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5275b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex)); 5285b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis return MacroExpandedTokens.data() + newIndex; 5295b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis} 5305b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5315b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidisvoid Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() { 5325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(!MacroExpandingLexersStack.empty()); 5335b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis size_t tokIndex = MacroExpandingLexersStack.back().second; 5345b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(tokIndex < MacroExpandedTokens.size()); 5355b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis // Pop the cached macro expanded tokens from the end. 5365b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandedTokens.resize(tokIndex); 5375b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandingLexersStack.pop_back(); 5385b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis} 5395b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 540a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified 541a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of 542a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted. 543a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, 544a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 545a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = time(0); 546a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 548a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner static const char * const Months[] = { 549a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" 550a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 5511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5525e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor char TmpBuffer[32]; 553b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32 554b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 555b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor TM->tm_year+1900); 556b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else 5575e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 558a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TM->tm_year+1900); 559b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif 5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Token TmpTok; 56247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TmpTok.startToken(); 56347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 56447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner DATELoc = TmpTok.getLocation(); 565a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 566513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32 567513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 568513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else 5695e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 570513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif 57147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 57247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TIMELoc = TmpTok.getLocation(); 573a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 574a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 575148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 576c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasFeature - Return true if we recognize and implement the feature 577c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier as a standard language feature. 578148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { 579148772a841cae6f32db16d890e788b92a763bb3fChris Lattner const LangOptions &LangOpts = PP.getLangOptions(); 5801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58132592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer return llvm::StringSwitch<bool>(II->getName()) 5826d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_analyzer_noreturn", true) 583dceb53180ae145915673913a9398ba4a00b05584Douglas Gregor .Case("attribute_availability", true) 5846d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_cf_returns_not_retained", true) 5856d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_cf_returns_retained", true) 5864820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("attribute_deprecated_with_message", true) 5876d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ext_vector_type", true) 5886d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ns_returns_not_retained", true) 5896d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ns_returns_retained", true) 59012b9434d5bf801e24242b1f6fd04899f8a7fa92cTed Kremenek .Case("attribute_ns_consumes_self", true) 59111fe175346242744bd9cb4040f3c84e243934134Ted Kremenek .Case("attribute_ns_consumed", true) 59211fe175346242744bd9cb4040f3c84e243934134Ted Kremenek .Case("attribute_cf_consumed", true) 5936d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_objc_ivar_unused", true) 594d5313b0bbf3948fe7c63bf46a7da330c96d07309John McCall .Case("attribute_objc_method_family", true) 5956d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_overloadable", true) 5964820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("attribute_unavailable_with_message", true) 59732592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("blocks", LangOpts.Blocks) 59832592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("cxx_exceptions", LangOpts.Exceptions) 5996d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("cxx_rtti", LangOpts.RTTI) 6004820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("enumerator_attributes", true) 601f85e193739c953358c865005855253af4f68a497John McCall // Objective-C features 602f85e193739c953358c865005855253af4f68a497John McCall .Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE? 603f85e193739c953358c865005855253af4f68a497John McCall .Case("objc_arc", LangOpts.ObjCAutoRefCount) 604f85e193739c953358c865005855253af4f68a497John McCall .Case("objc_arc_weak", LangOpts.ObjCAutoRefCount && 6059f084a3166b684573ba49df28fc5792bc37d92e1John McCall LangOpts.ObjCRuntimeHasWeak) 6065471bc85b69912e3b448de004498a80c0de32296Douglas Gregor .Case("objc_fixed_enum", LangOpts.ObjC2) 607e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor .Case("objc_instancetype", LangOpts.ObjC2) 60832592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI) 6093ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek .Case("objc_weak_class", LangOpts.ObjCNonFragileABI) 610dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_holds", true) 611dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_returns", true) 612dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_takes", true) 613eb2ac8b349e181bdc71bfd64980c019be3180d76John McCall .Case("arc_cf_code_audited", true) 614c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // C1X features 615fd5f6866a7574f12ecac5cceb7359ff253f83145Peter Collingbourne .Case("c_alignas", LangOpts.C1X) 616c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_generic_selections", LangOpts.C1X) 617c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_static_assert", LangOpts.C1X) 618c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor // C++0x features 6197822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus0x) 6203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith .Case("cxx_alias_templates", LangOpts.CPlusPlus0x) 621fd5f6866a7574f12ecac5cceb7359ff253f83145Peter Collingbourne .Case("cxx_alignas", LangOpts.CPlusPlus0x) 622c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_attributes", LangOpts.CPlusPlus0x) 623738291eedac0f3f3628e34b0b32d6155f280fab2Richard Smith .Case("cxx_auto_type", LangOpts.CPlusPlus0x) 624ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_constexpr", false); 625c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_decltype", LangOpts.CPlusPlus0x) 6260750800623dc6d14c4c0c721996ffd4210fcdff3Douglas Gregor .Case("cxx_default_function_template_args", LangOpts.CPlusPlus0x) 627059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt .Case("cxx_delegating_constructors", LangOpts.CPlusPlus0x) 628c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x) 629ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_explicit_conversions", LangOpts.CPlusPlus0x) 630e1f6dea1c9593651116fa9a5faa05647d18f3193Sean Hunt //.Case("cxx_generalized_initializers", LangOpts.CPlusPlus0x) 63174e611a5fd0b5977c664d13a07b625ae23527d0dSebastian Redl .Case("cxx_implicit_moves", LangOpts.CPlusPlus0x) 632ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_inheriting_constructors", false) 633c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x) 6346d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek //.Case("cxx_lambdas", false) 635ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus0x) 6364561ecdf27b68d80b3cecc2d80ec32bea0ac2127Sebastian Redl .Case("cxx_noexcept", LangOpts.CPlusPlus0x) 63784ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor .Case("cxx_nullptr", LangOpts.CPlusPlus0x) 638c8b9f7977094d0169ec59f9042e85ca854735299Anders Carlsson .Case("cxx_override_control", LangOpts.CPlusPlus0x) 639a391a4642c5eb98aae606f2a2b7219b1a3619d11Richard Smith .Case("cxx_range_for", LangOpts.CPlusPlus0x) 640ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_raw_string_literals", false) 64156209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x) 642c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x) 643c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_strong_enums", LangOpts.CPlusPlus0x) 644c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_static_assert", LangOpts.CPlusPlus0x) 645c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_trailing_return", LangOpts.CPlusPlus0x) 646ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_unicode_literals", false) 647ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_unrestricted_unions", false) 648ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_user_literals", false) 649c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x) 650afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor // Type traits 651afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_nothrow_assign", LangOpts.CPlusPlus) 652afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_nothrow_copy", LangOpts.CPlusPlus) 653afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_nothrow_constructor", LangOpts.CPlusPlus) 654afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_assign", LangOpts.CPlusPlus) 655afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_copy", LangOpts.CPlusPlus) 656afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_constructor", LangOpts.CPlusPlus) 657afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_destructor", LangOpts.CPlusPlus) 658afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_virtual_destructor", LangOpts.CPlusPlus) 659afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_abstract", LangOpts.CPlusPlus) 660afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_base_of", LangOpts.CPlusPlus) 661afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_class", LangOpts.CPlusPlus) 662afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_convertible_to", LangOpts.CPlusPlus) 663b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // __is_empty is available only if the horrible 664b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // "struct __is_empty" parsing hack hasn't been needed in this 665b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // translation unit. If it has, __is_empty reverts to a normal 666b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // identifier and __has_feature(is_empty) evaluates false. 667688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor .Case("is_empty", 6689a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor LangOpts.CPlusPlus && 6699a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor PP.getIdentifierInfo("__is_empty")->getTokenID() 6709a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor != tok::identifier) 671afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_enum", LangOpts.CPlusPlus) 6724e61ddd644e9c6293697a966d98d7c1905cf63a8Chandler Carruth .Case("is_literal", LangOpts.CPlusPlus) 673a55e68b7f961d6ef4551c9be9ac18a1e25c7c927Howard Hinnant .Case("is_standard_layout", LangOpts.CPlusPlus) 674b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // __is_pod is available only if the horrible 675b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // "struct __is_pod" parsing hack hasn't been needed in this 676b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // translation unit. If it has, __is_pod reverts to a normal 677b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // identifier and __has_feature(is_pod) evaluates false. 678688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor .Case("is_pod", 6799a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor LangOpts.CPlusPlus && 6809a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor PP.getIdentifierInfo("__is_pod")->getTokenID() 6819a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor != tok::identifier) 682afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_polymorphic", LangOpts.CPlusPlus) 683b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth .Case("is_trivial", LangOpts.CPlusPlus) 684feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt .Case("is_trivially_copyable", LangOpts.CPlusPlus) 685afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_union", LangOpts.CPlusPlus) 6861f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher .Case("tls", PP.getTargetInfo().isTLSSupported()) 687858a325e5f250c83409137c5609b162983ea6d1eSean Hunt .Case("underlying_type", LangOpts.CPlusPlus) 68832592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Default(false); 689148772a841cae6f32db16d890e788b92a763bb3fChris Lattner} 690148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 691c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasExtension - Return true if we recognize and implement the feature 692c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier, either as an extension or a standard language 693c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// feature. 694c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbournestatic bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) { 695c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne if (HasFeature(PP, II)) 696c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne return true; 697c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 698c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // If the use of an extension results in an error diagnostic, extensions are 699c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // effectively unavailable, so just return false here. 700d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie if (PP.getDiagnostics().getExtensionHandlingBehavior() == 701d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine::Ext_Error) 702c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne return false; 703c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 704c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne const LangOptions &LangOpts = PP.getLangOptions(); 705c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 706c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // Because we inherit the feature list from HasFeature, this string switch 707c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // must be less restrictive than HasFeature's. 708c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne return llvm::StringSwitch<bool>(II->getName()) 709c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // C1X features supported by other languages as extensions. 710fd5f6866a7574f12ecac5cceb7359ff253f83145Peter Collingbourne .Case("c_alignas", true) 711c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_generic_selections", true) 712c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_static_assert", true) 713c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // C++0x features supported by other languages as extensions. 714c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_deleted_functions", LangOpts.CPlusPlus) 715ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_explicit_conversions", LangOpts.CPlusPlus) 716c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_inline_namespaces", LangOpts.CPlusPlus) 717ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus) 718c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_override_control", LangOpts.CPlusPlus) 7197640c0070361bd365e30fc2eb3b6a64361fa7377Richard Smith .Case("cxx_range_for", LangOpts.CPlusPlus) 720c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus) 721c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_rvalue_references", LangOpts.CPlusPlus) 722c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Default(false); 723c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne} 724c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 725cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute - Return true if we recognize and implement the attribute 726cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier. 727cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) { 728cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson return llvm::StringSwitch<bool>(II->getName()) 729cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc" 730cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson .Default(false); 731cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson} 732cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson 73392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")' 73492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression. 73592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 7363ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok, 7373ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner IdentifierInfo *II, Preprocessor &PP, 7383ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner const DirectoryLookup *LookupFrom) { 73992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson SourceLocation LParenLoc; 74092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 74192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get '('. 74292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.LexNonComment(Tok); 74392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 74492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Ensure we have a '('. 74592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (Tok.isNot(tok::l_paren)) { 74692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName(); 74792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 74892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 74992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 75092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Save '(' location for possible missing ')' message. 75192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson LParenLoc = Tok.getLocation(); 75292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 75392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get the file name. 75492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.getCurrentLexer()->LexIncludeFilename(Tok); 75592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 75692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Reserve a buffer to get the spelling. 757a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner llvm::SmallString<128> FilenameBuffer; 7585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Filename; 759ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor SourceLocation EndLoc; 760ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 76192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson switch (Tok.getKind()) { 76284021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne case tok::eod: 76384021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne // If the token kind is EOD, the error has already been diagnosed. 76492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 76592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 76692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::angle_string_literal: 767453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor case tok::string_literal: { 768453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor bool Invalid = false; 769453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid); 770453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (Invalid) 771453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor return false; 77292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson break; 773453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor } 77492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 77592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::less: 77692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // This could be a <foo/bar.h> file coming from a macro expansion. In this 77792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // case, glue the tokens together into FilenameBuffer and interpret those. 77892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson FilenameBuffer.push_back('<'); 779ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc)) 78084021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne return false; // Found <eod> but no ">"? Diagnostic already emitted. 781a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner Filename = FilenameBuffer.str(); 78292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson break; 78392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson default: 78492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename); 78592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 78692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 78792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 788a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename); 78992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // If GetIncludeFilenameSpelling set the start ptr to null, there was an 79092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // error. 791a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner if (Filename.empty()) 79292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 79392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 79492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Search include directories. 79592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson const DirectoryLookup *CurDir; 796b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth const FileEntry *File = 797fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor PP.LookupFile(Filename, isAngled, LookupFrom, CurDir, NULL, NULL, NULL); 79892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 79992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get the result value. Result = true means the file exists. 8003ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner bool Result = File != 0; 80192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 80292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get ')'. 80392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.LexNonComment(Tok); 80492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 80592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Ensure we have a trailing ). 80692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (Tok.isNot(tok::r_paren)) { 80792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName(); 80892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(LParenLoc, diag::note_matching) << "("; 80992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 81092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 81192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 8123ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return Result; 81392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 81492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 81592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression. 81692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 8173ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II, 81892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Preprocessor &PP) { 8193ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return EvaluateHasIncludeCommon(Tok, II, PP, NULL); 82092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 82192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 82292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression. 82392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 8243ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok, 82592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson IdentifierInfo *II, Preprocessor &PP) { 82692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // __has_include_next is like __has_include, except that we start 82792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // searching after the current found directory. If we can't do this, 82892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // issue a diagnostic. 82992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson const DirectoryLookup *Lookup = PP.GetCurDirLookup(); 83092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (PP.isInPrimaryFile()) { 83192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Lookup = 0; 83292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok, diag::pp_include_next_in_primary); 83392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else if (Lookup == 0) { 83492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok, diag::pp_include_next_absolute_path); 83592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else { 83692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Start looking up in the next directory. 83792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson ++Lookup; 83892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 83992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 8403ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return EvaluateHasIncludeCommon(Tok, II, PP, Lookup); 84192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 842148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 843a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 844a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 845a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 846a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 847a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 848a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8501ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // If this is an _Pragma or Microsoft __pragma directive, expand it, 8511ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // invoke the pragma handler, then lex the token after it. 852a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 853a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 8541ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall else if (II == Ident__pragma) // in non-MS mode this is null 8551ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall return HandleMicrosoft__pragma(Tok); 8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 857a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 858a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 859b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::SmallString<128> TmpBuffer; 860b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::raw_svector_ostream OS(TmpBuffer); 861a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 862a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 863a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 864a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 866a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 867b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__LINE__: The presumed line number (within the current 868b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // source file) of the current source line (an integer constant)". This can 869b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // be affected by #line. 870081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner SourceLocation Loc = Tok.getLocation(); 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 872dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // Advance to the location of the first _, this might not be the first byte 873dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // of the token if it starts with an escaped newline. 874dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner Loc = AdvanceToTokenCharacter(Loc, 0); 8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 876081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // One wrinkle here is that GCC expands __LINE__ to location of the *end* of 8779e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // a macro expansion. This doesn't matter for object-like macros, but 878081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // can matter for a function-like macro that expands to contain __LINE__. 8799e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // Skip down through expansion points until we find a file loc for the 8809e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // end of the expansion history. 881edc3dccece244a584f8ebdb81da6c962c08e79beChandler Carruth Loc = SourceMgr.getExpansionRange(Loc).second; 882081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc); 8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8841fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __LINE__ expands to a simple numeric value. 885cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << (PLoc.isValid()? PLoc.getLine() : 1); 886a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 887a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 888b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__FILE__: The presumed name of the current source file (a 889b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // character string literal)". This can be affected by #line. 890b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 891b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 892b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // __BASE_FILE__ is a GNU extension that returns the top of the presumed 893b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // #include stack instead of the current file. 894cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (II == Ident__BASE_FILE__ && PLoc.isValid()) { 895b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner SourceLocation NextLoc = PLoc.getIncludeLoc(); 896a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 897b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(NextLoc); 898cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) 899cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor break; 900cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 901b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner NextLoc = PLoc.getIncludeLoc(); 902a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 903a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 9041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 905a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 906b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::SmallString<128> FN; 907cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isValid()) { 908cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor FN += PLoc.getFilename(); 909cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor Lexer::Stringify(FN); 910cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << '"' << FN.str() << '"'; 911cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 912a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 913a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 914a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 915a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 916a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 917a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 918bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.setLocation(SourceMgr.createExpansionLoc(DATELoc, Tok.getLocation(), 919bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLocation(), 920bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLength())); 921b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer return; 922a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 923a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 924a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 925a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 926a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 927bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.setLocation(SourceMgr.createExpansionLoc(TIMELoc, Tok.getLocation(), 928bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLocation(), 929bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLength())); 930b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer return; 931a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 932b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // Compute the presumed include depth of this token. This can be affected 933b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // by GNU line markers. 934a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 936b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 937cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isValid()) { 938b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 939cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor for (; PLoc.isValid(); ++Depth) 940cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 941cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 9421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9431fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. 944b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << Depth; 945a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 946a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 947a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 948a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 949a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 950a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 951a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 952a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 953a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 955a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 956ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 958a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 959a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 960a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 961a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 962a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 963a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 964a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 965a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 966b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer // Surround the string with " and strip the trailing newline. 9675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner OS << '"' << StringRef(Result, strlen(Result)-1) << '"'; 968a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 969c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner } else if (II == Ident__COUNTER__) { 970c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner // __COUNTER__ expands to a simple numeric value. 971b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << CounterValue++; 972c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Tok.setKind(tok::numeric_constant); 973c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne } else if (II == Ident__has_feature || 974c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne II == Ident__has_extension || 975c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne II == Ident__has_builtin || 976cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson II == Ident__has_attribute) { 977c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // The argument to these builtins should be a parenthesized identifier. 978148772a841cae6f32db16d890e788b92a763bb3fChris Lattner SourceLocation StartLoc = Tok.getLocation(); 9791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 980148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool IsValid = false; 981148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *FeatureII = 0; 9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 983148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the '('. 984148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 985148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::l_paren)) { 986148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the identifier 987148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 988148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::identifier)) { 989148772a841cae6f32db16d890e788b92a763bb3fChris Lattner FeatureII = Tok.getIdentifierInfo(); 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 991148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the ')'. 992148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 993148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::r_paren)) 994148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IsValid = true; 995148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 996148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 9971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 998148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool Value = false; 999148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (!IsValid) 1000148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Diag(StartLoc, diag::err_feature_check_malformed); 1001148772a841cae6f32db16d890e788b92a763bb3fChris Lattner else if (II == Ident__has_builtin) { 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Check for a builtin is trivial. 1003148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = FeatureII->getBuiltinID() != 0; 1004cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson } else if (II == Ident__has_attribute) 1005cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson Value = HasAttribute(FeatureII); 1006c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne else if (II == Ident__has_extension) 1007c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne Value = HasExtension(*this, FeatureII); 1008cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson else { 1009148772a841cae6f32db16d890e788b92a763bb3fChris Lattner assert(II == Ident__has_feature && "Must be feature check"); 1010148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = HasFeature(*this, FeatureII); 1011148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 10121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1013b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << (int)Value; 1014148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Tok.setKind(tok::numeric_constant); 101592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else if (II == Ident__has_include || 101692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson II == Ident__has_include_next) { 101792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // The argument to these two builtins should be a parenthesized 101892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // file name string literal using angle brackets (<>) or 101992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // double-quotes (""). 10203ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner bool Value; 102192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (II == Ident__has_include) 10223ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner Value = EvaluateHasInclude(Tok, II, *this); 102392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson else 10243ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner Value = EvaluateHasIncludeNext(Tok, II, *this); 1025b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << (int)Value; 102692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Tok.setKind(tok::numeric_constant); 1027d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } else if (II == Ident__has_warning) { 1028d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // The argument should be a parenthesized string literal. 1029d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // The argument to these builtins should be a parenthesized identifier. 1030d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek SourceLocation StartLoc = Tok.getLocation(); 1031d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek bool IsValid = false; 1032d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek bool Value = false; 1033d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Read the '('. 1034d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Lex(Tok); 1035d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek do { 1036d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (Tok.is(tok::l_paren)) { 1037d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Read the string. 1038d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Lex(Tok); 1039d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1040d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // We need at least one string literal. 1041d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (!Tok.is(tok::string_literal)) { 1042d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StartLoc = Tok.getLocation(); 1043d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek IsValid = false; 1044d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Eat tokens until ')'. 1045d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek do Lex(Tok); while (!(Tok.is(tok::r_paren) || Tok.is(tok::eod))); 1046d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1047d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1048d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1049d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // String concatenation allows multiple strings, which can even come 1050d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // from macro expansion. 1051d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek SmallVector<Token, 4> StrToks; 1052d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek while (Tok.is(tok::string_literal)) { 1053d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StrToks.push_back(Tok); 1054d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek LexUnexpandedToken(Tok); 1055d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1056d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1057d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Is the end a ')'? 1058d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (!(IsValid = Tok.is(tok::r_paren))) 1059d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1060d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1061d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Concatenate and parse the strings. 1062d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StringLiteralParser Literal(&StrToks[0], StrToks.size(), *this); 1063d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek assert(Literal.isAscii() && "Didn't allow wide strings in"); 1064d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (Literal.hadError) 1065d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1066d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (Literal.Pascal) { 1067d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Diag(Tok, diag::warn_pragma_diagnostic_invalid); 1068d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1069d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1070d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1071d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StringRef WarningName(Literal.GetString()); 1072d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1073d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (WarningName.size() < 3 || WarningName[0] != '-' || 1074d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek WarningName[1] != 'W') { 1075d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Diag(StrToks[0].getLocation(), diag::warn_has_warning_invalid_option); 1076d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1077d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1078d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1079d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Finally, check if the warning flags maps to a diagnostic group. 1080d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // We construct a SmallVector here to talk to getDiagnosticIDs(). 1081d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Although we don't use the result, this isn't a hot path, and not 1082d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // worth special casing. 1083d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek llvm::SmallVector<diag::kind, 10> Diags; 1084d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Value = !getDiagnostics().getDiagnosticIDs()-> 1085d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek getDiagnosticsInGroup(WarningName.substr(2), Diags); 1086d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1087d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } while (false); 1088d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1089d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (!IsValid) 1090d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Diag(StartLoc, diag::err_warning_check_malformed); 1091d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1092d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek OS << (int)Value; 1093d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Tok.setKind(tok::numeric_constant); 1094a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 1095b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown identifier!"); 1096a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 1097a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara CreateString(OS.str().data(), OS.str().size(), Tok, 1098a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara Tok.getLocation(), Tok.getLocation()); 1099a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 11000827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 11010827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) { 11020827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis // If the 'used' status changed, and the macro requires 'unused' warning, 11030827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis // remove its SourceLocation from the warn-for-unused-macro locations. 11040827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if (MI->isWarnIfUnused() && !MI->isUsed()) 11050827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); 11060827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis MI->setIsUsed(true); 11070827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis} 1108