From owner-svn-src-all@FreeBSD.ORG Sat May 11 21:23:56 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id B36F23B1; Sat, 11 May 2013 21:23:56 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id A4EF1980; Sat, 11 May 2013 21:23:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r4BLNu9t074744; Sat, 11 May 2013 21:23:56 GMT (envelope-from dim@svn.freebsd.org) Received: (from dim@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r4BLNuQa074743; Sat, 11 May 2013 21:23:56 GMT (envelope-from dim@svn.freebsd.org) Message-Id: <201305112123.r4BLNuQa074743@svn.freebsd.org> From: Dimitry Andric Date: Sat, 11 May 2013 21:23:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r250529 - stable/9/contrib/llvm/include/llvm/Support X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 May 2013 21:23:56 -0000 Author: dim Date: Sat May 11 21:23:55 2013 New Revision: 250529 URL: http://svnweb.freebsd.org/changeset/base/250529 Log: Pull in r178240 from upstream llvm trunk: Section 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&. This enables building clang 3.2 with the newer version of libc++ that was merged in r250514 (and which has stricter iterator requirements for the vector member templates). This is a direct commit to stable/9, since head has a complete import of llvm/clang trunk, and there is no single commit to merge. Modified: stable/9/contrib/llvm/include/llvm/Support/CFG.h Modified: stable/9/contrib/llvm/include/llvm/Support/CFG.h ============================================================================== --- stable/9/contrib/llvm/include/llvm/Support/CFG.h Sat May 11 20:55:14 2013 (r250528) +++ stable/9/contrib/llvm/include/llvm/Support/CFG.h Sat May 11 21:23:55 2013 (r250529) @@ -27,8 +27,9 @@ namespace llvm { 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 @@ class PredIterator : public std::iterato 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 @@ public: 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 @@ inline const_pred_iterator pred_end(cons 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 @@ class SuccIterator : public std::iterato 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 @@ public: 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