Fix leaking of LexedMethod objects created for caching objc method definitions tokens
for late parsing.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145394 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h
index a1b346e..2c8f7ef 100644
--- a/include/clang/Parse/Parser.h
+++ b/include/clang/Parse/Parser.h
@@ -402,6 +402,9 @@
     Tok.setKind(tok::eof);
   }
 
+  /// \brief Clear and free the cached objc methods.
+  void clearLateParsedObjCMethods();
+
   /// \brief Handle the annotation token produced for #pragma unused(...)
   void HandlePragmaUnused();
 
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index 3cb2aaa..10c74ff 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -1500,7 +1500,7 @@
     // missing @implementation
     Diag(atEnd.getBegin(), diag::err_expected_implementation);
     
-  LateParsedObjCMethods.clear();
+  clearLateParsedObjCMethods();
   ObjCImpDecl = 0;
   return Actions.BuildDeclaratorGroup(
            DeclsInGroup.data(), DeclsInGroup.size(), false);
@@ -1515,6 +1515,14 @@
   return Actions.ConvertDeclToDeclGroup(ImpDecl);
 }
 
+void Parser::clearLateParsedObjCMethods() {
+  for (LateParsedObjCMethodContainer::iterator
+         I = LateParsedObjCMethods.begin(),
+         E = LateParsedObjCMethods.end(); I != E; ++I)
+    delete *I;
+  LateParsedObjCMethods.clear();
+}
+
 ///   compatibility-alias-decl:
 ///     @compatibility_alias alias-name  class-name ';'
 ///
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index b4d41ef..834e741 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -370,6 +370,8 @@
       it != LateParsedTemplateMap.end(); ++it)
     delete it->second;
 
+  clearLateParsedObjCMethods();
+
   // Remove the pragma handlers we installed.
   PP.RemovePragmaHandler(AlignHandler.get());
   AlignHandler.reset();