mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 12:26:08 +00:00
[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.
This commit is contained in:
parent
b4df0da9e8
commit
2a5ba4fb89
@ -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|"
|
"`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"
|
"`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|",""
|
"`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|"
|
"`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","",""
|
"`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|",""
|
"`3650 <https://wg21.link/LWG3650>`__","Are ``std::basic_string`` 's ``iterator`` and ``const_iterator`` constexpr iterators?","February 2022","|Nothing to do|",""
|
||||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -129,7 +129,7 @@ public:
|
|||||||
return *this;
|
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.");
|
_LIBCPP_ASSERT_UNCATEGORIZED(__count_ > 0, "Iterator already at or past end.");
|
||||||
--__count_;
|
--__count_;
|
||||||
# ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
# ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||||
|
|
||||||
// constexpr counted_iterator& operator++();
|
// constexpr counted_iterator& operator++();
|
||||||
// decltype(auto) operator++(int);
|
// constexpr decltype(auto) operator++(int);
|
||||||
// constexpr counted_iterator operator++(int)
|
// constexpr counted_iterator operator++(int)
|
||||||
// requires forward_iterator<I>;
|
// requires forward_iterator<I>;
|
||||||
|
|
||||||
@ -62,6 +62,26 @@ concept PlusEnabled = requires(Iter& iter) {
|
|||||||
constexpr bool test() {
|
constexpr bool test() {
|
||||||
int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
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*>>;
|
using Counted = std::counted_iterator<forward_iterator<int*>>;
|
||||||
std::counted_iterator iter(forward_iterator<int*>{buffer}, 8);
|
std::counted_iterator iter(forward_iterator<int*>{buffer}, 8);
|
||||||
@ -95,29 +115,8 @@ int main(int, char**) {
|
|||||||
test();
|
test();
|
||||||
static_assert(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
|
#ifndef TEST_HAS_NO_EXCEPTIONS
|
||||||
|
int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
||||||
{
|
{
|
||||||
using Counted = std::counted_iterator<ThrowsOnInc<int*>>;
|
using Counted = std::counted_iterator<ThrowsOnInc<int*>>;
|
||||||
std::counted_iterator iter(ThrowsOnInc<int*>{buffer}, 8);
|
std::counted_iterator iter(ThrowsOnInc<int*>{buffer}, 8);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user