[cfe-dev] ast_matchers::MatchFinder to CallExpr that's a macro call

Peeter Joot peeter.joot at gmail.com
Thu Apr 25 14:57:40 PDT 2013

With code like:

ast_matchers::MatchFinder Finder;
  CallRenamer gmblkCallCallback(&Tool.getReplacements(), "myfunc",
        callExpr( callee(functionDecl(hasName("myfunc")))).bind("myfunc"),

I'm able to match to a function call, such as:

int myfunc( void ** ppBlkPtr ) ;
void blah(void)
   int * r ;

   myfunc( (void **)&r ) ;

(I've also got a working version of the replacement callback that renames
such a call).

However, the declaration of "myfunc" is actually of the form:

int myfuncEx( void ** ppBlkPtr, int line ) ;

#define myfunc( x ) myfuncEx( (x), __LINE__ )

Such a call generates a different sort of AST structure:

    `-CallExpr 0x14963a0 <line:1468:21, col:45> 'int'
      |-ImplicitCastExpr 0x1496388 <col:21> 'int (*)(void **, int)'
      | `-DeclRefExpr 0x1496338 <col:21> 'int (void **, int)' lvalue
Function 0x1495b00 'myfuncEx' 'int (void **, int)'
      |-ParenExpr 0x14962f8 <col:31, col:33> 'void **'
      | `-CStyleCastExpr 0x14962d0 <line:1478:12, col:22> 'void **'
      |   `-UnaryOperator 0x1496298 <col:21, col:22> 'int **' prefix '&'
      |     `-DeclRefExpr 0x1496248 <col:22> 'int *' lvalue Var 0x1496180
'r' 'int *'
      `-IntegerLiteral 0x1496318 <<scratch space>:2:1> 'int' 1478

How can I match to such a "macro call" AST?

My final goal is to have my replacement callback to remove that (void **)
cast from all such parameters for this macro, so a better (but harder)
question is probably:

How do I match to the (void **) cast operation of parameter N of a macro
call named "myfunc"?

It's not clear to me that the AST even has this info (see how the AST dump
has lost the original macro origins, and has info only about the myfuncEx

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130425/b63bf86d/attachment.html>

More information about the cfe-dev mailing list