On Fri, 14 Mar 2025 at 17:16, Patrick Palka <[email protected]> wrote:
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk? We could
> use a direct constexpr test for this from_range vector ctor code path,
> but that'll be easier once we make the __gnu_test range/iterators
> constexpr-friendly. For now I just added an end-to-end test, which
> seems good to have too.
OK, thanks.
>
> -- >8 --
>
> A missing 'constexpr' in the non-forward (and non-sized) branch of
> vector's recently added from_range ctor was causing this constexpr
> example to be rejected with an obscure error.
>
> PR libstdc++/119282
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/stl_vector.h (vector::vector(from_range_t)): Add
> missing 'constexpr' to local class _Clear.
> * testsuite/std/ranges/conv/1.cc (test_pr119282): New test.
> ---
> libstdc++-v3/include/bits/stl_vector.h | 2 +-
> libstdc++-v3/testsuite/std/ranges/conv/1.cc | 13 +++++++++++++
> 2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/bits/stl_vector.h
> b/libstdc++-v3/include/bits/stl_vector.h
> index 43d3cd1f171..9c75f64b6ef 100644
> --- a/libstdc++-v3/include/bits/stl_vector.h
> +++ b/libstdc++-v3/include/bits/stl_vector.h
> @@ -778,7 +778,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> // but will not destroy elements. This RAII type destroys them.
> struct _Clear
> {
> - ~_Clear() { if (_M_this) _M_this->clear(); }
> + constexpr ~_Clear() { if (_M_this) _M_this->clear(); }
> vector* _M_this;
> } __guard{this};
>
> diff --git a/libstdc++-v3/testsuite/std/ranges/conv/1.cc
> b/libstdc++-v3/testsuite/std/ranges/conv/1.cc
> index 09fd515edf1..231cb9d9934 100644
> --- a/libstdc++-v3/testsuite/std/ranges/conv/1.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/conv/1.cc
> @@ -466,6 +466,18 @@ test_composition()
> auto str = adaptor(" ");
> }
>
> +constexpr bool
> +test_pr119282()
> +{
> + // PR libstdc++/119282
> + auto v = std::array{1, 2, 3}
> + | std::views::transform([](auto x) { return std::array{x}; })
> + | std::views::join
> + | std::ranges::to<std::vector>();
> + VERIFY( std::ranges::size(v) == 3 );
> + return true;
> +}
> +
> int main()
> {
> test_p1206r7_examples();
> @@ -480,4 +492,5 @@ int main()
> test_constexpr();
> test_sfinae();
> test_composition();
> + static_assert(test_pr119282());
> }
> --
> 2.49.0.rc1.37.ge969bc8759
>