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: