Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h @@ -908,7 +908,7 @@ DeclRegion(const ValueDecl *d, const MemRegion *sReg, Kind k) : TypedValueRegion(sReg, k), D(d) { assert(classof(this)); - assert(d); + assert(d && d->isCanonicalDecl()); } static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl *D, Index: clang/lib/StaticAnalyzer/Core/MemRegion.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/MemRegion.cpp +++ clang/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -844,6 +844,7 @@ const VarRegion* MemRegionManager::getVarRegion(const VarDecl *D, const LocationContext *LC) { + D = D->getCanonicalDecl(); const MemRegion *sReg = nullptr; if (D->hasGlobalStorage() && !D->isStaticLocal()) { @@ -930,6 +931,7 @@ const VarRegion *MemRegionManager::getVarRegion(const VarDecl *D, const MemRegion *superR) { + D = D->getCanonicalDecl(); return getSubRegion(D, superR); } Index: clang/test/Analysis/globals.cpp =================================================================== --- clang/test/Analysis/globals.cpp +++ clang/test/Analysis/globals.cpp @@ -109,3 +109,18 @@ S3 s3; *(s3.p - 1) = 0; // expected-warning{{Dereference of null pointer}} } + +extern int ext_int; + +void update_original_declaration() { + ext_int = 2; +} + +extern int ext_int; + +int test_redeclaration() { + ext_int = 1; + update_original_declaration(); + int int_int = 3 / (ext_int - 1); // no-warning + return int_int / (ext_int - 2); // expected-warning{{Division by zero}} +}