]> granicus.if.org Git - clang/commitdiff
Revert "Fix late template parsing leak with incremental processing"
authorReid Kleckner <reid@kleckner.net>
Wed, 15 Oct 2014 17:22:56 +0000 (17:22 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 15 Oct 2014 17:22:56 +0000 (17:22 +0000)
This reverts commit r219810.

The test suite appears broken.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219813 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Parser.h
include/clang/Sema/Sema.h
lib/Parse/Parser.cpp
lib/Sema/Sema.cpp
unittests/Frontend/FrontendActionTest.cpp

index 6d533961cd1894a3aa450880a4933f53ddc4b09b..5aaa6cab91bdb027d10ac603a3453b4be03ddf37 100644 (file)
@@ -1155,7 +1155,6 @@ private:
   void ParseLateTemplatedFuncDef(LateParsedTemplate &LPT);
 
   static void LateTemplateParserCallback(void *P, LateParsedTemplate &LPT);
-  static void LateTemplateParserCleanupCallback(void *P);
 
   Sema::ParsingClassState
   PushParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface);
index bda327fc95e05fed1a5b03e6ae800a56e7f8d456..4cd4c57c33983dc2d866bdd4cfbe2228ff6a4490 100644 (file)
@@ -480,16 +480,11 @@ public:
 
   /// \brief Callback to the parser to parse templated functions when needed.
   typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
-  typedef void LateTemplateParserCleanupCB(void *P);
   LateTemplateParserCB *LateTemplateParser;
-  LateTemplateParserCleanupCB *LateTemplateParserCleanup;
   void *OpaqueParser;
 
-  void SetLateTemplateParser(LateTemplateParserCB *LTP,
-                             LateTemplateParserCleanupCB *LTPCleanup,
-                             void *P) {
+  void SetLateTemplateParser(LateTemplateParserCB *LTP, void *P) {
     LateTemplateParser = LTP;
-    LateTemplateParserCleanup = LTPCleanup;
     OpaqueParser = P;
   }
 
index fabfe218a48aae54c66019d1dc5827d706c42748..5a0653026f2eca6afd80c80166ab04a10fc10f9d 100644 (file)
@@ -510,13 +510,6 @@ namespace {
   };
 }
 
-void Parser::LateTemplateParserCleanupCallback(void *P) {
-  // While this RAII helper doesn't bracket any actual work, the destructor will
-  // clean up annotations that were created during ActOnEndOfTranslationUnit
-  // when incremental processing is enabled.
-  DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(((Parser *)P)->TemplateIds);
-}
-
 /// ParseTopLevelDecl - Parse one top-level declaration, return whatever the
 /// action tells us to.  This returns true if the EOF was encountered.
 bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
@@ -549,10 +542,7 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
   case tok::eof:
     // Late template parsing can begin.
     if (getLangOpts().DelayedTemplateParsing)
-      Actions.SetLateTemplateParser(LateTemplateParserCallback,
-                                    PP.isIncrementalProcessingEnabled() ?
-                                    LateTemplateParserCleanupCallback : nullptr,
-                                    this);
+      Actions.SetLateTemplateParser(LateTemplateParserCallback, this);
     if (!PP.isIncrementalProcessingEnabled())
       Actions.ActOnEndOfTranslationUnit();
     //else don't tell Sema that we ended parsing: more input might come.
index 70e4eaab8e3de97d0027e13a682068232ee53e4c..aae2008957ef26aa599099b87471272505f2d4c2 100644 (file)
@@ -672,9 +672,6 @@ void Sema::ActOnEndOfTranslationUnit() {
     }
     PerformPendingInstantiations();
 
-    if (LateTemplateParserCleanup)
-      LateTemplateParserCleanup(OpaqueParser);
-
     CheckDelayedMemberExceptionSpecs();
   }
 
index 9973d3f8bea2537bbf8555ecc25224cc7fa10aac..31711566921c6df4ffc9501d0664820bf5570f36 100644 (file)
@@ -14,7 +14,6 @@
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/CompilerInvocation.h"
 #include "clang/Lex/Preprocessor.h"
-#include "clang/Sema/Sema.h"
 #include "llvm/ADT/Triple.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "gtest/gtest.h"
@@ -26,13 +25,10 @@ namespace {
 
 class TestASTFrontendAction : public ASTFrontendAction {
 public:
-  TestASTFrontendAction(bool enableIncrementalProcessing = false,
-                        bool actOnEndOfTranslationUnit = false)
-    : EnableIncrementalProcessing(enableIncrementalProcessing),
-      ActOnEndOfTranslationUnit(actOnEndOfTranslationUnit) { }
+  TestASTFrontendAction(bool enableIncrementalProcessing = false)
+    : EnableIncrementalProcessing(enableIncrementalProcessing) { }
 
   bool EnableIncrementalProcessing;
-  bool ActOnEndOfTranslationUnit;
   std::vector<std::string> decl_names;
 
   virtual bool BeginSourceFileAction(CompilerInstance &ci, StringRef filename) {
@@ -44,22 +40,15 @@ public:
 
   virtual std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
                                                          StringRef InFile) {
-    return llvm::make_unique<Visitor>(CI, ActOnEndOfTranslationUnit,
-                                      decl_names);
+    return llvm::make_unique<Visitor>(decl_names);
   }
 
 private:
   class Visitor : public ASTConsumer, public RecursiveASTVisitor<Visitor> {
   public:
-    Visitor(CompilerInstance &ci, bool actOnEndOfTranslationUnit,
-            std::vector<std::string> &decl_names) :
-      CI(ci), ActOnEndOfTranslationUnit(actOnEndOfTranslationUnit),
-      decl_names_(decl_names) {}
+    Visitor(std::vector<std::string> &decl_names) : decl_names_(decl_names) {}
 
     virtual void HandleTranslationUnit(ASTContext &context) {
-      if (ActOnEndOfTranslationUnit) {
-        CI.getSema().ActOnEndOfTranslationUnit();
-      }
       TraverseDecl(context.getTranslationUnitDecl());
     }
 
@@ -69,8 +58,6 @@ private:
     }
 
   private:
-    CompilerInstance &CI;
-    bool ActOnEndOfTranslationUnit;
     std::vector<std::string> &decl_names_;
   };
 };
@@ -115,34 +102,6 @@ TEST(ASTFrontendAction, IncrementalParsing) {
   EXPECT_EQ("x", test_action.decl_names[1]);
 }
 
-TEST(ASTFrontendAction, LateTemplateIncrementalParsing) {
-  CompilerInvocation *invocation = new CompilerInvocation;
-  invocation->getLangOpts()->CPlusPlus = true;
-  invocation->getLangOpts()->DelayedTemplateParsing = true;
-  invocation->getPreprocessorOpts().addRemappedFile(
-    "test.cc", MemoryBuffer::getMemBuffer(
-      "template<typename T> struct A { A(T); T data; };\n"
-      "template<typename T> struct B: public A<T> {\n"
-      "  B();\n"
-      "  B(B const& b): A<T>(b.data) {}\n"
-      "};\n"
-      "B<char> c() { return B<char>(); }\n").release());
-  invocation->getFrontendOpts().Inputs.push_back(FrontendInputFile("test.cc",
-                                                                   IK_CXX));
-  invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
-  invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
-  CompilerInstance compiler;
-  compiler.setInvocation(invocation);
-  compiler.createDiagnostics();
-
-  TestASTFrontendAction test_action(/*enableIncrementalProcessing=*/true,
-                                    /*actOnEndOfTranslationUnit=*/true);
-  ASSERT_TRUE(compiler.ExecuteAction(test_action));
-  ASSERT_EQ(13U, test_action.decl_names.size());
-  EXPECT_EQ("A", test_action.decl_names[0]);
-  EXPECT_EQ("c", test_action.decl_names[12]);
-}
-
 struct TestPPCallbacks : public PPCallbacks {
   TestPPCallbacks() : SeenEnd(false) {}