diff options
Diffstat (limited to 'lib/Analysis/Store.cpp')
-rw-r--r-- | lib/Analysis/Store.cpp | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/lib/Analysis/Store.cpp b/lib/Analysis/Store.cpp index 32b186b269..49411b468e 100644 --- a/lib/Analysis/Store.cpp +++ b/lib/Analysis/Store.cpp @@ -44,18 +44,37 @@ StoreManager::CastRegion(const GRState* state, const MemRegion* R, QualType Pointee = PTy->getPointeeType(); if (Pointee->isVoidType()) { - // Casts to void* only removes TypedViewRegion. If there is no - // TypedViewRegion, leave the region untouched. This happens when: - // - // void foo(void*); - // ... - // void bar() { - // int x; - // foo(&x); - // } - - if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) - R = TR->removeViews(); + do { + if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) { + // Casts to void* removes TypedViewRegion. This happens when: + // + // void foo(void*); + // ... + // void bar() { + // int x; + // foo(&x); + // } + // + R = TR->removeViews(); + continue; + } + else if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) { + // Casts to void* also removes ElementRegions. This happens when: + // + // void foo(void*); + // ... + // void bar() { + // int x; + // foo((char*)&x); + // } + // + R = ER->getSuperRegion(); + continue; + } + else + break; + } + while (0); return CastResult(state, R); } |