diff --git a/clang/Driver/DiagChecker.cpp b/clang/Driver/DiagChecker.cpp index 4b457290e328..8daaa6cce2dc 100644 --- a/clang/Driver/DiagChecker.cpp +++ b/clang/Driver/DiagChecker.cpp @@ -227,8 +227,8 @@ static bool CheckResults(Preprocessor &PP, /// CheckASTConsumer - Implement diagnostic checking for AST consumers. bool clang::CheckASTConsumer(Preprocessor &PP, unsigned MainFileID, ASTConsumer* C) { - - ParseAST(PP, MainFileID, *C); + // Parse the AST and run the consumer, ultimately deleting C. + ParseAST(PP, MainFileID, C); // Gather the set of expected diagnostics. DiagList ExpectedErrors, ExpectedWarnings; diff --git a/clang/Driver/RewriteTest.cpp b/clang/Driver/RewriteTest.cpp index ca9b1153f02f..7bbd7afdb522 100644 --- a/clang/Driver/RewriteTest.cpp +++ b/clang/Driver/RewriteTest.cpp @@ -79,7 +79,6 @@ namespace { void SynthGetClassFunctionDecl(); // Metadata emission. - void HandleObjcMetaDataEmission(); void RewriteObjcClassMetaData(ObjcImplementationDecl *IDecl, std::string &Result); @@ -162,6 +161,12 @@ RewriteTest::~RewriteTest() { // Get the top-level buffer that this corresponds to. RewriteTabs(); + // Rewrite Objective-c meta data* + std::string ResultStr; + WriteObjcMetaData(ResultStr); + // For now just print the string out. + printf("%s", ResultStr.c_str()); + // Get the buffer corresponding to MainFileID. If we haven't changed it, then // we are done. if (const RewriteBuffer *RewriteBuf = @@ -175,16 +180,6 @@ RewriteTest::~RewriteTest() { } -/// HandleObjcMetaDataEmission - main routine to generate objective-c's -/// metadata. -void RewriteTest::HandleObjcMetaDataEmission() { - // Rewrite Objective-c meta data* - std::string ResultStr; - WriteObjcMetaData(ResultStr); - // For now just print the string out. - printf("%s", ResultStr.c_str()); -} - //===----------------------------------------------------------------------===// // Syntactic (non-AST) Rewriting Code //===----------------------------------------------------------------------===// diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 77779f7e80e7..f56830244433 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -821,11 +821,10 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID, if (Consumer) { if (VerifyDiagnostics) - exit (CheckASTConsumer(PP, MainFileID, Consumer)); - else - ParseAST(PP, MainFileID, *Consumer, Stats); - - delete Consumer; + exit(CheckASTConsumer(PP, MainFileID, Consumer)); + + // This deletes Consumer. + ParseAST(PP, MainFileID, Consumer, Stats); } if (Stats) { diff --git a/clang/Sema/ASTStreamer.cpp b/clang/Sema/ASTStreamer.cpp index d7f59af04b93..be43289be516 100644 --- a/clang/Sema/ASTStreamer.cpp +++ b/clang/Sema/ASTStreamer.cpp @@ -89,9 +89,10 @@ void ASTStreamer::PrintStats() const { //===----------------------------------------------------------------------===// /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as -/// the file is parsed. +/// the file is parsed. This takes ownership of the ASTConsumer and +/// ultimately deletes it. void clang::ParseAST(Preprocessor &PP, unsigned MainFileID, - ASTConsumer &Consumer, bool PrintStats) { + ASTConsumer *Consumer, bool PrintStats) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::CollectingStats(true); @@ -103,22 +104,22 @@ void clang::ParseAST(Preprocessor &PP, unsigned MainFileID, ASTStreamer Streamer(PP, Context, MainFileID); - Consumer.Initialize(Context, MainFileID); + Consumer->Initialize(Context, MainFileID); while (Decl *D = Streamer.ReadTopLevelDecl()) - Consumer.HandleTopLevelDecl(D); + Consumer->HandleTopLevelDecl(D); - Consumer.HandleObjcMetaDataEmission(); - if (PrintStats) { fprintf(stderr, "\nSTATISTICS:\n"); Streamer.PrintStats(); Context.PrintStats(); Decl::PrintStats(); Stmt::PrintStats(); - Consumer.PrintStats(); + Consumer->PrintStats(); Decl::CollectingStats(false); Stmt::CollectingStats(false); } + + delete Consumer; } diff --git a/clang/include/clang/AST/ASTConsumer.h b/clang/include/clang/AST/ASTConsumer.h index 48b6f0cea40c..160260f030bc 100644 --- a/clang/include/clang/AST/ASTConsumer.h +++ b/clang/include/clang/AST/ASTConsumer.h @@ -34,11 +34,6 @@ public: virtual void HandleTopLevelDecl(Decl *D) { } - /// HandleObjcMetaDataEmission - top level routine for objective-c - /// metadata emission. - virtual void HandleObjcMetaDataEmission() { - } - /// PrintStats - If desired, print any statistics. virtual void PrintStats() { } diff --git a/clang/include/clang/Sema/ASTStreamer.h b/clang/include/clang/Sema/ASTStreamer.h index 3130613e7a8f..bffc4db9939e 100644 --- a/clang/include/clang/Sema/ASTStreamer.h +++ b/clang/include/clang/Sema/ASTStreamer.h @@ -21,9 +21,10 @@ namespace clang { class ASTConsumer; /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as - /// the file is parsed. This does not take ownership of the ASTConsumer. + /// the file is parsed. This takes ownership of the ASTConsumer and + /// ultimately deletes it. void ParseAST(Preprocessor &pp, unsigned MainFileID, - ASTConsumer &C, bool PrintStats = false); + ASTConsumer *C, bool PrintStats = false); } // end namespace clang #endif