[libcxx-commits] [libcxx] 2205286 - [libcxx][iterator] adds `std::weakly_incrementable` and `std::incrementable`

Christopher Di Bella via libcxx-commits libcxx-commits at lists.llvm.org
Fri Apr 23 22:25:58 PDT 2021


Author: Christopher Di Bella
Date: 2021-04-23T22:25:37-07:00
New Revision: 22052860959c53ca32acc2eae77c23354e1649fc

URL: https://github.com/llvm/llvm-project/commit/22052860959c53ca32acc2eae77c23354e1649fc
DIFF: https://github.com/llvm/llvm-project/commit/22052860959c53ca32acc2eae77c23354e1649fc.diff

LOG: [libcxx][iterator] adds `std::weakly_incrementable` and `std::incrementable`

Implements parts of:
    * P0896R4 The One Ranges Proposal`

Depends on D100073.

Reviewed By: ldionne, zoecarver, #libc

Differential Revision: https://reviews.llvm.org/D100080

Added: 
    libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp
    libcxx/test/std/iterators/iterator.requirements/iterator.concepts/incrementable.h
    libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/incrementable.compile.pass.cpp
    libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/subsumption.compile.pass.cpp
    libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp
    libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp

Modified: 
    libcxx/include/__iterator/concepts.h
    libcxx/include/iterator
    libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp
    libcxx/test/std/utilities/optional/iterator_concept_conformance.compile.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__iterator/concepts.h b/libcxx/include/__iterator/concepts.h
index c7b59ca959820..bd1ec849f4457 100644
--- a/libcxx/include/__iterator/concepts.h
+++ b/libcxx/include/__iterator/concepts.h
@@ -57,6 +57,33 @@ concept indirectly_writable =
     const_cast<const iter_reference_t<_Out>&&>(*_VSTD::forward<_Out>(__o)) = _VSTD::forward<_Tp>(__t); // not required to be equality-preserving
   };
 
+// [iterator.concept.winc]
+template<class _Tp>
+concept __integer_like = integral<_Tp> && !same_as<_Tp, bool>;
+
+template<class _Tp>
+concept __signed_integer_like = signed_integral<_Tp>;
+
+template<class _Ip>
+concept weakly_incrementable =
+  default_initializable<_Ip> &&
+  movable<_Ip> &&
+  requires(_Ip __i) {
+    typename iter_
diff erence_t<_Ip>;
+    requires __signed_integer_like<iter_
diff erence_t<_Ip> >;
+    { ++__i } -> same_as<_Ip&>;   // not required to be equality-preserving
+    __i++;                        // not required to be equality-preserving
+  };
+
+// [iterator.concept.inc]
+template<class _Ip>
+concept incrementable =
+  regular<_Ip> &&
+  weakly_incrementable<_Ip> &&
+  requires(_Ip __i) {
+    { __i++ } -> same_as<_Ip>;
+  };
+
 // clang-format on
 
 #endif // !defined(_LIBCPP_HAS_NO_RANGES)

diff  --git a/libcxx/include/iterator b/libcxx/include/iterator
index f69a135e7a7e8..2ec32941029dc 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -52,6 +52,14 @@ template<class In>
 template<class Out, class T>
   concept indirectly_writable = see below;                // since C++20
 
+// [iterator.concept.winc], concept weakly_­incrementable
+template<class I>
+  concept weakly_incrementable = see below;                // since C++20
+
+// [iterator.concept.inc], concept incrementable
+template<class I>
+  concept incrementable = see below;                       // since C++20
+
 template<class Category, class T, class Distance = ptr
diff _t,
          class Pointer = T*, class Reference = T&>
 struct iterator

diff  --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp
new file mode 100644
index 0000000000000..a5bbc91d38c5c
--- /dev/null
+++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+// XFAIL: msvc && clang
+
+#include <iterator>
+
+#include <concepts>
+
+static_assert(!std::__integer_like<bool>);
+static_assert(std::__integer_like<signed char>);
+static_assert(std::__integer_like<unsigned char>);
+static_assert(std::__integer_like<short>);
+static_assert(std::__integer_like<unsigned short>);
+static_assert(std::__integer_like<int>);
+static_assert(std::__integer_like<unsigned int>);
+static_assert(std::__integer_like<long>);
+static_assert(std::__integer_like<unsigned long>);
+static_assert(std::__integer_like<long long>);
+static_assert(std::__integer_like<unsigned long long>);
+static_assert(std::__integer_like<char>);
+static_assert(std::__integer_like<wchar_t>);
+static_assert(std::__integer_like<char8_t>);
+static_assert(std::__integer_like<char16_t>);
+static_assert(std::__integer_like<char32_t>);
+
+static_assert(!std::__signed_integer_like<bool>);
+static_assert(std::__signed_integer_like<signed char>);
+static_assert(std::__signed_integer_like<short>);
+static_assert(std::__signed_integer_like<int>);
+static_assert(std::__signed_integer_like<long>);
+static_assert(std::__signed_integer_like<long long>);
+static_assert(!std::__signed_integer_like<unsigned char>);
+static_assert(!std::__signed_integer_like<unsigned short>);
+static_assert(!std::__signed_integer_like<unsigned int>);
+static_assert(!std::__signed_integer_like<unsigned long>);
+static_assert(!std::__signed_integer_like<unsigned long long>);
+static_assert(std::__signed_integer_like<char> == std::signed_integral<char>);
+static_assert(std::__signed_integer_like<wchar_t> == std::signed_integral<wchar_t>);
+static_assert(std::__signed_integer_like<char8_t> == std::signed_integral<char8_t>);
+static_assert(std::__signed_integer_like<char16_t> == std::signed_integral<char16_t>);
+static_assert(std::__signed_integer_like<char32_t> == std::signed_integral<char32_t>);

diff  --git a/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp
index 6f8ec7940459b..043e764c4e5b4 100644
--- a/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp
index 57fbd073f9c6a..03bc35e451447 100644
--- a/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp
index 008e4762f47a1..ba21aa7655a74 100644
--- a/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp
index 9b30f55f6087c..877690d076013 100644
--- a/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp
index aa1900311a1dd..a6b1bc37ca0df 100644
--- a/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp
@@ -22,6 +22,8 @@ using const_iterator = std::array<int, 10>::const_iterator;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, int>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp
index bcbb05f53e658..b63deee0a4d66 100644
--- a/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp
index 81d7ae19433c8..960443d975347 100644
--- a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp
index d863c202b6ff6..4e2274c229edd 100644
--- a/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp
index cab6cd34cee46..2293fc1852120 100644
--- a/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp
index 6e26cc7495ad1..cf03ae6fd46cf 100644
--- a/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp
index 7a3d9202f21b2..07bcb4e93e56e 100644
--- a/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp
@@ -25,12 +25,16 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);
 
 static_assert(std::indirectly_readable<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
+static_assert(std::incrementable<local_iterator>);
 
 static_assert(std::indirectly_readable<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
+static_assert(std::incrementable<const_local_iterator>);

diff  --git a/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp
index cdbb13b3a401b..11c81460c1cdb 100644
--- a/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp
@@ -25,12 +25,16 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);
 
 static_assert(std::indirectly_readable<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
+static_assert(std::incrementable<local_iterator>);
 
 static_assert(std::indirectly_readable<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
+static_assert(std::incrementable<const_local_iterator>);

diff  --git a/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp
index 6e52ad58ab694..925048bb55104 100644
--- a/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp
@@ -25,12 +25,16 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);
 
 static_assert(std::indirectly_readable<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
+static_assert(std::incrementable<local_iterator>);
 
 static_assert(std::indirectly_readable<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
+static_assert(std::incrementable<const_local_iterator>);

diff  --git a/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp
index 089f01dc6dab3..54e1e905ce2ff 100644
--- a/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp
@@ -25,12 +25,16 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);
 
 static_assert(std::indirectly_readable<local_iterator>);
 static_assert(!std::indirectly_writable<local_iterator, value_type>);
+static_assert(std::incrementable<local_iterator>);
 
 static_assert(std::indirectly_readable<const_local_iterator>);
 static_assert(!std::indirectly_writable<const_local_iterator, value_type>);
+static_assert(std::incrementable<const_local_iterator>);

diff  --git a/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp
index f12ba762ab3b9..77236c2e8f575 100644
--- a/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp
@@ -22,3 +22,4 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);

diff  --git a/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp
index 80400ac3a9097..70a25c3b4110d 100644
--- a/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp
@@ -19,7 +19,11 @@
 
 static_assert(std::indirectly_readable<fs::directory_iterator>);
 static_assert(!std::indirectly_writable<fs::directory_iterator, fs::directory_iterator::value_type>);
+static_assert(std::weakly_incrementable<fs::directory_iterator>);
+static_assert(!std::incrementable<fs::directory_iterator>);
 
 static_assert(std::indirectly_readable<fs::recursive_directory_iterator>);
 static_assert(
     !std::indirectly_writable<fs::recursive_directory_iterator, fs::recursive_directory_iterator::value_type>);
+static_assert(std::weakly_incrementable<fs::recursive_directory_iterator>);
+static_assert(!std::incrementable<fs::recursive_directory_iterator>);

diff  --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/incrementable.h b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/incrementable.h
new file mode 100644
index 0000000000000..847e9595ec27f
--- /dev/null
+++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/incrementable.h
@@ -0,0 +1,183 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LIBCPP_TEST_STD_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_CONCEPTS_INCREMENTABLE_H
+#define LIBCPP_TEST_STD_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_CONCEPTS_INCREMENTABLE_H
+
+struct postfix_increment_returns_void {
+  using 
diff erence_type = int;
+  postfix_increment_returns_void& operator++();
+  void operator++(int);
+};
+
+struct postfix_increment_returns_copy {
+  using 
diff erence_type = int;
+  postfix_increment_returns_copy& operator++();
+  postfix_increment_returns_copy operator++(int);
+};
+
+struct has_integral_minus {
+  has_integral_minus& operator++();
+  has_integral_minus operator++(int);
+
+  long operator-(has_integral_minus) const;
+};
+
+struct has_distinct_
diff erence_type_and_minus {
+  using 
diff erence_type = short;
+
+  has_distinct_
diff erence_type_and_minus& operator++();
+  has_distinct_
diff erence_type_and_minus operator++(int);
+
+  long operator-(has_distinct_
diff erence_type_and_minus) const;
+};
+
+struct missing_
diff erence_type {
+  missing_
diff erence_type& operator++();
+  void operator++(int);
+};
+
+struct floating_
diff erence_type {
+  using 
diff erence_type = float;
+
+  floating_
diff erence_type& operator++();
+  void operator++(int);
+};
+
+struct non_const_minus {
+  non_const_minus& operator++();
+  non_const_minus operator++(int);
+
+  long operator-(non_const_minus);
+};
+
+struct non_integral_minus {
+  non_integral_minus& operator++();
+  non_integral_minus operator++(int);
+
+  void operator-(non_integral_minus);
+};
+
+struct bad_
diff erence_type_good_minus {
+  using 
diff erence_type = float;
+
+  bad_
diff erence_type_good_minus& operator++();
+  void operator++(int);
+
+  int operator-(bad_
diff erence_type_good_minus) const;
+};
+
+struct not_default_initializable {
+  using 
diff erence_type = int;
+  not_default_initializable() = delete;
+
+  not_default_initializable& operator++();
+  void operator++(int);
+};
+
+struct not_movable {
+  using 
diff erence_type = int;
+
+  not_movable() = default;
+  not_movable(not_movable&&) = delete;
+
+  not_movable& operator++();
+  void operator++(int);
+};
+
+struct preinc_not_declared {
+  using 
diff erence_type = int;
+
+  void operator++(int);
+};
+
+struct postinc_not_declared {
+  using 
diff erence_type = int;
+
+  postinc_not_declared& operator++();
+};
+
+struct incrementable_with_
diff erence_type {
+  using 
diff erence_type = int;
+
+  incrementable_with_
diff erence_type& operator++();
+  incrementable_with_
diff erence_type operator++(int);
+
+  bool operator==(incrementable_with_
diff erence_type const&) const;
+};
+
+struct incrementable_without_
diff erence_type {
+  incrementable_without_
diff erence_type& operator++();
+  incrementable_without_
diff erence_type operator++(int);
+
+  bool operator==(incrementable_without_
diff erence_type const&) const;
+
+  int operator-(incrementable_without_
diff erence_type) const;
+};
+
+struct 
diff erence_type_and_void_minus {
+  using 
diff erence_type = int;
+
+  
diff erence_type_and_void_minus& operator++();
+  
diff erence_type_and_void_minus operator++(int);
+
+  bool operator==(
diff erence_type_and_void_minus const&) const;
+
+  void operator-(
diff erence_type_and_void_minus) const;
+};
+
+struct noncopyable_with_
diff erence_type {
+  using 
diff erence_type = int;
+
+  noncopyable_with_
diff erence_type() = default;
+  noncopyable_with_
diff erence_type(noncopyable_with_
diff erence_type&&) = default;
+  noncopyable_with_
diff erence_type(noncopyable_with_
diff erence_type const&) = delete;
+
+  noncopyable_with_
diff erence_type& operator=(noncopyable_with_
diff erence_type&&) = default;
+  noncopyable_with_
diff erence_type& operator=(noncopyable_with_
diff erence_type const&) = delete;
+
+  noncopyable_with_
diff erence_type& operator++();
+  noncopyable_with_
diff erence_type operator++(int);
+
+  bool operator==(noncopyable_with_
diff erence_type const&) const;
+};
+
+struct noncopyable_without_
diff erence_type {
+  noncopyable_without_
diff erence_type() = default;
+  noncopyable_without_
diff erence_type(noncopyable_without_
diff erence_type&&) = default;
+  noncopyable_without_
diff erence_type(noncopyable_without_
diff erence_type const&) = delete;
+
+  noncopyable_without_
diff erence_type& operator=(noncopyable_without_
diff erence_type&&) = default;
+  noncopyable_without_
diff erence_type& operator=(noncopyable_without_
diff erence_type const&) = delete;
+
+  noncopyable_without_
diff erence_type& operator++();
+  noncopyable_without_
diff erence_type operator++(int);
+
+  int operator-(noncopyable_without_
diff erence_type const&) const;
+
+  bool operator==(noncopyable_without_
diff erence_type const&) const;
+};
+
+struct noncopyable_with_
diff erence_type_and_minus {
+  using 
diff erence_type = int;
+
+  noncopyable_with_
diff erence_type_and_minus() = default;
+  noncopyable_with_
diff erence_type_and_minus(noncopyable_with_
diff erence_type_and_minus&&) = default;
+  noncopyable_with_
diff erence_type_and_minus(noncopyable_with_
diff erence_type_and_minus const&) = delete;
+
+  noncopyable_with_
diff erence_type_and_minus& operator=(noncopyable_with_
diff erence_type_and_minus&&) = default;
+  noncopyable_with_
diff erence_type_and_minus& operator=(noncopyable_with_
diff erence_type_and_minus const&) = delete;
+
+  noncopyable_with_
diff erence_type_and_minus& operator++();
+  noncopyable_with_
diff erence_type_and_minus operator++(int);
+
+  int operator-(noncopyable_with_
diff erence_type_and_minus const&) const;
+
+  bool operator==(noncopyable_with_
diff erence_type_and_minus const&) const;
+};
+
+#endif // #define LIBCPP_TEST_STD_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_CONCEPTS_INCREMENTABLE_H

diff  --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/incrementable.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/incrementable.compile.pass.cpp
new file mode 100644
index 0000000000000..e3a9210b14941
--- /dev/null
+++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/incrementable.compile.pass.cpp
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+// XFAIL: msvc && clang
+
+// template<class In>
+// concept indirectly_readable;
+
+#include <iterator>
+
+#include <concepts>
+#include <memory>
+#include <optional>
+
+#include "../incrementable.h"
+
+static_assert(std::incrementable<int>);
+static_assert(std::incrementable<int*>);
+static_assert(std::incrementable<int**>);
+
+static_assert(!std::incrementable<postfix_increment_returns_void>);
+static_assert(!std::incrementable<postfix_increment_returns_copy>);
+static_assert(!std::incrementable<has_integral_minus>);
+static_assert(!std::incrementable<has_distinct_
diff erence_type_and_minus>);
+static_assert(!std::incrementable<missing_
diff erence_type>);
+static_assert(!std::incrementable<floating_
diff erence_type>);
+static_assert(!std::incrementable<non_const_minus>);
+static_assert(!std::incrementable<non_integral_minus>);
+static_assert(!std::incrementable<bad_
diff erence_type_good_minus>);
+static_assert(!std::incrementable<not_default_initializable>);
+static_assert(!std::incrementable<not_movable>);
+static_assert(!std::incrementable<preinc_not_declared>);
+static_assert(!std::incrementable<postinc_not_declared>);
+static_assert(std::incrementable<incrementable_with_
diff erence_type>);
+static_assert(std::incrementable<incrementable_without_
diff erence_type>);
+static_assert(std::incrementable<
diff erence_type_and_void_minus>);
+static_assert(!std::incrementable<noncopyable_with_
diff erence_type>);
+static_assert(!std::incrementable<noncopyable_without_
diff erence_type>);
+static_assert(!std::incrementable<noncopyable_with_
diff erence_type_and_minus>);

diff  --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/subsumption.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/subsumption.compile.pass.cpp
new file mode 100644
index 0000000000000..88cd68fb1794c
--- /dev/null
+++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.inc/subsumption.compile.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+// XFAIL: msvc && clang
+
+// template<class T>
+// concept incrementable;
+
+#include <iterator>
+
+#include <concepts>
+
+// clang-format off
+template<std::weakly_incrementable I>
+requires std::regular<I>
+[[nodiscard]] constexpr bool check_subsumption() {
+  return false;
+}
+
+template<std::incrementable>
+[[nodiscard]] constexpr bool check_subsumption() {
+  return true;
+}
+// clang-format on
+
+static_assert(check_subsumption<int*>());

diff  --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp
new file mode 100644
index 0000000000000..05fa31607650d
--- /dev/null
+++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+// XFAIL: msvc && clang
+
+// template<class T>
+// concept weakly_incrementable;
+
+#include <iterator>
+
+#include <concepts>
+
+// clang-format off
+template<std::default_initializable I>
+requires std::movable<I>
+[[nodiscard]] constexpr bool check_subsumption() {
+  return false;
+}
+
+template<std::weakly_incrementable>
+[[nodiscard]] constexpr bool check_subsumption() {
+  return true;
+}
+// clang-format on
+
+static_assert(check_subsumption<int*>());

diff  --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp
new file mode 100644
index 0000000000000..be62915986eec
--- /dev/null
+++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp
@@ -0,0 +1,71 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+// UNSUPPORTED: gcc-10
+// XFAIL: msvc && clang
+
+// template<class In>
+// concept std::weakly_incrementable;
+
+#include <iterator>
+
+#include <concepts>
+#include <memory>
+#include <optional>
+
+#include "../incrementable.h"
+
+static_assert(std::weakly_incrementable<int>);
+static_assert(std::weakly_incrementable<int*>);
+static_assert(std::weakly_incrementable<int**>);
+static_assert(!std::weakly_incrementable<int[]>);
+static_assert(!std::weakly_incrementable<int[10]>);
+static_assert(!std::weakly_incrementable<double>);
+static_assert(!std::weakly_incrementable<int&>);
+static_assert(!std::weakly_incrementable<int()>);
+static_assert(!std::weakly_incrementable<int (*)()>);
+static_assert(!std::weakly_incrementable<int (&)()>);
+
+struct S {};
+static_assert(!std::weakly_incrementable<int S::*>);
+
+#define CHECK_POINTER_TO_MEMBER_FUNCTIONS(qualifier)                                                                   \
+  static_assert(!std::weakly_incrementable<int (S::*)() qualifier>);                                                   \
+  static_assert(!std::weakly_incrementable<int (S::*)() qualifier noexcept>);                                          \
+  static_assert(!std::weakly_incrementable<int (S::*)() qualifier&>);                                                  \
+  static_assert(!std::weakly_incrementable<int (S::*)() qualifier & noexcept>);                                        \
+  static_assert(!std::weakly_incrementable<int (S::*)() qualifier&&>);                                                 \
+  static_assert(!std::weakly_incrementable < int (S::*)() qualifier&& noexcept >);
+
+#define NO_QUALIFIER
+CHECK_POINTER_TO_MEMBER_FUNCTIONS(NO_QUALIFIER);
+CHECK_POINTER_TO_MEMBER_FUNCTIONS(const);
+CHECK_POINTER_TO_MEMBER_FUNCTIONS(volatile);
+CHECK_POINTER_TO_MEMBER_FUNCTIONS(const volatile);
+
+static_assert(std::weakly_incrementable<postfix_increment_returns_void>);
+static_assert(std::weakly_incrementable<postfix_increment_returns_copy>);
+static_assert(std::weakly_incrementable<has_integral_minus>);
+static_assert(std::weakly_incrementable<has_distinct_
diff erence_type_and_minus>);
+static_assert(!std::weakly_incrementable<missing_
diff erence_type>);
+static_assert(!std::weakly_incrementable<floating_
diff erence_type>);
+static_assert(!std::weakly_incrementable<non_const_minus>);
+static_assert(!std::weakly_incrementable<non_integral_minus>);
+static_assert(!std::weakly_incrementable<bad_
diff erence_type_good_minus>);
+static_assert(!std::weakly_incrementable<not_default_initializable>);
+static_assert(!std::weakly_incrementable<not_movable>);
+static_assert(!std::weakly_incrementable<preinc_not_declared>);
+static_assert(!std::weakly_incrementable<postinc_not_declared>);
+static_assert(std::weakly_incrementable<incrementable_with_
diff erence_type>);
+static_assert(std::weakly_incrementable<incrementable_without_
diff erence_type>);
+static_assert(std::weakly_incrementable<
diff erence_type_and_void_minus>);
+static_assert(std::weakly_incrementable<noncopyable_with_
diff erence_type>);
+static_assert(std::weakly_incrementable<noncopyable_without_
diff erence_type>);
+static_assert(std::weakly_incrementable<noncopyable_with_
diff erence_type_and_minus>);

diff  --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp
index 4398981a73663..3d7e996769298 100644
--- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -20,3 +20,4 @@
 using iterator = std::back_insert_iterator<std::vector<int> >;
 static_assert(!std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
+static_assert(!std::weakly_incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp
index f3ea3a302a2b1..26a8461d9b03c 100644
--- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -20,3 +20,4 @@
 using iterator = std::front_insert_iterator<std::list<int> >;
 static_assert(!std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
+static_assert(!std::weakly_incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp
index b8495a64baf77..e63d209877e76 100644
--- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -20,3 +20,4 @@
 using iterator = std::insert_iterator<std::vector<int> >;
 static_assert(!std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
+static_assert(!std::weakly_incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp
index 76160504d5383..76329e43aaa15 100644
--- a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -18,3 +18,4 @@
 using iterator = std::move_iterator<int*>;
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, int>);
+static_assert(std::incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp
index 3bebc5bcb4188..c610c3073ff02 100644
--- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp
@@ -18,3 +18,4 @@
 using iterator = std::reverse_iterator<int*>;
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
+static_assert(std::incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp
index e64dd891211ef..9d84b7b6faaff 100644
--- a/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -20,3 +20,4 @@
 using iterator = std::istream_iterator<int, std::istream>;
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, int>);
+static_assert(std::incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
index 76b0fb87ba3e9..52d6006f226ce 100644
--- a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -21,3 +21,5 @@
 using iterator = std::istreambuf_iterator<char>;
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, char>);
+static_assert(std::weakly_incrementable<iterator>);
+static_assert(!std::incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp
index d6df8cf84963d..9bab69ee2633d 100644
--- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -20,3 +20,4 @@
 using iterator = std::ostream_iterator<int, std::ostream>;
 static_assert(!std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, int>);
+static_assert(!std::weakly_incrementable<iterator>);

diff  --git a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
index e2ef6f276d0ef..cd2bba45b9364 100644
--- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp
@@ -21,3 +21,4 @@
 using iterator = std::ostreambuf_iterator<char>;
 static_assert(!std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, char>);
+static_assert(!std::weakly_incrementable<iterator>);

diff  --git a/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp
index fc5a652131e1c..c55bc00b395fb 100644
--- a/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp
@@ -19,3 +19,4 @@
 
 static_assert(std::indirectly_readable<std::cregex_iterator>);
 static_assert(!std::indirectly_writable<std::cregex_iterator, char>);
+static_assert(std::incrementable<std::cregex_iterator>);

diff  --git a/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp
index 6e710fa222bf5..50cae5607be90 100644
--- a/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp
@@ -19,3 +19,4 @@
 
 static_assert(std::indirectly_readable<std::cregex_token_iterator>);
 static_assert(!std::indirectly_writable<std::cregex_token_iterator, char>);
+static_assert(std::incrementable<std::cregex_token_iterator>);

diff  --git a/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp
index 8df75f6bb59e0..838a71c03a0c1 100644
--- a/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp
@@ -23,6 +23,8 @@ using value_type = iterator::value_type;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(std::indirectly_writable<iterator, value_type>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, value_type>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp
index 2727bacf2ed1a..29292f881d680 100644
--- a/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp
@@ -22,6 +22,8 @@ using const_iterator = std::string_view::const_iterator;
 
 static_assert(std::indirectly_readable<iterator>);
 static_assert(!std::indirectly_writable<iterator, char>);
+static_assert(std::incrementable<iterator>);
 
 static_assert(std::indirectly_readable<const_iterator>);
 static_assert(!std::indirectly_writable<const_iterator, char>);
+static_assert(std::incrementable<const_iterator>);

diff  --git a/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp
index 66a044cb3beae..1d5dbd9bd6941 100644
--- a/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp
@@ -19,6 +19,8 @@
 
 static_assert(std::indirectly_readable<std::unique_ptr<int> >);
 static_assert(std::indirectly_writable<std::unique_ptr<int>, int>);
+static_assert(!std::weakly_incrementable<std::unique_ptr<int> >);
 
 static_assert(!std::indirectly_readable<std::unique_ptr<void> >);
 static_assert(!std::indirectly_writable<std::unique_ptr<void>, void>);
+static_assert(!std::weakly_incrementable<std::unique_ptr<void> >);

diff  --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp
index 7b1b4b451c381..1c826eb23786b 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp
@@ -19,6 +19,8 @@
 
 static_assert(std::indirectly_readable<std::shared_ptr<int> >);
 static_assert(std::indirectly_writable<std::shared_ptr<int>, int>);
+static_assert(!std::weakly_incrementable<std::shared_ptr<int> >);
 
 static_assert(!std::indirectly_readable<std::shared_ptr<void> >);
 static_assert(!std::indirectly_writable<std::shared_ptr<void>, void>);
+static_assert(!std::weakly_incrementable<std::shared_ptr<void> >);

diff  --git a/libcxx/test/std/utilities/optional/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/utilities/optional/iterator_concept_conformance.compile.pass.cpp
index 58b1fda783ec1..749f1a87b4a0e 100644
--- a/libcxx/test/std/utilities/optional/iterator_concept_conformance.compile.pass.cpp
+++ b/libcxx/test/std/utilities/optional/iterator_concept_conformance.compile.pass.cpp
@@ -19,3 +19,4 @@
 
 static_assert(!std::indirectly_readable<std::optional<int> >);
 static_assert(!std::indirectly_writable<std::optional<int>, int>);
+static_assert(!std::weakly_incrementable<std::optional<int> >);


        


More information about the libcxx-commits mailing list