PPMacroExpansion.cpp revision d768150ef57f617c8d9fef48f3c92e8f21698024
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. 42432c1388f0feef4ea147f881415f5a7225e8cadccChris Lattner if (ArgTokens.size() == ArgTokenStart && !Features.C99 && !Features.CPlusPlus0x) 425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_empty_fnmacro_arg); 4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 428a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token EOFTok; 429a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.startToken(); 430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setKind(tok::eof); 431e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner EOFTok.setLocation(Tok.getLocation()); 432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setLength(0); 433a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(EOFTok); 434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumActuals; 4350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(NumFixedArgsLeft != 0 && "Too many arguments parsed"); 436a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; 437e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 439a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, we either found the r_paren. Check to see if we parsed too few 440a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // arguments. 441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned MinArgsExpected = MI->getNumArgs(); 4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // See MacroArgs instance var for description of this. 444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVarargsElided = false; 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals < MinArgsExpected) { 447a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // There are several cases where too few arguments is ok, handle them now. 44897e2de171de555feb1ef422e71874082a67498c9Chris Lattner if (NumActuals == 0 && MinArgsExpected == 1) { 44997e2de171de555feb1ef422e71874082a67498c9Chris Lattner // #define A(X) or #define A(...) ---> A() 4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45197e2de171de555feb1ef422e71874082a67498c9Chris Lattner // If there is exactly one argument, and that argument is missing, 45297e2de171de555feb1ef422e71874082a67498c9Chris Lattner // then we have an empty "()" argument empty list. This is fine, even if 45397e2de171de555feb1ef422e71874082a67498c9Chris Lattner // the macro expects one argument (the argument is just empty). 45497e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = MI->isVariadic(); 45597e2de171de555feb1ef422e71874082a67498c9Chris Lattner } else if (MI->isVariadic() && 45697e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals+1 == MinArgsExpected || // A(x, ...) -> A(X) 45797e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A() 458a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Varargs where the named vararg parameter is missing: ok as extension. 459a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x, ...) 460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A("blah") 461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_missing_varargs_arg); 462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4630a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Remember this occurred, allowing us to elide the comma when used for 46463bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // cases like: 4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define A(x, foo...) blah(a, ## foo) 4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define B(x, ...) blah(a, ## __VA_ARGS__) 4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define C(...) blah(a, ## __VA_ARGS__) 4680a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // A(x) B(x) C() 46997e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = true; 470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, emit the error. 472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::err_too_few_args_in_macro_invoc); 473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 477a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation EndLoc = Tok.getLocation(); 478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.startToken(); 479a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::eof); 480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(EndLoc); 481a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(0); 482a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 4839fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner 4849fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner // If we expect two arguments, add both as empty. 4859fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner if (NumActuals == 0 && MinArgsExpected == 2) 4869fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner ArgTokens.push_back(Tok); 4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4880a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) { 4890a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4900a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4910a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 4920a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 495d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie return MacroArgs::create(MI, ArgTokens, isVarargsElided, *this); 496a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 497a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4985b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// \brief Keeps macro expanded tokens for TokenLexers. 4995b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis// 5005b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// Works like a stack; a TokenLexer adds the macro expanded tokens that is 5015b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// going to lex in the cache and when it finishes the tokens are removed 5025b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis/// from the end of the cache. 5035b3284a9275a27f5c4410e25eb8933be540601d6Argyrios KyrtzidisToken *Preprocessor::cacheMacroExpandedTokens(TokenLexer *tokLexer, 5042d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner ArrayRef<Token> tokens) { 5055b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(tokLexer); 5065b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis if (tokens.empty()) 5075b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis return 0; 5085b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5095b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis size_t newIndex = MacroExpandedTokens.size(); 5105b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis bool cacheNeedsToGrow = tokens.size() > 5115b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandedTokens.capacity()-MacroExpandedTokens.size(); 5125b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandedTokens.append(tokens.begin(), tokens.end()); 5135b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5145b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis if (cacheNeedsToGrow) { 5155b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis // Go through all the TokenLexers whose 'Tokens' pointer points in the 5165b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis // buffer and update the pointers to the (potential) new buffer array. 5175b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis for (unsigned i = 0, e = MacroExpandingLexersStack.size(); i != e; ++i) { 5185b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis TokenLexer *prevLexer; 5195b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis size_t tokIndex; 5205b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis llvm::tie(prevLexer, tokIndex) = MacroExpandingLexersStack[i]; 5215b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex; 5225b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis } 5235b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis } 5245b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5255b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandingLexersStack.push_back(std::make_pair(tokLexer, newIndex)); 5265b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis return MacroExpandedTokens.data() + newIndex; 5275b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis} 5285b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 5295b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidisvoid Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() { 5305b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(!MacroExpandingLexersStack.empty()); 5315b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis size_t tokIndex = MacroExpandingLexersStack.back().second; 5325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(tokIndex < MacroExpandedTokens.size()); 5335b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis // Pop the cached macro expanded tokens from the end. 5345b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandedTokens.resize(tokIndex); 5355b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis MacroExpandingLexersStack.pop_back(); 5365b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis} 5375b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis 538a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified 539a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of 540a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted. 541a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, 542a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 543a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = time(0); 544a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 546a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner static const char * const Months[] = { 547a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" 548a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5505e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor char TmpBuffer[32]; 551b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32 552b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 553b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor TM->tm_year+1900); 554b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else 5555e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 556a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TM->tm_year+1900); 557b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif 5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Token TmpTok; 56047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TmpTok.startToken(); 56147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 56247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner DATELoc = TmpTok.getLocation(); 563a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 564513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32 565513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 566513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else 5675e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 568513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif 56947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 57047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TIMELoc = TmpTok.getLocation(); 571a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 572a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 573148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 574c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasFeature - Return true if we recognize and implement the feature 575c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier as a standard language feature. 576148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { 577148772a841cae6f32db16d890e788b92a763bb3fChris Lattner const LangOptions &LangOpts = PP.getLangOptions(); 5781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57932592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer return llvm::StringSwitch<bool>(II->getName()) 5806d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_analyzer_noreturn", true) 581dceb53180ae145915673913a9398ba4a00b05584Douglas Gregor .Case("attribute_availability", true) 5826d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_cf_returns_not_retained", true) 5836d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_cf_returns_retained", true) 5844820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("attribute_deprecated_with_message", true) 5856d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ext_vector_type", true) 5866d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ns_returns_not_retained", true) 5876d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ns_returns_retained", true) 58812b9434d5bf801e24242b1f6fd04899f8a7fa92cTed Kremenek .Case("attribute_ns_consumes_self", true) 58911fe175346242744bd9cb4040f3c84e243934134Ted Kremenek .Case("attribute_ns_consumed", true) 59011fe175346242744bd9cb4040f3c84e243934134Ted Kremenek .Case("attribute_cf_consumed", true) 5916d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_objc_ivar_unused", true) 592d5313b0bbf3948fe7c63bf46a7da330c96d07309John McCall .Case("attribute_objc_method_family", true) 5936d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_overloadable", true) 5944820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("attribute_unavailable_with_message", true) 59532592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("blocks", LangOpts.Blocks) 59632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("cxx_exceptions", LangOpts.Exceptions) 5976d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("cxx_rtti", LangOpts.RTTI) 5984820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("enumerator_attributes", true) 599f85e193739c953358c865005855253af4f68a497John McCall // Objective-C features 600f85e193739c953358c865005855253af4f68a497John McCall .Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE? 601f85e193739c953358c865005855253af4f68a497John McCall .Case("objc_arc", LangOpts.ObjCAutoRefCount) 602f85e193739c953358c865005855253af4f68a497John McCall .Case("objc_arc_weak", LangOpts.ObjCAutoRefCount && 6039f084a3166b684573ba49df28fc5792bc37d92e1John McCall LangOpts.ObjCRuntimeHasWeak) 6045471bc85b69912e3b448de004498a80c0de32296Douglas Gregor .Case("objc_fixed_enum", LangOpts.ObjC2) 605e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor .Case("objc_instancetype", LangOpts.ObjC2) 60632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI) 6073ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek .Case("objc_weak_class", LangOpts.ObjCNonFragileABI) 608dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_holds", true) 609dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_returns", true) 610dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_takes", true) 611c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // C1X features 612c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_generic_selections", LangOpts.C1X) 613c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_static_assert", LangOpts.C1X) 614c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor // C++0x features 6157822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus0x) 6163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith .Case("cxx_alias_templates", LangOpts.CPlusPlus0x) 617c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_attributes", LangOpts.CPlusPlus0x) 618738291eedac0f3f3628e34b0b32d6155f280fab2Richard Smith .Case("cxx_auto_type", LangOpts.CPlusPlus0x) 619ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_constexpr", false); 620c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_decltype", LangOpts.CPlusPlus0x) 6210750800623dc6d14c4c0c721996ffd4210fcdff3Douglas Gregor .Case("cxx_default_function_template_args", LangOpts.CPlusPlus0x) 622059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt .Case("cxx_delegating_constructors", LangOpts.CPlusPlus0x) 623c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x) 624ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_explicit_conversions", LangOpts.CPlusPlus0x) 625e1f6dea1c9593651116fa9a5faa05647d18f3193Sean Hunt //.Case("cxx_generalized_initializers", LangOpts.CPlusPlus0x) 62674e611a5fd0b5977c664d13a07b625ae23527d0dSebastian Redl .Case("cxx_implicit_moves", LangOpts.CPlusPlus0x) 627ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_inheriting_constructors", false) 628c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x) 6296d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek //.Case("cxx_lambdas", false) 630ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus0x) 6314561ecdf27b68d80b3cecc2d80ec32bea0ac2127Sebastian Redl .Case("cxx_noexcept", LangOpts.CPlusPlus0x) 63284ee2eeec9f63e4938bafd060105fa4f0c9cd89bDouglas Gregor .Case("cxx_nullptr", LangOpts.CPlusPlus0x) 633c8b9f7977094d0169ec59f9042e85ca854735299Anders Carlsson .Case("cxx_override_control", LangOpts.CPlusPlus0x) 634a391a4642c5eb98aae606f2a2b7219b1a3619d11Richard Smith .Case("cxx_range_for", LangOpts.CPlusPlus0x) 635ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_raw_string_literals", false) 63656209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x) 637c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x) 638c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_strong_enums", LangOpts.CPlusPlus0x) 639c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_static_assert", LangOpts.CPlusPlus0x) 640c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_trailing_return", LangOpts.CPlusPlus0x) 641ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_unicode_literals", false) 642ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_unrestricted_unions", false) 643ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor //.Case("cxx_user_literals", false) 644c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x) 645afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor // Type traits 646afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_nothrow_assign", LangOpts.CPlusPlus) 647afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_nothrow_copy", LangOpts.CPlusPlus) 648afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_nothrow_constructor", LangOpts.CPlusPlus) 649afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_assign", LangOpts.CPlusPlus) 650afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_copy", LangOpts.CPlusPlus) 651afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_constructor", LangOpts.CPlusPlus) 652afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_trivial_destructor", LangOpts.CPlusPlus) 653afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("has_virtual_destructor", LangOpts.CPlusPlus) 654afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_abstract", LangOpts.CPlusPlus) 655afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_base_of", LangOpts.CPlusPlus) 656afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_class", LangOpts.CPlusPlus) 657afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_convertible_to", LangOpts.CPlusPlus) 658b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // __is_empty is available only if the horrible 659b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // "struct __is_empty" parsing hack hasn't been needed in this 660b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // translation unit. If it has, __is_empty reverts to a normal 661b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // identifier and __has_feature(is_empty) evaluates false. 662688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor .Case("is_empty", 6639a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor LangOpts.CPlusPlus && 6649a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor PP.getIdentifierInfo("__is_empty")->getTokenID() 6659a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor != tok::identifier) 666afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_enum", LangOpts.CPlusPlus) 6674e61ddd644e9c6293697a966d98d7c1905cf63a8Chandler Carruth .Case("is_literal", LangOpts.CPlusPlus) 668a55e68b7f961d6ef4551c9be9ac18a1e25c7c927Howard Hinnant .Case("is_standard_layout", LangOpts.CPlusPlus) 669b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // __is_pod is available only if the horrible 670b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // "struct __is_pod" parsing hack hasn't been needed in this 671b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // translation unit. If it has, __is_pod reverts to a normal 672b3f8c244a0f193229a6fdbcea1a3615aff5b90dcDouglas Gregor // identifier and __has_feature(is_pod) evaluates false. 673688761409155b47c39eb5dae1b8c6c8a9f43307aDouglas Gregor .Case("is_pod", 6749a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor LangOpts.CPlusPlus && 6759a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor PP.getIdentifierInfo("__is_pod")->getTokenID() 6769a14ecbdecd89801d87beae92ad60845374e252aDouglas Gregor != tok::identifier) 677afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_polymorphic", LangOpts.CPlusPlus) 678b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth .Case("is_trivial", LangOpts.CPlusPlus) 679feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt .Case("is_trivially_copyable", LangOpts.CPlusPlus) 680afdf137c50f7f96ef865cf007f660dd663a8731fDouglas Gregor .Case("is_union", LangOpts.CPlusPlus) 6811f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher .Case("tls", PP.getTargetInfo().isTLSSupported()) 682858a325e5f250c83409137c5609b162983ea6d1eSean Hunt .Case("underlying_type", LangOpts.CPlusPlus) 68332592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Default(false); 684148772a841cae6f32db16d890e788b92a763bb3fChris Lattner} 685148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 686c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// HasExtension - Return true if we recognize and implement the feature 687c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// specified by the identifier, either as an extension or a standard language 688c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne/// feature. 689c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbournestatic bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) { 690c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne if (HasFeature(PP, II)) 691c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne return true; 692c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 693c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // If the use of an extension results in an error diagnostic, extensions are 694c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // effectively unavailable, so just return false here. 695d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie if (PP.getDiagnostics().getExtensionHandlingBehavior() == 696d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine::Ext_Error) 697c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne return false; 698c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 699c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne const LangOptions &LangOpts = PP.getLangOptions(); 700c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 701c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // Because we inherit the feature list from HasFeature, this string switch 702c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // must be less restrictive than HasFeature's. 703c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne return llvm::StringSwitch<bool>(II->getName()) 704c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // C1X features supported by other languages as extensions. 705c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_generic_selections", true) 706c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("c_static_assert", true) 707c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // C++0x features supported by other languages as extensions. 708c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_deleted_functions", LangOpts.CPlusPlus) 709ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_explicit_conversions", LangOpts.CPlusPlus) 710c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_inline_namespaces", LangOpts.CPlusPlus) 711ece3894a9fe3ce3d282e63c349d84c0923143fe2Douglas Gregor .Case("cxx_nonstatic_member_init", LangOpts.CPlusPlus) 712c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_override_control", LangOpts.CPlusPlus) 7137640c0070361bd365e30fc2eb3b6a64361fa7377Richard Smith .Case("cxx_range_for", LangOpts.CPlusPlus) 714c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus) 715c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Case("cxx_rvalue_references", LangOpts.CPlusPlus) 716c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne .Default(false); 717c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne} 718c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne 719cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute - Return true if we recognize and implement the attribute 720cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier. 721cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) { 722cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson return llvm::StringSwitch<bool>(II->getName()) 723cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc" 724cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson .Default(false); 725cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson} 726cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson 72792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")' 72892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression. 72992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 7303ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok, 7313ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner IdentifierInfo *II, Preprocessor &PP, 7323ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner const DirectoryLookup *LookupFrom) { 73392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson SourceLocation LParenLoc; 73492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 73592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get '('. 73692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.LexNonComment(Tok); 73792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 73892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Ensure we have a '('. 73992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (Tok.isNot(tok::l_paren)) { 74092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName(); 74192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 74292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 74392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 74492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Save '(' location for possible missing ')' message. 74592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson LParenLoc = Tok.getLocation(); 74692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 74792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get the file name. 74892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.getCurrentLexer()->LexIncludeFilename(Tok); 74992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 75092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Reserve a buffer to get the spelling. 751a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner llvm::SmallString<128> FilenameBuffer; 7525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Filename; 753ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor SourceLocation EndLoc; 754ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 75592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson switch (Tok.getKind()) { 75684021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne case tok::eod: 75784021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne // If the token kind is EOD, the error has already been diagnosed. 75892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 75992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 76092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::angle_string_literal: 761453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor case tok::string_literal: { 762453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor bool Invalid = false; 763453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid); 764453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (Invalid) 765453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor return false; 76692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson break; 767453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor } 76892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 76992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::less: 77092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // This could be a <foo/bar.h> file coming from a macro expansion. In this 77192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // case, glue the tokens together into FilenameBuffer and interpret those. 77292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson FilenameBuffer.push_back('<'); 773ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc)) 77484021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne return false; // Found <eod> but no ">"? Diagnostic already emitted. 775a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner Filename = FilenameBuffer.str(); 77692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson break; 77792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson default: 77892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename); 77992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 78092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 78192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 782a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename); 78392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // If GetIncludeFilenameSpelling set the start ptr to null, there was an 78492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // error. 785a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner if (Filename.empty()) 78692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 78792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 78892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Search include directories. 78992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson const DirectoryLookup *CurDir; 790b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth const FileEntry *File = 791fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor PP.LookupFile(Filename, isAngled, LookupFrom, CurDir, NULL, NULL, NULL); 79292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 79392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get the result value. Result = true means the file exists. 7943ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner bool Result = File != 0; 79592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 79692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get ')'. 79792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.LexNonComment(Tok); 79892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 79992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Ensure we have a trailing ). 80092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (Tok.isNot(tok::r_paren)) { 80192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName(); 80292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(LParenLoc, diag::note_matching) << "("; 80392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 80492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 80592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 8063ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return Result; 80792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 80892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 80992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression. 81092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 8113ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II, 81292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Preprocessor &PP) { 8133ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return EvaluateHasIncludeCommon(Tok, II, PP, NULL); 81492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 81592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 81692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression. 81792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 8183ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok, 81992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson IdentifierInfo *II, Preprocessor &PP) { 82092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // __has_include_next is like __has_include, except that we start 82192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // searching after the current found directory. If we can't do this, 82292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // issue a diagnostic. 82392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson const DirectoryLookup *Lookup = PP.GetCurDirLookup(); 82492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (PP.isInPrimaryFile()) { 82592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Lookup = 0; 82692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok, diag::pp_include_next_in_primary); 82792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else if (Lookup == 0) { 82892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok, diag::pp_include_next_absolute_path); 82992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else { 83092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Start looking up in the next directory. 83192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson ++Lookup; 83292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 83392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 8343ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return EvaluateHasIncludeCommon(Tok, II, PP, Lookup); 83592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 836148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 837a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 838a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 839a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 840a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 841a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 842a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8441ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // If this is an _Pragma or Microsoft __pragma directive, expand it, 8451ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // invoke the pragma handler, then lex the token after it. 846a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 847a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 8481ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall else if (II == Ident__pragma) // in non-MS mode this is null 8491ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall return HandleMicrosoft__pragma(Tok); 8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 851a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 852a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 853b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::SmallString<128> TmpBuffer; 854b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::raw_svector_ostream OS(TmpBuffer); 855a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 856a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 857a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 858a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 860a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 861b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__LINE__: The presumed line number (within the current 862b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // source file) of the current source line (an integer constant)". This can 863b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // be affected by #line. 864081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner SourceLocation Loc = Tok.getLocation(); 8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 866dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // Advance to the location of the first _, this might not be the first byte 867dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // of the token if it starts with an escaped newline. 868dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner Loc = AdvanceToTokenCharacter(Loc, 0); 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 870081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // One wrinkle here is that GCC expands __LINE__ to location of the *end* of 8719e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // a macro expansion. This doesn't matter for object-like macros, but 872081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // can matter for a function-like macro that expands to contain __LINE__. 8739e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // Skip down through expansion points until we find a file loc for the 8749e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth // end of the expansion history. 875edc3dccece244a584f8ebdb81da6c962c08e79beChandler Carruth Loc = SourceMgr.getExpansionRange(Loc).second; 876081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc); 8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8781fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __LINE__ expands to a simple numeric value. 879cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << (PLoc.isValid()? PLoc.getLine() : 1); 880a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 881a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 882b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__FILE__: The presumed name of the current source file (a 883b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // character string literal)". This can be affected by #line. 884b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 885b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 886b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // __BASE_FILE__ is a GNU extension that returns the top of the presumed 887b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // #include stack instead of the current file. 888cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (II == Ident__BASE_FILE__ && PLoc.isValid()) { 889b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner SourceLocation NextLoc = PLoc.getIncludeLoc(); 890a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 891b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(NextLoc); 892cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) 893cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor break; 894cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 895b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner NextLoc = PLoc.getIncludeLoc(); 896a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 897a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 899a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 900b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::SmallString<128> FN; 901cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isValid()) { 902cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor FN += PLoc.getFilename(); 903cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor Lexer::Stringify(FN); 904cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << '"' << FN.str() << '"'; 905cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 906a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 907a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 908a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 909a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 910a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 911a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 912bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.setLocation(SourceMgr.createExpansionLoc(DATELoc, Tok.getLocation(), 913bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLocation(), 914bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLength())); 915b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer return; 916a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 917a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 918a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 919a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 920a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 921bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.setLocation(SourceMgr.createExpansionLoc(TIMELoc, Tok.getLocation(), 922bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLocation(), 923bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Tok.getLength())); 924b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer return; 925a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 926b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // Compute the presumed include depth of this token. This can be affected 927b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // by GNU line markers. 928a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 930b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 931cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isValid()) { 932b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 933cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor for (; PLoc.isValid(); ++Depth) 934cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 935cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9371fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. 938b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << Depth; 939a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 940a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 941a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 942a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 943a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 944a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 945a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 946a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 947a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 949a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 950ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 952a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 953a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 954a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 955a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 956a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 957a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 958a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 959a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 960b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer // Surround the string with " and strip the trailing newline. 9615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner OS << '"' << StringRef(Result, strlen(Result)-1) << '"'; 962a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 963c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner } else if (II == Ident__COUNTER__) { 964c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner // __COUNTER__ expands to a simple numeric value. 965b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << CounterValue++; 966c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Tok.setKind(tok::numeric_constant); 967c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne } else if (II == Ident__has_feature || 968c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne II == Ident__has_extension || 969c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne II == Ident__has_builtin || 970cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson II == Ident__has_attribute) { 971c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne // The argument to these builtins should be a parenthesized identifier. 972148772a841cae6f32db16d890e788b92a763bb3fChris Lattner SourceLocation StartLoc = Tok.getLocation(); 9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 974148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool IsValid = false; 975148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *FeatureII = 0; 9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 977148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the '('. 978148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 979148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::l_paren)) { 980148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the identifier 981148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 982148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::identifier)) { 983148772a841cae6f32db16d890e788b92a763bb3fChris Lattner FeatureII = Tok.getIdentifierInfo(); 9841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 985148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the ')'. 986148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 987148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::r_paren)) 988148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IsValid = true; 989148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 990148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 992148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool Value = false; 993148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (!IsValid) 994148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Diag(StartLoc, diag::err_feature_check_malformed); 995148772a841cae6f32db16d890e788b92a763bb3fChris Lattner else if (II == Ident__has_builtin) { 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Check for a builtin is trivial. 997148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = FeatureII->getBuiltinID() != 0; 998cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson } else if (II == Ident__has_attribute) 999cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson Value = HasAttribute(FeatureII); 1000c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne else if (II == Ident__has_extension) 1001c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne Value = HasExtension(*this, FeatureII); 1002cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson else { 1003148772a841cae6f32db16d890e788b92a763bb3fChris Lattner assert(II == Ident__has_feature && "Must be feature check"); 1004148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = HasFeature(*this, FeatureII); 1005148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 10061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1007b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << (int)Value; 1008148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Tok.setKind(tok::numeric_constant); 100992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else if (II == Ident__has_include || 101092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson II == Ident__has_include_next) { 101192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // The argument to these two builtins should be a parenthesized 101292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // file name string literal using angle brackets (<>) or 101392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // double-quotes (""). 10143ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner bool Value; 101592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (II == Ident__has_include) 10163ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner Value = EvaluateHasInclude(Tok, II, *this); 101792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson else 10183ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner Value = EvaluateHasIncludeNext(Tok, II, *this); 1019b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << (int)Value; 102092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Tok.setKind(tok::numeric_constant); 1021d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } else if (II == Ident__has_warning) { 1022d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // The argument should be a parenthesized string literal. 1023d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // The argument to these builtins should be a parenthesized identifier. 1024d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek SourceLocation StartLoc = Tok.getLocation(); 1025d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek bool IsValid = false; 1026d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek bool Value = false; 1027d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Read the '('. 1028d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Lex(Tok); 1029d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek do { 1030d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (Tok.is(tok::l_paren)) { 1031d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Read the string. 1032d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Lex(Tok); 1033d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1034d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // We need at least one string literal. 1035d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (!Tok.is(tok::string_literal)) { 1036d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StartLoc = Tok.getLocation(); 1037d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek IsValid = false; 1038d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Eat tokens until ')'. 1039d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek do Lex(Tok); while (!(Tok.is(tok::r_paren) || Tok.is(tok::eod))); 1040d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1041d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1042d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1043d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // String concatenation allows multiple strings, which can even come 1044d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // from macro expansion. 1045d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek SmallVector<Token, 4> StrToks; 1046d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek while (Tok.is(tok::string_literal)) { 1047d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StrToks.push_back(Tok); 1048d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek LexUnexpandedToken(Tok); 1049d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1050d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1051d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Is the end a ')'? 1052d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (!(IsValid = Tok.is(tok::r_paren))) 1053d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1054d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1055d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Concatenate and parse the strings. 1056d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StringLiteralParser Literal(&StrToks[0], StrToks.size(), *this); 1057d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek assert(Literal.isAscii() && "Didn't allow wide strings in"); 1058d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (Literal.hadError) 1059d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1060d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (Literal.Pascal) { 1061d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Diag(Tok, diag::warn_pragma_diagnostic_invalid); 1062d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1063d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1064d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1065d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek StringRef WarningName(Literal.GetString()); 1066d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1067d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (WarningName.size() < 3 || WarningName[0] != '-' || 1068d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek WarningName[1] != 'W') { 1069d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Diag(StrToks[0].getLocation(), diag::warn_has_warning_invalid_option); 1070d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek break; 1071d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1072d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1073d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Finally, check if the warning flags maps to a diagnostic group. 1074d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // We construct a SmallVector here to talk to getDiagnosticIDs(). 1075d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // Although we don't use the result, this isn't a hot path, and not 1076d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek // worth special casing. 1077d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek llvm::SmallVector<diag::kind, 10> Diags; 1078d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Value = !getDiagnostics().getDiagnosticIDs()-> 1079d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek getDiagnosticsInGroup(WarningName.substr(2), Diags); 1080d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } 1081d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek } while (false); 1082d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1083d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek if (!IsValid) 1084d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Diag(StartLoc, diag::err_warning_check_malformed); 1085d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek 1086d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek OS << (int)Value; 1087d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek Tok.setKind(tok::numeric_constant); 1088a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 1089b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown identifier!"); 1090a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 1091a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara CreateString(OS.str().data(), OS.str().size(), Tok, 1092a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara Tok.getLocation(), Tok.getLocation()); 1093a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 10940827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 10950827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) { 10960827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis // If the 'used' status changed, and the macro requires 'unused' warning, 10970827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis // remove its SourceLocation from the warn-for-unused-macro locations. 10980827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if (MI->isWarnIfUnused() && !MI->isUsed()) 10990827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); 11000827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis MI->setIsUsed(true); 11010827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis} 1102