diff options
Diffstat (limited to 'contrib/llvm-project/clang/include/clang/AST/ASTNodeTraverser.h')
-rw-r--r-- | contrib/llvm-project/clang/include/clang/AST/ASTNodeTraverser.h | 100 |
1 files changed, 84 insertions, 16 deletions
diff --git a/contrib/llvm-project/clang/include/clang/AST/ASTNodeTraverser.h b/contrib/llvm-project/clang/include/clang/AST/ASTNodeTraverser.h index bb5b0c73f028..cc8dab97f8b0 100644 --- a/contrib/llvm-project/clang/include/clang/AST/ASTNodeTraverser.h +++ b/contrib/llvm-project/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); }; */ @@ -103,7 +104,7 @@ public: Visit(Comment, Comment); // Decls within functions are visited by the body. - if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D)) { + if (!isa<FunctionDecl, ObjCMethodDecl, BlockDecl>(*D)) { if (Traversal != TK_AsIs) { if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) { auto SK = CTSD->getSpecializationKind(); @@ -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,32 @@ 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->hasInvalidConstraint()) + Visit(NR->getConstraintExpr()); + } + }); + } + + void Visit(const ConceptReference *R) { + getNodeDelegate().AddChild([=] { getNodeDelegate().Visit(R); }); + } + void Visit(const APValue &Value, QualType Ty) { getNodeDelegate().AddChild([=] { getNodeDelegate().Visit(Value, Ty); }); } @@ -264,6 +292,8 @@ public: Visit(C); else if (const auto *T = N.get<TemplateArgument>()) Visit(*T); + else if (const auto *CR = N.get<ConceptReference>()) + Visit(CR); } void dumpDeclContext(const DeclContext *DC) { @@ -360,18 +390,19 @@ public: } void VisitAttributedType(const AttributedType *T) { // FIXME: AttrKind - Visit(T->getModifiedType()); + if (T->getModifiedType() != T->getEquivalentType()) + Visit(T->getModifiedType()); } - void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) { - Visit(T->getReplacedParameter()); + void VisitBTFTagAttributedType(const BTFTagAttributedType *T) { + Visit(T->getWrappedType()); } + void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *) {} void VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType *T) { - Visit(T->getReplacedParameter()); Visit(T->getArgumentPack()); } void VisitTemplateSpecializationType(const TemplateSpecializationType *T) { - for (const auto &Arg : *T) + for (const auto &Arg : T->template_arguments()) Visit(Arg); } void VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { @@ -395,8 +426,12 @@ public: } void VisitFunctionDecl(const FunctionDecl *D) { - if (const auto *FTSI = D->getTemplateSpecializationInfo()) + if (FunctionTemplateSpecializationInfo *FTSI = + D->getTemplateSpecializationInfo()) dumpTemplateArgumentList(*FTSI->TemplateArguments); + else if (DependentFunctionTemplateSpecializationInfo *DFTSI = + D->getDependentSpecializationInfo()) + dumpASTTemplateArgumentListInfo(DFTSI->TemplateArgumentsAsWritten); if (D->param_begin()) for (const auto *Parameter : D->parameters()) @@ -438,6 +473,12 @@ public: } void VisitBindingDecl(const BindingDecl *D) { + if (Traversal == TK_IgnoreUnlessSpelledInSource) + return; + + if (const auto *V = D->getHoldingVar()) + Visit(V); + if (const auto *E = D->getBinding()) Visit(E); } @@ -446,6 +487,8 @@ public: Visit(D->getAsmString()); } + void VisitTopLevelStmtDecl(const TopLevelStmtDecl *D) { Visit(D->getStmt()); } + void VisitCapturedDecl(const CapturedDecl *D) { Visit(D->getBody()); } void VisitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) { @@ -539,11 +582,6 @@ public: dumpTemplateParameters(D->getTemplateParameters()); } - void VisitClassScopeFunctionSpecializationDecl( - const ClassScopeFunctionSpecializationDecl *D) { - Visit(D->getSpecialization()); - dumpASTTemplateArgumentListInfo(D->getTemplateArgsAsWritten()); - } void VisitVarTemplateDecl(const VarTemplateDecl *D) { dumpTemplateDecl(D); } void VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D) { @@ -593,7 +631,14 @@ public: Visit(D->getConstraintExpr()); } + void VisitImplicitConceptSpecializationDecl( + const ImplicitConceptSpecializationDecl *CSD) { + for (const TemplateArgument &Arg : CSD->getTemplateArguments()) + Visit(Arg); + } + void VisitConceptSpecializationExpr(const ConceptSpecializationExpr *CSE) { + Visit(CSE->getSpecializationDecl()); if (CSE->hasExplicitTemplateArgs()) for (const auto &ArgLoc : CSE->getTemplateArgsAsWritten()->arguments()) dumpTemplateArgumentLoc(ArgLoc); @@ -605,8 +650,15 @@ public: } void VisitFriendDecl(const FriendDecl *D) { - if (!D->getFriendType()) + if (D->getFriendType()) { + // Traverse any CXXRecordDecl owned by this type, since + // it will not be in the parent context: + if (auto *ET = D->getFriendType()->getType()->getAs<ElaboratedType>()) + if (auto *TD = ET->getOwnedTagDecl()) + Visit(TD); + } else { Visit(D->getFriendDecl()); + } } void VisitObjCMethodDecl(const ObjCMethodDecl *D) { @@ -671,6 +723,12 @@ public: } } + void VisitCXXParenListInitExpr(const CXXParenListInitExpr *PLIE) { + if (auto *Filler = PLIE->getArrayFiller()) { + Visit(Filler, "array_filler"); + } + } + void VisitBlockExpr(const BlockExpr *Node) { Visit(Node->getBlockDecl()); } void VisitOpaqueValueExpr(const OpaqueValueExpr *Node) { @@ -679,14 +737,24 @@ public: } void VisitGenericSelectionExpr(const GenericSelectionExpr *E) { - Visit(E->getControllingExpr()); - Visit(E->getControllingExpr()->getType()); // FIXME: remove + if (E->isExprPredicate()) { + Visit(E->getControllingExpr()); + Visit(E->getControllingExpr()->getType()); // FIXME: remove + } else + Visit(E->getControllingType()->getType()); for (const auto Assoc : E->associations()) { Visit(Assoc); } } + 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) { |