-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[libc++] LWG3643: Missing constexpr
in std::counted_iterator
#87901
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-libcxx Author: Xiaoyang Liu (xiaoyang-sde) ChangesAbstractThis pull request implements LWG3643: Missing ReferenceFull diff: https://github.com/llvm/llvm-project/pull/87901.diff 3 Files Affected:
diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv
index 02297715cc2e2a..83f83113eb12be 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..fff7fb35ed4d6c 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);
@@ -97,26 +117,6 @@ int main(int, char**) {
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
{
using Counted = std::counted_iterator<ThrowsOnInc<int*>>;
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
The MSAN issue looks like a fluke, merging. |
Abstract
This pull request implements LWG3643: Missing
constexpr
instd::counted_iterator
. Specifically, one overload ofstd::counted_operator::operator++
was not marked asconstexpr
, despite being eligible for it after the introduction of try-block support in constexpr functions in C++20.Reference