<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jun 3, 2014 at 5:36 PM, Alex Horn <span dir="ltr"><<a href="mailto:alex.horn@cs.ox.ac.uk" target="_blank">alex.horn@cs.ox.ac.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I am struggling to replace "assert(c)" macro calls by "BAR(c)" where c<br>
is some integer expression and BAR is a function.<br>
<br>
The problem manifests itself in RefactoringTool::applyAllReplacements<br>
which returns false, thereby causing the tool to skip replacements.<br>
<br>
I am using the following ASTMatcher:<br>
<br>
StatementMatcher makeAssertMatcher() {<br>
  return callExpr(callee(functionDecl(hasName("__builtin_expect")))).bind("AssertBindId");<br>
}<br>
<br>
Note: callExpr(callee(functionDecl(hasName("assert"))) won't work here<br>
because assert() is a macro according to the assert.h and cassert<br>
headers.<br>
<br>
Here's an example match using clang-query:<br>
<br>
example.cpp:<br>
<br>
  #include <assert.h><br>
  int main() {<br>
    assert(false);<br>
    return 0;<br>
  }<br>
<br>
$ clang-query> match callExpr(callee(functionDecl(hasName("__builtin_expect"))))<br>
<br>
  Match #1:<br>
<br>
  example.cpp:4:3: note: "AssertBindId" binds here<br>
    assert(false);<br>
    ^~~~~~~~~~~~~<br>
  /usr/include/assert.h:93:6: note: expanded from macro 'assert'<br>
      (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__,<br>
__LINE__, #e) : (void)0)<br>
       ^~~~~~~~~~~~~~~~~~~~~~~~~<br>
  1 match.<br>
<br>
But I cannot find the correct way to rewrite the match; the following<br>
replacement is skipped (i.e. see line 295 in Refactoring.cpp):<br>
<br>
  const CallExpr *E = Result.Nodes.getNodeAs<CallExpr>("AssertBindId");<br>
  SourceManager &SM = *Result.SourceManager;<br>
  SourceLocation LocBegin = E->getLocStart();<br>
  Replace->insert(tooling::Replacement(SM, LocBegin,<br>
    /* number of letters in assert */ 6, "BAR"));<br>
<br>
What is the correct way (if any) to rewrite call expressions of macros<br>
such as "assert()"?<br></blockquote><div><br></div><div>You need to get the expansion location:</div><div>SourceLocation ExpLocBegin = SM.getExpansionLoc(LocBegin);</div><div>Replace->insert(tooling::Replacement(SM, ExpLocBegin, 6, "BAR"));</div>
<div><br></div><div>Something like this should do the trick...</div><div>Cheers,</div><div>/Manuel</div></div></div></div>