Index: lib/AST/ASTDumper.cpp =================================================================== --- lib/AST/ASTDumper.cpp +++ lib/AST/ASTDumper.cpp @@ -355,18 +355,8 @@ } void ASTDumper::dumpDeclContext(const DeclContext *DC) { - if (!DC) - return; - for (auto *D : (Deserialize ? DC->decls() : DC->noload_decls())) dumpDecl(D); - - if (DC->hasExternalLexicalStorage()) { - dumpChild([=] { - ColorScope Color(OS, ShowColors, UndeserializedColor); - OS << ""; - }); - } } void ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) { @@ -514,10 +504,7 @@ // Decls within functions are visited by the body. if (!isa(*D) && !isa(*D)) { auto DC = dyn_cast(D); - if (DC && - (DC->hasExternalLexicalStorage() || - (Deserialize ? DC->decls_begin() != DC->decls_end() - : DC->noload_decls_begin() != DC->noload_decls_end()))) + if (DC) dumpDeclContext(DC); } }); @@ -1243,12 +1230,11 @@ if (D->isVariadic()) OS << " variadic"; - if (D->isThisDeclarationADefinition()) { + if (isa(D) && D->isThisDeclarationADefinition()) dumpDeclContext(D); - } else { + else for (const ParmVarDecl *Parameter : D->parameters()) dumpDecl(Parameter); - } if (D->hasBody()) dumpStmt(D->getBody()); Index: lib/AST/TextNodeDumper.cpp =================================================================== --- lib/AST/TextNodeDumper.cpp +++ lib/AST/TextNodeDumper.cpp @@ -256,6 +256,17 @@ if (const FunctionDecl *FD = dyn_cast(D)) if (FD->isConstexpr()) OS << " constexpr"; + + if (!isa(*D)) { + auto MD = dyn_cast(D); + if (!MD || !MD->isThisDeclarationADefinition()) { + auto DC = dyn_cast(D); + if (DC && DC->hasExternalLexicalStorage()) { + ColorScope Color(OS, ShowColors, UndeserializedColor); + OS << " "; + } + } + } } void TextNodeDumper::Visit(const CXXCtorInitializer *Init) {