diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -386,8 +386,24 @@ return false; SymbolRef Sym = V.getAsSymbol(/* IncludeBaseRegion */ true); - if (!Sym) + if (!Sym) { + if (Optional LV = V.getAs()) { + SValBuilder &SVB = stateMgr->getSValBuilder(); + QualType T; + const MemRegion *MR = LV->getAsRegion(); + if (const TypedRegion *TR = dyn_cast_or_null(MR)) + T = TR->getLocationType(); + else + T = SVB.getContext().VoidPtrTy; + + V = SVB.evalCast(*LV, SVB.getContext().BoolTy, T); + auto const integer = V.getAsInteger(); + if (integer) { + return integer->isZero(); + } + } return ConditionTruthVal(); + } return getStateManager().ConstraintMgr->isNull(this, Sym); }