diff options
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index c8d4722442..9995a397fc 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -1637,23 +1637,30 @@ public: void GRExprEngine::VisitInitListExpr(InitListExpr* E, NodeTy* Pred, NodeSet& Dst) { - const GRState* state = GetState(Pred); + const GRState* state = GetState(Pred); QualType T = E->getType(); - unsigned NumInitElements = E->getNumInits(); if (T->isArrayType() || T->isStructureType()) { - - llvm::SmallVector<InitListWLItem, 10> WorkList; - WorkList.reserve(NumInitElements); - - WorkList.push_back(InitListWLItem(Pred, getBasicVals().getEmptySValList(), - E->rbegin())); + llvm::ImmutableList<SVal> StartVals = getBasicVals().getEmptySValList(); + // Handle base case where the initializer has no elements. + // e.g: static int* myArray[] = {}; + if (NumInitElements == 0) { + SVal V = NonLoc::MakeCompoundVal(T, StartVals, getBasicVals()); + MakeNode(Dst, E, Pred, BindExpr(state, E, V)); + return; + } + + // Create a worklist to process the initializers. + llvm::SmallVector<InitListWLItem, 10> WorkList; + WorkList.reserve(NumInitElements); + WorkList.push_back(InitListWLItem(Pred, StartVals, E->rbegin())); InitListExpr::reverse_iterator ItrEnd = E->rend(); + // Process the worklist until it is empty. while (!WorkList.empty()) { InitListWLItem X = WorkList.back(); WorkList.pop_back(); |