Index: lib/StaticAnalyzer/Core/ProgramState.cpp =================================================================== --- lib/StaticAnalyzer/Core/ProgramState.cpp +++ lib/StaticAnalyzer/Core/ProgramState.cpp @@ -527,33 +527,22 @@ } bool ScanReachableSymbols::scan(const SymExpr *sym) { - bool wasVisited = !visited.insert(sym).second; - if (wasVisited) - return true; + bool Result = true; + for (SymExpr::symbol_iterator SI = sym->symbol_begin(), + SE = sym->symbol_end(); + SI != SE; ++SI) { + if (!isa(*SI)) + continue; - if (!visitor.VisitSymbol(sym)) - return false; + bool wasVisited = !visited.insert(*SI).second; + if (wasVisited) + continue; - // TODO: should be rewritten using SymExpr::symbol_iterator. - switch (sym->getKind()) { - case SymExpr::SymbolRegionValueKind: - case SymExpr::SymbolConjuredKind: - case SymExpr::SymbolDerivedKind: - case SymExpr::SymbolExtentKind: - case SymExpr::SymbolMetadataKind: - break; - case SymExpr::SymbolCastKind: - return scan(cast(sym)->getOperand()); - case SymExpr::SymIntExprKind: - return scan(cast(sym)->getLHS()); - case SymExpr::IntSymExprKind: - return scan(cast(sym)->getRHS()); - case SymExpr::SymSymExprKind: { - const SymSymExpr *x = cast(sym); - return scan(x->getLHS()) && scan(x->getRHS()); - } + if (!visitor.VisitSymbol(*SI)) + Result = false; } - return true; + + return Result; } bool ScanReachableSymbols::scan(SVal val) {