<div dir="ltr">Hi <span style="font-size:12.8px">Himanshu</span>,<div><br></div><div>I guess that you are looking at the AST of main.c. The definition/body of foo is not available in main.c (after expanding all includes),</div><div>thus you see the nullptr. The AST is per translation unit, not for the whole program.</div><div>When compiling, this is only resolved later by the linker.</div><div><br></div><div>I don't know if there is a way to merge the ASTs of different translation units yet, I remember that I saw some</div><div>discussions on the mailing list.</div><div><br></div><div>Best wishes,</div><div>Matthias</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-07-13 3:45 GMT+02:00 Himanshu via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div data-smartmail="gmail_signature">Hi All, <br></div></div><div class="gmail_quote"><div dir="ltr"><div><br></div><div>I have looked thru the previous posts on this topic in the mailing-list archives, and still can't get things to work. Hence the repost --- for which I apologize. </div><div><br></div><div>I would like to get the body of a called function when visiting a CallExpr. </div><div>I create a recursive AST visitor, and handle the translation units correctly (to the best of my knowledge), and still am not able to get the body. The function is declared in a header file and implemented in a .c file. For brevity, I am recreating a toy example here: </div><div><br></div><div>def.h: </div><div>   void foo();</div><div><br></div><div>impl.c: </div><div>   #include "def.h"</div><div>   </div><div>   void foo(){</div><div>          printf("in func foo\n");</div><div>   }</div><div><br></div><div>main.c: </div><div>  #include "def.h"</div><div><br></div><div>  int main(){</div><div>     foo();</div><div>  }</div><div><br></div><div>Running my Visitor code here is able to parse the call expression, but returns nullptr on </div><div>callexpr->getDirectCallee()->getBody(). Similarly, callexpr->getDirectCallee()->hasBody() </div><div>returns false. </div><div>Could anyone kindly suggest what should I do? </div><div><br></div><div>Here is the simplified code for my visitor: </div>class FVisitor : public RecursiveASTVisitor<FVisitor> {<br>   public:<br>          bool VisitCallExpr(CallExpr *C){<br>                const FunctionDecl *FD = C->getDirectCallee();<br>                // try both variants of getBody<br>                if(FD->getBody())<br>                            cout << "found body"<<endl;<br>                else if(FD->getBody(FD))<br>                           cout << "found body"<<endl;<br>                return true;<br>          }<br>};</div><div dir="ltr"><br><div>Thanks,</div><div><div><div data-smartmail="gmail_signature">--<div>Himanshu</div></div></div>
</div></div>
</div><br></div>
<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>