diff --git a/clang/include/clang/Analysis/PathSensitive/ConstraintManager.h b/clang/include/clang/Analysis/PathSensitive/ConstraintManager.h index 4b17f57c91b1..e3b6489ad085 100644 --- a/clang/include/clang/Analysis/PathSensitive/ConstraintManager.h +++ b/clang/include/clang/Analysis/PathSensitive/ConstraintManager.h @@ -37,7 +37,7 @@ public: SVal UpperBound, bool Assumption) = 0; std::pair AssumeDual(const GRState *state, - SVal Cond) { + DefinedSVal Cond) { return std::make_pair(Assume(state, Cond, true), Assume(state, Cond, false)); } diff --git a/clang/include/clang/Analysis/PathSensitive/SVals.h b/clang/include/clang/Analysis/PathSensitive/SVals.h index 4371e31fadaa..1dd690695e90 100644 --- a/clang/include/clang/Analysis/PathSensitive/SVals.h +++ b/clang/include/clang/Analysis/PathSensitive/SVals.h @@ -177,7 +177,7 @@ class DefinedSVal : public SVal { protected: DefinedSVal(const void* d, bool isLoc, unsigned ValKind) : SVal(d, isLoc, ValKind) {} - +public: // Implement isa support. static inline bool classof(const SVal *V) { return !V->isUnknownOrUndef(); diff --git a/clang/lib/Analysis/GRExprEngineInternalChecks.cpp b/clang/lib/Analysis/GRExprEngineInternalChecks.cpp index d22f276a55ca..1b2fd1cb9fb9 100644 --- a/clang/lib/Analysis/GRExprEngineInternalChecks.cpp +++ b/clang/lib/Analysis/GRExprEngineInternalChecks.cpp @@ -575,10 +575,15 @@ public: if (!Att->isNonNull(idx)) continue; + const SVal &V = state->getSVal(*I); + const DefinedSVal *DV = dyn_cast(&V); + + if (!DV) + continue; + ConstraintManager &CM = C.getConstraintManager(); const GRState *stateNotNull, *stateNull; - llvm::tie(stateNotNull, stateNull) = CM.AssumeDual(state, - state->getSVal(*I)); + llvm::tie(stateNotNull, stateNull) = CM.AssumeDual(state, *DV); if (stateNull && !stateNotNull) { // Generate an error node. Check for a null node in case