<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, May 15, 2013 at 4:22 PM, Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jrose<br>
Date: Wed May 15 18:22:55 2013<br>
New Revision: 181945<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=181945&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=181945&view=rev</a><br>
Log:<br>
Remove unused, awkward CFGStmtVisitor and subclasses.<br></blockquote><div><br></div><div style>Thanks Jordan!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
This class is a StmtVisitor that distinguishes between block-level and<br>
non-block-level statements in a CFG. However, it does so using a hard-coded<br>
idea of which statements might be block-level, which probably isn't accurate<br>
anymore. The only implementer of the CFGStmtVisitor hierarchy was the<br>
analyzer's DeadStoresChecker, and the analyzer creates a linearized CFG<br>
anyway (every non-trivial statement is a block-level statement).<br>
<br>
This also allows us to remove the block-expr map ("BlkExprMap"), which<br>
mapped statements to positions in the CFG. Apart from having a helper type<br>
that really should have just been Optional<unsigned>, it was only being<br>
used to ask /if/ a particular expression was block-level, for traversal<br>
purposes in CFGStmtVisitor.<br>
<br>
Removed:<br>
    cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h<br>
    cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h<br>
    cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h<br>
    cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h<br>
Modified:<br>
    cfe/trunk/include/clang/Analysis/CFG.h<br>
    cfe/trunk/lib/Analysis/CFG.cpp<br>
    cfe/trunk/lib/Analysis/UninitializedValues.cpp<br>
    cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Analysis/CFG.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/CFG.h?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/CFG.h?rev=181945&r1=181944&r2=181945&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/CFG.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/CFG.h Wed May 15 18:22:55 2013<br>
@@ -763,21 +763,6 @@ public:<br>
   // CFG Introspection.<br>
   //===--------------------------------------------------------------------===//<br>
<br>
-  struct   BlkExprNumTy {<br>
-    const signed Idx;<br>
-    explicit BlkExprNumTy(signed idx) : Idx(idx) {}<br>
-    explicit BlkExprNumTy() : Idx(-1) {}<br>
-    operator bool() const { return Idx >= 0; }<br>
-    operator unsigned() const { assert(Idx >=0); return (unsigned) Idx; }<br>
-  };<br>
-<br>
-  bool isBlkExpr(const Stmt *S) { return getBlkExprNum(S); }<br>
-  bool isBlkExpr(const Stmt *S) const {<br>
-    return const_cast<CFG*>(this)->isBlkExpr(S);<br>
-  }<br>
-  BlkExprNumTy  getBlkExprNum(const Stmt *S);<br>
-  unsigned      getNumBlkExprs();<br>
-<br>
   /// getNumBlockIDs - Returns the total number of BlockIDs allocated (which<br>
   /// start at 0).<br>
   unsigned getNumBlockIDs() const { return NumBlockIDs; }<br>
@@ -800,9 +785,7 @@ public:<br>
   //===--------------------------------------------------------------------===//<br>
<br>
   CFG() : Entry(NULL), Exit(NULL), IndirectGotoBlock(NULL), NumBlockIDs(0),<br>
-          BlkExprMap(NULL), Blocks(BlkBVC, 10) {}<br>
-<br>
-  ~CFG();<br>
+          Blocks(BlkBVC, 10) {}<br>
<br>
   llvm::BumpPtrAllocator& getAllocator() {<br>
     return BlkBVC.getAllocator();<br>
@@ -819,11 +802,6 @@ private:<br>
                                 // for indirect gotos<br>
   unsigned  NumBlockIDs;<br>
<br>
-  // BlkExprMap - An opaque pointer to prevent inclusion of DenseMap.h.<br>
-  //  It represents a map from Expr* to integers to record the set of<br>
-  //  block-level expressions and their "statement number" in the CFG.<br>
-  void *    BlkExprMap;<br>
-<br>
   BumpVectorContext BlkBVC;<br>
<br>
   CFGBlockListTy Blocks;<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h?rev=181944&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Support/BlkExprDeclBitVector.h (removed)<br>
@@ -1,307 +0,0 @@<br>
-// BlkExprDeclBitVector.h - Dataflow types for Bitvector Analysis --*- C++ --*--<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file provides definition of dataflow types used by analyses such<br>
-// as LiveVariables and UninitializedValues.  The underlying dataflow values<br>
-// are implemented as bitvectors, but the definitions in this file include<br>
-// the necessary boilerplate to use with our dataflow framework.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_STMTDECLBVDVAL_H<br>
-#define LLVM_CLANG_STMTDECLBVDVAL_H<br>
-<br>
-#include "clang/AST/Decl.h" // for Decl* -> NamedDecl* conversion<br>
-#include "clang/Analysis/CFG.h"<br>
-#include "llvm/ADT/BitVector.h"<br>
-#include "llvm/ADT/DenseMap.h"<br>
-<br>
-namespace clang {<br>
-<br>
-  class Stmt;<br>
-  class ASTContext;<br>
-<br>
-struct DeclBitVector_Types {<br>
-<br>
-  class Idx {<br>
-    unsigned I;<br>
-  public:<br>
-    explicit Idx(unsigned i) : I(i) {}<br>
-    Idx() : I(~0U) {}<br>
-<br>
-    bool isValid() const {<br>
-      return I != ~0U;<br>
-    }<br>
-    operator unsigned() const {<br>
-      assert (isValid());<br>
-      return I;<br>
-    }<br>
-  };<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // AnalysisDataTy - Whole-function meta data.<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  class AnalysisDataTy {<br>
-  public:<br>
-    typedef llvm::DenseMap<const NamedDecl*, unsigned > DMapTy;<br>
-    typedef DMapTy::const_iterator decl_iterator;<br>
-<br>
-  protected:<br>
-    DMapTy DMap;<br>
-    unsigned NDecls;<br>
-<br>
-  public:<br>
-<br>
-    AnalysisDataTy() : NDecls(0) {}<br>
-    virtual ~AnalysisDataTy() {}<br>
-<br>
-    bool isTracked(const NamedDecl *SD) { return DMap.find(SD) != DMap.end(); }<br>
-<br>
-    Idx getIdx(const NamedDecl *SD) const {<br>
-      DMapTy::const_iterator I = DMap.find(SD);<br>
-      return I == DMap.end() ? Idx() : Idx(I->second);<br>
-    }<br>
-<br>
-    unsigned getNumDecls() const { return NDecls; }<br>
-<br>
-    void Register(const NamedDecl *SD) {<br>
-      if (!isTracked(SD)) DMap[SD] = NDecls++;<br>
-    }<br>
-<br>
-    decl_iterator begin_decl() const { return DMap.begin(); }<br>
-    decl_iterator end_decl() const { return DMap.end(); }<br>
-  };<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // ValTy - Dataflow value.<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  class ValTy {<br>
-    llvm::BitVector DeclBV;<br>
-  public:<br>
-<br>
-    void resetDeclValues(AnalysisDataTy& AD) {<br>
-      DeclBV.resize(AD.getNumDecls());<br>
-      DeclBV.reset();<br>
-    }<br>
-<br>
-    void setDeclValues(AnalysisDataTy& AD) {<br>
-      DeclBV.resize(AD.getNumDecls());<br>
-      DeclBV.set();<br>
-    }<br>
-<br>
-    void resetValues(AnalysisDataTy& AD) {<br>
-      resetDeclValues(AD);<br>
-    }<br>
-<br>
-    bool operator==(const ValTy& RHS) const {<br>
-      assert (sizesEqual(RHS));<br>
-      return DeclBV == RHS.DeclBV;<br>
-    }<br>
-<br>
-    void copyValues(const ValTy& RHS) { DeclBV = RHS.DeclBV; }<br>
-<br>
-    llvm::BitVector::reference getBit(unsigned i) {<br>
-      return DeclBV[i];<br>
-    }<br>
-<br>
-    bool getBit(unsigned i) const {<br>
-      return DeclBV[i];<br>
-    }<br>
-<br>
-    llvm::BitVector::reference<br>
-    operator()(const NamedDecl *ND, const AnalysisDataTy& AD) {<br>
-      return getBit(AD.getIdx(ND));<br>
-    }<br>
-<br>
-    bool operator()(const NamedDecl *ND, const AnalysisDataTy& AD) const {<br>
-      return getBit(AD.getIdx(ND));<br>
-    }<br>
-<br>
-    llvm::BitVector::reference getDeclBit(unsigned i) { return DeclBV[i]; }<br>
-    const llvm::BitVector::reference getDeclBit(unsigned i) const {<br>
-      return const_cast<llvm::BitVector&>(DeclBV)[i];<br>
-    }<br>
-<br>
-    ValTy& operator|=(const ValTy& RHS) {<br>
-      assert (sizesEqual(RHS));<br>
-      DeclBV |= RHS.DeclBV;<br>
-      return *this;<br>
-    }<br>
-<br>
-    ValTy& operator&=(const ValTy& RHS) {<br>
-      assert (sizesEqual(RHS));<br>
-      DeclBV &= RHS.DeclBV;<br>
-      return *this;<br>
-    }<br>
-<br>
-    ValTy& OrDeclBits(const ValTy& RHS) {<br>
-      return operator|=(RHS);<br>
-    }<br>
-<br>
-    ValTy& AndDeclBits(const ValTy& RHS) {<br>
-      return operator&=(RHS);<br>
-    }<br>
-<br>
-    bool sizesEqual(const ValTy& RHS) const {<br>
-      return DeclBV.size() == RHS.DeclBV.size();<br>
-    }<br>
-  };<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // Some useful merge operations.<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  struct Union { void operator()(ValTy& Dst, ValTy& Src) { Dst |= Src; } };<br>
-  struct Intersect { void operator()(ValTy& Dst, ValTy& Src) { Dst &= Src; } };<br>
-};<br>
-<br>
-<br>
-struct StmtDeclBitVector_Types {<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // AnalysisDataTy - Whole-function meta data.<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  class AnalysisDataTy : public DeclBitVector_Types::AnalysisDataTy {<br>
-    ASTContext *ctx;<br>
-    CFG* cfg;<br>
-  public:<br>
-    AnalysisDataTy() : ctx(0), cfg(0) {}<br>
-    virtual ~AnalysisDataTy() {}<br>
-<br>
-    void setContext(ASTContext &c) { ctx = &c; }<br>
-    ASTContext &getContext() {<br>
-      assert(ctx && "ASTContext should not be NULL.");<br>
-      return *ctx;<br>
-    }<br>
-<br>
-    void setCFG(CFG& c) { cfg = &c; }<br>
-    CFG& getCFG() { assert(cfg && "CFG should not be NULL."); return *cfg; }<br>
-<br>
-    bool isTracked(const Stmt *S) { return cfg->isBlkExpr(S); }<br>
-    using DeclBitVector_Types::AnalysisDataTy::isTracked;<br>
-<br>
-    unsigned getIdx(const Stmt *S) const {<br>
-      CFG::BlkExprNumTy I = cfg->getBlkExprNum(S);<br>
-      assert(I && "Stmtession not tracked for bitvector.");<br>
-      return I;<br>
-    }<br>
-    using DeclBitVector_Types::AnalysisDataTy::getIdx;<br>
-<br>
-    unsigned getNumBlkExprs() const { return cfg->getNumBlkExprs(); }<br>
-  };<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // ValTy - Dataflow value.<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  class ValTy : public DeclBitVector_Types::ValTy {<br>
-    llvm::BitVector BlkExprBV;<br>
-    typedef DeclBitVector_Types::ValTy ParentTy;<br>
-<br>
-    static inline ParentTy& ParentRef(ValTy& X) {<br>
-      return static_cast<ParentTy&>(X);<br>
-    }<br>
-<br>
-    static inline const ParentTy& ParentRef(const ValTy& X) {<br>
-      return static_cast<const ParentTy&>(X);<br>
-    }<br>
-<br>
-  public:<br>
-<br>
-    void resetBlkExprValues(AnalysisDataTy& AD) {<br>
-      BlkExprBV.resize(AD.getNumBlkExprs());<br>
-      BlkExprBV.reset();<br>
-    }<br>
-<br>
-    void setBlkExprValues(AnalysisDataTy& AD) {<br>
-      BlkExprBV.resize(AD.getNumBlkExprs());<br>
-      BlkExprBV.set();<br>
-    }<br>
-<br>
-    void resetValues(AnalysisDataTy& AD) {<br>
-      resetDeclValues(AD);<br>
-      resetBlkExprValues(AD);<br>
-    }<br>
-<br>
-    void setValues(AnalysisDataTy& AD) {<br>
-      setDeclValues(AD);<br>
-      setBlkExprValues(AD);<br>
-    }<br>
-<br>
-    bool operator==(const ValTy& RHS) const {<br>
-      return ParentRef(*this) == ParentRef(RHS)<br>
-          && BlkExprBV == RHS.BlkExprBV;<br>
-    }<br>
-<br>
-    void copyValues(const ValTy& RHS) {<br>
-      ParentRef(*this).copyValues(ParentRef(RHS));<br>
-      BlkExprBV = RHS.BlkExprBV;<br>
-    }<br>
-<br>
-    llvm::BitVector::reference<br>
-    operator()(const Stmt *S, const AnalysisDataTy& AD) {<br>
-      return BlkExprBV[AD.getIdx(S)];<br>
-    }<br>
-    const llvm::BitVector::reference<br>
-    operator()(const Stmt *S, const AnalysisDataTy& AD) const {<br>
-      return const_cast<ValTy&>(*this)(S,AD);<br>
-    }<br>
-<br>
-    using DeclBitVector_Types::ValTy::operator();<br>
-<br>
-<br>
-    llvm::BitVector::reference getStmtBit(unsigned i) { return BlkExprBV[i]; }<br>
-    const llvm::BitVector::reference getStmtBit(unsigned i) const {<br>
-      return const_cast<llvm::BitVector&>(BlkExprBV)[i];<br>
-    }<br>
-<br>
-    ValTy& OrBlkExprBits(const ValTy& RHS) {<br>
-      BlkExprBV |= RHS.BlkExprBV;<br>
-      return *this;<br>
-    }<br>
-<br>
-    ValTy& AndBlkExprBits(const ValTy& RHS) {<br>
-      BlkExprBV &= RHS.BlkExprBV;<br>
-      return *this;<br>
-    }<br>
-<br>
-    ValTy& operator|=(const ValTy& RHS) {<br>
-      assert (sizesEqual(RHS));<br>
-      ParentRef(*this) |= ParentRef(RHS);<br>
-      BlkExprBV |= RHS.BlkExprBV;<br>
-      return *this;<br>
-    }<br>
-<br>
-    ValTy& operator&=(const ValTy& RHS) {<br>
-      assert (sizesEqual(RHS));<br>
-      ParentRef(*this) &= ParentRef(RHS);<br>
-      BlkExprBV &= RHS.BlkExprBV;<br>
-      return *this;<br>
-    }<br>
-<br>
-    bool sizesEqual(const ValTy& RHS) const {<br>
-      return ParentRef(*this).sizesEqual(ParentRef(RHS))<br>
-          && BlkExprBV.size() == RHS.BlkExprBV.size();<br>
-    }<br>
-  };<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // Some useful merge operations.<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  struct Union { void operator()(ValTy& Dst, ValTy& Src) { Dst |= Src; } };<br>
-  struct Intersect { void operator()(ValTy& Dst, ValTy& Src) { Dst &= Src; } };<br>
-<br>
-};<br>
-} // end namespace clang<br>
-<br>
-#endif<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=181944&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (removed)<br>
@@ -1,107 +0,0 @@<br>
-//= CFGRecStmtDeclVisitor - Recursive visitor of CFG stmts/decls -*- C++ --*-=//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file implements the template class CFGRecStmtDeclVisitor, which extends<br>
-// CFGRecStmtVisitor by implementing (typed) visitation of decls.<br>
-//<br>
-// FIXME: This may not be fully complete.  We currently explore only subtypes<br>
-//        of ScopedDecl.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_ANALYSIS_CFG_REC_STMT_DECL_VISITOR_H<br>
-#define LLVM_CLANG_ANALYSIS_CFG_REC_STMT_DECL_VISITOR_H<br>
-<br>
-#include "clang/AST/Decl.h"<br>
-#include "clang/AST/DeclCXX.h"<br>
-#include "clang/AST/DeclObjC.h"<br>
-#include "clang/Analysis/Visitors/CFGRecStmtVisitor.h"<br>
-<br>
-#define DISPATCH_CASE(CLASS)                                  \<br>
-case Decl::CLASS:                                             \<br>
-static_cast<ImplClass*>(this)->Visit##CLASS##Decl(            \<br>
-                               static_cast<CLASS##Decl*>(D)); \<br>
-break;<br>
-<br>
-#define DEFAULT_DISPATCH(CLASS) void Visit##CLASS##Decl(CLASS##Decl *D) {}<br>
-#define DEFAULT_DISPATCH_VARDECL(CLASS) void Visit##CLASS##Decl(CLASS##Decl *D)\<br>
-  { static_cast<ImplClass*>(this)->VisitVarDecl(D); }<br>
-<br>
-<br>
-namespace clang {<br>
-template <typename ImplClass><br>
-class CFGRecStmtDeclVisitor : public CFGRecStmtVisitor<ImplClass> {<br>
-public:<br>
-<br>
-  void VisitDeclRefExpr(DeclRefExpr *DR) {<br>
-    static_cast<ImplClass*>(this)->VisitDecl(DR->getDecl());<br>
-  }<br>
-<br>
-  void VisitDeclStmt(DeclStmt *DS) {<br>
-    for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end();<br>
-        DI != DE; ++DI) {<br>
-      Decl *D = *DI;<br>
-      static_cast<ImplClass*>(this)->VisitDecl(D);<br>
-      // Visit the initializer.<br>
-      if (VarDecl *VD = dyn_cast<VarDecl>(D))<br>
-        if (Expr *I = VD->getInit())<br>
-          static_cast<ImplClass*>(this)->Visit(I);<br>
-    }<br>
-  }<br>
-<br>
-  void VisitDecl(Decl *D) {<br>
-    switch (D->getKind()) {<br>
-        DISPATCH_CASE(Function)<br>
-        DISPATCH_CASE(CXXMethod)<br>
-        DISPATCH_CASE(Var)<br>
-        DISPATCH_CASE(ParmVar)       // FIXME: (same)<br>
-        DISPATCH_CASE(ImplicitParam)<br>
-        DISPATCH_CASE(EnumConstant)<br>
-        DISPATCH_CASE(Typedef)<br>
-        DISPATCH_CASE(TypeAlias)<br>
-        DISPATCH_CASE(Record)    // FIXME: Refine.  VisitStructDecl?<br>
-        DISPATCH_CASE(CXXRecord)<br>
-        DISPATCH_CASE(Enum)<br>
-        DISPATCH_CASE(Field)<br>
-        DISPATCH_CASE(UsingDirective)<br>
-        DISPATCH_CASE(Using)<br>
-        DISPATCH_CASE(NamespaceAlias)<br>
-      default:<br>
-        llvm_unreachable("Subtype of ScopedDecl not handled.");<br>
-    }<br>
-  }<br>
-<br>
-  DEFAULT_DISPATCH(Var)<br>
-  DEFAULT_DISPATCH(Function)<br>
-  DEFAULT_DISPATCH(CXXMethod)<br>
-  DEFAULT_DISPATCH_VARDECL(ParmVar)<br>
-  DEFAULT_DISPATCH(ImplicitParam)<br>
-  DEFAULT_DISPATCH(EnumConstant)<br>
-  DEFAULT_DISPATCH(Typedef)<br>
-  DEFAULT_DISPATCH(TypeAlias)<br>
-  DEFAULT_DISPATCH(Record)<br>
-  DEFAULT_DISPATCH(Enum)<br>
-  DEFAULT_DISPATCH(Field)<br>
-  DEFAULT_DISPATCH(ObjCInterface)<br>
-  DEFAULT_DISPATCH(ObjCMethod)<br>
-  DEFAULT_DISPATCH(ObjCProtocol)<br>
-  DEFAULT_DISPATCH(ObjCCategory)<br>
-  DEFAULT_DISPATCH(UsingDirective)<br>
-  DEFAULT_DISPATCH(Using)<br>
-  DEFAULT_DISPATCH(NamespaceAlias)<br>
-<br>
-  void VisitCXXRecordDecl(CXXRecordDecl *D) {<br>
-    static_cast<ImplClass*>(this)->VisitRecordDecl(D);<br>
-  }<br>
-};<br>
-<br>
-} // end namespace clang<br>
-<br>
-#undef DISPATCH_CASE<br>
-#undef DEFAULT_DISPATCH<br>
-#endif<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h?rev=181944&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h (removed)<br>
@@ -1,59 +0,0 @@<br>
-//==- CFGRecStmtVisitor - Recursive visitor of CFG statements ---*- C++ --*-==//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// This file implements the template class CFGRecStmtVisitor, which extends<br>
-// CFGStmtVisitor by implementing a default recursive visit of all statements.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_ANALYSIS_CFG_REC_STMT_VISITOR_H<br>
-#define LLVM_CLANG_ANALYSIS_CFG_REC_STMT_VISITOR_H<br>
-<br>
-#include "clang/Analysis/Visitors/CFGStmtVisitor.h"<br>
-<br>
-namespace clang {<br>
-template <typename ImplClass><br>
-class CFGRecStmtVisitor : public CFGStmtVisitor<ImplClass,void> {<br>
-public:<br>
-<br>
-  void VisitStmt(Stmt *S) {<br>
-    static_cast< ImplClass* >(this)->VisitChildren(S);<br>
-  }<br>
-<br>
-  void VisitCompoundStmt(CompoundStmt *S) {<br>
-    // Do nothing.  Everything in a CompoundStmt is inlined<br>
-    // into the CFG.<br>
-  }<br>
-<br>
-  void VisitConditionVariableInit(Stmt *S) {<br>
-    assert(S == this->getCurrentBlkStmt());<br>
-    VarDecl *CondVar = 0;<br>
-    switch (S->getStmtClass()) {<br>
-#define CONDVAR_CASE(CLASS) \<br>
-case Stmt::CLASS ## Class:\<br>
-CondVar = cast<CLASS>(S)->getConditionVariable();\<br>
-break;<br>
-        CONDVAR_CASE(IfStmt)<br>
-        CONDVAR_CASE(ForStmt)<br>
-        CONDVAR_CASE(SwitchStmt)<br>
-        CONDVAR_CASE(WhileStmt)<br>
-#undef CONDVAR_CASE<br>
-      default:<br>
-        llvm_unreachable("Infeasible");<br>
-    }<br>
-    static_cast<ImplClass*>(this)->Visit(CondVar->getInit());<br>
-  }<br>
-<br>
-  // Defining operator() allows the visitor to be used as a C++ style functor.<br>
-  void operator()(Stmt *S) { static_cast<ImplClass*>(this)->BlockStmt_Visit(S);}<br>
-};<br>
-<br>
-} // end namespace clang<br>
-<br>
-#endif<br>
<br>
Removed: cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h?rev=181944&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h?rev=181944&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGStmtVisitor.h (removed)<br>
@@ -1,175 +0,0 @@<br>
-//===--- CFGStmtVisitor.h - Visitor for Stmts in a CFG ----------*- C++ -*-===//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-//  This file defines the CFGStmtVisitor interface, which extends<br>
-//  StmtVisitor.  This interface is useful for visiting statements in a CFG<br>
-//  where some statements have implicit control-flow and thus should<br>
-//  be treated specially.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_CLANG_ANALYSIS_CFGSTMTVISITOR_H<br>
-#define LLVM_CLANG_ANALYSIS_CFGSTMTVISITOR_H<br>
-<br>
-#include "clang/AST/StmtVisitor.h"<br>
-#include "clang/Analysis/CFG.h"<br>
-<br>
-namespace clang {<br>
-<br>
-#define DISPATCH_CASE(CLASS) \<br>
-case Stmt::CLASS ## Class: return \<br>
-static_cast<ImplClass*>(this)->BlockStmt_Visit ## CLASS(static_cast<CLASS*>(S));<br>
-<br>
-#define DEFAULT_BLOCKSTMT_VISIT(CLASS) RetTy BlockStmt_Visit ## CLASS(CLASS *S)\<br>
-{ return\<br>
-  static_cast<ImplClass*>(this)->BlockStmt_VisitImplicitControlFlowExpr(\<br>
-  cast<Expr>(S)); }<br>
-<br>
-template <typename ImplClass, typename RetTy=void><br>
-class CFGStmtVisitor : public StmtVisitor<ImplClass,RetTy> {<br>
-  Stmt *CurrentBlkStmt;<br>
-<br>
-  struct NullifyStmt {<br>
-    Stmt*& S;<br>
-<br>
-    NullifyStmt(Stmt*& s) : S(s) {}<br>
-    ~NullifyStmt() { S = NULL; }<br>
-  };<br>
-<br>
-public:<br>
-  CFGStmtVisitor() : CurrentBlkStmt(NULL) {}<br>
-<br>
-  Stmt *getCurrentBlkStmt() const { return CurrentBlkStmt; }<br>
-<br>
-  RetTy Visit(Stmt *S) {<br>
-    if (S == CurrentBlkStmt ||<br>
-        !static_cast<ImplClass*>(this)->getCFG().isBlkExpr(S))<br>
-      return StmtVisitor<ImplClass,RetTy>::Visit(S);<br>
-    else<br>
-      return RetTy();<br>
-  }<br>
-<br>
-  /// VisitConditionVariableInit - Handle the initialization of condition<br>
-  ///  variables at branches.  Valid statements include IfStmt, ForStmt,<br>
-  ///  WhileStmt, and SwitchStmt.<br>
-  RetTy VisitConditionVariableInit(Stmt *S) {<br>
-    return RetTy();<br>
-  }<br>
-<br>
-  /// BlockVisit_XXX - Visitor methods for visiting the "root" statements in<br>
-  /// CFGBlocks.  Root statements are the statements that appear explicitly in<br>
-  /// the list of statements in a CFGBlock.  For substatements, or when there<br>
-  /// is no implementation provided for a BlockStmt_XXX method, we default<br>
-  /// to using StmtVisitor's Visit method.<br>
-  RetTy BlockStmt_Visit(Stmt *S) {<br>
-    CurrentBlkStmt = S;<br>
-    NullifyStmt cleanup(CurrentBlkStmt);<br>
-<br>
-    switch (S->getStmtClass()) {<br>
-      case Stmt::IfStmtClass:<br>
-      case Stmt::ForStmtClass:<br>
-      case Stmt::WhileStmtClass:<br>
-      case Stmt::SwitchStmtClass:<br>
-        return static_cast<ImplClass*>(this)->VisitConditionVariableInit(S);<br>
-<br>
-      DISPATCH_CASE(StmtExpr)<br>
-      DISPATCH_CASE(ConditionalOperator)<br>
-      DISPATCH_CASE(BinaryConditionalOperator)<br>
-      DISPATCH_CASE(ObjCForCollectionStmt)<br>
-      DISPATCH_CASE(CXXForRangeStmt)<br>
-<br>
-      case Stmt::BinaryOperatorClass: {<br>
-        BinaryOperator* B = cast<BinaryOperator>(S);<br>
-        if (B->isLogicalOp())<br>
-          return static_cast<ImplClass*>(this)->BlockStmt_VisitLogicalOp(B);<br>
-        else if (B->getOpcode() == BO_Comma)<br>
-          return static_cast<ImplClass*>(this)->BlockStmt_VisitComma(B);<br>
-        // Fall through.<br>
-      }<br>
-<br>
-      default:<br>
-        if (isa<Expr>(S))<br>
-          return<br>
-            static_cast<ImplClass*>(this)->BlockStmt_VisitExpr(cast<Expr>(S));<br>
-        else<br>
-          return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(S);<br>
-    }<br>
-  }<br>
-<br>
-  DEFAULT_BLOCKSTMT_VISIT(StmtExpr)<br>
-  DEFAULT_BLOCKSTMT_VISIT(ConditionalOperator)<br>
-  DEFAULT_BLOCKSTMT_VISIT(BinaryConditionalOperator)<br>
-<br>
-  RetTy BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {<br>
-    return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(S);<br>
-  }<br>
-<br>
-  RetTy BlockStmt_VisitCXXForRangeStmt(CXXForRangeStmt *S) {<br>
-    return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(S);<br>
-  }<br>
-<br>
-  RetTy BlockStmt_VisitImplicitControlFlowExpr(Expr *E) {<br>
-    return static_cast<ImplClass*>(this)->BlockStmt_VisitExpr(E);<br>
-  }<br>
-<br>
-  RetTy BlockStmt_VisitExpr(Expr *E) {<br>
-    return static_cast<ImplClass*>(this)->BlockStmt_VisitStmt(E);<br>
-  }<br>
-<br>
-  RetTy BlockStmt_VisitStmt(Stmt *S) {<br>
-    return static_cast<ImplClass*>(this)->Visit(S);<br>
-  }<br>
-<br>
-  RetTy BlockStmt_VisitLogicalOp(BinaryOperator* B) {<br>
-    return<br>
-     static_cast<ImplClass*>(this)->BlockStmt_VisitImplicitControlFlowExpr(B);<br>
-  }<br>
-<br>
-  RetTy BlockStmt_VisitComma(BinaryOperator* B) {<br>
-    return<br>
-     static_cast<ImplClass*>(this)->BlockStmt_VisitImplicitControlFlowExpr(B);<br>
-  }<br>
-<br>
-  //===--------------------------------------------------------------------===//<br>
-  // Utility methods.  Not called by default (but subclasses may use them).<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  /// VisitChildren: Call "Visit" on each child of S.<br>
-  void VisitChildren(Stmt *S) {<br>
-<br>
-    switch (S->getStmtClass()) {<br>
-      default:<br>
-        break;<br>
-<br>
-      case Stmt::StmtExprClass: {<br>
-        CompoundStmt *CS = cast<StmtExpr>(S)->getSubStmt();<br>
-        if (CS->body_empty()) return;<br>
-        static_cast<ImplClass*>(this)->Visit(CS->body_back());<br>
-        return;<br>
-      }<br>
-<br>
-      case Stmt::BinaryOperatorClass: {<br>
-        BinaryOperator* B = cast<BinaryOperator>(S);<br>
-        if (B->getOpcode() != BO_Comma) break;<br>
-        static_cast<ImplClass*>(this)->Visit(B->getRHS());<br>
-        return;<br>
-      }<br>
-    }<br>
-<br>
-    for (Stmt::child_range I = S->children(); I; ++I)<br>
-      if (*I) static_cast<ImplClass*>(this)->Visit(*I);<br>
-  }<br>
-};<br>
-<br>
-#undef DEFAULT_BLOCKSTMT_VISIT<br>
-#undef DISPATCH_CASE<br>
-<br>
-}  // end namespace clang<br>
-<br>
-#endif<br>
<br>
Modified: cfe/trunk/lib/Analysis/CFG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=181945&r1=181944&r2=181945&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Analysis/CFG.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/CFG.cpp Wed May 15 18:22:55 2013<br>
@@ -3400,113 +3400,6 @@ bool CFGImplicitDtor::isNoReturn(ASTCont<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
-// CFG: Queries for BlkExprs.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-namespace {<br>
-  typedef llvm::DenseMap<const Stmt*,unsigned> BlkExprMapTy;<br>
-}<br>
-<br>
-static void FindSubExprAssignments(const Stmt *S,<br>
-                                   llvm::SmallPtrSet<const Expr*,50>& Set) {<br>
-  if (!S)<br>
-    return;<br>
-<br>
-  for (Stmt::const_child_range I = S->children(); I; ++I) {<br>
-    const Stmt *child = *I;<br>
-    if (!child)<br>
-      continue;<br>
-<br>
-    if (const BinaryOperator* B = dyn_cast<BinaryOperator>(child))<br>
-      if (B->isAssignmentOp()) Set.insert(B);<br>
-<br>
-    FindSubExprAssignments(child, Set);<br>
-  }<br>
-}<br>
-<br>
-static BlkExprMapTy* PopulateBlkExprMap(CFG& cfg) {<br>
-  BlkExprMapTy* M = new BlkExprMapTy();<br>
-<br>
-  // Look for assignments that are used as subexpressions.  These are the only<br>
-  // assignments that we want to *possibly* register as a block-level<br>
-  // expression.  Basically, if an assignment occurs both in a subexpression and<br>
-  // at the block-level, it is a block-level expression.<br>
-  llvm::SmallPtrSet<const Expr*,50> SubExprAssignments;<br>
-<br>
-  for (CFG::iterator I=cfg.begin(), E=cfg.end(); I != E; ++I)<br>
-    for (CFGBlock::iterator BI=(*I)->begin(), EI=(*I)->end(); BI != EI; ++BI)<br>
-      if (Optional<CFGStmt> S = BI->getAs<CFGStmt>())<br>
-        FindSubExprAssignments(S->getStmt(), SubExprAssignments);<br>
-<br>
-  for (CFG::iterator I=cfg.begin(), E=cfg.end(); I != E; ++I) {<br>
-<br>
-    // Iterate over the statements again on identify the Expr* and Stmt* at the<br>
-    // block-level that are block-level expressions.<br>
-<br>
-    for (CFGBlock::iterator BI=(*I)->begin(), EI=(*I)->end(); BI != EI; ++BI) {<br>
-      Optional<CFGStmt> CS = BI->getAs<CFGStmt>();<br>
-      if (!CS)<br>
-        continue;<br>
-      if (const Expr *Exp = dyn_cast<Expr>(CS->getStmt())) {<br>
-        assert((Exp->IgnoreParens() == Exp) && "No parens on block-level exps");<br>
-<br>
-        if (const BinaryOperator* B = dyn_cast<BinaryOperator>(Exp)) {<br>
-          // Assignment expressions that are not nested within another<br>
-          // expression are really "statements" whose value is never used by<br>
-          // another expression.<br>
-          if (B->isAssignmentOp() && !SubExprAssignments.count(Exp))<br>
-            continue;<br>
-        } else if (const StmtExpr *SE = dyn_cast<StmtExpr>(Exp)) {<br>
-          // Special handling for statement expressions.  The last statement in<br>
-          // the statement expression is also a block-level expr.<br>
-          const CompoundStmt *C = SE->getSubStmt();<br>
-          if (!C->body_empty()) {<br>
-            const Stmt *Last = C->body_back();<br>
-            if (const Expr *LastEx = dyn_cast<Expr>(Last))<br>
-              Last = LastEx->IgnoreParens();<br>
-            unsigned x = M->size();<br>
-            (*M)[Last] = x;<br>
-          }<br>
-        }<br>
-<br>
-        unsigned x = M->size();<br>
-        (*M)[Exp] = x;<br>
-      }<br>
-    }<br>
-<br>
-    // Look at terminators.  The condition is a block-level expression.<br>
-<br>
-    Stmt *S = (*I)->getTerminatorCondition();<br>
-<br>
-    if (S && M->find(S) == M->end()) {<br>
-      unsigned x = M->size();<br>
-      (*M)[S] = x;<br>
-    }<br>
-  }<br>
-<br>
-  return M;<br>
-}<br>
-<br>
-CFG::BlkExprNumTy CFG::getBlkExprNum(const Stmt *S) {<br>
-  assert(S != NULL);<br>
-  if (!BlkExprMap) { BlkExprMap = (void*) PopulateBlkExprMap(*this); }<br>
-<br>
-  BlkExprMapTy* M = reinterpret_cast<BlkExprMapTy*>(BlkExprMap);<br>
-  BlkExprMapTy::iterator I = M->find(S);<br>
-  return (I == M->end()) ? CFG::BlkExprNumTy() : CFG::BlkExprNumTy(I->second);<br>
-}<br>
-<br>
-unsigned CFG::getNumBlkExprs() {<br>
-  if (const BlkExprMapTy* M = reinterpret_cast<const BlkExprMapTy*>(BlkExprMap))<br>
-    return M->size();<br>
-<br>
-  // We assume callers interested in the number of BlkExprs will want<br>
-  // the map constructed if it doesn't already exist.<br>
-  BlkExprMap = (void*) PopulateBlkExprMap(*this);<br>
-  return reinterpret_cast<BlkExprMapTy*>(BlkExprMap)->size();<br>
-}<br>
-<br>
-//===----------------------------------------------------------------------===//<br>
 // Filtered walking of the CFG.<br>
 //===----------------------------------------------------------------------===//<br>
<br>
@@ -3530,14 +3423,6 @@ bool CFGBlock::FilterEdge(const CFGBlock<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
-// Cleanup: CFG dstor.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-CFG::~CFG() {<br>
-  delete reinterpret_cast<const BlkExprMapTy*>(BlkExprMap);<br>
-}<br>
-<br>
-//===----------------------------------------------------------------------===//<br>
 // CFG pretty printing<br>
 //===----------------------------------------------------------------------===//<br>
<br>
<br>
Modified: cfe/trunk/lib/Analysis/UninitializedValues.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/UninitializedValues.cpp?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/UninitializedValues.cpp?rev=181945&r1=181944&r2=181945&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Analysis/UninitializedValues.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/UninitializedValues.cpp Wed May 15 18:22:55 2013<br>
@@ -14,12 +14,12 @@<br>
 #include "clang/AST/ASTContext.h"<br>
 #include "clang/AST/Attr.h"<br>
 #include "clang/AST/Decl.h"<br>
+#include "clang/AST/StmtVisitor.h"<br>
 #include "clang/Analysis/Analyses/PostOrderCFGView.h"<br>
 #include "clang/Analysis/Analyses/UninitializedValues.h"<br>
 #include "clang/Analysis/AnalysisContext.h"<br>
 #include "clang/Analysis/CFG.h"<br>
 #include "clang/Analysis/DomainSpecific/ObjCNoReturn.h"<br>
-#include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h"<br>
 #include "llvm/ADT/DenseMap.h"<br>
 #include "llvm/ADT/Optional.h"<br>
 #include "llvm/ADT/PackedVector.h"<br>
<br>
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp?rev=181945&r1=181944&r2=181945&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp?rev=181945&r1=181944&r2=181945&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp (original)<br>
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp Wed May 15 18:22:55 2013<br>
@@ -18,7 +18,6 @@<br>
 #include "clang/AST/ParentMap.h"<br>
 #include "clang/AST/RecursiveASTVisitor.h"<br>
 #include "clang/Analysis/Analyses/LiveVariables.h"<br>
-#include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h"<br>
 #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"<br>
 #include "clang/StaticAnalyzer/Core/Checker.h"<br>
 #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"<br>
@@ -391,26 +390,24 @@ public:<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 namespace {<br>
-class FindEscaped : public CFGRecStmtDeclVisitor<FindEscaped>{<br>
-  CFG *cfg;<br>
+class FindEscaped {<br>
 public:<br>
-  FindEscaped(CFG *c) : cfg(c) {}<br>
-<br>
-  CFG& getCFG() { return *cfg; }<br>
-<br>
   llvm::SmallPtrSet<const VarDecl*, 20> Escaped;<br>
<br>
-  void VisitUnaryOperator(UnaryOperator* U) {<br>
-    // Check for '&'.  Any VarDecl whose value has its address-taken we<br>
-    // treat as escaped.<br>
-    Expr *E = U->getSubExpr()->IgnoreParenCasts();<br>
-    if (U->getOpcode() == UO_AddrOf)<br>
-      if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E))<br>
-        if (VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) {<br>
-          Escaped.insert(VD);<br>
-          return;<br>
-        }<br>
-    Visit(E);<br>
+  void operator()(const Stmt *S) {<br>
+    // Check for '&'. Any VarDecl whose address has been taken we treat as<br>
+    // escaped.<br>
+    // FIXME: What about references?<br>
+    const UnaryOperator *U = dyn_cast<UnaryOperator>(S);<br>
+    if (!U)<br>
+      return;<br>
+    if (U->getOpcode() != UO_AddrOf)<br>
+      return;<br>
+<br>
+    const Expr *E = U->getSubExpr()->IgnoreParenCasts();<br>
+    if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E))<br>
+      if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl()))<br>
+        Escaped.insert(VD);<br>
   }<br>
 };<br>
 } // end anonymous namespace<br>
@@ -438,8 +435,8 @@ public:<br>
       CFG &cfg = *mgr.getCFG(D);<br>
       AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D);<br>
       ParentMap &pmap = mgr.getParentMap(D);<br>
-      FindEscaped FS(&cfg);<br>
-      FS.getCFG().VisitBlockStmts(FS);<br>
+      FindEscaped FS;<br>
+      cfg.VisitBlockStmts(FS);<br>
       DeadStoreObs A(cfg, BR.getContext(), BR, AC, pmap, FS.Escaped);<br>
       L->runOnAllBlocks(A);<br>
     }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>