[libcxx] r203587 - Implement LWG 2360: 'reverse_iterator::operator*() is unimplementable'. Note that this is a (small) behavior change in the library. Reverse iterators whose base iterators' operator* return references to 'within themselves' have been sacrificed to the greater goal of avoiding data races.

Richard Smith richard at metafoo.co.uk
Tue Mar 11 10:32:07 PDT 2014


On Tue, Mar 11, 2014 at 10:16 AM, Marshall Clow <mclow.lists at gmail.com>wrote:

> Author: marshall
> Date: Tue Mar 11 12:16:17 2014
> New Revision: 203587
>
> URL: http://llvm.org/viewvc/llvm-project?rev=203587&view=rev
> Log:
> Implement LWG 2360: 'reverse_iterator::operator*() is unimplementable'.
> Note that this is a (small) behavior change in the library. Reverse
> iterators whose base iterators' operator* return references to 'within
> themselves' have been sacrificed to the greater goal of avoiding data races.
>
> Modified:
>     libcxx/trunk/include/iterator
>
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
>
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
>     libcxx/trunk/www/cxx1y_status.html
>
> Modified: libcxx/trunk/include/iterator
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=203587&r1=203586&r2=203587&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/iterator (original)
> +++ libcxx/trunk/include/iterator Tue Mar 11 12:16:17 2014
> @@ -536,8 +536,6 @@ class _LIBCPP_TYPE_VIS_ONLY reverse_iter
>                        typename iterator_traits<_Iter>::pointer,
>                        typename iterator_traits<_Iter>::reference>
>  {
> -private:
> -    mutable _Iter __t;
>

This looks like an ABI break; is that OK?


>  protected:
>      _Iter current;
>  public:
> @@ -547,11 +545,11 @@ public:
>      typedef typename iterator_traits<_Iter>::pointer         pointer;
>
>      _LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {}
> -    _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) :
> __t(__x), current(__x) {}
> +    _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) :
> current(__x) {}
>      template <class _Up> _LIBCPP_INLINE_VISIBILITY reverse_iterator(const
> reverse_iterator<_Up>& __u)
> -        : __t(__u.base()), current(__u.base()) {}
> +        : current(__u.base()) {}
>      _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;}
> -    _LIBCPP_INLINE_VISIBILITY reference operator*() const {__t = current;
> return *--__t;}
> +    _LIBCPP_INLINE_VISIBILITY reference operator*() const {_Iter __tmp =
> current; return *--__tmp;}
>      _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {return
> _VSTD::addressof(operator*());}
>      _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current;
> return *this;}
>      _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator++(int)
>
> Modified:
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp?rev=203587&r1=203586&r2=203587&view=diff
>
> ==============================================================================
> ---
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
> (original)
> +++
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
> Tue Mar 11 12:16:17 2014
> @@ -15,6 +15,8 @@
>
>  // Be sure to respect LWG 198:
>  //    http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198
> +// LWG 198 was superseded by LWG 2360
> +//    http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360
>
>  #include <iterator>
>  #include <cassert>
> @@ -31,26 +33,6 @@ public:
>  };
>
>  template <class It>
> -class weird_iterator
> -{
> -    It it_;
> -public:
> -    typedef It                              value_type;
> -    typedef std::bidirectional_iterator_tag iterator_category;
> -    typedef std::ptrdiff_t                  difference_type;
> -    typedef It*                             pointer;
> -    typedef It&                             reference;
> -
> -    weird_iterator() {}
> -    explicit weird_iterator(It it) : it_(it) {}
> -    ~weird_iterator() {it_ = It();}
> -
> -    reference operator*() {return it_;}
> -
> -    weird_iterator& operator--() {return *this;}
> -};
> -
> -template <class It>
>  void
>  test(It i, typename std::iterator_traits<It>::value_type x)
>  {
> @@ -60,7 +42,6 @@ test(It i, typename std::iterator_traits
>
>  int main()
>  {
> -    test(weird_iterator<A>(A()), A());
>      A a;
>      test(&a+1, A());
>  }
>
> Modified:
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp?rev=203587&r1=203586&r2=203587&view=diff
>
> ==============================================================================
> ---
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
> (original)
> +++
> libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
> Tue Mar 11 12:16:17 2014
> @@ -15,6 +15,9 @@
>
>  // Be sure to respect LWG 198:
>  //    http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198
> +// LWG 198 was superseded by LWG 2360
> +//    http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360
> +
>
>  #include <iterator>
>  #include <list>
> @@ -34,27 +37,6 @@ public:
>  };
>
>  template <class It>
> -class weird_iterator
> -{
> -    It it_;
> -public:
> -    typedef It                              value_type;
> -    typedef std::bidirectional_iterator_tag iterator_category;
> -    typedef std::ptrdiff_t                  difference_type;
> -    typedef It*                             pointer;
> -    typedef It&                             reference;
> -
> -    weird_iterator() {}
> -    explicit weird_iterator(It it) : it_(it) {}
> -    ~weird_iterator() {it_ = It();}
> -
> -    reference operator*() {return it_;}
> -    pointer operator->() {return &it_;}
> -
> -    weird_iterator& operator--() {return *this;}
> -};
> -
> -template <class It>
>  void
>  test(It i, typename std::iterator_traits<It>::value_type x)
>  {
> @@ -79,7 +61,6 @@ public:
>
>  int main()
>  {
> -    test(weird_iterator<A>(A()), A());
>      A a;
>      test(&a+1, A());
>
>
> Modified: libcxx/trunk/www/cxx1y_status.html
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1y_status.html?rev=203587&r1=203586&r2=203587&view=diff
>
> ==============================================================================
> --- libcxx/trunk/www/cxx1y_status.html (original)
> +++ libcxx/trunk/www/cxx1y_status.html Tue Mar 11 12:16:17 2014
> @@ -265,7 +265,7 @@
>         <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2356">2356</a></td><td>Stability
> of erasure in unordered associative
> containers</td><td>Issaquah</td><td>Complete</td></tr>
>         <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2357">2357</a></td><td>Remaining
> "Assignable" requirement</td><td>Issaquah</td><td>Complete</td></tr>
>         <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2359">2359</a></td><td>How
> does regex_constants::nosubs affect
> basic_regex::mark_count()?</td><td>Issaquah</td><td>Complete</td></tr>
> -       <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360">2360</a></td><td>reverse_iterator::operator*()
> is unimplementable</td><td>Issaquah</td><td></td></tr>
> +       <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360">2360</a></td><td>reverse_iterator::operator*()
> is unimplementable</td><td>Issaquah</td><td>Complete</td></tr>
>         <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2104">2104</a></td><td>unique_lock
> move-assignment should not be noexcept</td><td>Issaquah</td><td></td></tr>
>         <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2186">2186</a></td><td>Incomplete
> action on async/launch::deferred</td><td>Issaquah</td><td></td></tr>
>         <tr><td><a href="
> http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2075">2075</a></td><td>Progress
> guarantees, lock-free property, and scheduling
> assumptions</td><td>Issaquah</td><td></td></tr>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140311/2cd5c8d5/attachment.html>


More information about the cfe-commits mailing list