Modified operator* for StmtIterator to return Stmt*& instead of Stmt*.
This permits in-place replacement of the original AST statements.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43295 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/StmtIterator.cpp b/AST/StmtIterator.cpp
index b7a03bb..2d198c0 100644
--- a/AST/StmtIterator.cpp
+++ b/AST/StmtIterator.cpp
@@ -61,6 +61,6 @@
   Ptr.D = lastVD;
 }
 
-Stmt* StmtIteratorBase::GetInitializer() const {
-  return cast<VarDecl>(Ptr.D)->getInit();
+Stmt*& StmtIteratorBase::GetInitializer() const {
+  return reinterpret_cast<Stmt*&>(cast<VarDecl>(Ptr.D)->Init);
 }
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h
index adedf53..d06481f 100644
--- a/include/clang/AST/Decl.h
+++ b/include/clang/AST/Decl.h
@@ -269,7 +269,7 @@
 private:
   StorageClass SClass;
   Expr *Init;  
-  friend struct StmtIterator;
+  friend class StmtIteratorBase;
 };
 
 /// BlockVarDecl - Represent a local variable declaration.
diff --git a/include/clang/AST/StmtIterator.h b/include/clang/AST/StmtIterator.h
index f347636..3752793 100644
--- a/include/clang/AST/StmtIterator.h
+++ b/include/clang/AST/StmtIterator.h
@@ -28,7 +28,7 @@
   
   void NextDecl();
   void PrevDecl();
-  Stmt* GetInitializer() const;
+  Stmt*& GetInitializer() const;
 
   StmtIteratorBase(Stmt** s) : FirstDecl(NULL) { Ptr.S = s; }
   StmtIteratorBase(ScopedDecl* d);
@@ -36,11 +36,11 @@
 };
   
   
-template <typename DERIVED, typename STMT_PTR>
+template <typename DERIVED, typename REFERENCE>
 class StmtIteratorImpl : public StmtIteratorBase, 
                          public std::iterator<std::bidirectional_iterator_tag,
-                                              STMT_PTR, ptrdiff_t, 
-                                              STMT_PTR, STMT_PTR> {  
+                                              REFERENCE, ptrdiff_t, 
+                                              REFERENCE, REFERENCE> {  
 protected:
   StmtIteratorImpl(const StmtIteratorBase& RHS) : StmtIteratorBase(RHS) {}
 public:
@@ -83,17 +83,17 @@
     return FirstDecl != RHS.FirstDecl || Ptr.S != RHS.Ptr.S;
   }
   
-  STMT_PTR operator*() const { 
-    return (STMT_PTR) (FirstDecl ? GetInitializer() : *Ptr.S);
+  REFERENCE operator*() const { 
+    return (REFERENCE) (FirstDecl ? GetInitializer() : *Ptr.S);
   }
   
-  STMT_PTR operator->() const { return operator*(); }   
+  REFERENCE operator->() const { return operator*(); }   
 };
 
-struct StmtIterator : public StmtIteratorImpl<StmtIterator,Stmt*> {
-  explicit StmtIterator() : StmtIteratorImpl<StmtIterator,Stmt*>() {}
-  StmtIterator(Stmt** S) : StmtIteratorImpl<StmtIterator,Stmt*>(S) {}
-  StmtIterator(ScopedDecl* D) : StmtIteratorImpl<StmtIterator,Stmt*>(D) {}
+struct StmtIterator : public StmtIteratorImpl<StmtIterator,Stmt*&> {
+  explicit StmtIterator() : StmtIteratorImpl<StmtIterator,Stmt*&>() {}
+  StmtIterator(Stmt** S) : StmtIteratorImpl<StmtIterator,Stmt*&>(S) {}
+  StmtIterator(ScopedDecl* D) : StmtIteratorImpl<StmtIterator,Stmt*&>(D) {}
 };
 
 struct ConstStmtIterator : public StmtIteratorImpl<ConstStmtIterator,