summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2015-03-13 04:40:07 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2015-03-13 04:40:07 +0000
commit58d0e7ab79a33b2d8352765abbca2c03c34e09de (patch)
tree0e6106657ea842a26a1a87ea2791278a0aab15f1 /clang/tools/libclang
parentdf8a83127f538e20eba1ed85c977e8aa2aea7435 (diff)
downloadbcm5719-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.cpp17
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());
OpenPOWER on IntegriCloud