$FreeBSD: head/devel/llvm32/files/patch-svn-r178240 340725 2014-01-22 17:40:44Z mat $ ------------------------------------------------------------------------ r178240 | hhinnant | 2013-03-28 15:47:50 +0000 (Thu, 28 Mar 2013) | 17 lines Seciton 24.2.2 of the C++ standard, [iterator.iterators], Table 106 requires that the return type of *r for all iterators r be reference, where reference is defined in [iterator.requirements.general]/p11 as iterator_traits::reference, and X is the type of r. But in CFG.h, the dereference operator of PredIterator and SuccIterator return pointer, not reference. Furthermore the nested type reference is value_type&, which is not the type returned from operator*(). This patch simply makes the iterator::reference type value_type*, which is what the operator*() returns, and then re-lables the return type as reference. From a functionality point of view, the only difference is that the nested reference type is now value_type* instead of value_type&. ------------------------------------------------------------------------ Index: include/llvm/Support/CFG.h =================================================================== --- include/llvm/Support/CFG.h (revision 178239) +++ include/llvm/Support/CFG.h (revision 178240) @@ -27,8 +27,9 @@ template // Predecessor Iterator class PredIterator : public std::iterator { - typedef std::iterator super; + Ptr, ptrdiff_t, Ptr*, Ptr*> { + typedef std::iterator super; typedef PredIterator Self; USE_iterator It; @@ -40,6 +41,7 @@ public: typedef typename super::pointer pointer; + typedef typename super::reference reference; PredIterator() {} explicit inline PredIterator(Ptr *bb) : It(bb->use_begin()) { @@ -50,7 +52,7 @@ inline bool operator==(const Self& x) const { return It == x.It; } inline bool operator!=(const Self& x) const { return !operator==(x); } - inline pointer operator*() const { + inline reference operator*() const { assert(!It.atEnd() && "pred_iterator out of range!"); return cast(*It)->getParent(); } @@ -100,10 +102,11 @@ template // Successor Iterator class SuccIterator : public std::iterator { + BB_, ptrdiff_t, BB_*, BB_*> { const Term_ Term; unsigned idx; - typedef std::iterator super; + typedef std::iterator super; typedef SuccIterator Self; inline bool index_is_valid(int idx) { @@ -112,6 +115,7 @@ public: typedef typename super::pointer pointer; + typedef typename super::reference reference; // TODO: This can be random access iterator, only operator[] missing. explicit inline SuccIterator(Term_ T) : Term(T), idx(0) {// begin iterator @@ -142,7 +146,7 @@ inline bool operator==(const Self& x) const { return idx == x.idx; } inline bool operator!=(const Self& x) const { return !operator==(x); } - inline pointer operator*() const { return Term->getSuccessor(idx); } + inline reference operator*() const { return Term->getSuccessor(idx); } inline pointer operator->() const { return operator*(); } inline Self& operator++() { ++idx; return *this; } // Preincrement