]> granicus.if.org Git - clang/commitdiff
Modified operator* for StmtIterator to return Stmt*& instead of Stmt*.
authorTed Kremenek <kremenek@apple.com>
Wed, 24 Oct 2007 16:52:34 +0000 (16:52 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 24 Oct 2007 16:52:34 +0000 (16:52 +0000)
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

AST/StmtIterator.cpp
include/clang/AST/Decl.h
include/clang/AST/StmtIterator.h

index b7a03bbb2c995232e0c9b9910dae2db4aaaeee0f..2d198c029d949dcdb1dd4b29b2f0a528e94e3d4a 100644 (file)
@@ -61,6 +61,6 @@ void StmtIteratorBase::PrevDecl() {
   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);
 }
index adedf539e9a65847026447c51083049f4fe15e02..d06481fbdd3909360e742cafb90bbb83148a17a5 100644 (file)
@@ -269,7 +269,7 @@ protected:
 private:
   StorageClass SClass;
   Expr *Init;  
-  friend struct StmtIterator;
+  friend class StmtIteratorBase;
 };
 
 /// BlockVarDecl - Represent a local variable declaration.
index f347636fae6b73ff2d9c5c3301bfb2f9d8abf381..3752793c9fd146c65da7b1c09bbd6df897baf94f 100644 (file)
@@ -28,7 +28,7 @@ protected:
   
   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 @@ protected:
 };
   
   
-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 @@ public:
     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,