[cfe-dev] How to lookup a name from a specific expression's location?
Nicolás Alvarez via cfe-dev
cfe-dev at lists.llvm.org
Sun Oct 4 00:31:21 PDT 2020
> El 3 oct. 2020, a la(s) 22:06, Oleksandr Koval via cfe-dev <cfe-dev at lists.llvm.org> escribió:
>
>
> 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:
> struct X{
> void f(int x){
> // without `this->` will use parameter
> this->x++;
>
> // can remove `this->` because
> // local `y` is not visible yet
> this->y++;
> y++;
>
> int y;
> y++;
> }
> int x;
> int y;
> };
> I need to know whether a specific name(function or variable) will resolve to the same declaration without `this->` part. My matcher is memberExpr(has(cxxThisExpr())), 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?
Removing this-> from this->y is safe in the sense that the code will still work, because the local y isn't visible yet, but it would be very confusing and error prone for the human reading it. It would subtly break if someone moves the local y declaration higher for example.
So maybe you should consider *not* suggesting the removal of this-> in a situation like this (when there is a local var with the same name but it's not yet visible) due to code readability, even if it's technically safe to remove it.
And as a bonus, it becomes easier to implement :)
--
Nicolás
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20201004/6caa2929/attachment-0001.html>
More information about the cfe-dev
mailing list