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

David Blaikie via cfe-dev cfe-dev at lists.llvm.org
Sat Oct 3 19:12:36 PDT 2020

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)

On Sat, Oct 3, 2020 at 6:06 PM Oleksandr Koval via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> 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.
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20201003/65125fcf/attachment.html>

More information about the cfe-dev mailing list