From: Ted Kremenek Date: Thu, 29 Nov 2007 19:04:54 +0000 (+0000) Subject: Only serialize top-level decls that appear at the head of a decl chain. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6127b12f1663323490fdbd08bbb73bd14df3e4e8;p=clang Only serialize top-level decls that appear at the head of a decl chain. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44438 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/SerializationTest.cpp b/Driver/SerializationTest.cpp index b7d9b75bb5..9beb92e130 100644 --- a/Driver/SerializationTest.cpp +++ b/Driver/SerializationTest.cpp @@ -128,18 +128,23 @@ void SerializationTest::Serialize(llvm::sys::Path& Filename, for (std::list::iterator I=Decls.begin(), E=Decls.end(); I!=E; ++I) { llvm::cerr << "Serializing: Decl.\n"; - Printer->HandleTopLevelDecl(*I); - FilePrinter->HandleTopLevelDecl(*I); - - if (FunctionDecl* FD = dyn_cast(*I)) - if (FD->getBody()) { - // Construct and print a CFG. - Janitor cfg(CFG::buildCFG(FD->getBody())); - cfg->print(DeclPP); - } - - // Serialize the decl. - Sezr.EmitOwnedPtr(*I); + // Only serialize the head of a decl chain. The ASTConsumer interfaces + // provides us with each top-level decl, including those nested in + // a decl chain, so we may be passed decls that are already serialized. + if (!Sezr.isRegistered(*I)) { + Printer->HandleTopLevelDecl(*I); + FilePrinter->HandleTopLevelDecl(*I); + + if (FunctionDecl* FD = dyn_cast(*I)) + if (FD->getBody()) { + // Construct and print a CFG. + Janitor cfg(CFG::buildCFG(FD->getBody())); + cfg->print(DeclPP); + } + + // Serialize the decl. + Sezr.EmitOwnedPtr(*I); + } } }