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