Updated CFGStmtVisitor and CFGRecStmtVisitor to have a notion of
"block-expressions" when visiting arbitrary expressions (via calls to
"Visit()").  This results in a refactoring where a dataflow analysis no
longer needs to always special case when handling block-expressions versus
non-block expressions.

Updated LiveVariables and UninitializedValues to conform to the slightly
altered interface of these visitor classes.

Thanks to Nuno Lopes for providing a test case that illustrated some
fundamental problems in the current design of the CFGXXXStmtVisitor classes
and how they were used.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44246 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/LiveVariables.cpp b/Analysis/LiveVariables.cpp
index 3118a30..eba1a77 100644
--- a/Analysis/LiveVariables.cpp
+++ b/Analysis/LiveVariables.cpp
@@ -35,6 +35,7 @@
 public:
   RegisterDecls(LiveVariables::AnalysisDataTy& ad) : AD(ad) {}  
   void VisitVarDecl(VarDecl* VD) { AD.Register(VD); }
+  CFG& getCFG() { return AD.getCFG(); }
 };
 } // end anonymous namespace
 
@@ -52,34 +53,25 @@
 static const bool Alive = true;
 static const bool Dead = false;  
 
-class TransferFuncs : public CFGStmtVisitor<TransferFuncs> {
+class TransferFuncs : public CFGRecStmtVisitor<TransferFuncs> {
   LiveVariables::AnalysisDataTy& AD;
   LiveVariables::ValTy LiveState;
 public:
   TransferFuncs(LiveVariables::AnalysisDataTy& ad) : AD(ad) {}
 
   LiveVariables::ValTy& getVal() { return LiveState; }
+  CFG& getCFG() { return AD.getCFG(); }
   
   void VisitDeclRefExpr(DeclRefExpr* DR);
   void VisitBinaryOperator(BinaryOperator* B);
   void VisitAssign(BinaryOperator* B);
   void VisitDeclStmt(DeclStmt* DS);
   void VisitUnaryOperator(UnaryOperator* U);
-  void VisitStmt(Stmt* S);
-  void VisitExpr(Expr* E);
-  void BlockStmt_VisitExpr(Expr *E);    
   void Visit(Stmt *S);
   
   DeclRefExpr* FindDeclRef(Stmt *S);
 };
-
-void TransferFuncs::VisitExpr(Expr * E) {
-  if (AD.getCFG().isBlkExpr(E)) return;
-  else VisitStmt(E);
-}
       
-void TransferFuncs::VisitStmt(Stmt* S) { VisitChildren(S); }
-
 void TransferFuncs::Visit(Stmt *S) {
   if (AD.Observer)
     AD.Observer->ObserveStmt(S,AD,LiveState);
@@ -160,11 +152,6 @@
     LiveState(D,AD) = Dead;
 }
   
-void TransferFuncs::BlockStmt_VisitExpr(Expr* E) {
-  assert (AD.getCFG().isBlkExpr(E));
-  VisitChildren(E);
-}
-  
 } // end anonymous namespace
 
 //===----------------------------------------------------------------------===//