njames93 created this revision. njames93 added reviewers: klimek, aaron.ballman, alexfh. njames93 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Some polymorphic matchers use dyn_cast in cases where we know the type from the TemplateParameter. Using type_traits we can remove the need for dyn_cast and let the template instantiation handle everything. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D102369 Files: clang/include/clang/ASTMatchers/ASTMatchers.h
Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -3167,8 +3167,9 @@ AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl), internal::Matcher<NamedDecl>, Base) { // Check if the node is a C++ struct/union/class. - if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node)) - return Finder->classIsDerivedFrom(RD, Base, Builder, /*Directly=*/false); + if (std::is_convertible<NodeType *, CXXRecordDecl *>::value) + return Finder->classIsDerivedFrom(cast<CXXRecordDecl>(&Node), Base, Builder, + /*Directly=*/false); // The node must be an Objective-C class. const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node); @@ -3186,8 +3187,9 @@ const auto M = isDerivedFrom(hasName(BaseName)); - if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node)) - return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder); + if (std::is_convertible<NodeType *, CXXRecordDecl *>::value) + return Matcher<CXXRecordDecl>(M).matches(cast<CXXRecordDecl>(Node), Finder, + Builder); const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node); return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder); @@ -3241,8 +3243,9 @@ internal::Matcher<NamedDecl>, Base, 0) { const auto M = anyOf(Base, isDerivedFrom(Base)); - if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node)) - return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder); + if (std::is_convertible<NodeType *, CXXRecordDecl *>::value) + return Matcher<CXXRecordDecl>(M).matches(cast<CXXRecordDecl>(Node), Finder, + Builder); const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node); return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder); @@ -3259,8 +3262,9 @@ const auto M = isSameOrDerivedFrom(hasName(BaseName)); - if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node)) - return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder); + if (std::is_convertible<NodeType *, CXXRecordDecl *>::value) + return Matcher<CXXRecordDecl>(M).matches(cast<CXXRecordDecl>(Node), Finder, + Builder); const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node); return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder); @@ -3292,8 +3296,9 @@ AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl), internal::Matcher<NamedDecl>, Base, 0) { // Check if the node is a C++ struct/union/class. - if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node)) - return Finder->classIsDerivedFrom(RD, Base, Builder, /*Directly=*/true); + if (std::is_convertible<NodeType *, CXXRecordDecl *>::value) + return Finder->classIsDerivedFrom(cast<CXXRecordDecl>(&Node), Base, Builder, + /*Directly=*/true); // The node must be an Objective-C class. const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node); @@ -3310,8 +3315,9 @@ return false; const auto M = isDirectlyDerivedFrom(hasName(BaseName)); - if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node)) - return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder); + if (std::is_convertible<NodeType *, CXXRecordDecl *>::value) + return Matcher<CXXRecordDecl>(M).matches(cast<CXXRecordDecl>(Node), Finder, + Builder); const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node); return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder); @@ -6179,12 +6185,14 @@ AST_POLYMORPHIC_SUPPORTED_TYPES(MemberExpr, UnresolvedMemberExpr, CXXDependentScopeMemberExpr), internal::Matcher<Expr>, InnerMatcher) { - if (const auto *E = dyn_cast<UnresolvedMemberExpr>(&Node)) - if (E->isImplicitAccess()) + if (std::is_convertible<NodeType *, UnresolvedMemberExpr *>::value) { + if (cast<UnresolvedMemberExpr>(&Node)->isImplicitAccess()) return false; - if (const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node)) - if (E->isImplicitAccess()) + } else if (std::is_convertible<NodeType *, + CXXDependentScopeMemberExpr *>::value) { + if (cast<CXXDependentScopeMemberExpr>(&Node)->isImplicitAccess()) return false; + } return InnerMatcher.matches(*Node.getBase(), Finder, Builder); } @@ -7345,10 +7353,10 @@ FunctionDecl)) { // This is required because the spelling of the function used to determine // whether inline is specified or not differs between the polymorphic types. - if (const auto *FD = dyn_cast<FunctionDecl>(&Node)) - return FD->isInlineSpecified(); - else if (const auto *NSD = dyn_cast<NamespaceDecl>(&Node)) - return NSD->isInline(); + if (std::is_convertible<NodeType *, FunctionDecl *>::value) + return cast<FunctionDecl>(&Node)->isInlineSpecified(); + else if (std::is_convertible<NodeType *, NamespaceDecl *>::value) + return cast<NamespaceDecl>(&Node)->isInline(); llvm_unreachable("Not a valid polymorphic type"); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits