summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2014-03-11 17:16:17 +0000
committerMarshall Clow <mclow.lists@gmail.com>2014-03-11 17:16:17 +0000
commitb1ead689be7ceb202eeff251c211dfeafd50e276 (patch)
tree2b84a5cf188dc6c895fa797aef738a36327be88d
parentd3849253ce8da1dace4943cc064fe3036a4583da (diff)
downloadlibcxx_35a-b1ead689be7ceb202eeff251c211dfeafd50e276.tar.gz
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.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@203587 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/iterator8
-rw-r--r--test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp23
-rw-r--r--test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp25
-rw-r--r--www/cxx1y_status.html2
4 files changed, 9 insertions, 49 deletions
diff --git a/include/iterator b/include/iterator
index 5aa784f2..4c6b0a60 100644
--- a/include/iterator
+++ b/include/iterator
@@ -536,8 +536,6 @@ class _LIBCPP_TYPE_VIS_ONLY reverse_iterator
typename iterator_traits<_Iter>::pointer,
typename iterator_traits<_Iter>::reference>
{
-private:
- mutable _Iter __t;
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)
diff --git a/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp b/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
index 7055e27b..7a775984 100644
--- a/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
+++ b/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
@@ -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<It>::value_type x)
int main()
{
- test(weird_iterator<A>(A()), A());
A a;
test(&a+1, A());
}
diff --git a/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp b/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
index fc57deab..efbdf140 100644
--- a/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
+++ b/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
@@ -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());
diff --git a/www/cxx1y_status.html b/www/cxx1y_status.html
index c282572e..199cf4fc 100644
--- a/www/cxx1y_status.html
+++ b/www/cxx1y_status.html
@@ -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>