Store BasicStoreManager::InvalidateRegion(Store store,
        const MemRegion *R,
        const Expr *E,
        unsigned Count,
        InvalidatedSymbols *IS) {
    R = R->StripCasts();

    if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R)))
        return store;

    if (IS) {
        BindingsTy B = GetBindings(store);
        if (BindingsTy::data_type *Val = B.lookup(R)) {
            if (SymbolRef Sym = Val->getAsSymbol())
                IS->insert(Sym);
        }
    }

    QualType T = cast<TypedRegion>(R)->getValueType(R->getContext());
    SVal V = ValMgr.getConjuredSymbolVal(R, E, T, Count);
    return Bind(store, loc::MemRegionVal(R), V);
}
SVal BasicStoreManager::Retrieve(Store store, Loc loc, QualType T) {
    if (isa<UnknownVal>(loc))
        return UnknownVal();

    assert(!isa<UndefinedVal>(loc));

    switch (loc.getSubKind()) {

    case loc::MemRegionKind: {
        const MemRegion* R = cast<loc::MemRegionVal>(loc).getRegion();

        if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R)))
            return UnknownVal();

        BindingsTy B = GetBindings(store);
        BindingsTy::data_type *Val = B.lookup(R);
        const TypedRegion *TR = cast<TypedRegion>(R);

        if (Val)
            return CastRetrievedVal(*Val, TR, T);

        SVal V = LazyRetrieve(store, TR);
        return V.isUnknownOrUndef() ? V : CastRetrievedVal(V, TR, T);
    }

    case loc::ConcreteIntKind:
        // Some clients may call GetSVal with such an option simply because
        // they are doing a quick scan through their Locs (potentially to
        // invalidate their bindings).  Just return Undefined.
        return UndefinedVal();

    default:
        assert (false && "Invalid Loc.");
        break;
    }

    return UnknownVal();
}