[preprocessor] Call the MacroUndefined callback even when the macro was not defined.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 16 Jan 2013 16:52:44 +0000 (16:52 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 16 Jan 2013 16:52:44 +0000 (16:52 +0000)
Patch by Enea Zaffanella!

llvm-svn: 172623

clang/lib/Lex/PPDirectives.cpp
clang/lib/Lex/PreprocessingRecord.cpp

index 6796f1c..bdca036 100644 (file)
@@ -1967,16 +1967,17 @@ void Preprocessor::HandleUndefDirective(Token &UndefTok) {
   // Okay, we finally have a valid identifier to undef.
   MacroInfo *MI = getMacroInfo(MacroNameTok.getIdentifierInfo());
 
+  // If the callbacks want to know, tell them about the macro #undef.
+  // Note: no matter if the macro was defined or not.
+  if (Callbacks)
+    Callbacks->MacroUndefined(MacroNameTok, MI);
+
   // If the macro is not defined, this is a noop undef, just return.
   if (MI == 0) return;
 
   if (!MI->isUsed() && MI->isWarnIfUnused())
     Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
 
-  // If the callbacks want to know, tell them about the macro #undef.
-  if (Callbacks)
-    Callbacks->MacroUndefined(MacroNameTok, MI);
-
   if (MI->isWarnIfUnused())
     WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
 
index 8e8afeb..d7ebeaf 100644 (file)
@@ -416,7 +416,9 @@ void PreprocessingRecord::MacroDefined(const Token &Id,
 
 void PreprocessingRecord::MacroUndefined(const Token &Id,
                                          const MacroInfo *MI) {
-  MacroDefinitions.erase(MI);
+  // Note: MI may be null (when #undef'ining an undefined macro).
+  if (MI)
+    MacroDefinitions.erase(MI);
 }
 
 void PreprocessingRecord::InclusionDirective(