From: Richard Smith Date: Fri, 5 Jan 2018 21:31:07 +0000 (+0000) Subject: Add AST dumping support for _Generic expressions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=183d4bfc6856352ca8cac380c7271538df8b2477;p=clang Add AST dumping support for _Generic expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@321899 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp index 92be6d95e8..22b71e3cf5 100644 --- a/lib/AST/ASTDumper.cpp +++ b/lib/AST/ASTDumper.cpp @@ -539,6 +539,7 @@ namespace { void VisitAddrLabelExpr(const AddrLabelExpr *Node); void VisitBlockExpr(const BlockExpr *Node); void VisitOpaqueValueExpr(const OpaqueValueExpr *Node); + void VisitGenericSelectionExpr(const GenericSelectionExpr *E); // C++ void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node); @@ -1946,10 +1947,15 @@ void ASTDumper::dumpStmt(const Stmt *S) { return; } + // Some statements have custom mechanisms for dumping their children. if (const DeclStmt *DS = dyn_cast(S)) { VisitDeclStmt(DS); return; } + if (const GenericSelectionExpr *GSE = dyn_cast(S)) { + VisitGenericSelectionExpr(GSE); + return; + } ConstStmtVisitor::Visit(S); @@ -2272,6 +2278,32 @@ void ASTDumper::VisitOpaqueValueExpr(const OpaqueValueExpr *Node) { dumpStmt(Source); } +void ASTDumper::VisitGenericSelectionExpr(const GenericSelectionExpr *E) { + VisitExpr(E); + if (E->isResultDependent()) + OS << " result_dependent"; + dumpStmt(E->getControllingExpr()); + dumpTypeAsChild(E->getControllingExpr()->getType()); // FIXME: remove + + for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) { + dumpChild([=] { + if (const TypeSourceInfo *TSI = E->getAssocTypeSourceInfo(I)) { + OS << "case "; + dumpType(TSI->getType()); + } else { + OS << "default"; + } + + if (!E->isResultDependent() && E->getResultIndex() == I) + OS << " selected"; + + if (const TypeSourceInfo *TSI = E->getAssocTypeSourceInfo(I)) + dumpTypeAsChild(TSI->getType()); + dumpStmt(E->getAssocExpr(I)); + }); + } +} + // GNU extensions. void ASTDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) {