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.
-- >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