Per conversations with Zhongxing, add an 'element type' to
ElementRegion.  I also removed 'ElementRegion::getArrayRegion',
although we may need to add this back.

This breaks a few test cases with RegionStore:
- 'array-struct.c' triggers an infinite recursion in RegionStoreManager.  Need to investigate.
- misc-ps.m triggers a failure with RegionStoreManager as we now get the diagnostic:
  'Line 159: Uninitialized or undefined return value returned to caller.'
  
There were a bunch of places that needed to be edit
RegionStoreManager, and we may not be passing all the correct 'element
types' down from GRExprEngine.

Zhongxing: When you get a chance, could you review this?  I could have
easily screwed up something basic in RegionStoreManager.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70830 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index 81855ba..78cd814 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -96,15 +96,17 @@
   SymbolicRegion::ProfileRegion(ID, sym);
 }
 
-void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 
+void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
+                                  QualType ElementType, SVal Idx, 
                                   const MemRegion* superRegion) {
   ID.AddInteger(MemRegion::ElementRegionKind);
+  ID.Add(ElementType);
   ID.AddPointer(superRegion);
   Idx.Profile(ID);
 }
 
 void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
-  ElementRegion::ProfileRegion(ID, Index, superRegion);
+  ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
 }
 
 void CodeTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const void* data,
@@ -122,18 +124,6 @@
 // getLValueType() and getRValueType()
 //===----------------------------------------------------------------------===//
 
-QualType ElementRegion::getRValueType(ASTContext& C) const {
-  // Strip off typedefs from the ArrayRegion's RvalueType.
-  QualType T = getArrayRegion()->getRValueType(C)->getDesugaredType();
-
-  if (ArrayType* AT = dyn_cast<ArrayType>(T.getTypePtr()))
-    return AT->getElementType();
-
-  // If the RValueType of the array region isn't an ArrayType, then essentially
-  // the element's  
-  return T;
-}
-
 QualType StringRegion::getRValueType(ASTContext& C) const {
   return Str->getType();
 }
@@ -313,10 +303,11 @@
 }
 
 ElementRegion*
-MemRegionManager::getElementRegion(SVal Idx, const TypedRegion* superRegion){
+MemRegionManager::getElementRegion(QualType elementType, SVal Idx,
+                                   const TypedRegion* superRegion){
 
   llvm::FoldingSetNodeID ID;
-  ElementRegion::ProfileRegion(ID, Idx, superRegion);
+  ElementRegion::ProfileRegion(ID, elementType, Idx, superRegion);
 
   void* InsertPos;
   MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
@@ -324,7 +315,7 @@
 
   if (!R) {
     R = (ElementRegion*) A.Allocate<ElementRegion>();
-    new (R) ElementRegion(Idx, superRegion);
+    new (R) ElementRegion(elementType, Idx, superRegion);
     Regions.InsertNode(R, InsertPos);
   }