<div dir="ltr">I /believe/ that's not entirely possible in clang (DeclContexts are not preserved) - though I guess clangd does /something/ to try to get good-enough name lookup from arbitrary locations (maybe it reparses the code to achieve this? Not sure)</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Oct 3, 2020 at 6:06 PM Oleksandr Koval via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hi, I'm writing a check that detects and removes redundant `this->` usage. Finding explicit `this->` was simple, now I want to check whether it's safe to remove it. My main concern is such case:</div>
<pre style="color:rgb(0,0,0);background:none 0% 0% repeat scroll rgb(255,255,255)"><span style="color:rgb(128,0,0);font-weight:bold">struct</span> X<span style="color:rgb(128,0,128)">{</span>
    <span style="color:rgb(128,0,0);font-weight:bold">void</span> f<span style="color:rgb(128,128,48)">(</span><span style="color:rgb(128,0,0);font-weight:bold">int</span> x<span style="color:rgb(128,128,48)">)</span><span style="color:rgb(128,0,128)">{</span>
        <span style="color:rgb(105,105,105)">// without `this->` will use parameter</span>
        <span style="color:rgb(128,0,0);font-weight:bold">this</span><span style="color:rgb(128,128,48)">-</span><span style="color:rgb(128,128,48)">></span>x<span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,0,128)">;</span>

        <span style="color:rgb(105,105,105)">// can remove `this->` because</span>
        <span style="color:rgb(105,105,105)">// local `y` is not visible yet</span>
        <span style="color:rgb(128,0,0);font-weight:bold">this</span><span style="color:rgb(128,128,48)">-</span><span style="color:rgb(128,128,48)">></span>y<span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,0,128)">;</span>
        y<span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,0,128)">;</span>

        <span style="color:rgb(128,0,0);font-weight:bold">int</span> y<span style="color:rgb(128,0,128)">;</span>
        y<span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,128,48)">+</span><span style="color:rgb(128,0,128)">;</span>
    <span style="color:rgb(128,0,128)">}</span>
    <span style="color:rgb(128,0,0);font-weight:bold">int</span> x<span style="color:rgb(128,0,128)">;</span>
    <span style="color:rgb(128,0,0);font-weight:bold">int</span> y<span style="color:rgb(128,0,128)">;</span>
<span style="color:rgb(128,0,128)">}</span><span style="color:rgb(128,0,128)">;</span>
</pre>
<div>I need to know whether a specific name(function or variable) will resolve to the same declaration without `this->` part. My matcher is  <i>memberExpr(has(cxxThisExpr()))</i>, I bind  MemberExpr and CXXThisExpr, I can rewrite matcher to also bind enclosing CXXMethodDecl. As I understand, simple enumeration of parameter/local variable names won't work(as in case with `y`) because of lookup/visibility rules. Is there  some `lookup()` function whose result I can compare against the declaration of original function/variable? I found Sema::LookupName() but can't figure out how to get Scope of the found expression. Can you give me an example please?<br></div><div><br></div><div>-- <br><div dir="ltr"><div dir="ltr"><div>Regards,</div><div>Oleksandr Koval.<br></div></div></div></div></div>
_______________________________________________<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="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div>