diff options
| -rw-r--r-- | clang/lib/Checker/RegionStore.cpp | 23 | ||||
| -rw-r--r-- | clang/test/Analysis/PR7218.c | 1 | 
2 files changed, 6 insertions, 18 deletions
diff --git a/clang/lib/Checker/RegionStore.cpp b/clang/lib/Checker/RegionStore.cpp index c25d2095b13..2200ef1002e 100644 --- a/clang/lib/Checker/RegionStore.cpp +++ b/clang/lib/Checker/RegionStore.cpp @@ -213,11 +213,6 @@ public:    RegionStoreSubRegionMap *getRegionStoreSubRegionMap(Store store); -  /// canHaveDirectBinding - Disallow direct bindings for certain types, -  ///  like arrays. This lets us distinguish between x and x[0], which was -  ///  causing PR7218 "Assigning to buf[0] makes buf[1] valid". -  bool canHaveDirectBinding (const MemRegion *R); -    Optional<SVal> getBinding(RegionBindings B, const MemRegion *R);    Optional<SVal> getDirectBinding(RegionBindings B, const MemRegion *R);    /// getDefaultBinding - Returns an SVal* representing an optional default @@ -949,20 +944,12 @@ SVal RegionStoreManager::EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R,  //===----------------------------------------------------------------------===//  // Loading values from regions.  //===----------------------------------------------------------------------===// -bool RegionStoreManager::canHaveDirectBinding (const MemRegion *R) { -  // Arrays can't have direct binding -- must bind to elements -  if (const TypedRegion *TR = dyn_cast<TypedRegion>(R))     -    if (TR->getValueType(getContext())->isArrayType())    -      return false; -   -  return true; -}  Optional<SVal> RegionStoreManager::getDirectBinding(RegionBindings B,                                                      const MemRegion *R) { -  if (canHaveDirectBinding(R)) -    if (const SVal *V = Lookup(B, R, BindingKey::Direct)) -      return *V; + +  if (const SVal *V = Lookup(B, R, BindingKey::Direct)) +    return *V;    return Optional<SVal>();  } @@ -1188,8 +1175,9 @@ SVal RegionStoreManager::RetrieveElement(Store store,    // Check if the immediate super region has a direct binding.    if (const Optional<SVal> &V = getDirectBinding(B, superR)) { -    if (SymbolRef parentSym = V->getAsSymbol()) +    if (SymbolRef parentSym = V->getAsSymbol()) {        return ValMgr.getDerivedRegionValueSymbolVal(parentSym, R); +    }      if (V->isUnknownOrUndef())        return *V; @@ -1198,7 +1186,6 @@ SVal RegionStoreManager::RetrieveElement(Store store,      // are handled in 'RetrieveFieldOrElementCommon'.      if (const nonloc::LazyCompoundVal *LCV =          dyn_cast<nonloc::LazyCompoundVal>(V)) { -        R = MRMgr.getElementRegionWithSuper(R, LCV->getRegion());        return RetrieveElement(LCV->getStore(), R);      } diff --git a/clang/test/Analysis/PR7218.c b/clang/test/Analysis/PR7218.c index 635e56f053e..bda30a7f726 100644 --- a/clang/test/Analysis/PR7218.c +++ b/clang/test/Analysis/PR7218.c @@ -1,4 +1,5 @@  // RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -verify %s +// XFAIL: *  char PR7218(char a) {      char buf[2];      buf[0] = a;  | 

