diff --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp --- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp +++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp @@ -59,7 +59,11 @@ } bool VisitMemberExpr(MemberExpr *E) { - report(E->getMemberLoc(), E->getFoundDecl().getDecl()); + // Instead of the FieldDecl for MemberExpr, we report the Decl of + // the corresponding record. + Expr *BE = E->getBase()->IgnoreImpCasts(); + RecordDecl *RD = BE->getType()->getAsRecordDecl(); + report(E->getMemberLoc(), RD); return true; } diff --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp --- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp +++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp @@ -172,10 +172,12 @@ } TEST(WalkAST, MemberExprs) { - testWalk("struct S { void $explicit^foo(); };", "void foo() { S{}.^foo(); }"); + testWalk("struct $explicit^S { void foo(); };", "void foo() { S{}.^foo(); }"); testWalk( - "struct S { void foo(); }; struct X : S { using S::$explicit^foo; };", + "struct S { void foo(); }; struct $explicit^X : S { using S::foo; };", "void foo() { X{}.^foo(); }"); + testWalk("struct Base { int a; }; struct $explicit^Derived : public Base {};", + "void fun(Derived d) { d.^a; }"); } TEST(WalkAST, ConstructExprs) {