<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Mar 10, 2026 at 5:25 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">Implement the accepted resolution of LWG 4243.<br>
<br>
libstdc++-v3/ChangeLog:<br>
<br>
        * include/std/span (as_bytes, as_writable_bytes): Add<br>
        constraints to disallow volatile elements, as per LWG 4243.<br>
        * testsuite/23_containers/span/lwg4243.cc: New test.<br>
---<br>
<br>
Tested x86_64-linux.<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/std/span                 |  5 ++-<br>
 .../testsuite/23_containers/span/lwg4243.cc   | 31 +++++++++++++++++++<br>
 2 files changed, 35 insertions(+), 1 deletion(-)<br>
 create mode 100644 libstdc++-v3/testsuite/23_containers/span/lwg4243.cc<br>
<br>
diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span<br>
index 8f525d009ff5..a2f338449c8a 100644<br>
--- a/libstdc++-v3/include/std/span<br>
+++ b/libstdc++-v3/include/std/span<br>
@@ -517,7 +517,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
     span(_Range &&)<br>
       -> span<remove_reference_t<ranges::range_reference_t<_Range&>>>;<br>
<br>
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS<br>
+  // 4243. as_bytes/as_writable_bytes is broken with span<volatile T><br>
   template<typename _Type, size_t _Extent><br>
+    requires (!is_volatile_v<_Type>)<br>
     [[nodiscard]]<br>
     inline<br>
     span<const byte, _Extent == dynamic_extent<br>
@@ -532,7 +535,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
     }<br>
<br>
   template<typename _Type, size_t _Extent><br>
-    requires (!is_const_v<_Type>)<br>
+    requires (!is_const_v<_Type> && !is_volatile_v<_Type>)<br>
     inline<br>
     span<byte, _Extent == dynamic_extent<br>
        ? dynamic_extent : _Extent * sizeof(_Type)><br>
diff --git a/libstdc++-v3/testsuite/23_containers/span/lwg4243.cc b/libstdc++-v3/testsuite/23_containers/span/lwg4243.cc<br>
new file mode 100644<br>
index 000000000000..c2c9949319a9<br>
--- /dev/null<br>
+++ b/libstdc++-v3/testsuite/23_containers/span/lwg4243.cc<br>
@@ -0,0 +1,31 @@<br>
+// { dg-do compile { target c++20 } }<br>
+<br>
+// LWG 4243. as_bytes/as_writable_bytes is broken with span<volatile T><br>
+<br>
+#include <span><br>
+<br>
+template<typename ElementType, std::size_t Extent = std::dynamic_extent><br>
+concept can_call_as_bytes<br>
+  = requires (std::span<ElementType, Extent> s) { std::as_bytes(s); };<br>
+<br>
+template<typename ElementType, std::size_t Extent = std::dynamic_extent><br>
+concept can_call_as_writable_bytes<br>
+  = requires (std::span<ElementType, Extent> s) { std::as_writable_bytes(s); };<br>
+<br>
+static_assert( can_call_as_bytes<int> );<br>
+static_assert( can_call_as_bytes<int, 10> );<br>
+static_assert( can_call_as_bytes<const int> );<br>
+static_assert( can_call_as_bytes<const int, 10> );<br>
+static_assert( can_call_as_writable_bytes<int> );<br>
+static_assert( can_call_as_writable_bytes<int, 10> );<br>
+static_assert( can_call_as_writable_bytes<const int> );<br>
+static_assert( can_call_as_writable_bytes<const int, 10> );<br>
+<br>
+static_assert( ! can_call_as_bytes<volatile int> );<br>
+static_assert( ! can_call_as_bytes<volatile int, 10> );<br>
+static_assert( ! can_call_as_bytes<const volatile int> );<br>
+static_assert( ! can_call_as_bytes<const volatile int, 10> );<br>
+static_assert( ! can_call_as_writable_bytes<volatile int> );<br>
+static_assert( ! can_call_as_writable_bytes<volatile int, 10> );<br>
+static_assert( ! can_call_as_writable_bytes<const volatile int> );<br>
+static_assert( ! can_call_as_writable_bytes<const volatile int, 10> );<br>
-- <br>
2.53.0<br>
<br>
</blockquote></div></div>