From e1cfe7a7f6a73181a9426952069b32f4270c5581 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Tue, 14 Nov 2017 00:03:10 +0000 Subject: [PATCH] Implement LWG2952: iterator_traits should work for pointers to cv T git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@318119 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/iterator | 12 +------- .../iterator.traits/volatile_pointer.pass.cpp | 28 +++++++++++++++++++ www/cxx2a_status.html | 2 +- 3 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 test/std/iterators/iterator.primitives/iterator.traits/volatile_pointer.pass.cpp diff --git a/include/iterator b/include/iterator index 9e1da937d..78cab25e5 100644 --- a/include/iterator +++ b/include/iterator @@ -37,16 +37,6 @@ struct iterator_traits typedef random_access_iterator_tag iterator_category; }; -template -struct iterator_traits -{ - typedef ptrdiff_t difference_type; - typedef T value_type; - typedef const T* pointer; - typedef const T& reference; - typedef random_access_iterator_tag iterator_category; -}; - template struct iterator @@ -494,7 +484,7 @@ template struct _LIBCPP_TEMPLATE_VIS iterator_traits<_Tp*> { typedef ptrdiff_t difference_type; - typedef typename remove_const<_Tp>::type value_type; + typedef typename remove_cv<_Tp>::type value_type; typedef _Tp* pointer; typedef _Tp& reference; typedef random_access_iterator_tag iterator_category; diff --git a/test/std/iterators/iterator.primitives/iterator.traits/volatile_pointer.pass.cpp b/test/std/iterators/iterator.primitives/iterator.traits/volatile_pointer.pass.cpp new file mode 100644 index 000000000..1630feb25 --- /dev/null +++ b/test/std/iterators/iterator.primitives/iterator.traits/volatile_pointer.pass.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// struct iterator_traits + +#include +#include + +struct A {}; + +int main() +{ + typedef std::iterator_traits It; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +} diff --git a/www/cxx2a_status.html b/www/cxx2a_status.html index 3245adf5c..b689e0e19 100644 --- a/www/cxx2a_status.html +++ b/www/cxx2a_status.html @@ -108,7 +108,7 @@ 2945Order of template parameters in optional comparisonsAlbuquerqueComplete 2948unique_ptr does not define operator<< for stream outputAlbuquerque 2950std::byte operations are misspecifiedAlbuquerque - 2952iterator_traits should work for pointers to cv TAlbuquerque + 2952iterator_traits should work for pointers to cv TAlbuquerqueComplete 2953LWG 2853 should apply to deque::erase tooAlbuquerque 2958Moves improperly defined as deletedAlbuquerque 2964Apparently redundant requirement for dynamic_pointer_castAlbuquerque