<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Thu, Mar 12, 2026 at 4:59 PM Jonathan Wakely <<a href="mailto:jwakely@redhat.com">jwakely@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This implements LWG 4242 which was approved in Sofia 2025.<br>
<br>
Replace the use of the std::decay_t trait with the C++23 auto(x)<br>
feature, which avoids instantiating the class template.<br>
<br>
libstdc++-v3/ChangeLog:<br>
<br>
* include/bits/ranges_base.h (distance(It&&, Sent)): Decay<br>
arrays to pointers, as per LWG 4242.<br>
* testsuite/24_iterators/range_operations/lwg4242.cc: New test.<br>
---<br>
<br>
Lightly tested on x86_64-linux so far, full tests running now.<br></blockquote><div>LGTM </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
libstdc++-v3/include/bits/ranges_base.h | 12 ++++++++++-<br>
.../24_iterators/range_operations/lwg4242.cc | 21 +++++++++++++++++++<br>
2 files changed, 32 insertions(+), 1 deletion(-)<br>
create mode 100644 libstdc++-v3/testsuite/24_iterators/range_operations/lwg4242.cc<br>
<br>
diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h<br>
index 6cfa6fb6afe6..609e29175f06 100644<br>
--- a/libstdc++-v3/include/bits/ranges_base.h<br>
+++ b/libstdc++-v3/include/bits/ranges_base.h<br>
@@ -989,7 +989,17 @@ namespace ranges<br>
[[nodiscard, __gnu__::__always_inline__]]<br>
constexpr iter_difference_t<decay_t<_It>><br>
operator()(_It&& __first, _Sent __last) const<br>
- { return __last - static_cast<const decay_t<_It>&>(__first); }<br>
+ {<br>
+ // GLIBCXX_RESOLVE_LIB_DEFECTS<br>
+ // 4242. ranges::distance does not work with volatile iterators<br>
+ if constexpr (!is_array_v<remove_reference_t<_It>>)<br>
+ return __last - __first;<br>
+ else<br>
+#pragma GCC diagnostic push<br>
+#pragma GCC diagnostic ignored "-Wc++23-extensions" // auto(x)<br>
+ return __last - auto(__first);<br>
+#pragma GCC diagnostic pop<br>
+ }<br>
<br>
template<range _Range><br>
[[nodiscard, __gnu__::__always_inline__]]<br>
diff --git a/libstdc++-v3/testsuite/24_iterators/range_operations/lwg4242.cc b/libstdc++-v3/testsuite/24_iterators/range_operations/lwg4242.cc<br>
new file mode 100644<br>
index 000000000000..ec03be42cbab<br>
--- /dev/null<br>
+++ b/libstdc++-v3/testsuite/24_iterators/range_operations/lwg4242.cc<br>
@@ -0,0 +1,21 @@<br>
+// { dg-do run { target c++20 } }<br>
+<br>
+// LWG 4242. ranges::distance does not work with volatile iterators<br>
+<br>
+#include <iterator><br>
+#include <testsuite_hooks.h><br>
+<br>
+void<br>
+test_lwg4242()<br>
+{<br>
+ int arr[] = {1, 2, 3};<br>
+ int* volatile ptr = arr;<br>
+ auto d1 = std::distance(ptr, arr + 3);<br>
+ auto d2 = std::ranges::distance(ptr, arr + 3);<br>
+ VERIFY( d1 == d2 );<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+ test_lwg4242();<br>
+}<br>
-- <br>
2.53.0<br>
<br>
</blockquote></div></div>