From 1247cb3ed88c415ced10f680fb5b8a54b4cfeed7 Mon Sep 17 00:00:00 2001 From: Ben Deane Date: Thu, 23 Oct 2025 12:13:25 -0600 Subject: [PATCH] :bug: Fix compile-time capacity calculation for dynamic span Problem: - `ct_capacity_v>` returns its capacity as the maximum value of `std::size_t`, which is wrong. Solution: - Make `ct_capacity_v` a compile-time error when called on a dynamic `stdx::span`. (Just like on a dynamic `std::span`). These things don't have compile-time capacities; they are dynamic. --- include/stdx/span.hpp | 4 ++++ test/fail/CMakeLists.txt | 3 ++- ...city.cpp => dynamic_std_span_no_ct_capacity.cpp} | 0 test/fail/dynamic_stdx_span_no_ct_capacity.cpp | 13 +++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) rename test/fail/{dynamic_span_no_ct_capacity.cpp => dynamic_std_span_no_ct_capacity.cpp} (100%) create mode 100644 test/fail/dynamic_stdx_span_no_ct_capacity.cpp diff --git a/include/stdx/span.hpp b/include/stdx/span.hpp index 49d5cfd..87c9f18 100644 --- a/include/stdx/span.hpp +++ b/include/stdx/span.hpp @@ -281,6 +281,10 @@ span(R &&) -> span>>; template constexpr auto ct_capacity_v> = N; + +template +constexpr auto ct_capacity_v> = + detail::ct_capacity_fail>{}; } // namespace v1 } // namespace stdx diff --git a/test/fail/CMakeLists.txt b/test/fail/CMakeLists.txt index 64ccc93..09edb36 100644 --- a/test/fail/CMakeLists.txt +++ b/test/fail/CMakeLists.txt @@ -32,8 +32,9 @@ if(${CMAKE_CXX_STANDARD} GREATER_EQUAL 20) atomic_bool_dec call_by_need ct_format_mismatch - dynamic_span_no_ct_capacity dynamic_container_no_ct_capacity + dynamic_std_span_no_ct_capacity + dynamic_stdx_span_no_ct_capacity tuple_index_out_of_bounds tuple_equality_mismatch tuple_equality_with_element diff --git a/test/fail/dynamic_span_no_ct_capacity.cpp b/test/fail/dynamic_std_span_no_ct_capacity.cpp similarity index 100% rename from test/fail/dynamic_span_no_ct_capacity.cpp rename to test/fail/dynamic_std_span_no_ct_capacity.cpp diff --git a/test/fail/dynamic_stdx_span_no_ct_capacity.cpp b/test/fail/dynamic_stdx_span_no_ct_capacity.cpp new file mode 100644 index 0000000..6c01b7e --- /dev/null +++ b/test/fail/dynamic_stdx_span_no_ct_capacity.cpp @@ -0,0 +1,13 @@ +#include +#include + +#include +#include + +// EXPECT: Type does not support compile-time capacity + +auto main() -> int { + auto a = std::array{}; + auto s = stdx::span{std::begin(a), std::end(a)}; + constexpr auto c = stdx::ct_capacity(s); +}