<div dir="ltr">Hi Noel, <div><br></div><div>This is common question, I've seen it a couple of times here in the mailing list.</div><div><br></div><div>Here's the solution a use. However, you do need the ASTContext, which you can get from any Decl object by calling the getASTContext() method.<br><br><div class="gmail_quote">2016-01-04 7:28 GMT+00:00 Mikhail Ramalho <span dir="ltr"><<a href="mailto:mikhail.ramalho@gmail.com" target="_blank">mikhail.ramalho@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hello,<div><br></div><div>You can use the following code to walk through the parents of a stmt/expr:</div><div><br></div><div><div>const clang::Decl* get_DeclContext_from_Stmt(const clang::Stmt& stmt)</div><div>{</div><div>  auto it = ASTContext->getParents(stmt).begin();</div><div><br></div><div>  if(it == ASTContext->getParents(stmt).end())</div><div>    return nullptr;</div><div><br></div><div>  const clang::Decl *aDecl = it->get<clang::Decl>();</div><div>  if(aDecl)</div><div>    return aDecl;</div><div><br></div><div>  const clang::Stmt *aStmt = it->get<clang::Stmt>();</div><div>  if(aStmt)</div><div>    return get_DeclContext_from_Stmt(*aStmt);</div><div><br></div><div>  return nullptr;</div><div>}</div></div><div><br></div><div>It tries to find a declaration, but you can change it to find any stmt/expr.</div><div><br></div><div>Best regards,</div></div></blockquote><div><br></div><div>To get the FunctionDecl, I use the following code:</div><div><br></div><div><div>const clang::FunctionDecl* get_top_FunctionDecl_from_Stmt(</div><div>  const clang::Stmt& stmt)</div><div>{</div><div>  const clang::Decl *decl = get_DeclContext_from_Stmt(stmt);</div><div>  if(decl)</div><div>    return static_cast<const clang::FunctionDecl*>(decl->getNonClosureContext());</div><div><br></div><div>  return nullptr;</div><div>}</div></div><div><br></div><div>I don't know if there is some weird corner case in which it won't work but it's working so far (I tried in about 7000 different programs, from simple programs to some weird preprocessed device drivers).</div><div> </div><div>Thank you,</div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-01-28 14:01 GMT+00:00 Noel Grandin 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">Hi<br>
<br>
Is there a straightforward way to look "up" the tree when implementing<br>
a clang plugin using RecursiveASTVisitor ?<br>
<br>
I've bumped into this a couple of times and never found a "nice" answer.<br>
<br>
For example, I have overridden<br>
<br>
       VisitCallExpr(const CallExpr* expr)<br>
<br>
and I want to know in which context the call is happening i.e. from<br>
which FunctionDecl the call is being made.<br>
<br>
It seems like there should be an easy way to walk back up the tree?<br>
<br>
Thanks, Noel Grandin<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">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>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div><div dir="ltr"><div><br></div><div>Mikhail Ramalho.</div></div></div>
</div></div>