aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/PPDirectives.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-21 04:46:33 +0000
committerChris Lattner <sabre@nondot.org>2009-04-21 04:46:33 +0000
commit2451b528fe114595d0f10ef2c05047928558ab0f (patch)
treeb0f427d33b0d56779b1c6af709ca1672a01dba5f /lib/Lex/PPDirectives.cpp
parentf1c97eb52e55d2d1340a0345ed91e345fddcb65d (diff)
improve MacroInfo to track the source range of the macro definition,
patch by Alexei Svitkine! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69659 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/PPDirectives.cpp')
-rw-r--r--lib/Lex/PPDirectives.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
index a6e1e7ee2c..ca8693bf61 100644
--- a/lib/Lex/PPDirectives.cpp
+++ b/lib/Lex/PPDirectives.cpp
@@ -1275,6 +1275,8 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) {
if (MacroNameTok.is(tok::eom))
return;
+ Token LastTok = MacroNameTok;
+
// If we are supposed to keep comments in #defines, reenable comment saving
// mode.
if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
@@ -1342,11 +1344,15 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) {
else
Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
}
-
+
+ if (!Tok.is(tok::eom))
+ LastTok = Tok;
+
// Read the rest of the macro body.
if (MI->isObjectLike()) {
// Object-like macros are very simple, just read their body.
while (Tok.isNot(tok::eom)) {
+ LastTok = Tok;
MI->AddTokenToBody(Tok);
// Get the next token of the macro.
LexUnexpandedToken(Tok);
@@ -1356,6 +1362,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) {
// Otherwise, read the body of a function-like macro. This has to validate
// the # (stringize) operator.
while (Tok.isNot(tok::eom)) {
+ LastTok = Tok;
MI->AddTokenToBody(Tok);
// Check C99 6.10.3.2p1: ensure that # operators are followed by macro
@@ -1412,6 +1419,8 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) {
// used yet.
if (isInPrimaryFile())
MI->setIsUsed(false);
+
+ MI->setDefinitionEndLoc(LastTok.getLocation());
// Finally, if this identifier already had a macro defined for it, verify that
// the macro bodies are identical and free the old definition.