OSAtomic simulation: use the original region as the location to load from,
instead of the ElementRegion obtained from casts.

Test cast: the leak cannot occur bacause the true branch cannot be taken.

llvm-svn: 90964
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp
index 4a960c6..daa249f 100644
--- a/clang/lib/Analysis/GRExprEngine.cpp
+++ b/clang/lib/Analysis/GRExprEngine.cpp
@@ -1483,10 +1483,13 @@
   ExplodedNodeSet Tmp;
   SVal location = state->getSVal(theValueExpr);
   // Here we should use the value type of the region as the load type.
-  const MemRegion *R = location.getAsRegion();
+  const MemRegion *R = location.getAsRegion()->StripCasts();
   QualType LoadTy;
-  if (R)
+  if (R) {
     LoadTy = cast<TypedRegion>(R)->getValueType(C);
+    // Use the region as the real load location.
+    location = loc::MemRegionVal(R);
+  }
   Engine.EvalLoad(Tmp, theValueExpr, Pred, state, location, OSAtomicLoadTag,
                   LoadTy);