summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Lex/MacroArgs.cpp11
-rw-r--r--clang/lib/Lex/PPMacroExpansion.cpp2
2 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/Lex/MacroArgs.cpp b/clang/lib/Lex/MacroArgs.cpp
index b634f6a62cb..77c96e0ab33 100644
--- a/clang/lib/Lex/MacroArgs.cpp
+++ b/clang/lib/Lex/MacroArgs.cpp
@@ -23,7 +23,7 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI,
unsigned NumToks, bool VarargsElided) {
assert(MI->isFunctionLike() &&
"Can't have args for an object-like macro!");
-
+
// Allocate memory for the MacroArgs object with the lexer tokens at the end.
MacroArgs *Result = (MacroArgs*)malloc(sizeof(MacroArgs) +
NumToks*sizeof(Token));
@@ -118,7 +118,14 @@ MacroArgs::getPreExpArgument(unsigned Arg, Preprocessor &PP) {
// Lex all of the macro-expanded tokens into Result.
do {
Result.push_back(Token());
- PP.Lex(Result.back());
+ Token &Tok = Result.back();
+ PP.Lex(Tok);
+
+ // Eagerly resolve instantiation ID's to their spelling location. This
+ // makes it so we only have to get the spelling loc once per macro argument
+ // preexpansion instead of once per each time the token is expanded.
+ if (!Tok.getLocation().isFileID())
+ Tok.setLocation(PP.getSourceManager().getSpellingLoc(Tok.getLocation()));
} while (Result.back().isNot(tok::eof));
// Pop the token stream off the top of the stack. We know that the internal
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index 518c84e8c38..b14df735ad1 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -359,7 +359,7 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
Token EOFTok;
EOFTok.startToken();
EOFTok.setKind(tok::eof);
- EOFTok.setLocation(Tok.getLocation());
+ EOFTok.setLocation(SourceMgr.getSpellingLoc(Tok.getLocation()));
EOFTok.setLength(0);
ArgTokens.push_back(EOFTok);
++NumActuals;
OpenPOWER on IntegriCloud