Skip to content

Conversation

H-G-Hristov
Copy link
Contributor

Fixes: #105352

@H-G-Hristov H-G-Hristov requested a review from a team as a code owner August 9, 2025 13:28
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Aug 9, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 9, 2025

@llvm/pr-subscribers-libcxx

Author: Hristo Hristov (H-G-Hristov)

Changes

Fixes: #105352


Full diff: https://github.com/llvm/llvm-project/pull/152855.diff

3 Files Affected:

  • (modified) libcxx/docs/Status/Cxx2cIssues.csv (+1-1)
  • (modified) libcxx/include/__ranges/iota_view.h (+2-1)
  • (added) libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.verify.cpp (+29)
diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 6fcb2f3c78cfc..9b61c921c8db4 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -71,7 +71,7 @@
 "`LWG4079 <https://wg21.link/LWG4079>`__","Missing Preconditions in ``concat_view::iterator``\`s conversion constructor","2024-06 (St. Louis)","","",""
 "`LWG4082 <https://wg21.link/LWG4082>`__","``views::concat(r)`` is well-formed when ``r`` is an ``output_range``","2024-06 (St. Louis)","","",""
 "`LWG4083 <https://wg21.link/LWG4083>`__","``views::as_rvalue`` should reject non-input ranges","2024-06 (St. Louis)","","",""
-"`LWG4096 <https://wg21.link/LWG4096>`__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","","",""
+"`LWG4096 <https://wg21.link/LWG4096>`__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","|Complete|","22",""
 "`LWG4098 <https://wg21.link/LWG4098>`__","``views::adjacent<0>`` should reject non-forward ranges","2024-06 (St. Louis)","","",""
 "`LWG4105 <https://wg21.link/LWG4105>`__","``ranges::ends_with``\`s Returns misses difference casting","2024-06 (St. Louis)","","",""
 "`LWG4106 <https://wg21.link/LWG4106>`__","``basic_format_args`` should not be default-constructible","2024-06 (St. Louis)","|Complete|","19",""
diff --git a/libcxx/include/__ranges/iota_view.h b/libcxx/include/__ranges/iota_view.h
index 4b84585258b91..79a450a9ce40c 100644
--- a/libcxx/include/__ranges/iota_view.h
+++ b/libcxx/include/__ranges/iota_view.h
@@ -30,6 +30,7 @@
 #include <__ranges/movable_box.h>
 #include <__ranges/view_interface.h>
 #include <__type_traits/conditional.h>
+#include <__type_traits/decay.h>
 #include <__type_traits/is_nothrow_constructible.h>
 #include <__type_traits/make_unsigned.h>
 #include <__type_traits/type_identity.h>
@@ -377,7 +378,7 @@ struct __fn {
   _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Start&& __start) const
       noexcept(noexcept(ranges::iota_view(std::forward<_Start>(__start))))
           -> decltype(ranges::iota_view(std::forward<_Start>(__start))) {
-    return ranges::iota_view(std::forward<_Start>(__start));
+    return ranges::iota_view<decay_t<_Start>>(std::forward<_Start>(__start));
   }
 
   template <class _Start, class _BoundSentinel>
diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.verify.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.verify.cpp
new file mode 100644
index 0000000000000..9f1879968eebc
--- /dev/null
+++ b/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.verify.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++20
+
+// views::iota
+
+#include <ranges>
+
+#include "types.h"
+
+void test() {
+  // LWG4096
+  {
+    [[maybe_unused]] auto i1 = std::views::iota(0); // OK
+    [[maybe_unused]] auto i2 = std::views::iota(std::views::iota(0));
+    // expected-error-re@*:* {{constraints not satisfied for class template 'iota_view'{{.*}}}}
+  }
+  {
+    [[maybe_unused]] auto i1 = std::views::iota(SomeInt(0)); // OK
+    [[maybe_unused]] auto i2 = std::views::iota(std::views::iota(SomeInt(0)));
+    //expected-error-re@*:* {{constraints not satisfied for class template 'iota_view'{{.*}}}}
+  }
+}

Copy link

github-actions bot commented Aug 9, 2025

✅ With the latest revision this PR passed the C/C++ code formatter.

Copy link
Contributor

@frederick-vs-ja frederick-vs-ja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. CI failures are probably unrelated.

@ldionne ldionne merged commit 6d40257 into llvm:main Aug 13, 2025
76 of 79 checks passed
@H-G-Hristov H-G-Hristov deleted the hgh/libcxx/LWG4096-ranges_iota_zero branch August 15, 2025 06:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

LWG4096: views::iota(views::iota(0)) should be rejected

5 participants