[cfe-dev] How to lookup a name from a specific expression's location?

Oleksandr Koval via cfe-dev cfe-dev at lists.llvm.org
Sat Oct 3 05:40:44 PDT 2020


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?

-- 
Regards,
Oleksandr Koval.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20201003/dd9369fd/attachment.html>


More information about the cfe-dev mailing list