Index: clang/lib/StaticAnalyzer/Core/Store.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/Store.cpp +++ clang/lib/StaticAnalyzer/Core/Store.cpp @@ -365,6 +365,10 @@ MR = Uncasted; } + if (const auto *SR = dyn_cast(MR)) { + return loc::MemRegionVal(GetElementZeroRegion(SR, TargetType)); + } + // We failed if the region we ended up with has perfect type info. Failed = isa(MR); return UnknownVal(); Index: clang/test/Analysis/casts.cpp =================================================================== --- clang/test/Analysis/casts.cpp +++ clang/test/Analysis/casts.cpp @@ -1,4 +1,6 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-store=region -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s + +void clang_analyzer_eval(bool); bool PR14634(int x) { double y = (double)x; @@ -41,3 +43,12 @@ *reinterpret_cast(&q) = p; return q; } + +struct A {}; +struct B : public A{}; + +void testNoopCast(A* a) { + B* b = (B* ) a; + A* a2 = (A *) b; + clang_analyzer_eval(a2 == a); // expected-warning{{TRUE}} +}