diff options
Diffstat (limited to 'clang/include/clang/AST/ASTNodeTraverser.h')
-rw-r--r-- | clang/include/clang/AST/ASTNodeTraverser.h | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h index bb5b0c73f028..18e7f491f222 100644 --- a/clang/include/clang/AST/ASTNodeTraverser.h +++ b/clang/include/clang/AST/ASTNodeTraverser.h @@ -53,6 +53,7 @@ struct { void Visit(const OMPClause *C); void Visit(const BlockDecl::Capture &C); void Visit(const GenericSelectionExpr::ConstAssociation &A); + void Visit(const concepts::Requirement *R); void Visit(const APValue &Value, QualType Ty); }; */ @@ -141,7 +142,8 @@ public: ConstStmtVisitor<Derived>::Visit(S); // Some statements have custom mechanisms for dumping their children. - if (isa<DeclStmt>(S) || isa<GenericSelectionExpr>(S)) + if (isa<DeclStmt>(S) || isa<GenericSelectionExpr>(S) || + isa<RequiresExpr>(S)) return; if (Traversal == TK_IgnoreUnlessSpelledInSource && @@ -228,6 +230,28 @@ public: }); } + void Visit(const concepts::Requirement *R) { + getNodeDelegate().AddChild([=] { + getNodeDelegate().Visit(R); + if (!R) + return; + if (auto *TR = dyn_cast<concepts::TypeRequirement>(R)) { + if (!TR->isSubstitutionFailure()) + Visit(TR->getType()->getType().getTypePtr()); + } else if (auto *ER = dyn_cast<concepts::ExprRequirement>(R)) { + if (!ER->isExprSubstitutionFailure()) + Visit(ER->getExpr()); + if (!ER->getReturnTypeRequirement().isEmpty()) + Visit(ER->getReturnTypeRequirement() + .getTypeConstraint() + ->getImmediatelyDeclaredConstraint()); + } else if (auto *NR = dyn_cast<concepts::NestedRequirement>(R)) { + if (!NR->isSubstitutionFailure()) + Visit(NR->getConstraintExpr()); + } + }); + } + void Visit(const APValue &Value, QualType Ty) { getNodeDelegate().AddChild([=] { getNodeDelegate().Visit(Value, Ty); }); } @@ -438,6 +462,8 @@ public: } void VisitBindingDecl(const BindingDecl *D) { + if (Traversal == TK_IgnoreUnlessSpelledInSource) + return; if (const auto *E = D->getBinding()) Visit(E); } @@ -687,6 +713,13 @@ public: } } + void VisitRequiresExpr(const RequiresExpr *E) { + for (auto *D : E->getLocalParameters()) + Visit(D); + for (auto *R : E->getRequirements()) + Visit(R); + } + void VisitLambdaExpr(const LambdaExpr *Node) { if (Traversal == TK_IgnoreUnlessSpelledInSource) { for (unsigned I = 0, N = Node->capture_size(); I != N; ++I) { |