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,