Fix to BasicStoreManager::getElementLValue: If the base region is a symbol, layer an AnonTypedRegion on top of it.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60808 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp
index 31d392e..207f609 100644
--- a/lib/Analysis/BasicStore.cpp
+++ b/lib/Analysis/BasicStore.cpp
@@ -174,9 +174,20 @@
const MemRegion* BaseR = 0;
switch(BaseL.getSubKind()) {
- case loc::SymbolValKind:
- BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)->getSymbol());
+ case loc::SymbolValKind: {
+ // FIXME: Should we have symbolic regions be typed or typeless?
+ // Here we assume that these regions are typeless, even though the
+ // symbol is typed.
+ SymbolRef Sym = cast<loc::SymbolVal>(&BaseL)->getSymbol();
+ // Create a region to represent this symbol.
+ // FIXME: In the future we may just use symbolic regions instead of
+ // SymbolVals to reason about symbolic memory chunks.
+ const MemRegion* SymR = MRMgr.getSymbolicRegion(Sym);
+ // Layered a typed region on top of this.
+ QualType T = StateMgr.getSymbolManager().getType(Sym);
+ BaseR = MRMgr.getAnonTypedRegion(T, SymR);
break;
+ }
case loc::GotoLabelKind:
case loc::FuncValKind: