diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index e93d1d8eab56f..0d5d515c0e6f7 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1005,7 +1005,9 @@ DEF_TRAVERSE_TYPE(RValueReferenceType, DEF_TRAVERSE_TYPE(MemberPointerType, { TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); - TRY_TO(TraverseDecl(T->getMostRecentCXXRecordDecl())); + if (T->isSugared()) + TRY_TO(TraverseType( + QualType(T->getMostRecentCXXRecordDecl()->getTypeForDecl(), 0))); TRY_TO(TraverseType(T->getPointeeType())); }) diff --git a/clang/test/SemaCXX/member-pointer.cpp b/clang/test/SemaCXX/member-pointer.cpp index b6ab7d38610c8..3d9dd05755b8c 100644 --- a/clang/test/SemaCXX/member-pointer.cpp +++ b/clang/test/SemaCXX/member-pointer.cpp @@ -344,3 +344,14 @@ namespace GH132494 { }; template struct A; // expected-note {{requested here}} } // namespace GH132494 + +namespace GH132401 { + template struct CallableHelper { + static auto Resolve() -> Func; + }; + struct QIODevice { + void d_func() { (void)d_ptr; } + int d_ptr; + }; + template struct CallableHelper; +} // namespace GH132401