diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv index a212d56685c0..fa82e67ac7db 100644 --- a/libcxx/docs/Status/Cxx23Issues.csv +++ b/libcxx/docs/Status/Cxx23Issues.csv @@ -150,7 +150,7 @@ "`3619 `__","Specification of ``vformat_to`` contains ill-formed ``formatted_size`` calls","February 2022","|Nothing to do|","","|format|" "`3621 `__","Remove feature-test macro ``__cpp_lib_monadic_optional`` ","February 2022","|Complete|","15.0" "`3632 `__","``unique_ptr`` ""Mandates: This constructor is not selected by class template argument deduction""","February 2022","|Nothing to do|","" -"`3643 `__","Missing ``constexpr`` in ``std::counted_iterator`` ","February 2022","","","|ranges|" +"`3643 `__","Missing ``constexpr`` in ``std::counted_iterator`` ","February 2022","|Complete|","19.0","|ranges|" "`3648 `__","``format`` should not print ``bool`` with ``'c'`` ","February 2022","|Complete|","15.0","|format|" "`3649 `__","[fund.ts.v2] Reinstate and bump ``__cpp_lib_experimental_memory_resource`` feature test macro","February 2022","","" "`3650 `__","Are ``std::basic_string`` 's ``iterator`` and ``const_iterator`` constexpr iterators?","February 2022","|Nothing to do|","" diff --git a/libcxx/include/__iterator/counted_iterator.h b/libcxx/include/__iterator/counted_iterator.h index 008c52fa87ce..ea2832e3b978 100644 --- a/libcxx/include/__iterator/counted_iterator.h +++ b/libcxx/include/__iterator/counted_iterator.h @@ -129,7 +129,7 @@ public: return *this; } - _LIBCPP_HIDE_FROM_ABI decltype(auto) operator++(int) { + _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator++(int) { _LIBCPP_ASSERT_UNCATEGORIZED(__count_ > 0, "Iterator already at or past end."); --__count_; # ifndef _LIBCPP_HAS_NO_EXCEPTIONS diff --git a/libcxx/test/std/iterators/predef.iterators/counted.iterator/increment.pass.cpp b/libcxx/test/std/iterators/predef.iterators/counted.iterator/increment.pass.cpp index 66d90a418744..2fea2561ebf7 100644 --- a/libcxx/test/std/iterators/predef.iterators/counted.iterator/increment.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/counted.iterator/increment.pass.cpp @@ -9,7 +9,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 // constexpr counted_iterator& operator++(); -// decltype(auto) operator++(int); +// constexpr decltype(auto) operator++(int); // constexpr counted_iterator operator++(int) // requires forward_iterator; @@ -62,6 +62,26 @@ concept PlusEnabled = requires(Iter& iter) { constexpr bool test() { int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + { + using Counted = std::counted_iterator; + std::counted_iterator iter(InputOrOutputArchetype{buffer}, 8); + + iter++; + assert((++iter).base().ptr == buffer + 2); + + ASSERT_SAME_TYPE(decltype(iter++), void); + ASSERT_SAME_TYPE(decltype(++iter), Counted&); + } + { + using Counted = std::counted_iterator>; + std::counted_iterator iter(cpp20_input_iterator{buffer}, 8); + + iter++; + assert(++iter == Counted(cpp20_input_iterator{buffer + 2}, 6)); + + ASSERT_SAME_TYPE(decltype(iter++), void); + ASSERT_SAME_TYPE(decltype(++iter), Counted&); + } { using Counted = std::counted_iterator>; std::counted_iterator iter(forward_iterator{buffer}, 8); @@ -95,29 +115,8 @@ int main(int, char**) { test(); static_assert(test()); - int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - - { - using Counted = std::counted_iterator; - std::counted_iterator iter(InputOrOutputArchetype{buffer}, 8); - - iter++; - assert((++iter).base().ptr == buffer + 2); - - ASSERT_SAME_TYPE(decltype(iter++), void); - ASSERT_SAME_TYPE(decltype(++iter), Counted&); - } - { - using Counted = std::counted_iterator>; - std::counted_iterator iter(cpp20_input_iterator{buffer}, 8); - - iter++; - assert(++iter == Counted(cpp20_input_iterator{buffer + 2}, 6)); - - ASSERT_SAME_TYPE(decltype(iter++), void); - ASSERT_SAME_TYPE(decltype(++iter), Counted&); - } #ifndef TEST_HAS_NO_EXCEPTIONS + int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; { using Counted = std::counted_iterator>; std::counted_iterator iter(ThrowsOnInc{buffer}, 8);