diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-01-05 21:31:07 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-01-05 21:31:07 +0000 |
commit | 01ccebf031b2bf6dbe61964c8f2fb9727421ce19 (patch) | |
tree | 31c7b0bbe1299c73a3042b7cf5fa72c725c81495 /clang/lib/AST/ASTDumper.cpp | |
parent | 004867312ebb0c4fa7cd2b1554fd2a04d71f2c70 (diff) | |
download | bcm5719-llvm-01ccebf031b2bf6dbe61964c8f2fb9727421ce19.tar.gz bcm5719-llvm-01ccebf031b2bf6dbe61964c8f2fb9727421ce19.zip |
Add AST dumping support for _Generic expressions.
llvm-svn: 321899
Diffstat (limited to 'clang/lib/AST/ASTDumper.cpp')
-rw-r--r-- | clang/lib/AST/ASTDumper.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTDumper.cpp b/clang/lib/AST/ASTDumper.cpp index 92be6d95e89..22b71e3cf53 100644 --- a/clang/lib/AST/ASTDumper.cpp +++ b/clang/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<DeclStmt>(S)) { VisitDeclStmt(DS); return; } + if (const GenericSelectionExpr *GSE = dyn_cast<GenericSelectionExpr>(S)) { + VisitGenericSelectionExpr(GSE); + return; + } ConstStmtVisitor<ASTDumper>::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) { |