[libcxx-commits] [libcxx] [libc++][ranges] implement LWG3715 (PR #85004)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Mar 12 17:36:28 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Xiaoyang Liu (xiaoyang-sde)
<details>
<summary>Changes</summary>
## Abstract
This pull request implements LWG3715: `view_interface::empty` is overconstrained. Here is an example similar to those described in the report, which compiles with `-stdlib=libstdc++` but failed to compile with `-stdlib=libc++`:
```cpp
// https://godbolt.org/z/EWEoTzah3
std::istringstream input("1 2 3 4 5");
auto i = std::views::istream<int>(input);
auto r = std::views::counted(i.begin(), 4) | std::views::take(2);
assert(!r.empty());
```
## Reference
- [Draft C++ Standard: [view.interface.general]](https://eel.is/c++draft/view.interface.general)
- [LWG3715](https://wg21.link/LWG3715)
---
Full diff: https://github.com/llvm/llvm-project/pull/85004.diff
3 Files Affected:
- (modified) libcxx/docs/Status/Cxx23Issues.csv (+1-1)
- (modified) libcxx/include/__ranges/view_interface.h (+12-4)
- (added) libcxx/test/std/ranges/range.utility/view.interface/lwg3715.pass.cpp (+31)
``````````diff
diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv
index 70480b33820580..a0c5a284e3291c 100644
--- a/libcxx/docs/Status/Cxx23Issues.csv
+++ b/libcxx/docs/Status/Cxx23Issues.csv
@@ -181,7 +181,7 @@
"`3711 <https://wg21.link/LWG3711>`__","Missing preconditions for slide_view constructor","July 2022","","","|ranges|"
"`3712 <https://wg21.link/LWG3712>`__","``chunk_view`` and ``slide_view`` should not be ``default_initializable``","July 2022","","","|ranges|"
"`3713 <https://wg21.link/LWG3713>`__","Sorted with respect to comparator (only)","July 2022","",""
-"`3715 <https://wg21.link/LWG3715>`__","``view_interface::empty`` is overconstrained","July 2022","","","|ranges|"
+"`3715 <https://wg21.link/LWG3715>`__","``view_interface::empty`` is overconstrained","July 2022","|Complete|","19.0","|ranges|"
"`3719 <https://wg21.link/LWG3719>`__","Directory iterators should be usable with default sentinel","July 2022","|Complete|","17.0","|ranges|"
"`3721 <https://wg21.link/LWG3721>`__","Allow an ``arg-id`` with a value of zero for ``width`` in ``std-format-spec``","July 2022","|Complete|","16.0","|format|"
"`3724 <https://wg21.link/LWG3724>`__","``decay-copy`` should be constrained","July 2022","|Complete|","14.0"
diff --git a/libcxx/include/__ranges/view_interface.h b/libcxx/include/__ranges/view_interface.h
index 84dd1c316de379..ecc14c0a9471cb 100644
--- a/libcxx/include/__ranges/view_interface.h
+++ b/libcxx/include/__ranges/view_interface.h
@@ -51,16 +51,24 @@ class view_interface {
public:
template <class _D2 = _Derived>
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool empty()
- requires forward_range<_D2>
+ requires sized_range<_D2> || forward_range<_D2>
{
- return ranges::begin(__derived()) == ranges::end(__derived());
+ if constexpr (sized_range<_D2>) {
+ return ranges::size(__derived()) == 0;
+ } else {
+ return ranges::begin(__derived()) == ranges::end(__derived());
+ }
}
template <class _D2 = _Derived>
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool empty() const
- requires forward_range<const _D2>
+ requires sized_range<const _D2> || forward_range<const _D2>
{
- return ranges::begin(__derived()) == ranges::end(__derived());
+ if constexpr (sized_range<const _D2>) {
+ return ranges::size(__derived()) == 0;
+ } else {
+ return ranges::begin(__derived()) == ranges::end(__derived());
+ }
}
template <class _D2 = _Derived>
diff --git a/libcxx/test/std/ranges/range.utility/view.interface/lwg3715.pass.cpp b/libcxx/test/std/ranges/range.utility/view.interface/lwg3715.pass.cpp
new file mode 100644
index 00000000000000..cc58f2facba012
--- /dev/null
+++ b/libcxx/test/std/ranges/range.utility/view.interface/lwg3715.pass.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+
+// LWG 3715: `view_interface::empty` is overconstrained
+
+#include <cassert>
+#include <ranges>
+#include <sstream>
+
+bool test() {
+ std::istringstream input("1 2 3 4 5");
+ auto i = std::views::istream<int>(input);
+ auto r = std::views::counted(i.begin(), 4) | std::views::take(2);
+ static_assert(std::ranges::input_range<decltype(r)>);
+ static_assert(!std::ranges::forward_range<decltype(r)>);
+ static_assert(std::ranges::sized_range<decltype(r)>);
+ assert(!r.empty());
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ return 0;
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/85004
More information about the libcxx-commits
mailing list