diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2015-03-13 04:40:07 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2015-03-13 04:40:07 +0000 |
commit | 58d0e7ab79a33b2d8352765abbca2c03c34e09de (patch) | |
tree | 0e6106657ea842a26a1a87ea2791278a0aab15f1 /clang/tools/libclang | |
parent | df8a83127f538e20eba1ed85c977e8aa2aea7435 (diff) | |
download | bcm5719-llvm-58d0e7ab79a33b2d8352765abbca2c03c34e09de.tar.gz bcm5719-llvm-58d0e7ab79a33b2d8352765abbca2c03c34e09de.zip |
[libclang] During member ref expression visitation, ignore base anonymous struct/union fields.
Otherwise they will shadow the real field that that we are interested in.
rdar://19783938
llvm-svn: 232141
Diffstat (limited to 'clang/tools/libclang')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index efe20e27d82..1b41e0066f5 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2238,8 +2238,21 @@ void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) { // visit it. // FIXME: If we ever want to show these implicit accesses, this will be // unfortunate. However, clang_getCursor() relies on this behavior. - if (!M->isImplicitAccess()) - AddStmt(M->getBase()); + if (M->isImplicitAccess()) + return; + + // Ignore base anonymous struct/union fields, otherwise they will shadow the + // real field that that we are interested in. + if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) { + if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) { + if (FD->isAnonymousStructOrUnion()) { + AddStmt(SubME->getBase()); + return; + } + } + } + + AddStmt(M->getBase()); } void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { AddTypeLoc(E->getEncodedTypeSourceInfo()); |