Message ID | 20171019140036.GA15986@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix path::iterator post-increment and post-decrement | expand |
On 19/10/17 15:00 +0100, Jonathan Wakely wrote: >I made a dumb mistake in the post-inc and post-dec operators for >the path::iterator type, forgetting that _M_cur is sometimes null (for >a single-element path). > > * include/experimental/bits/fs_path.h (path::iterator++(int)) > (path::iterator--(int)): Fix for paths with only one component. > * testsuite/experimental/filesystem/path/itr/traversal.cc: Test > post-increment and post-decrement. And I made another dumb mistake in the new test, incrementing an end iterator. It was caught by testing with _GLIBCXX_ASSERTIONS though. Tested powerpc64le-linux, committed to trunk and gcc-7-branch. commit b978785e751acf12d2429f19130900f419136e34 Author: Jonathan Wakely <jwakely@redhat.com> Date: Sat Oct 21 02:11:37 2017 +0100 Fix invalid path::iterator test * testsuite/experimental/filesystem/path/itr/traversal.cc: Do not increment past-the-end iterators. diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc index dbb4d46796d..41a292af4db 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc @@ -90,10 +90,9 @@ test03() ++iter; iter2++; VERIFY( iter2 == iter ); - auto iter3 = iter; - --iter3; + --iter; iter2--; - VERIFY( iter2 == iter3 ); + VERIFY( iter2 == iter ); } }
diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index cde3897b8e5..9121439b7f2 100644 --- a/libstdc++-v3/include/experimental/bits/fs_path.h +++ b/libstdc++-v3/include/experimental/bits/fs_path.h @@ -725,10 +725,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 pointer operator->() const { return std::__addressof(**this); } iterator& operator++(); - iterator operator++(int) { auto __tmp = *this; ++_M_cur; return __tmp; } + iterator operator++(int) { auto __tmp = *this; ++*this; return __tmp; } iterator& operator--(); - iterator operator--(int) { auto __tmp = *this; --_M_cur; return __tmp; } + iterator operator--(int) { auto __tmp = *this; --*this; return __tmp; } friend bool operator==(const iterator& __lhs, const iterator& __rhs) { return __lhs._M_equals(__rhs); } diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc index bc1091476b5..dbb4d46796d 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/itr/traversal.cc @@ -79,9 +79,28 @@ test02() } } +void +test03() +{ + path paths[] = { "single", "multiple/elements" }; + for (const path& p : paths) + for (auto iter = p.begin(); iter != p.end(); ++iter) + { + auto iter2 = iter; + ++iter; + iter2++; + VERIFY( iter2 == iter ); + auto iter3 = iter; + --iter3; + iter2--; + VERIFY( iter2 == iter3 ); + } +} + int main() { test01(); test02(); + test03(); }