Author: sbenza
Date: Thu Jun  5 09:47:08 2014
New Revision: 210269

URL: http://llvm.org/viewvc/llvm-project?rev=210269&view=rev
Log:
Fix equalsNode() to accept pointers to derived types.

Summary:
Move the 'const' in the AST_*MATCHER_P* macros to the right of ParamType to
avoiad applying the constness on the wrong level when ParamType is a pointer.
Change equalsNode() to explicitly accept 'const Decl*' or 'const Stmt*'.

Reviewers: klimek

Subscribers: klimek, cfe-commits

Differential Revision: http://reviews.llvm.org/D3994

Modified:
    cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
    cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
    cfe/trunk/include/clang/ASTMatchers/ASTMatchersMacros.h

Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=210269&r1=210268&r2=210269&view=diff
==============================================================================
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Thu Jun  5 09:47:08 2014
@@ -3504,15 +3504,15 @@ AST_MATCHER_P(NestedNameSpecifier, speci
 /// \brief Matches if a node equals another node.
 ///
 /// \c Decl has pointer identity in the AST.
-inline internal::Matcher<Decl> equalsNode(const Decl *Node) {
-  return internal::makeMatcher(new internal::EqualsNodeMatcher<Decl>(Node));
+AST_MATCHER_P_OVERLOAD(Decl, equalsNode, const Decl*, Other, 0) {
+  return &Node == Other;
 }
 /// \brief Matches if a node equals another node.
 ///
 /// \c Stmt has pointer identity in the AST.
 ///
-inline internal::Matcher<Stmt> equalsNode(const Stmt *Node) {
-  return internal::makeMatcher(new internal::EqualsNodeMatcher<Stmt>(Node));
+AST_MATCHER_P_OVERLOAD(Stmt, equalsNode, const Stmt*, Other, 1) {
+  return &Node == Other;
 }
 
 /// @}

Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=210269&r1=210268&r2=210269&view=diff
==============================================================================
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h (original)
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Thu Jun  5 
09:47:08 2014
@@ -1387,20 +1387,6 @@ private:
   const ValueT ExpectedValue;
 };
 
-template <typename T>
-class EqualsNodeMatcher : public SingleNodeMatcherInterface<T> {
-public:
-  explicit EqualsNodeMatcher(const T *ExpectedNode)
-      : ExpectedNode(ExpectedNode) {}
-
-  bool matchesNode(const T &Node) const override {
-    return &Node == ExpectedNode;
-  }
-
-private:
-  const T *ExpectedNode;
-};
-
 /// \brief A VariadicDynCastAllOfMatcher<SourceT, TargetT> object is a
 /// variadic functor that takes a number of Matcher<TargetT> and returns a
 /// Matcher<SourceT> that matches TargetT nodes that are matched by all of the

Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersMacros.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersMacros.h?rev=210269&r1=210268&r2=210269&view=diff
==============================================================================
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchersMacros.h (original)
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersMacros.h Thu Jun  5 09:47:08 
2014
@@ -52,9 +52,9 @@
                                   0)
 #define AST_MATCHER_FUNCTION_P_OVERLOAD(ReturnType, DefineMatcher, ParamType,  
\
                                         Param, OverloadId)                     
\
-  inline ReturnType DefineMatcher(const ParamType &Param);                     
\
-  typedef ReturnType (&DefineMatcher##_Type##OverloadId)(const ParamType &);   
\
-  inline ReturnType DefineMatcher(const ParamType &Param)
+  inline ReturnType DefineMatcher(ParamType const &Param);                     
\
+  typedef ReturnType (&DefineMatcher##_Type##OverloadId)(ParamType const &);   
\
+  inline ReturnType DefineMatcher(ParamType const &Param)
 
 /// \brief AST_MATCHER(Type, DefineMatcher) { ... }
 /// defines a zero parameter function named DefineMatcher() that returns a
@@ -107,21 +107,21 @@
       : public MatcherInterface<Type> {                                        
\
   public:                                                                      
\
     explicit matcher_##DefineMatcher##OverloadId##Matcher(                     
\
-        const ParamType &A##Param)                                             
\
+        ParamType const &A##Param)                                             
\
         : Param(A##Param) {}                                                   
\
     bool matches(const Type &Node, ASTMatchFinder *Finder,                     
\
                  BoundNodesTreeBuilder *Builder) const override;               
\
                                                                                
\
   private:                                                                     
\
-    const ParamType Param;                                                     
\
+    ParamType const Param;                                                     
\
   };                                                                           
\
   }                                                                            
\
-  inline internal::Matcher<Type> DefineMatcher(const ParamType &Param) {       
\
+  inline internal::Matcher<Type> DefineMatcher(ParamType const &Param) {       
\
     return internal::makeMatcher(                                              
\
         new internal::matcher_##DefineMatcher##OverloadId##Matcher(Param));    
\
   }                                                                            
\
   typedef internal::Matcher<Type>(&DefineMatcher##_Type##OverloadId)(          
\
-      const ParamType &Param);                                                 
\
+      ParamType const &Param);                                                 
\
   inline bool internal::matcher_##DefineMatcher##OverloadId##Matcher::matches( 
\
       const Type &Node, ASTMatchFinder *Finder,                                
\
       BoundNodesTreeBuilder *Builder) const
@@ -151,25 +151,25 @@
   class matcher_##DefineMatcher##OverloadId##Matcher                           
\
       : public MatcherInterface<Type> {                                        
\
   public:                                                                      
\
-    matcher_##DefineMatcher##OverloadId##Matcher(const ParamType1 &A##Param1,  
\
-                                                 const ParamType2 &A##Param2)  
\
+    matcher_##DefineMatcher##OverloadId##Matcher(ParamType1 const &A##Param1,  
\
+                                                 ParamType2 const &A##Param2)  
\
         : Param1(A##Param1), Param2(A##Param2) {}                              
\
     bool matches(const Type &Node, ASTMatchFinder *Finder,                     
\
                  BoundNodesTreeBuilder *Builder) const override;               
\
                                                                                
\
   private:                                                                     
\
-    const ParamType1 Param1;                                                   
\
-    const ParamType2 Param2;                                                   
\
+    ParamType1 const Param1;                                                   
\
+    ParamType2 const Param2;                                                   
\
   };                                                                           
\
   }                                                                            
\
-  inline internal::Matcher<Type> DefineMatcher(const ParamType1 &Param1,       
\
-                                               const ParamType2 &Param2) {     
\
+  inline internal::Matcher<Type> DefineMatcher(ParamType1 const &Param1,       
\
+                                               ParamType2 const &Param2) {     
\
     return internal::makeMatcher(                                              
\
         new internal::matcher_##DefineMatcher##OverloadId##Matcher(Param1,     
\
                                                                    Param2));   
\
   }                                                                            
\
   typedef internal::Matcher<Type>(&DefineMatcher##_Type##OverloadId)(          
\
-      const ParamType1 &Param1, const ParamType2 &Param2);                     
\
+      ParamType1 const &Param1, ParamType2 const &Param2);                     
\
   inline bool internal::matcher_##DefineMatcher##OverloadId##Matcher::matches( 
\
       const Type &Node, ASTMatchFinder *Finder,                                
\
       BoundNodesTreeBuilder *Builder) const
@@ -240,18 +240,18 @@
       : public MatcherInterface<NodeType> {                                    
\
   public:                                                                      
\
     explicit matcher_##DefineMatcher##OverloadId##Matcher(                     
\
-        const ParamType &A##Param)                                             
\
+        ParamType const &A##Param)                                             
\
         : Param(A##Param) {}                                                   
\
     bool matches(const NodeType &Node, ASTMatchFinder *Finder,                 
\
                  BoundNodesTreeBuilder *Builder) const override;               
\
                                                                                
\
   private:                                                                     
\
-    const ParamType Param;                                                     
\
+    ParamType const Param;                                                     
\
   };                                                                           
\
   }                                                                            
\
   inline internal::PolymorphicMatcherWithParam1<                               
\
       internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType,       
\
-      ReturnTypesF> DefineMatcher(const ParamType &Param) {                    
\
+      ReturnTypesF> DefineMatcher(ParamType const &Param) {                    
\
     return internal::PolymorphicMatcherWithParam1<                             
\
         internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType,     
\
         ReturnTypesF>(Param);                                                  
\
@@ -259,7 +259,7 @@
   typedef internal::PolymorphicMatcherWithParam1<                              
\
       internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType,       
\
       ReturnTypesF>(&DefineMatcher##_Type##OverloadId)(                        
\
-      const ParamType &Param);                                                 
\
+      ParamType const &Param);                                                 
\
   template <typename NodeType, typename ParamT>                                
\
   bool internal::matcher_##DefineMatcher##OverloadId##Matcher<                 
\
       NodeType, ParamT>::matches(const NodeType &Node, ASTMatchFinder *Finder, 
\
@@ -286,21 +286,21 @@
   class matcher_##DefineMatcher##OverloadId##Matcher                           
\
       : public MatcherInterface<NodeType> {                                    
\
   public:                                                                      
\
-    matcher_##DefineMatcher##OverloadId##Matcher(const ParamType1 &A##Param1,  
\
-                                                 const ParamType2 &A##Param2)  
\
+    matcher_##DefineMatcher##OverloadId##Matcher(ParamType1 const &A##Param1,  
\
+                                                 ParamType2 const &A##Param2)  
\
         : Param1(A##Param1), Param2(A##Param2) {}                              
\
      bool matches(const NodeType &Node, ASTMatchFinder *Finder,                
\
                   BoundNodesTreeBuilder *Builder) const override;              
\
                                                                                
\
   private:                                                                     
\
-    const ParamType1 Param1;                                                   
\
-    const ParamType2 Param2;                                                   
\
+    ParamType1 const Param1;                                                   
\
+    ParamType2 const Param2;                                                   
\
   };                                                                           
\
   }                                                                            
\
   inline internal::PolymorphicMatcherWithParam2<                               
\
       internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType1,      
\
-      ParamType2, ReturnTypesF> DefineMatcher(const ParamType1 &Param1,        
\
-                                              const ParamType2 &Param2) {      
\
+      ParamType2, ReturnTypesF> DefineMatcher(ParamType1 const &Param1,        
\
+                                              ParamType2 const &Param2) {      
\
     return internal::PolymorphicMatcherWithParam2<                             
\
         internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType1,    
\
         ParamType2, ReturnTypesF>(Param1, Param2);                             
\
@@ -308,7 +308,7 @@
   typedef internal::PolymorphicMatcherWithParam2<                              
\
       internal::matcher_##DefineMatcher##OverloadId##Matcher, ParamType1,      
\
       ParamType2, ReturnTypesF>(&DefineMatcher##_Type##OverloadId)(            
\
-      const ParamType1 &Param1, const ParamType2 &Param2);                     
\
+      ParamType1 const &Param1, ParamType2 const &Param2);                     
\
   template <typename NodeType, typename ParamT1, typename ParamT2>             
\
   bool internal::matcher_##DefineMatcher##OverloadId##Matcher<                 
\
       NodeType, ParamT1, ParamT2>::matches(                                    
\


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to