aboutsummaryrefslogtreecommitdiff
path: root/clang/include/clang/AST/ASTNodeTraverser.h
diff options
context:
space:
mode:
Diffstat (limited to 'clang/include/clang/AST/ASTNodeTraverser.h')
-rw-r--r--clang/include/clang/AST/ASTNodeTraverser.h35
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) {