rsmith added a comment. Do we need `-print-decl-contexts` at all? It's not exposed by the driver, not tested, not documented, has a very strange output format (the bracketing character supplies some information about the kind of declaration, but it's not clear *what* information), and it doesn't really seem to provide any value given that we also have the maintained, tested, and actively-used `-ast-dump` flag, as well as programmatic interfaces to this information via libclang.
The only reason I can see to keep it would be if there's some external tool that's parsing its output, which this patch would break. ================ Comment at: lib/Frontend/ASTConsumers.cpp:423 + if (auto *DC = dyn_cast<DeclContext>(I)) { + PrintDeclContext(DC, Indentation + 1); + continue; ---------------- Was the change from +2 to +1 here intentional? ================ Comment at: lib/Frontend/ASTConsumers.cpp:427-431 switch (DK) { - case Decl::Namespace: - case Decl::Enum: - case Decl::Record: - case Decl::CXXRecord: - case Decl::ObjCMethod: - case Decl::ObjCInterface: - case Decl::ObjCCategory: - case Decl::ObjCProtocol: - case Decl::ObjCImplementation: - case Decl::ObjCCategoryImpl: - case Decl::LinkageSpec: - case Decl::Block: - case Decl::Function: - case Decl::CXXMethod: - case Decl::CXXConstructor: - case Decl::CXXDestructor: - case Decl::CXXConversion: - case Decl::ClassTemplateSpecialization: - case Decl::ClassTemplatePartialSpecialization: { - DeclContext* DC = cast<DeclContext>(I); - PrintDeclContext(DC, Indentation+2); - break; - } - case Decl::IndirectField: - Out << "<IndirectField> " << *cast<IndirectFieldDecl>(I) << '\n'; - break; - case Decl::Label: - Out << "<Label> " << *cast<LabelDecl>(I) << '\n'; - break; - case Decl::Field: - Out << "<field> " << *cast<FieldDecl>(I) << '\n'; - break; - case Decl::Typedef: - case Decl::TypeAlias: - Out << "<typedef> " << *cast<TypedefNameDecl>(I) << '\n'; - break; - case Decl::EnumConstant: - Out << "<enum constant> " << *cast<EnumConstantDecl>(I) << '\n'; - break; - case Decl::Var: - Out << "<var> " << *cast<VarDecl>(I) << '\n'; - break; - case Decl::ImplicitParam: - Out << "<implicit parameter> " << *cast<ImplicitParamDecl>(I) << '\n'; - break; - case Decl::ParmVar: - Out << "<parameter> " << *cast<ParmVarDecl>(I) << '\n'; - break; - case Decl::ObjCProperty: - Out << "<objc property> " << *cast<ObjCPropertyDecl>(I) << '\n'; - break; - case Decl::FunctionTemplate: - Out << "<function template> " << *cast<FunctionTemplateDecl>(I) << '\n'; - break; - case Decl::TypeAliasTemplate: - Out << "<type alias template> " << *cast<TypeAliasTemplateDecl>(I) - << '\n'; - break; - case Decl::FileScopeAsm: - Out << "<file-scope asm>\n"; - break; - case Decl::UsingDirective: - Out << "<using directive>\n"; - break; - case Decl::NamespaceAlias: - Out << "<namespace alias> " << *cast<NamespaceAliasDecl>(I) << '\n'; - break; - case Decl::ClassTemplate: - Out << "<class template> " << *cast<ClassTemplateDecl>(I) << '\n'; - break; - case Decl::OMPThreadPrivate: { - Out << "<omp threadprivate> " << '"' << I << "\"\n"; - break; - } - case Decl::Friend: { - Out << "<friend>"; - if (const NamedDecl *ND = cast<FriendDecl>(I)->getFriendDecl()) - Out << ' ' << *ND; - Out << "\n"; - break; - } - case Decl::Using: - Out << "<using> " << *cast<UsingDecl>(I) << "\n"; - break; - case Decl::UsingShadow: - Out << "<using shadow> " << *cast<UsingShadowDecl>(I) << "\n"; - break; - case Decl::UnresolvedUsingValue: - Out << "<unresolved using value> " << *cast<UnresolvedUsingValueDecl>(I) - << "\n"; - break; - case Decl::Empty: - Out << "<empty>\n"; - break; - case Decl::AccessSpec: - Out << "<access specifier>\n"; - break; - case Decl::VarTemplate: - Out << "<var template> " << *cast<VarTemplateDecl>(I) << "\n"; - break; - case Decl::StaticAssert: - Out << "<static assert>\n"; - break; - - default: - Out << "DeclKind: " << DK << '"' << I << "\"\n"; - llvm_unreachable("decl unhandled"); +#define NAMED(DERIVED, BASE) \ + case Decl::DERIVED: \ + Out << "<" << #DERIVED << "> " << *cast<NamedDecl>(I) << "\n"; \ + continue; ---------------- You don't need a switch for this either. `if (auto *ND = dyn_cast<NamedDecl>(I))` and `ND->getDeclKindName()` should work fine. ================ Comment at: lib/Frontend/ASTConsumers.cpp:498-499 - Out << "<friend>"; - if (const NamedDecl *ND = cast<FriendDecl>(I)->getFriendDecl()) - Out << ' ' << *ND; - Out << "\n"; ---------------- You've lost this special case. Repository: rC Clang https://reviews.llvm.org/D52529 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits