diff options
Diffstat (limited to 'clang/lib/AST/StmtPrinter.cpp')
-rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 200 |
1 files changed, 142 insertions, 58 deletions
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index c14bb886bb11..f797f5fe8e6d 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -75,14 +75,11 @@ namespace { public: StmtPrinter(raw_ostream &os, PrinterHelper *helper, const PrintingPolicy &Policy, unsigned Indentation = 0, - StringRef NL = "\n", - const ASTContext *Context = nullptr) + StringRef NL = "\n", const ASTContext *Context = nullptr) : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy), NL(NL), Context(Context) {} - void PrintStmt(Stmt *S) { - PrintStmt(S, Policy.Indentation); - } + void PrintStmt(Stmt *S) { PrintStmt(S, Policy.Indentation); } void PrintStmt(Stmt *S, int SubIndent) { IndentLevel += SubIndent; @@ -756,6 +753,16 @@ void StmtPrinter::VisitOMPFlushDirective(OMPFlushDirective *Node) { PrintOMPExecutableDirective(Node); } +void StmtPrinter::VisitOMPDepobjDirective(OMPDepobjDirective *Node) { + Indent() << "#pragma omp depobj"; + PrintOMPExecutableDirective(Node); +} + +void StmtPrinter::VisitOMPScanDirective(OMPScanDirective *Node) { + Indent() << "#pragma omp scan"; + PrintOMPExecutableDirective(Node); +} + void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) { Indent() << "#pragma omp ordered"; PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>()); @@ -1274,29 +1281,20 @@ void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) { OS << ")"; } -void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){ - switch(Node->getKind()) { - case UETT_SizeOf: - OS << "sizeof"; - break; - case UETT_AlignOf: +void StmtPrinter::VisitUnaryExprOrTypeTraitExpr( + UnaryExprOrTypeTraitExpr *Node) { + const char *Spelling = getTraitSpelling(Node->getKind()); + if (Node->getKind() == UETT_AlignOf) { if (Policy.Alignof) - OS << "alignof"; + Spelling = "alignof"; else if (Policy.UnderscoreAlignof) - OS << "_Alignof"; + Spelling = "_Alignof"; else - OS << "__alignof"; - break; - case UETT_PreferredAlignOf: - OS << "__alignof"; - break; - case UETT_VecStep: - OS << "vec_step"; - break; - case UETT_OpenMPRequiredSimdAlign: - OS << "__builtin_omp_required_simd_align"; - break; + Spelling = "__alignof"; } + + OS << Spelling; + if (Node->isArgumentType()) { OS << '('; Node->getArgumentType().print(OS, Policy); @@ -1330,19 +1328,65 @@ void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { OS << "]"; } +void StmtPrinter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *Node) { + PrintExpr(Node->getBase()); + OS << "["; + PrintExpr(Node->getRowIdx()); + OS << "]"; + OS << "["; + PrintExpr(Node->getColumnIdx()); + OS << "]"; +} + void StmtPrinter::VisitOMPArraySectionExpr(OMPArraySectionExpr *Node) { PrintExpr(Node->getBase()); OS << "["; if (Node->getLowerBound()) PrintExpr(Node->getLowerBound()); - if (Node->getColonLoc().isValid()) { + if (Node->getColonLocFirst().isValid()) { OS << ":"; if (Node->getLength()) PrintExpr(Node->getLength()); } + if (Node->getColonLocSecond().isValid()) { + OS << ":"; + if (Node->getStride()) + PrintExpr(Node->getStride()); + } OS << "]"; } +void StmtPrinter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *Node) { + OS << "("; + for (Expr *E : Node->getDimensions()) { + OS << "["; + PrintExpr(E); + OS << "]"; + } + OS << ")"; + PrintExpr(Node->getBase()); +} + +void StmtPrinter::VisitOMPIteratorExpr(OMPIteratorExpr *Node) { + OS << "iterator("; + for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) { + auto *VD = cast<ValueDecl>(Node->getIteratorDecl(I)); + VD->getType().print(OS, Policy); + const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I); + OS << " " << VD->getName() << " = "; + PrintExpr(Range.Begin); + OS << ":"; + PrintExpr(Range.End); + if (Range.Step) { + OS << ":"; + PrintExpr(Range.Step); + } + if (I < E - 1) + OS << ", "; + } + OS << ")"; +} + void StmtPrinter::PrintCallArgs(CallExpr *Call) { for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { @@ -1750,6 +1794,10 @@ void StmtPrinter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *Node) { OS << ")"; } +void StmtPrinter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *Node) { + VisitCXXNamedCastExpr(Node); +} + void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { OS << "typeid("; if (Node->isTypeOperand()) { @@ -2008,7 +2056,7 @@ void StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) { if (Policy.TerseOutput) OS << "{}"; else - PrintRawCompoundStmt(Node->getBody()); + PrintRawCompoundStmt(Node->getCompoundStmtBody()); } void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) { @@ -2160,37 +2208,8 @@ void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) { printTemplateArgumentList(OS, Node->template_arguments(), Policy); } -static const char *getTypeTraitName(TypeTrait TT) { - switch (TT) { -#define TYPE_TRAIT_1(Spelling, Name, Key) \ -case clang::UTT_##Name: return #Spelling; -#define TYPE_TRAIT_2(Spelling, Name, Key) \ -case clang::BTT_##Name: return #Spelling; -#define TYPE_TRAIT_N(Spelling, Name, Key) \ - case clang::TT_##Name: return #Spelling; -#include "clang/Basic/TokenKinds.def" - } - llvm_unreachable("Type trait not covered by switch"); -} - -static const char *getTypeTraitName(ArrayTypeTrait ATT) { - switch (ATT) { - case ATT_ArrayRank: return "__array_rank"; - case ATT_ArrayExtent: return "__array_extent"; - } - llvm_unreachable("Array type trait not covered by switch"); -} - -static const char *getExpressionTraitName(ExpressionTrait ET) { - switch (ET) { - case ET_IsLValueExpr: return "__is_lvalue_expr"; - case ET_IsRValueExpr: return "__is_rvalue_expr"; - } - llvm_unreachable("Expression type trait not covered by switch"); -} - void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) { - OS << getTypeTraitName(E->getTrait()) << "("; + OS << getTraitSpelling(E->getTrait()) << "("; for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { if (I > 0) OS << ", "; @@ -2200,13 +2219,13 @@ void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) { } void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { - OS << getTypeTraitName(E->getTrait()) << '('; + OS << getTraitSpelling(E->getTrait()) << '('; E->getQueriedType().print(OS, Policy); OS << ')'; } void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { - OS << getExpressionTraitName(E->getTrait()) << '('; + OS << getTraitSpelling(E->getTrait()) << '('; PrintExpr(E->getQueriedExpression()); OS << ')'; } @@ -2269,6 +2288,60 @@ void StmtPrinter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) { Policy); } +void StmtPrinter::VisitRequiresExpr(RequiresExpr *E) { + OS << "requires "; + auto LocalParameters = E->getLocalParameters(); + if (!LocalParameters.empty()) { + OS << "("; + for (ParmVarDecl *LocalParam : LocalParameters) { + PrintRawDecl(LocalParam); + if (LocalParam != LocalParameters.back()) + OS << ", "; + } + + OS << ") "; + } + OS << "{ "; + auto Requirements = E->getRequirements(); + for (concepts::Requirement *Req : Requirements) { + if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) { + if (TypeReq->isSubstitutionFailure()) + OS << "<<error-type>>"; + else + TypeReq->getType()->getType().print(OS, Policy); + } else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) { + if (ExprReq->isCompound()) + OS << "{ "; + if (ExprReq->isExprSubstitutionFailure()) + OS << "<<error-expression>>"; + else + PrintExpr(ExprReq->getExpr()); + if (ExprReq->isCompound()) { + OS << " }"; + if (ExprReq->getNoexceptLoc().isValid()) + OS << " noexcept"; + const auto &RetReq = ExprReq->getReturnTypeRequirement(); + if (!RetReq.isEmpty()) { + OS << " -> "; + if (RetReq.isSubstitutionFailure()) + OS << "<<error-type>>"; + else if (RetReq.isTypeConstraint()) + RetReq.getTypeConstraint()->print(OS, Policy); + } + } + } else { + auto *NestedReq = cast<concepts::NestedRequirement>(Req); + OS << "requires "; + if (NestedReq->isSubstitutionFailure()) + OS << "<<error-expression>>"; + else + PrintExpr(NestedReq->getConstraintExpr()); + } + OS << "; "; + } + OS << "}"; +} + // C++ Coroutines TS void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) { @@ -2445,6 +2518,17 @@ void StmtPrinter::VisitTypoExpr(TypoExpr *Node) { llvm_unreachable("Cannot print TypoExpr nodes"); } +void StmtPrinter::VisitRecoveryExpr(RecoveryExpr *Node) { + OS << "<recovery-expr>("; + const char *Sep = ""; + for (Expr *E : Node->subExpressions()) { + OS << Sep; + PrintExpr(E); + Sep = ", "; + } + OS << ')'; +} + void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) { OS << "__builtin_astype("; PrintExpr(Node->getSrcExpr()); |