<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Sat, Jul 18, 2015 at 12:32 AM Aaron Mertz <<a href="mailto:mertz.ac@gmail.com">mertz.ac@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello all,<br>
<br>
I've been having some trouble writing the correct matcher to deal with a<br>
rather sticky case of mine.<br>
<br>
I have some code which serves as a kind of catch all so that I can refactor<br>
boost::shared_ptr (and friends) into the std version. The code below is<br>
meaningless, but lets me test to make sure I can refactor in real code.<br>
<br>
class Test {<br>
  public:<br>
    Test() {}<br>
<br>
    std::string toString() {<br>
      return std::string("Test");<br>
    }<br>
};<br>
<br>
<br>
template <class T><br>
::boost::shared_ptr<T> TestFunc() {<br>
  ::boost::shared_ptr<T> ptr = ::boost::make_shared<T>();<br>
  std::cout << ::boost::static_pointer_cast<T>(txn)->toString();<br></blockquote><div><br></div><div>Where does txn come from?</div><div><br></div><div>Generally, it helps me if you have a code snippet that I can use without having boost around (just forward declare the boost functions necessary, as the template is not actually instantiated).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  return ptr ;<br>
}<br>
<br>
<br>
If I call TestFunc() inside main, my matcher works perfectly fine and<br>
everything inside the template matches. However, if I don't call the<br>
function, then I get 0 matches.<br>
<br>
My matchers look like:<br>
<br>
// For make_shared, static_pointer_cast, etc...<br>
callExpr(callee(functionDecl(matchesName("make_shared|static_pointer_cast")))).bind(k_BoostStmtTokenId);<br>
<br>
// For shared_ptr, weak_ptr<br>
typeLoc(loc(qualType(hasDeclaration(recordDecl(matchesName("shared_ptr|weak_ptr"),<br>
isFromBoostNamespace()))))).bind(k_BoostTypeLocTokenId);<br>
<br>
I've been poring over the AST-dump, but I can't seem to figure out exactly<br>
how to construct a matcher that will let me match the template code without<br>
it being actually called somewhere.<br>
<br>
A general callExpr() catches the two expressions inside the template, but<br>
I'm not sure how to narrow them down from there.<br>
<br>
Any help is very much appreciated.<br>
<br>
Thanks,<br>
Aaron<br>
<br>
<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__clang-2Ddevelopers.42468.n3.nabble.com_AST-2DMatching-2DTemplate-2DFunctions-2Dtp4046680.html&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=CnzuN65ENJ1H9py9XLiRvC_UQz6u3oG6GUNn7_wosSM&m=EyxJIXAHu-M-12WXXot3toIGME9gunh2P04WCYcZ99g&s=2eDubwlBqOUcG4WFtpVQZcbhtL6xql1IVV9_s6LcKUA&e=" rel="noreferrer" target="_blank">http://clang-developers.42468.n3.nabble.com/AST-Matching-Template-Functions-tp4046680.html</a><br>
Sent from the Clang Developers mailing list archive at Nabble.com.<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>