aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog33
-rw-r--r--libstdc++-v3/include/bits/version.def8
-rw-r--r--libstdc++-v3/include/bits/version.h10
-rw-r--r--libstdc++-v3/include/std/bitset82
-rw-r--r--libstdc++-v3/include/std/ranges4
-rw-r--r--libstdc++-v3/testsuite/20_util/bitset/cons/1.cc1
-rw-r--r--libstdc++-v3/testsuite/20_util/bitset/cons/6282.cc5
-rw-r--r--libstdc++-v3/testsuite/20_util/bitset/cons/string_view.cc132
-rw-r--r--libstdc++-v3/testsuite/20_util/bitset/cons/string_view_wide.cc8
-rw-r--r--libstdc++-v3/testsuite/std/ranges/concat/1.cc13
10 files changed, 263 insertions, 33 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c87e61f..77f58f7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,36 @@
+2025-07-03 Nathan Myers <ncm@cantrip.org>
+
+ * include/bits/version.def: Fix typo.
+ * include/bits/version.h: Rebuilt.
+
+2025-07-03 Patrick Palka <ppalka@redhat.com>
+
+ PR libstdc++/120934
+ * include/std/ranges (concat_view::end): Refine condition
+ for returning an iterator instead of default_sentinel as
+ per the updated P/R for LWG 4166.
+ * testsuite/std/ranges/concat/1.cc (test05): New test.
+
+2025-07-03 Nathan Myers <ncm@cantrip.org>
+
+ PR libstdc++/119742
+ * include/bits/version.def: Add preprocessor symbol.
+ * include/bits/version.h: Add preprocessor symbol.
+ * include/std/bitset: Add constructor.
+ * testsuite/20_util/bitset/cons/1.cc: Fix.
+ * testsuite/20_util/bitset/cons/6282.cc: Fix.
+ * testsuite/20_util/bitset/cons/string_view.cc: Test new ctor.
+ * testsuite/20_util/bitset/cons/string_view_wide.cc: Test new ctor.
+
+2025-07-03 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/120931
+ * include/bits/stl_uninitialized.h (__uninitialized_fill<true>):
+ Fix typo resulting in call to __do_uninit_copy instead of
+ __do_uninit_fill.
+ * testsuite/20_util/specialized_algorithms/uninitialized_fill/120931.cc:
+ New test.
+
2025-07-02 Jonathan Wakely <jwakely@redhat.com>
* include/bits/stl_iterator.h (__normal_iterator): Make all
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
index f4ba501..5d5758b 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -2030,6 +2030,14 @@ ftms = {
};
};
+ftms = {
+ name = bitset; // ...construct from string_view
+ values = {
+ v = 202306;
+ cxxmin = 26;
+ };
+};
+
// Standard test specifications.
stds[97] = ">= 199711L";
stds[03] = ">= 199711L";
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
index dc8ac07..2b00e84 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -2273,4 +2273,14 @@
#endif /* !defined(__cpp_lib_exception_ptr_cast) && defined(__glibcxx_want_exception_ptr_cast) */
#undef __glibcxx_want_exception_ptr_cast
+#if !defined(__cpp_lib_bitset)
+# if (__cplusplus > 202302L)
+# define __glibcxx_bitset 202306L
+# if defined(__glibcxx_want_all) || defined(__glibcxx_want_bitset)
+# define __cpp_lib_bitset 202306L
+# endif
+# endif
+#endif /* !defined(__cpp_lib_bitset) && defined(__glibcxx_want_bitset) */
+#undef __glibcxx_want_bitset
+
#undef __glibcxx_want_all
diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index 8b5d270..1c1e167 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -61,8 +61,13 @@
#endif
#define __glibcxx_want_constexpr_bitset
+#define __glibcxx_want_bitset // ...construct from string_view
#include <bits/version.h>
+#ifdef __cpp_lib_bitset // ...construct from string_view
+# include <string_view>
+#endif
+
#define _GLIBCXX_BITSET_BITS_PER_WORD (__CHAR_BIT__ * __SIZEOF_LONG__)
#define _GLIBCXX_BITSET_WORDS(__n) \
((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \
@@ -752,7 +757,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* (Note that %bitset does @e not meet the formal requirements of a
* <a href="tables.html#65">container</a>. Mainly, it lacks iterators.)
*
- * The template argument, @a Nb, may be any non-negative number,
+ * The template argument, `Nb`, may be any non-negative number,
* specifying the number of bits (e.g., "0", "12", "1024*1024").
*
* In the general unoptimized case, storage is allocated in word-sized
@@ -816,28 +821,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
typedef unsigned long _WordT;
-#if _GLIBCXX_HOSTED
- template<class _CharT, class _Traits, class _Alloc>
- _GLIBCXX23_CONSTEXPR
- void
- _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
- size_t __position) const
+ template<class _Str>
+ _GLIBCXX23_CONSTEXPR void
+ _M_check_initial_position(
+ const _Str& __s, typename _Str::size_type __position) const
{
if (__position > __s.size())
- __throw_out_of_range_fmt(__N("bitset::bitset: __position "
- "(which is %zu) > __s.size() "
- "(which is %zu)"),
- __position, __s.size());
+ __throw_out_of_range_fmt(
+ __N("bitset::bitset:"
+ " __position (which is %zu) > __s.size() (which is %zu)"),
+ size_t(__position), size_t(__s.size()));
}
-#endif // HOSTED
_GLIBCXX23_CONSTEXPR
void _M_check(size_t __position, const char *__s) const
{
if (__position >= _Nb)
- __throw_out_of_range_fmt(__N("%s: __position (which is %zu) "
- ">= _Nb (which is %zu)"),
- __s, __position, _Nb);
+ __throw_out_of_range_fmt(
+ __N("%s: __position (which is %zu) >= _Nb (which is %zu)"),
+ __s, size_t(__position), size_t(_Nb));
}
_GLIBCXX23_CONSTEXPR
@@ -954,12 +956,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#if _GLIBCXX_HOSTED
/**
* Use a subset of a string.
- * @param __s A string of @a 0 and @a 1 characters.
- * @param __position Index of the first character in @a __s to use;
+ * @param __s A string of `0` and `1` characters.
+ * @param __position Index of the first character in `__s` to use;
* defaults to zero.
- * @throw std::out_of_range If @a pos is bigger the size of @a __s.
+ * @throw std::out_of_range If `__position > __s.size()`.
* @throw std::invalid_argument If a character appears in the string
- * which is neither @a 0 nor @a 1.
+ * which is neither `0` nor `1`.
*/
template<class _CharT, class _Traits, class _Alloc>
_GLIBCXX23_CONSTEXPR
@@ -976,13 +978,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
/**
* Use a subset of a string.
- * @param __s A string of @a 0 and @a 1 characters.
- * @param __position Index of the first character in @a __s to use.
+ * @param __s A string of `0` and `1` characters.
+ * @param __position Index of the first character in `__s` to use.
* @param __n The number of characters to copy.
- * @throw std::out_of_range If @a __position is bigger the size
- * of @a __s.
+ * @throw std::out_of_range If `__position > __s.size()`.
* @throw std::invalid_argument If a character appears in the string
- * which is neither @a 0 nor @a 1.
+ * which is neither `0` nor `1`.
*/
template<class _CharT, class _Traits, class _Alloc>
_GLIBCXX23_CONSTEXPR
@@ -1008,15 +1009,42 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
}
#endif // HOSTED
+#ifdef __cpp_lib_bitset
+ /**
+ * Use a subset of a string view.
+ * @param __s A `string_view` of a sequence of `0` and `1` characters.
+ * @param __position Index of the first character in `__s` to use.
+ * @param __n The maximum number of characters from `__s` to use.
+ * @param __zero The character corresponding to the value 0.
+ * @param __one The character corresponding to the value 1.
+ * @throw std::out_of_range If `__position > __s.size()`.
+ * @throw std::invalid_argument If a character appears in `__s`
+ * which is neither `0` nor `1`.
+ */
+ template<class _CharT, class _Traits>
+ constexpr explicit
+ bitset(basic_string_view<_CharT, _Traits> __s,
+ basic_string_view<_CharT, _Traits>::size_type __position = 0,
+ basic_string_view<_CharT, _Traits>::size_type __n =
+ basic_string_view<_CharT, _Traits>::npos,
+ _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
+ : _Base()
+ {
+ _M_check_initial_position(__s, __position);
+ _M_copy_from_ptr<_CharT, _Traits>(
+ __s.data(), __s.size(), __position, __n, __zero, __one);
+ }
+#endif
+
#if __cplusplus >= 201103L
/**
* Construct from a character %array.
- * @param __str An %array of characters @a zero and @a one.
+ * @param __str An %array of characters `__zero` and `__one`.
* @param __n The number of characters to use.
* @param __zero The character corresponding to the value 0.
* @param __one The character corresponding to the value 1.
* @throw std::invalid_argument If a character appears in the string
- * which is neither @a __zero nor @a __one.
+ * which is neither `__zero` nor `__one`.
*/
template<typename _CharT>
[[__gnu__::__nonnull__]]
@@ -1028,10 +1056,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
: _Base()
{
-#if _GLIBCXX_HOSTED
if (!__str)
__throw_logic_error(__N("bitset::bitset(const _CharT*, ...)"));
-#endif
using _Traits = typename __bitset::__string<_CharT>::traits_type;
if (__n == __bitset::__string<_CharT>::npos)
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index f764aa7..3a6710b 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -9735,7 +9735,7 @@ namespace ranges
end() requires (!(__detail::__simple_view<_Vs> && ...))
{
constexpr auto __n = sizeof...(_Vs);
- if constexpr ((semiregular<iterator_t<_Vs>> && ...)
+ if constexpr (__detail::__all_forward<false, _Vs...>
&& common_range<_Vs...[__n - 1]>)
return _Iterator<false>(this, in_place_index<__n - 1>,
ranges::end(std::get<__n - 1>(_M_views)));
@@ -9747,7 +9747,7 @@ namespace ranges
end() const requires (range<const _Vs> && ...) && __detail::__concatable<const _Vs...>
{
constexpr auto __n = sizeof...(_Vs);
- if constexpr ((semiregular<iterator_t<const _Vs>> && ...)
+ if constexpr (__detail::__all_forward<true, _Vs...>
&& common_range<const _Vs...[__n - 1]>)
return _Iterator<true>(this, in_place_index<__n - 1>,
ranges::end(std::get<__n - 1>(_M_views)));
diff --git a/libstdc++-v3/testsuite/20_util/bitset/cons/1.cc b/libstdc++-v3/testsuite/20_util/bitset/cons/1.cc
index 0a40b6c..6441332 100644
--- a/libstdc++-v3/testsuite/20_util/bitset/cons/1.cc
+++ b/libstdc++-v3/testsuite/20_util/bitset/cons/1.cc
@@ -47,6 +47,7 @@ void test01(void)
const size_t n3 = 128;
try {
std::bitset<n3> bit03(str01, 5);
+ VERIFY(false);
}
catch(std::invalid_argument& fail) {
VERIFY( true );
diff --git a/libstdc++-v3/testsuite/20_util/bitset/cons/6282.cc b/libstdc++-v3/testsuite/20_util/bitset/cons/6282.cc
index fafa9fc..ee348c3 100644
--- a/libstdc++-v3/testsuite/20_util/bitset/cons/6282.cc
+++ b/libstdc++-v3/testsuite/20_util/bitset/cons/6282.cc
@@ -39,6 +39,8 @@ void test02(void)
std::bitset<0> z3(std::string("10101010101"));
VERIFY( z3.any() == false );
+ VERIFY( z1.to_ulong() == 0 );
+ VERIFY( (z1.to_string<char,char_traits<char>,allocator<char> >().empty() ));
try {
z1.set(0);
VERIFY( false );
@@ -49,9 +51,6 @@ void test02(void)
catch(...) {
VERIFY( false );
}
-
- VERIFY( z1.to_ulong() == 0 );
- VERIFY( (z1.to_string<char,char_traits<char>,allocator<char> >().empty() ));
}
int main()
diff --git a/libstdc++-v3/testsuite/20_util/bitset/cons/string_view.cc b/libstdc++-v3/testsuite/20_util/bitset/cons/string_view.cc
new file mode 100644
index 0000000..ec3a6c86
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bitset/cons/string_view.cc
@@ -0,0 +1,132 @@
+// C++26 [bitset.cons]
+
+// { dg-do run { target c++26 } }
+
+#ifndef C
+# define C char
+# define L(s) s
+#endif
+
+#include <bitset>
+#include <string>
+#include <string_view>
+#include <algorithm> // std::reverse, std::transform
+#include <stdexcept>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+ // template<_C,_T>
+ // constexpr explicit
+ // bitset(const basic_string_view<_C,_T>,
+ // size_type pos, size_type n, _C zero, _C one)
+ try {
+ std::basic_string_view<C> str(L("stuff smith sessions"));
+ const std::size_t n = 128;
+ std::bitset<n> bit(str, 5);
+ VERIFY(false);
+ }
+ catch(std::invalid_argument& fail) {
+ VERIFY( true );
+ }
+ catch(...) {
+ VERIFY( false );
+ }
+
+ try {
+ std::basic_string_view<C> str(L("010101000011"));
+ const std::size_t n = 128;
+ const auto sz = str.size();
+ std::bitset<n> bit(str, 0);
+ std::basic_string<C> str02;
+ for (std::size_t i = 0; i < sz; ++i)
+ str02 += (bit.test(i) ? C('1') : C('0'));
+ std::reverse(str02.begin(), str02.end());
+ VERIFY( str02 == str );
+ }
+ catch(std::invalid_argument& fail) {
+ VERIFY( false );
+ }
+ catch(...) {
+ VERIFY( false );
+ }
+
+ // substring<C> "010101000011"
+ // "10100001"
+ try {
+ std::basic_string_view<C> str(L("010101000011"));
+ const std::size_t n = 128;
+ const auto sz = 8;
+ std::bitset<n> bit(str, 3, sz);
+ std::basic_string<C> str02;
+ for (std::size_t i = 0; i < sz; ++i)
+ str02 += (bit.test(i) ? C('1') : C('0'));
+ std::reverse(str02.begin(), str02.end());
+ VERIFY( str02 == str.substr(3, sz) );
+ }
+ catch(std::invalid_argument& fail) {
+ VERIFY( false );
+ }
+ catch(...) {
+ VERIFY( false );
+ }
+
+ // "abababaaaabb", zero = 'a', one = 'b'
+ try {
+ std::basic_string_view<C> str(L("010101000011"));
+ const std::size_t n = 128;
+ const auto sz = str.size();
+ std::basic_string<C> str02(str);
+ std::transform(str02.cbegin(), str02.cend(), str02.begin(), [](auto c) {
+ return (c - C('0')) + C('a');
+ });
+ std::basic_string_view<C> str03(str02);
+ std::bitset<n> bit(str03, 0, 100, C('a'), C('b'));
+ std::basic_string<C> str04;
+ for (std::size_t i = 0; i < sz; ++i)
+ str04 += (bit.test(i) ? C('1') : C('0'));
+ std::reverse(str04.begin(), str04.end());
+ VERIFY( str04 == str );
+ }
+ catch(std::invalid_argument& fail) {
+ VERIFY( false );
+ }
+ catch(...) {
+ VERIFY( false );
+ }
+
+ // "aba0aba", zero = 'a', one = 'b', '0' appears
+ try {
+ const std::size_t n = 128;
+ std::basic_string_view<C> str05(L("aba0aba"));
+ std::bitset<n> bit(str05, 0, 100, C('a'), C('b'));
+ VERIFY( false );
+ }
+ catch(std::invalid_argument& fail) {
+ VERIFY( true );
+ }
+ catch(...) {
+ VERIFY( false );
+ }
+
+ // pos > str.size()
+ try {
+ std::basic_string_view<C> str(L("010101000011"));
+ const std::size_t n = 128;
+ const auto sz = str.size();
+ std::bitset<n> bit(str, sz + 1, 100);
+ VERIFY( false );
+ }
+ catch(std::out_of_range& fail) {
+ VERIFY( true );
+ }
+ catch(...) {
+ VERIFY( false );
+ }
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/20_util/bitset/cons/string_view_wide.cc b/libstdc++-v3/testsuite/20_util/bitset/cons/string_view_wide.cc
new file mode 100644
index 0000000..b53fe74
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bitset/cons/string_view_wide.cc
@@ -0,0 +1,8 @@
+// C++26 [bitset.cons]
+
+// { dg-do run { target c++26 } }
+
+#define C wchar_t
+#define L(s) L ## s
+
+#include "./string_view.cc"
diff --git a/libstdc++-v3/testsuite/std/ranges/concat/1.cc b/libstdc++-v3/testsuite/std/ranges/concat/1.cc
index 1672191..f78ed08 100644
--- a/libstdc++-v3/testsuite/std/ranges/concat/1.cc
+++ b/libstdc++-v3/testsuite/std/ranges/concat/1.cc
@@ -99,6 +99,18 @@ test04()
using type = decltype(v);
}
+void
+test05()
+{
+ // PR libstdc++/120934 - views::concat is ill-formed depending on argument order
+ auto v1 = views::single(1);
+ std::vector<int> vec = {2, 3};
+ auto v2 = views::join(views::transform(vec, views::single));
+
+ static_assert( ranges::range<decltype(views::concat(v1, v2))> );
+ static_assert( ranges::range<decltype(views::concat(v2, v1))> );
+}
+
int
main()
{
@@ -107,4 +119,5 @@ main()
test02();
test03();
test04();
+ test05();
}