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

Reply via email to