diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp --- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -1172,6 +1172,9 @@ if (!Class) return true; + if (Class == BaseClass) + return true; + if (IsVirtual) return Class->isVirtuallyDerivedFrom(BaseClass); diff --git a/clang/test/Analysis/pointer-to-member.cpp b/clang/test/Analysis/pointer-to-member.cpp --- a/clang/test/Analysis/pointer-to-member.cpp +++ b/clang/test/Analysis/pointer-to-member.cpp @@ -231,6 +231,23 @@ } } // end of testPointerToMemberDiamond namespace +namespace testPointerToMemberViaStaticCast { +// From bug #48739 +struct Base { + int field; +}; + +struct Derived : public Base {}; + +void static_cast_test() { + int Derived::* derived_field = &Derived::field; + Base base; + base.field = 5; + int Base::* base_field = static_cast(derived_field); + clang_analyzer_eval(base.*base_field == 5); // expected-warning {{TRUE}} +} +} + namespace testAnonymousMember { struct A { int a;