[libcxx-commits] [libcxx] 2a5ba4f - [libc++] LWG3643: Missing `constexpr` in `std::counted_iterator` (#87901)
via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Apr 12 07:04:25 PDT 2024
Author: Xiaoyang Liu
Date: 2024-04-12T10:04:21-04:00
New Revision: 2a5ba4fb895931b7dc86f4304b0e64153a1175d4
URL: https://github.com/llvm/llvm-project/commit/2a5ba4fb895931b7dc86f4304b0e64153a1175d4
DIFF: https://github.com/llvm/llvm-project/commit/2a5ba4fb895931b7dc86f4304b0e64153a1175d4.diff
LOG: [libc++] LWG3643: Missing `constexpr` in `std::counted_iterator` (#87901)
This pull request implements LWG3643: Missing constexpr in
std::counted_iterator. Specifically, one overload of
std::counted_operator::operator++ was not marked as constexpr,
despite being eligible for it after the introduction of try-block
support in constexpr functions in C++20.
Added:
Modified:
libcxx/docs/Status/Cxx23Issues.csv
libcxx/include/__iterator/counted_iterator.h
libcxx/test/std/iterators/predef.iterators/counted.iterator/increment.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv
index a212d56685c000..fa82e67ac7db71 100644
--- a/libcxx/docs/Status/Cxx23Issues.csv
+++ b/libcxx/docs/Status/Cxx23Issues.csv
@@ -150,7 +150,7 @@
"`3619 <https://wg21.link/LWG3619>`__","Specification of ``vformat_to`` contains ill-formed ``formatted_size`` calls","February 2022","|Nothing to do|","","|format|"
"`3621 <https://wg21.link/LWG3621>`__","Remove feature-test macro ``__cpp_lib_monadic_optional`` ","February 2022","|Complete|","15.0"
"`3632 <https://wg21.link/LWG3632>`__","``unique_ptr`` ""Mandates: This constructor is not selected by class template argument deduction""","February 2022","|Nothing to do|",""
-"`3643 <https://wg21.link/LWG3643>`__","Missing ``constexpr`` in ``std::counted_iterator`` ","February 2022","","","|ranges|"
+"`3643 <https://wg21.link/LWG3643>`__","Missing ``constexpr`` in ``std::counted_iterator`` ","February 2022","|Complete|","19.0","|ranges|"
"`3648 <https://wg21.link/LWG3648>`__","``format`` should not print ``bool`` with ``'c'`` ","February 2022","|Complete|","15.0","|format|"
"`3649 <https://wg21.link/LWG3649>`__","[fund.ts.v2] Reinstate and bump ``__cpp_lib_experimental_memory_resource`` feature test macro","February 2022","",""
"`3650 <https://wg21.link/LWG3650>`__","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 008c52fa87ce00..ea2832e3b978dc 100644
--- a/libcxx/include/__iterator/counted_iterator.h
+++ b/libcxx/include/__iterator/counted_iterator.h
@@ -129,7 +129,7 @@ class counted_iterator
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 66d90a4187448c..2fea2561ebf7f3 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<I>;
@@ -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<InputOrOutputArchetype>;
+ 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<cpp20_input_iterator<int*>>;
+ std::counted_iterator iter(cpp20_input_iterator<int*>{buffer}, 8);
+
+ iter++;
+ assert(++iter == Counted(cpp20_input_iterator<int*>{buffer + 2}, 6));
+
+ ASSERT_SAME_TYPE(decltype(iter++), void);
+ ASSERT_SAME_TYPE(decltype(++iter), Counted&);
+ }
{
using Counted = std::counted_iterator<forward_iterator<int*>>;
std::counted_iterator iter(forward_iterator<int*>{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<InputOrOutputArchetype>;
- 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<cpp20_input_iterator<int*>>;
- std::counted_iterator iter(cpp20_input_iterator<int*>{buffer}, 8);
-
- iter++;
- assert(++iter == Counted(cpp20_input_iterator<int*>{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<ThrowsOnInc<int*>>;
std::counted_iterator iter(ThrowsOnInc<int*>{buffer}, 8);
More information about the libcxx-commits
mailing list