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