diff options
Diffstat (limited to 'lib/AST/ASTDumper.cpp')
-rw-r--r-- | lib/AST/ASTDumper.cpp | 60 |
1 files changed, 54 insertions, 6 deletions
diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp index 92be6d95e8989..f46ae58d192d4 100644 --- a/lib/AST/ASTDumper.cpp +++ b/lib/AST/ASTDumper.cpp @@ -521,10 +521,12 @@ namespace { // Exprs void VisitExpr(const Expr *Node); void VisitCastExpr(const CastExpr *Node); + void VisitImplicitCastExpr(const ImplicitCastExpr *Node); void VisitDeclRefExpr(const DeclRefExpr *Node); void VisitPredefinedExpr(const PredefinedExpr *Node); void VisitCharacterLiteral(const CharacterLiteral *Node); void VisitIntegerLiteral(const IntegerLiteral *Node); + void VisitFixedPointLiteral(const FixedPointLiteral *Node); void VisitFloatingLiteral(const FloatingLiteral *Node); void VisitStringLiteral(const StringLiteral *Str); void VisitInitListExpr(const InitListExpr *ILE); @@ -539,6 +541,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); @@ -808,11 +811,10 @@ void ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) { bool HasUndeserializedLookups = Primary->hasExternalVisibleStorage(); - for (auto I = Deserialize ? Primary->lookups_begin() - : Primary->noload_lookups_begin(), - E = Deserialize ? Primary->lookups_end() - : Primary->noload_lookups_end(); - I != E; ++I) { + auto Range = Deserialize + ? Primary->lookups() + : Primary->noload_lookups(/*PreserveInternalState=*/true); + for (auto I = Range.begin(), E = Range.end(); I != E; ++I) { DeclarationName Name = I.getLookupName(); DeclContextLookupResult R = *I; @@ -1602,7 +1604,7 @@ void ASTDumper::VisitClassTemplatePartialSpecializationDecl( void ASTDumper::VisitClassScopeFunctionSpecializationDecl( const ClassScopeFunctionSpecializationDecl *D) { - dumpDeclRef(D->getSpecialization()); + dumpDecl(D->getSpecialization()); if (D->hasExplicitTemplateArgs()) dumpTemplateArgumentListInfo(D->templateArgs()); } @@ -1946,10 +1948,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); @@ -2113,6 +2120,12 @@ void ASTDumper::VisitCastExpr(const CastExpr *Node) { OS << ">"; } +void ASTDumper::VisitImplicitCastExpr(const ImplicitCastExpr *Node) { + VisitCastExpr(Node); + if (Node->isPartOfExplicitCast()) + OS << " part_of_explicit_cast"; +} + void ASTDumper::VisitDeclRefExpr(const DeclRefExpr *Node) { VisitExpr(Node); @@ -2172,6 +2185,13 @@ void ASTDumper::VisitIntegerLiteral(const IntegerLiteral *Node) { OS << " " << Node->getValue().toString(10, isSigned); } +void ASTDumper::VisitFixedPointLiteral(const FixedPointLiteral *Node) { + VisitExpr(Node); + + ColorScope Color(*this, ValueColor); + OS << " " << Node->getValueAsString(/*Radix=*/10); +} + void ASTDumper::VisitFloatingLiteral(const FloatingLiteral *Node) { VisitExpr(Node); ColorScope Color(*this, ValueColor); @@ -2211,6 +2231,8 @@ void ASTDumper::VisitUnaryOperator(const UnaryOperator *Node) { VisitExpr(Node); OS << " " << (Node->isPostfix() ? "postfix" : "prefix") << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; + if (!Node->canOverflow()) + OS << " cannot overflow"; } void ASTDumper::VisitUnaryExprOrTypeTraitExpr( @@ -2272,6 +2294,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) { |