Make SymbolicRegion subclass TypedRegion, for symbols usually have types, so 
do the symblic regions associated with them and we need them to be typed.

Current SymbolicRegion::getRValueType() method is very restricting. It may be
modified when we are more clear about what could be the types of symblic
regions.

BasicConstraintManager::Assume() is changed due to that now SymblicRegion is a
subclass of SubRegion.
 


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63844 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index 82f4423..e41c5f9 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -107,6 +107,28 @@
   ElementRegion::ProfileRegion(ID, Index, superRegion);
 }
 
+//===----------------------------------------------------------------------===//
+// getLValueType() and getRValueType()
+//===----------------------------------------------------------------------===//
+
+QualType SymbolicRegion::getRValueType(ASTContext& C) const {
+  const SymbolData& data = SymMgr.getSymbolData(sym);
+
+  // FIXME: We could use the SymbolManager::getType() directly. But that
+  // would hide the assumptions we made here. What is the type of a symbolic
+  // region is unclear for other cases.
+
+  // For now we assume the symbol is a typed region rvalue.
+  const TypedRegion* R 
+    = cast<TypedRegion>(cast<SymbolRegionRValue>(data).getRegion());
+
+  // Assume the region rvalue has a pointer type, only then we could have a
+  // symbolic region associated with it.
+  PointerType* PTy = cast<PointerType>(R->getRValueType(C).getTypePtr());
+
+  return PTy->getPointeeType();
+}
+
 QualType ElementRegion::getRValueType(ASTContext& C) const {
   // Strip off typedefs from the ArrayRegion's RvalueType.
   QualType T = getArrayRegion()->getRValueType(C)->getDesugaredType();
@@ -119,10 +141,6 @@
   return T;
 }
 
-//===----------------------------------------------------------------------===//
-// getLValueType() and getRValueType()
-//===----------------------------------------------------------------------===//
-
 QualType StringRegion::getRValueType(ASTContext& C) const {
   return Str->getType();
 }
@@ -308,7 +326,8 @@
 }
 
 /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
-SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef sym) {
+SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef sym,
+                                                    const SymbolManager& mgr) {
   
   llvm::FoldingSetNodeID ID;
   SymbolicRegion::ProfileRegion(ID, sym);
@@ -319,7 +338,8 @@
   
   if (!R) {
     R = (SymbolicRegion*) A.Allocate<SymbolicRegion>();
-    new (R) SymbolicRegion(sym);
+    // SymbolicRegion's storage class is usually unknown.
+    new (R) SymbolicRegion(sym, mgr, getUnknownRegion());
     Regions.InsertNode(R, InsertPos);
   }