mgrang added a comment.

In https://reviews.llvm.org/D50488#1207398, @Szelethus wrote:

> In https://reviews.llvm.org/D50488#1204655, @mgrang wrote:
>
> > This is my first time with ASTMatchers and I am not sure how to get the 
> > value_type from hasType (I don't see a matcher for value_types in 
> > ASTMatchers.h). Would I end up using a visitor for that? If yes, then maybe 
> > the entire check for pointer types needs to be done via visitors? Sorry for 
> > the newbie questions :)
>
>
> I played around for a bit, my `clang-query` is a little out of date, but 
> here's what I found: You can match `typedef`s with `typedefDecl()`, and 
> `using` by `typeAliasDecl()`, and then add `hasName("value_type")` as a 
> parameter. As to how to check whether a type has any of these, I'm a little 
> unsure myself, but you could use `hasDescendant`, and narrow down the matches.
>
> I'm not sure whether this checks inherited type declarations, and it sure 
> doesn't check template specializations of `std::iterator_traits`, but it is a 
> good start :) I'll revisit this when I have a little more time on my hand.


I played around a lot with clang-query in the past week but I haven't been able 
to match typedefDecl with hasName("value_type"). Here are some matchers I tried:

  match callExpr(allOf (callee(functionDecl(hasName("std::sort"))), 
hasArgument(0,          
stmt(hasDescendant(expr(hasType(typedefType(hasDeclaration(typedefNameDecl(hasName("value_type")))))))))))
  
  match callExpr(allOf (callee(functionDecl(hasName("std::sort"))), 
hasArgument(0,            
hasDescendant(expr(hasType(typedefType(hasDeclaration(typedefDecl(matchesName(".*value.*"))))))))))
  
  match callExpr(allOf (callee(functionDecl(hasName("std::sort"))), 
hasArgument(0,            
hasDescendant(declRefExpr(to(fieldDecl(hasName("value_type"))))))))))

Here's the AST dump for the IntPointerArray example:

  FunctionDecl 0x639e958 <../../tst/s.cpp:5:1, line:10:1> line:5:5 main 'int ()'
  `-CompoundStmt 0x639f1d0 <col:12, line:10:1>
    |-DeclStmt 0x639ead0 <line:6:3, col:27>
    | `-VarDecl 0x639ea70 <col:3, col:26> col:8 used IntPointerArray 'int *[20]'
    |-CallExpr 0x639ebd0 <line:7:3, col:23> 'void'
    | |-ImplicitCastExpr 0x639ebb8 <col:3> 'void (*)(int **)' 
<FunctionToPointerDecay>
    | | `-DeclRefExpr 0x639eb68 <col:3> 'void (int **)' lvalue Function 
0x639e890 'fill' 'void (int **)'
    | `-ImplicitCastExpr 0x639ec00 <col:8> 'int **' <ArrayToPointerDecay>
    |   `-DeclRefExpr 0x639eb40 <col:8> 'int *[20]' lvalue Var 0x639ea70 
'IntPointerArray' 'int *[20]'
    `-CallExpr 0x639f180 <line:9:3, col:50> 'void'
  |-ImplicitCastExpr 0x639f168 <col:3, col:8> 'void (*)(int **, int **)' 
<FunctionToPointerDecay>
      | `-DeclRefExpr 0x639f0d0 <col:3, col:8> 'void (int **, int **)' lvalue 
Function 0x639efd0 'sort' 'void (int **, int **)' (FunctionTemplate 0x638dd18 
'sort')
      |-ImplicitCastExpr 0x639f1b8 <col:13> 'int **' <ArrayToPointerDecay>
      | `-DeclRefExpr 0x639ec98 <col:13> 'int *[20]' lvalue Var 0x639ea70 
'IntPointerArray' 'int *[20]'
      `-BinaryOperator 0x639ed20 <col:30, col:48> 'int **' '+'
        |-ImplicitCastExpr 0x639ed08 <col:30> 'int **' <ArrayToPointerDecay>
        | `-DeclRefExpr 0x639ecc0 <col:30> 'int *[20]' lvalue Var 0x639ea70 
'IntPointerArray' 'int *[20]'
        `-IntegerLiteral 0x639ece8 <col:48> 'int' 20


Repository:
  rC Clang

https://reviews.llvm.org/D50488



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to