<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
<p>Hello I have implemented an AST visitor which is working quite good and it can print me on the console the information I want from the AST such as variable declarations, function declarations and function calls. Today while I was experimenting I came across
 a function call which is not recognized as a function call. syntacticaly is the same as a function call. Here is the code:</p>
<p><br>
</p>
<p></p>
<div>void  //this is a part of the tiff library for linux. its in the source file tif_error.c in libtiff directory</div>
<div>TIFFError(const char* module, const char* fmt, ...)</div>
<div>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>va_list ap;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>va_start(ap, fmt);    <------------------------------ THIS IS THE FUNCTION CALL</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (_TIFFerrorHandler)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>(*_TIFFerrorHandler)(module, fmt, ap);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (_TIFFerrorHandlerExt)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>(*_TIFFerrorHandlerExt)(0, module, fmt, ap);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>va_end(ap);            <--------------------------------AND THIS ONE</div>
<div>}</div>
<br>
<p></p>
<p>My code of the ASTvisitor is this:</p>
<p><br>
</p>
<p></p>
<div> bool VisitStmt(Stmt *st)</div>
<div>    {</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>FullSourceLoc FullLocation = astContext->getFullLoc(st->getLocStart());</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>FileID fileID = FullLocation.getFileID();</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>unsigned int thisFileID = fileID.getHashValue();</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>if(thisFileID == 1) //checks if the node is in the main = input file.</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>if (CallExpr *call = dyn_cast<CallExpr>(st))</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>numFuncCalls++;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>//call->dump(); //prints the corresponding line of the AST.</div>
<div> <span class="Apple-tab-span" style="white-space:pre"> </span>FunctionDecl *func_decl;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(call->getDirectCallee())</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>func_decl = call ->getDirectCallee();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>string funcCall = func_decl->getNameInfo().getName().getAsString();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>cout << "Function call: " << funcCall << " with arguments ";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>APIs << funcCall << ",";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>for(int i=0, j = call->getNumArgs(); i<j; i++)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>//For each argument it prints its type. The function must be declared otherwise it will return int-for unknown argument type.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>APIs << call->getArg(i)->getType().getAsString()<< ",";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>cout << call->getArg(i)->getType().getAsString() << ", ";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>cout << "\n";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>else</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>Expr *expr = call->getCallee();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>string exprCall = expr->getStmtClassName();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>cout << "Expression call: " << exprCall << " with arguments ";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>APIs << exprCall << ",";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>for(int i=0, j = call->getNumArgs(); i<j; i++)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>//For each argument it prints its type. The function must be declared otherwise it will return int-for unknown argument type.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>APIs << call->getArg(i)->getType().getAsString()<< ",";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>cout << call->getArg(i)->getType().getAsString() << ", ";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>cout << "\n";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div>    <span class="Apple-tab-span" style="white-space:pre"></span>return true;</div>
<div>    }</div>
<br>
<p></p>
<p>The expression if(call->getDirectCallee()) is not true for those calls. </p>
<p><br>
</p>
<p>How can I extract the "function name" and its arguments like I am doing with the "normal" function calls?</p>
<p><br>
</p>
<p>Thank you.</p>
</div>
</body>
</html>