diff --git a/lib/StaticAnalyzer/CFRefCount.cpp b/lib/StaticAnalyzer/CFRefCount.cpp
index 6fda42c..d4bed35 100644
--- a/lib/StaticAnalyzer/CFRefCount.cpp
+++ b/lib/StaticAnalyzer/CFRefCount.cpp
@@ -91,17 +91,17 @@
 }
 
 namespace {
-class GenericNodeBuilder {
+class GenericNodeBuilderRefCount {
   StmtNodeBuilder *SNB;
   const Stmt *S;
   const void *tag;
   EndOfFunctionNodeBuilder *ENB;
 public:
-  GenericNodeBuilder(StmtNodeBuilder &snb, const Stmt *s,
+  GenericNodeBuilderRefCount(StmtNodeBuilder &snb, const Stmt *s,
                      const void *t)
   : SNB(&snb), S(s), tag(t), ENB(0) {}
 
-  GenericNodeBuilder(EndOfFunctionNodeBuilder &enb)
+  GenericNodeBuilderRefCount(EndOfFunctionNodeBuilder &enb)
   : SNB(0), S(0), tag(0), ENB(&enb) {}
 
   ExplodedNode *MakeNode(const GRState *state, ExplodedNode *Pred) {
@@ -1659,7 +1659,7 @@
 
   ExplodedNode* ProcessLeaks(const GRState * state,
                                       llvm::SmallVectorImpl<SymbolRef> &Leaked,
-                                      GenericNodeBuilder &Builder,
+                                      GenericNodeBuilderRefCount &Builder,
                                       ExprEngine &Eng,
                                       ExplodedNode *Pred = 0);
 
@@ -1728,7 +1728,7 @@
                                SymbolReaper& SymReaper);
 
   std::pair<ExplodedNode*, const GRState *>
-  HandleAutoreleaseCounts(const GRState * state, GenericNodeBuilder Bd,
+  HandleAutoreleaseCounts(const GRState * state, GenericNodeBuilderRefCount Bd,
                           ExplodedNode* Pred, ExprEngine &Eng,
                           SymbolRef Sym, RefVal V, bool &stop);
   // Return statements.
@@ -2891,7 +2891,7 @@
 
   // Update the autorelease counts.
   static unsigned autoreleasetag = 0;
-  GenericNodeBuilder Bd(Builder, S, &autoreleasetag);
+  GenericNodeBuilderRefCount Bd(Builder, S, &autoreleasetag);
   bool stop = false;
   llvm::tie(Pred, state) = HandleAutoreleaseCounts(state , Bd, Pred, Eng, Sym,
                                                    X, stop);
@@ -3139,7 +3139,8 @@
 //===----------------------------------------------------------------------===//
 
 std::pair<ExplodedNode*, const GRState *>
-CFRefCount::HandleAutoreleaseCounts(const GRState * state, GenericNodeBuilder Bd,
+CFRefCount::HandleAutoreleaseCounts(const GRState * state, 
+                                    GenericNodeBuilderRefCount Bd,
                                     ExplodedNode* Pred,
                                     ExprEngine &Eng,
                                     SymbolRef Sym, RefVal V, bool &stop) {
@@ -3224,7 +3225,7 @@
 ExplodedNode*
 CFRefCount::ProcessLeaks(const GRState * state,
                          llvm::SmallVectorImpl<SymbolRef> &Leaked,
-                         GenericNodeBuilder &Builder,
+                         GenericNodeBuilderRefCount &Builder,
                          ExprEngine& Eng,
                          ExplodedNode *Pred) {
 
@@ -3253,7 +3254,7 @@
                              EndOfFunctionNodeBuilder& Builder) {
 
   const GRState *state = Builder.getState();
-  GenericNodeBuilder Bd(Builder);
+  GenericNodeBuilderRefCount Bd(Builder);
   RefBindings B = state->get<RefBindings>();
   ExplodedNode *Pred = 0;
 
@@ -3292,7 +3293,7 @@
     if (const RefVal* T = B.lookup(Sym)){
       // Use the symbol as the tag.
       // FIXME: This might not be as unique as we would like.
-      GenericNodeBuilder Bd(Builder, S, Sym);
+      GenericNodeBuilderRefCount Bd(Builder, S, Sym);
       bool stop = false;
       llvm::tie(Pred, state) = HandleAutoreleaseCounts(state, Bd, Pred, Eng,
                                                        Sym, *T, stop);
@@ -3312,7 +3313,7 @@
 
   static unsigned LeakPPTag = 0;
   {
-    GenericNodeBuilder Bd(Builder, S, &LeakPPTag);
+    GenericNodeBuilderRefCount Bd(Builder, S, &LeakPPTag);
     Pred = ProcessLeaks(state, Leaked, Bd, Eng, Pred);
   }
 
