[libcxx-commits] [PATCH] D101729: [libcxx] deprecates `std::iterator` and removes it as a base class
Arthur O'Dwyer via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Sun May 2 17:01:41 PDT 2021
Quuxplusone added a comment.
Looks pretty good to me, mod comments.
================
Comment at: libcxx/include/__memory/raw_storage_iterator.h:30-36
+#if _LIBCPP_STD_VER <= 14
: public iterator<output_iterator_tag,
_Tp, // purposefully not C++03
ptrdiff_t, // purposefully not C++03
_Tp*, // purposefully not C++03
raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03
+#endif
----------------
Interestingly, libc++ has never been conforming here.
https://timsong-cpp.github.io/cppwp/n3337/storage.iterator
requires inheriting from `iterator<output_iterator_tag, void, void, void, void>`.
But since this is removed in '20, do we even care about it? I guess not; so this `#if` seems like the minimal change, and therefore OK by me.
================
Comment at: libcxx/include/__memory/raw_storage_iterator.h:41-47
+#if _LIBCPP_STD_VER > 14
+ using iterator_category = output_iterator_tag;
+ using value_type = void;
+ using difference_type = void;
+ using pointer = void;
+ using reference = void;
+#endif
----------------
Here, we //could// drop the `#if` and just unconditionally define these members... except that that would visibly change the value of `raw_storage_iterator::difference_type` (from non-conforming to conforming), and maybe we don't want that? But again I'd think we don't really care about this type and so we might as well lose the `#if`.
================
Comment at: libcxx/include/__memory/raw_storage_iterator.h:50-54
+ _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() { return *this; }
+ _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) {
+ ::new ((void*)_VSTD::addressof(*__x_)) _Tp(__element);
+ return *this;
+ }
----------------
I vote for not reformatting here. Keeps the diff smaller.
================
Comment at: libcxx/include/iterator:85
+struct iterator // until C++17
+struct [[deprecated)]] iterator // since C++17
{
----------------
Stray `)` here. But please remove this diff anyway; `[[deprecated]]` doesn't appear in the Standard and even if it did I don't think it needs to appear in the synopsis comments.
================
Comment at: libcxx/include/iterator:629-631
+#if _LIBCPP_STD_VER > 14
+ typedef typename iterator_traits<_Iter>::value_type value_type;
+#endif
----------------
Lose the `#if` here.
(Any idea why the old code bothered to redundantly redefine `difference_type` etc.?)
================
Comment at: libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.pass.cpp:45-53
namespace std {
template <>
-struct iterator_traits<MyIter>
- : iterator_traits<std::iterator<std::random_access_iterator_tag, char> > {};
+struct iterator_traits<MyIter> {
+ using iterator_category = std::random_access_iterator_tag;
+ using value_type = char;
+ using difference_type = std::ptrdiff_t;
+ using pointer = char*;
----------------
Keep this one inheriting from `iterator_traits`'s primary template and the next one inheriting from `iterator`'s primary template; otherwise you lose the point of the test.
I recommend
```
struct MyIter {
using iterator_category = std::random_access_iterator_tag;
using value_type = char;
using difference_type = std::ptrdiff_t;
using pointer = char*;
using reference = char&;
};
struct MyIter2 : MyIter {};
struct MyIter3 : MyIter {};
template<> struct std::iterator_traits<MyIter> : std::iterator_traits<char*> {};
#if TEST_STD_VER <= 17
template<> struct std::iterator_traits<MyIter2> : std::iterator<char*> {};
#endif
```
However, if you just wanted to rip out `MyIter2` for being excessively silly, that might be a better solution.
================
Comment at: libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp:56
+
+ using iterator_base = std::iterator<typename T::iterator_category, char>;
+#if TEST_STD_VER <= 14
----------------
This isn't right when `T::iterator_category` is `contiguous_iterator_tag`, although maybe the test doesn't care.
This also isn't right when `T::difference_type` isn't `ptrdiff_t`, etc.; but I'm sure the test doesn't care.
================
Comment at: libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp:49
#if TEST_STD_VER <= 14
- static_assert((std::is_convertible<I1,
- std::iterator<std::input_iterator_tag, double, std::ptrdiff_t,
- const double*, const double&> >::value), "");
+ static_assert((std::is_convertible<I1, iterator_base>::value), "");
+ static_assert(std::is_base_of<iterator_base, std::istream_iterator<double> >::value, "");
----------------
Might as well lose the double-parens while you're here. (Presumably a holdover from when `static_assert` was a macro.)
================
Comment at: libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp:29-30
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
----------------
Throughout: It looks like buildkite isn't happy with some of these pragmas; and I don't really like them either... Aha!
`git grep deprecated libcxx/include/`
`git grep const_fun_mem_t libcxx/test/`
reveals that the correct incantation is
```
#define _LIBCPP_DISABLE_DEPRECATION_WARNINGS
```
at the top of the test. Please make that change throughout.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D101729/new/
https://reviews.llvm.org/D101729
More information about the libcxx-commits
mailing list