<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Mar 11, 2014 at 10:16 AM, Marshall Clow <span dir="ltr"><<a href="mailto:mclow.lists@gmail.com" target="_blank">mclow.lists@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: marshall<br>
Date: Tue Mar 11 12:16:17 2014<br>
New Revision: 203587<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=203587&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=203587&view=rev</a><br>
Log:<br>
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.<br>

<br>
Modified:<br>
    libcxx/trunk/include/iterator<br>
    libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp<br>
    libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp<br>
    libcxx/trunk/www/cxx1y_status.html<br>
<br>
Modified: libcxx/trunk/include/iterator<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=203587&r1=203586&r2=203587&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=203587&r1=203586&r2=203587&view=diff</a><br>

==============================================================================<br>
--- libcxx/trunk/include/iterator (original)<br>
+++ libcxx/trunk/include/iterator Tue Mar 11 12:16:17 2014<br>
@@ -536,8 +536,6 @@ class _LIBCPP_TYPE_VIS_ONLY reverse_iter<br>
                       typename iterator_traits<_Iter>::pointer,<br>
                       typename iterator_traits<_Iter>::reference><br>
 {<br>
-private:<br>
-    mutable _Iter __t;<br></blockquote><div><br></div><div>This looks like an ABI break; is that OK?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

 protected:<br>
     _Iter current;<br>
 public:<br>
@@ -547,11 +545,11 @@ public:<br>
     typedef typename iterator_traits<_Iter>::pointer         pointer;<br>
<br>
     _LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {}<br>
-    _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {}<br>
+    _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : current(__x) {}<br>
     template <class _Up> _LIBCPP_INLINE_VISIBILITY reverse_iterator(const reverse_iterator<_Up>& __u)<br>
-        : __t(__u.base()), current(__u.base()) {}<br>
+        : current(__u.base()) {}<br>
     _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;}<br>
-    _LIBCPP_INLINE_VISIBILITY reference operator*() const {__t = current; return *--__t;}<br>
+    _LIBCPP_INLINE_VISIBILITY reference operator*() const {_Iter __tmp = current; return *--__tmp;}<br>
     _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {return _VSTD::addressof(operator*());}<br>
     _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;}<br>
     _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator++(int)<br>
<br>
Modified: libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp<br>
URL: <a href="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" target="_blank">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</a><br>

==============================================================================<br>
--- libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp (original)<br>
+++ 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<br>
@@ -15,6 +15,8 @@<br>
<br>
 // Be sure to respect LWG 198:<br>
 //    <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198</a><br>
+// LWG 198 was superseded by LWG 2360<br>
+//    <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360</a><br>
<br>
 #include <iterator><br>
 #include <cassert><br>
@@ -31,26 +33,6 @@ public:<br>
 };<br>
<br>
 template <class It><br>
-class weird_iterator<br>
-{<br>
-    It it_;<br>
-public:<br>
-    typedef It                              value_type;<br>
-    typedef std::bidirectional_iterator_tag iterator_category;<br>
-    typedef std::ptrdiff_t                  difference_type;<br>
-    typedef It*                             pointer;<br>
-    typedef It&                             reference;<br>
-<br>
-    weird_iterator() {}<br>
-    explicit weird_iterator(It it) : it_(it) {}<br>
-    ~weird_iterator() {it_ = It();}<br>
-<br>
-    reference operator*() {return it_;}<br>
-<br>
-    weird_iterator& operator--() {return *this;}<br>
-};<br>
-<br>
-template <class It><br>
 void<br>
 test(It i, typename std::iterator_traits<It>::value_type x)<br>
 {<br>
@@ -60,7 +42,6 @@ test(It i, typename std::iterator_traits<br>
<br>
 int main()<br>
 {<br>
-    test(weird_iterator<A>(A()), A());<br>
     A a;<br>
     test(&a+1, A());<br>
 }<br>
<br>
Modified: libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp<br>
URL: <a href="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" target="_blank">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</a><br>

==============================================================================<br>
--- libcxx/trunk/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp (original)<br>
+++ 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<br>
@@ -15,6 +15,9 @@<br>
<br>
 // Be sure to respect LWG 198:<br>
 //    <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198</a><br>
+// LWG 198 was superseded by LWG 2360<br>
+//    <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360</a><br>
+<br>
<br>
 #include <iterator><br>
 #include <list><br>
@@ -34,27 +37,6 @@ public:<br>
 };<br>
<br>
 template <class It><br>
-class weird_iterator<br>
-{<br>
-    It it_;<br>
-public:<br>
-    typedef It                              value_type;<br>
-    typedef std::bidirectional_iterator_tag iterator_category;<br>
-    typedef std::ptrdiff_t                  difference_type;<br>
-    typedef It*                             pointer;<br>
-    typedef It&                             reference;<br>
-<br>
-    weird_iterator() {}<br>
-    explicit weird_iterator(It it) : it_(it) {}<br>
-    ~weird_iterator() {it_ = It();}<br>
-<br>
-    reference operator*() {return it_;}<br>
-    pointer operator->() {return &it_;}<br>
-<br>
-    weird_iterator& operator--() {return *this;}<br>
-};<br>
-<br>
-template <class It><br>
 void<br>
 test(It i, typename std::iterator_traits<It>::value_type x)<br>
 {<br>
@@ -79,7 +61,6 @@ public:<br>
<br>
 int main()<br>
 {<br>
-    test(weird_iterator<A>(A()), A());<br>
     A a;<br>
     test(&a+1, A());<br>
<br>
<br>
Modified: libcxx/trunk/www/cxx1y_status.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1y_status.html?rev=203587&r1=203586&r2=203587&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1y_status.html?rev=203587&r1=203586&r2=203587&view=diff</a><br>

==============================================================================<br>
--- libcxx/trunk/www/cxx1y_status.html (original)<br>
+++ libcxx/trunk/www/cxx1y_status.html Tue Mar 11 12:16:17 2014<br>
@@ -265,7 +265,7 @@<br>
        <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2356" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2356</a>">2356</a></td><td>Stability of erasure in unordered associative containers</td><td>Issaquah</td><td>Complete</td></tr><br>

        <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2357" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2357</a>">2357</a></td><td>Remaining "Assignable" requirement</td><td>Issaquah</td><td>Complete</td></tr><br>

        <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2359" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2359</a>">2359</a></td><td>How does regex_constants::nosubs affect basic_regex::mark_count()?</td><td>Issaquah</td><td>Complete</td></tr><br>

-       <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360</a>">2360</a></td><td>reverse_iterator::operator*() is unimplementable</td><td>Issaquah</td><td></td></tr><br>

+       <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360</a>">2360</a></td><td>reverse_iterator::operator*() is unimplementable</td><td>Issaquah</td><td>Complete</td></tr><br>

        <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2104" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2104</a>">2104</a></td><td>unique_lock move-assignment should not be noexcept</td><td>Issaquah</td><td></td></tr><br>

        <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2186" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2186</a>">2186</a></td><td>Incomplete action on async/launch::deferred</td><td>Issaquah</td><td></td></tr><br>

        <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2075" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2075</a>">2075</a></td><td>Progress guarantees, lock-free property, and scheduling assumptions</td><td>Issaquah</td><td></td></tr><br>

<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>