With code like:
ast_matchers::MatchFinder Finder;
CallRenamer gmblkCallCallback(&Tool.getReplacements(), “myfunc”, “xxmyfunc”);
Finder.addMatcher(
callExpr( callee(functionDecl(hasName(“myfunc”)))).bind(“myfunc”),
&gmblkCallCallback);
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 <: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 function).